Skip to content

Ubuntu MySQL 自动备份到阿里云 OSS

· 6 min

1. 阿里云 OSS 配置#

1.1 创建 OSS Bucket#

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

image-20260112134318092

1.2 创建 RAM 子账户#

⚠️ 不建议使用主账号 AccessKey,安全风险大

  1. 进入 RAM 访问控制
  2. 点击「创建用户」
  3. 保存 AccessKey ID 和 AccessKey Secret
    • Secret 只显示一次,建议妥善保存!
  4. 在用户列表找到刚创建的用户,搜索并添加 AliyunOSSFullAccess权限

2. 服务器安装 ossutil#

2.1 下载安装#

Terminal window
# 下载 ossutil
wget https://gosspublic.alicdn.com/ossutil/1.7.18/ossutil-v1.7.18-linux-amd64.zip
# 解压
unzip ossutil-v1.7.18-linux-amd64.zip
cd ossutil-v1.7.18-linux-amd64
# 安装到系统目录
sudo mv ossutil /usr/local/bin/
sudo chmod +x /usr/local/bin/ossutil
# 验证安装
ossutil --version

2.2 配置 ossutil#

Terminal window
#输入下面命令,进入初始化配置页面
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 身份运行,需要复制配置:

Terminal window
sudo cp ~/.ossutilconfig /root/.ossutilconfig

2.4 测试连接#

Terminal window
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 创建目录#

Terminal window
# 创建脚本目录
sudo mkdir -p /opt/backup
# 创建本地备份目录
sudo mkdir -p /backup-data
sudo chmod 777 /backup-data

4.2 创建备份脚本#

Terminal window
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_help
fi
DO_BACKUP=false
DO_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_backup
fi
# ============ 执行上传 ============
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
done
fi
echo "$(date): 完成!"

4.3 配置说明#

配置项说明示例
BUCKETOSS Bucket 地址oss://my-mysql-data-backup
OSS_PATHOSS 中的备份目录(不要有末尾斜杠)demo
BACKUP_DIR本地备份目录/backup-data
KEEP_COUNTOSS 保留备份数量10
LOCAL_KEEP_COUNT本地保留备份数量2
DB_HOST数据库主机127.0.0.1localhost
DB_USER数据库用户名backup
DB_PASS数据库密码YourSecurePassword
DB_LIST要备份的数据库列表(多个数据库用空格隔开)("database1" "database2")

4.4 赋予执行权限并测试#

Terminal window
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 --all

5. 配置定时任务#

5.1 添加定时任务#

Terminal window
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>&1

5.4 最后检查#

Terminal window
#查看定时任务
sudo crontab -l
#查看备份日志
tail -f /var/log/backup.log