1. 阿里云 OSS 配置#
1.1 创建 OSS Bucket#
- 登录 阿里云 OSS 控制台
- 点击「创建 Bucket」
- 名称:如
my-mysql-data-backup - 地域:选择离服务器近的(如华北2-北京)
- 存储类型:根据情况选择
- 权限:私有
- 名称:如

1.2 创建 RAM 子账户#
⚠️ 不建议使用主账号 AccessKey,安全风险大
- 进入 RAM 访问控制
- 点击「创建用户」
- 保存 AccessKey ID 和 AccessKey Secret
- Secret 只显示一次,建议妥善保存!
- 在用户列表找到刚创建的用户,搜索并添加
AliyunOSSFullAccess权限
2. 服务器安装 ossutil#
2.1 下载安装#
# 下载 ossutilwget https://gosspublic.alicdn.com/ossutil/1.7.18/ossutil-v1.7.18-linux-amd64.zip
# 解压unzip ossutil-v1.7.18-linux-amd64.zipcd ossutil-v1.7.18-linux-amd64
# 安装到系统目录sudo mv ossutil /usr/local/bin/sudo chmod +x /usr/local/bin/ossutil
# 验证安装ossutil --version2.2 配置 ossutil#
#输入下面命令,进入初始化配置页面ossutil config按提示依次输入:
| 配置项 | 输入内容 |
|---|---|
| config file name | 直接回车(使用默认路径) |
| Endpoint | 你的 Bucket 地域,如 oss-cn-beijing.aliyuncs.com |
| AccessKey ID | 你的 AccessKey ID |
| AccessKey Secret | 你的 AccessKey Secret |
| stsToken | 直接回车(留空) |
2.3 复制配置到 root 用户(可选)#
由于定时任务以 root 身份运行,需要复制配置:
sudo cp ~/.ossutilconfig /root/.ossutilconfig2.4 测试连接#
ossutil ls如果能看到 Bucket 列表,说明配置成功。
3. 创建 MySQL 备份用户#
-- 创建用户(根据实际情况修改密码)CREATE USER 'backup'@'localhost' IDENTIFIED BY 'YourSecurePassword';
-- 授予所有数据库的备份权限GRANT ALL PRIVILEGES ON *.* TO 'backup'@'localhost' WITH GRANT OPTION;
-- 刷新权限FLUSH PRIVILEGES;
-- 查看用户是否创建成功SELECT user, host FROM mysql.user WHERE user='backup';
-- 退出EXIT;4. 创建备份脚本#
4.1 创建目录#
# 创建脚本目录sudo mkdir -p /opt/backup
# 创建本地备份目录sudo mkdir -p /backup-datasudo chmod 777 /backup-data4.2 创建备份脚本#
sudo nano /opt/backup/backup.sh粘贴以下内容(根据实际情况修改配置区):
#!/bin/bash
cd /tmp
# ============ 配置区(根据实际情况修改) ============BUCKET="oss://your-bucket-name"OSS_PATH="your-backup-folder"BACKUP_DIR="/backup-data"DATE=$(date +%Y%m%d_%H%M%S)
#阿里云oss保留文件个数KEEP_COUNT=10
#本地保留备份数量LOCAL_KEEP_COUNT=1
DB_HOST="127.0.0.1"DB_USER="backup"DB_PASS='YourSecurePassword'DB_LIST=("database1" "database2")
# ============ 参数解析 ============show_help() { echo "用法: $0 <参数>" echo "" echo "必须指定以下参数之一:" echo " --all MySQL备份 + 上传阿里云" echo " --backup-only 只执行 MySQL 备份" echo " --upload-only 只上传到阿里云" echo " --help 显示帮助" exit 1}
if [ $# -eq 0 ]; then echo "错误:必须指定参数!" show_helpfi
DO_BACKUP=falseDO_UPLOAD=false
case $1 in --all) DO_BACKUP=true DO_UPLOAD=true ;; --backup-only) DO_BACKUP=true ;; --upload-only) DO_UPLOAD=true ;; --help) show_help ;; *) echo "未知参数: $1" show_help ;;esac
# ============ 清理本地旧备份 ============clean_local_backup() { echo "$(date): 清理本地旧备份,保留最近 ${LOCAL_KEEP_COUNT} 份..." for DB_NAME in "${DB_LIST[@]}"; do ls -t "$BACKUP_DIR"/${DB_NAME}_*.sql.gz 2>/dev/null | tail -n +$((LOCAL_KEEP_COUNT + 1)) | xargs -r rm -f done ls -t "$BACKUP_DIR"/configs_*.tar.gz 2>/dev/null | tail -n +$((LOCAL_KEEP_COUNT + 1)) | xargs -r rm -f}
# ============ 执行备份 ============if [ "$DO_BACKUP" = true ]; then mkdir -p "$BACKUP_DIR"
echo "$(date): 开始备份数据库..." for DB_NAME in "${DB_LIST[@]}"; do echo "$(date): 正在备份: $DB_NAME" mysqldump -h "$DB_HOST" -u"$DB_USER" -p"$DB_PASS" --single-transaction "$DB_NAME" 2>/dev/null | gzip > "$BACKUP_DIR/${DB_NAME}_$DATE.sql.gz"
if [ ${PIPESTATUS[0]} -eq 0 ] && [ -s "$BACKUP_DIR/${DB_NAME}_$DATE.sql.gz" ]; then echo "$(date): $DB_NAME 备份成功" else echo "$(date): $DB_NAME 备份失败!" fi done
echo "$(date): 备份配置文件..." tar czf "$BACKUP_DIR/configs_$DATE.tar.gz" /etc/nginx /opt/app/application.yml 2>/dev/null
clean_local_backupfi
# ============ 执行上传 ============if [ "$DO_UPLOAD" = true ]; then FILE_COUNT=$(find "$BACKUP_DIR" -type f 2>/dev/null | wc -l) if [ "$FILE_COUNT" -eq 0 ]; then echo "$(date): 错误:备份目录为空!" exit 1 fi
echo "$(date): 上传到阿里云 OSS..." find "$BACKUP_DIR" -type f | while read file; do FILENAME=$(basename "$file") echo "上传: $FILENAME" ossutil cp "$file" "$BUCKET/$OSS_PATH/backup_$DATE/$FILENAME" done
echo "$(date): 清理 OSS 旧备份..." ossutil ls "$BUCKET/$OSS_PATH/" -d 2>/dev/null | grep "backup_" | awk '{print $NF}' | sort -r | tail -n +$((KEEP_COUNT + 1)) | while read dir; do echo "删除: $dir" ossutil rm -r "$dir" -f donefi
echo "$(date): 完成!"4.3 配置说明#
| 配置项 | 说明 | 示例 |
|---|---|---|
BUCKET | OSS Bucket 地址 | oss://my-mysql-data-backup |
OSS_PATH | OSS 中的备份目录(不要有末尾斜杠) | demo |
BACKUP_DIR | 本地备份目录 | /backup-data |
KEEP_COUNT | OSS 保留备份数量 | 10 |
LOCAL_KEEP_COUNT | 本地保留备份数量 | 2 |
DB_HOST | 数据库主机 | 127.0.0.1 或 localhost |
DB_USER | 数据库用户名 | backup |
DB_PASS | 数据库密码 | YourSecurePassword |
DB_LIST | 要备份的数据库列表(多个数据库用空格隔开) | ("database1" "database2") |
4.4 赋予执行权限并测试#
sudo chmod +x /opt/backup/backup.sh
# 查看帮助sudo /opt/backup/backup.sh --help
# 只备份(不上传)sudo /opt/backup/backup.sh --backup-only
# 只上传(不备份)sudo /opt/backup/backup.sh --upload-only
# 完整流程(备份+上传)sudo /opt/backup/backup.sh --all5. 配置定时任务#
5.1 添加定时任务#
sudo crontab -e
# MySQL 数据库备份任务# 零点0 0 * * * /opt/backup/backup.sh --all >> /var/log/backup.log 2>&1# 凌晨3点0 3 * * * /opt/backup/backup.sh --all >> /var/log/backup.log 2>&1# 早上8点0 8 * * * /opt/backup/backup.sh --all >> /var/log/backup.log 2>&1# 中午12点半30 12 * * * /opt/backup/backup.sh --all >> /var/log/backup.log 2>&1# 下午6点0 18 * * * /opt/backup/backup.sh --all >> /var/log/backup.log 2>&1# 晚上10点0 22 * * * /opt/backup/backup.sh --all >> /var/log/backup.log 2>&15.4 最后检查#
#查看定时任务sudo crontab -l
#查看备份日志tail -f /var/log/backup.log