MySQL备份脚本

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"

posted @ 2025-07-09 10:22  wandereryjh  阅读(12)  评论(0)    收藏  举报