MySQL备份脚本
#!/bin/bash
# 设置环境变量
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# MySQL容器信息
CONTAINER_NAME="mysql"
USERNAME="root"
PASSWORD="123456!"
DATABASES=("1" "2")
# 备份路径
BACKUP_DIR="/usr/local/software/mysqlbackup"
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 获取当前日期时间(年月日时分)
CURRENT_DATETIME=$(date +"%Y%m%d%H%M")
# 备份每个数据库
for DATABASE in "${DATABASES[@]}"; do
# 导出数据库(安全优化参数)
echo "导出数据库 $DATABASE ..."
docker exec "$CONTAINER_NAME" mysqldump -u "$USERNAME" -p"$PASSWORD" \
--single-transaction \
--quick \
--skip-add-locks \
--skip-tz-utc \
--set-gtid-purged=OFF \
"$DATABASE" > "$BACKUP_DIR/$DATABASE-$CURRENT_DATETIME.sql"
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "数据库 $DATABASE 备份成功."
# 在导出的SQL文件开头添加性能优化参数(不影响数据完整性)
sed -i "1iSET autocommit=0;\nSET unique_checks=0;\nSET foreign_key_checks=0;\nSET sql_log_bin=0;" "$BACKUP_DIR/$DATABASE-$CURRENT_DATETIME.sql"
# 在文件末尾添加恢复语句
echo -e "\nSET autocommit=1;\nSET unique_checks=1;\nSET foreign_key_checks=1;\nSET sql_log_bin=1;\nCOMMIT;" >> "$BACKUP_DIR/$DATABASE-$CURRENT_DATETIME.sql"
else
echo "数据库 $DATABASE 备份失败."
exit 1
fi
done
# 压缩备份文件(在宿主机上)
echo "压缩备份文件..."
cd "$BACKUP_DIR" || exit 1
zip -q -r "backup-$CURRENT_DATETIME.zip" *.sql
# 检查压缩是否成功
if [ $? -eq 0 ]; then
echo "备份文件压缩成功."
else
echo "备份文件压缩失败."
exit 1
fi
# 删除导出的SQL文件
echo "清理备份文件..."
rm -f "$BACKUP_DIR"/*.sql
echo "备份完成,备份文件保存在 $BACKUP_DIR 目录下,文件名为 backup-$CURRENT_DATETIME.zip"