windows系统下
1.创建mysql自动备份脚本mysqlback.bat需将此脚本存放在mysql的bin文件夹下。确保此脚本执行成功了在进行第2步做计划任务。
@echo off
REM 定义备份目录backup_dir、备份的文件名filename
set "backup_dir=D:\mysqlback"
set "filename=mysqlback_%date:~0,4%%date:~5,2%%date:~8,2%.sql"
set "backup_path=%backup_dir%\%filename%"REM 检查目录是否存在,不存在则创建
if not exist "%backup_dir%" (echo 目录 %backup_dir% 不存在,正在创建...mkdir "%backup_dir%"if %errorlevel% equ 0 (echo 目录创建成功) else (echo 目录创建失败,请检查权限或路径是否正确pauseexit /b 1)
)REM 执行数据库备份,定义MySQL端口(根据实际情况修改端口号-P端口)
echo 开始备份数据库tuyou到 %backup_path%...
mysqldump -uzhanghu -pmima -P3307 --skip-lock-tables dbname > "%backup_path%"REM 检查备份是否成功
if %errorlevel% equ 0 (echo 数据库备份成功,文件保存至:%backup_path%
) else (echo 数据库备份失败,请检查MySQL连接信息或权限
)REM 延迟15秒后自动退出(/nobreak表示不响应按键中断)
echo 15秒后自动退出...
timeout /t 15 /nobreak >nul
exit /b 0
2.创建jiahuarenwu.bat计划任务,进行定时执行mysqlback.bat备份。(jiahuarenwu.bat需将此脚本放mysql的bin文件夹下。)
@echo off
:: 定义变量(请根据实际情况修改)
set "task_name=MySQL每周日备份任务"
set "script_path=C:\ProgramData\bin\backmysql.bat" :: 备份脚本完整路径
set "working_dir=C:\ProgramData\MySQL57\bin" :: 工作目录(起始于)
set "trigger_time=19:00"
set "user=Administrator" :: 管理员用户名
set "start_date=2025/08/1" :: 任务开始日期(格式必须为 yyyy/mm/dd,设置为今天或未来日期):: 检查备份脚本是否存在
if not exist "%script_path%" (echo 错误:未找到备份脚本 "%script_path%"timeout /t 10 /nobreak >nulexit /b 1
):: 第一步:创建基础计划任务(使用/sd指定正确的开始日期)
schtasks /create ^/tn "%task_name%" ^/tr "\"%script_path%\"" ^/sc weekly ^/d SUN ^/st %trigger_time% ^/ru "%user%" ^/sd "%start_date%" ^/f:: 第二步:通过PowerShell设置工作目录(起始于)
PowerShell -Command "$task = Get-ScheduledTask -TaskName '%task_name%'; $action = $task.Actions[0]; $action.WorkingDirectory = '%working_dir%'; Set-ScheduledTask -TaskName '%task_name%' -Action $action | Out-Null":: 检查任务是否创建成功
if %errorlevel% equ 0 (echo 计划任务创建成功!echo 任务名称:%task_name%echo 执行时间:每周日 %trigger_time%(从 %start_date% 开始)echo 执行脚本:%script_path%echo 工作目录:%working_dir%
) else (echo 计划任务创建失败!请确认:echo 1. 以管理员身份运行脚本echo 2. 开始日期格式为 yyyy/mm/dd(例如 %start_date%)echo 3. 用户名、脚本路径和工作目录正确
)timeout /t 15 /nobreak >nul
3.数据恢复创建huifu.bat文件,需将此脚本放mysql的bin文件夹下。
@echo off
REM 配置参数
set "mysql_host=192.168.3.5"
set "mysql_port=3306"
set "mysql_user=root"
set "mysql_pass=root"
set "db_name=dbname"
set "sql_file=D:\mysqlback\mysqlback_backup_20250801.sql"
set "mysql_path=C:\ProgramData\MySQL\bin\mysql.exe"REM 检查必要文件
if not exist "%mysql_path%" (echo 错误:未找到mysql程序!路径:%mysql_path%timeout /t 10 /nobreak >nulexit /b 1
)if not exist "%sql_file%" (echo 错误:未找到备份文件!路径:%sql_file%timeout /t 10 /nobreak >nulexit /b 1
)REM 关键:添加 --no-defaults 参数彻底忽略所有配置文件
echo 开始恢复 %sql_file% 到 %mysql_host% 的 %db_name% 数据库...
"%mysql_path%" --no-defaults -h%mysql_host% -P%mysql_port% -u%mysql_user% -p%mysql_pass% ^
--default-character-set=utf8mb4 %db_name% < "%sql_file%"REM 显示结果
if %errorlevel% equ 0 (echo 恢复成功!
) else (echo 恢复失败!请手动执行以下命令(已包含忽略配置参数):echo "%mysql_path%" --no-defaults -h%mysql_host% -P%mysql_port% -u%mysql_user% -p%mysql_pass% --default-character-set=utf8mb4 %db_name% < "%sql_file%"
)REM 延迟15秒后自动退出(/nobreak表示不响应按键中断)
echo 15秒后自动退出...
timeout /t 15 /nobreak >nul
exit /b 0
linux系统下
1.创建mysql备份脚本mysql_backup.sh给权限chmod +x mysqlbacl.bat并执行测试是否成功,成功了在执行第2步。
#!/bin/bash# MySQL数据库备份脚本
# 每天22:00执行一次,备份tuyou库# 配置信息
BACKUP_DIR="/data/mysql_backup/dbback" # 备份文件存放目录
LOG_FILE="/data/mysql_backup/log/mysql_backup.log" # 日志文件路径
MYSQL_USER="root" # MySQL用户名
MYSQL_PASSWORD="root" # MySQL密码
MYSQL_HOST="192.168.2.52" # MySQL主机
MYSQL_PORT="3306" # MySQL端口
DATABASE="dbname" # 需要备份的数据库名
RETENTION_HOURS=24 # 备份保留小时数
RETENTION_DAYS=7 # 备份保留天数
# 修改配置部分,添加 --ssl-mode=DISABLED
MYSQL_OPTS="--ssl-mode=DISABLED"# 创建必要的目录
mkdir -p "$BACKUP_DIR"
mkdir -p "$(dirname "$LOG_FILE")"# 日志函数
log() {local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $1"echo "$msg"echo "$msg" >> "$LOG_FILE"
}# 错误处理
handle_error() {local err="Error on line $1: $2"log "$err"[ -n "$MAIL_RECIPIENT" ] && echo "$err" | mail -s "MySQL Backup Failed" "$MAIL_RECIPIENT"exit 1
}trap 'handle_error $LINENO "$BASH_COMMAND"' ERR# 显示所有可用数据库(调试用)
log "可用数据库列表:"
mysql $MYSQL_OPTS -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" \-e "SHOW DATABASES;" >> "$LOG_FILE" 2>&1# 验证数据库存在
log "验证数据库 '$DATABASE' 是否存在..."
mysql $MYSQL_OPTS -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" \-e "USE $DATABASE ;" 2>/dev/null || handle_error $LINENO "数据库 '$DATABASE' 不存在或无法访问"# 开始备份
log "开始备份数据库 '$DATABASE'..."
BACKUP_FILE="$BACKUP_DIR/${DATABASE}_backup_$(date '+%Y%m%d_%H%M%S').sql.gz"
DUMP_ERROR_LOG="$BACKUP_DIR/dump_error_$(date '+%Y%m%d_%H%M%S').log"# 执行备份并捕获错误
log "执行mysqldump命令..."
mysqldump $MYSQL_OPTS -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" \--single-transaction --quick --lock-tables=false "$DATABASE" 2> "$DUMP_ERROR_LOG" | gzip > "$BACKUP_FILE"# 检查命令状态和备份文件大小
if [ $? -ne 0 ] || [ ! -s "$BACKUP_FILE" ]; thenERROR_MSG="备份失败"[ -s "$DUMP_ERROR_LOG" ] && ERROR_MSG+=": $(cat "$DUMP_ERROR_LOG")"handle_error $LINENO "$ERROR_MSG"
fi# 清理和日志
log "备份成功: $BACKUP_FILE (大小: $(du -sh "$BACKUP_FILE" | awk '{print $1}'))"
#find "$BACKUP_DIR" -type f -name "${DATABASE}_backup_*.sql.gz" -mmin +$((RETENTION_HOURS * 60)) -exec rm -f {} \;
#log "清理完成,保留最近 $RETENTION_HOURS 小时的备份"
log "清理超过 $RETENTION_DAYS 天的旧备份..."
find "$BACKUP_DIR" -type f -name "${DATABASE}_backup_*.sql.gz" -mtime +$RETENTION_DAYS -exec rm -f {} \;2.设置计划任务add_crontab.sh给权限chmod +x add_crontab.sh并执行测试是否成功。记得修改脚本中mysql的备份路径。
以下为cronta简单命令具体可百度查询。
手动编辑 Cron 任务,打开 Cron 表:crontab -e
删除对应的 Cron 条目:在打开的编辑器中,找到包含 $BACKUP_SCRIPT 路径的行(例如 0 22 * * * /path/to/mysql_backup.sh),删除该行后保存并退出。
验证修改:crontab -l确认列表中已不存在该任务。
#!/bin/bash# 备份脚本路径
BACKUP_SCRIPT="/data/mysql_backup/mysql_backup.sh" # 需要修改为实际备份的脚本路径# 检查脚本是否存在
if [ ! -f "$BACKUP_SCRIPT" ]; thenecho "错误: 备份脚本 $BACKUP_SCRIPT 不存在!"exit 1
fi# 设置执行权限
chmod +x "$BACKUP_SCRIPT"# 添加Cron任务(每天22:00执行)分 时 日 月 星期(7=0 1=1 2=2...6=6)
CRON_ENTRY="0 22 * * * $BACKUP_SCRIPT"
#CRON_ENTRY="*/5 * * * * $BACKUP_SCRIPT"# 检查Cron任务是否已存在
if ! crontab -l | grep -q "$BACKUP_SCRIPT"; then# 添加新的Cron任务(crontab -l 2>/dev/null; echo "$CRON_ENTRY") | crontab -echo "已成功添加Cron任务: $CRON_ENTRY"
elseecho "Cron任务已存在,未做修改"
fi# 显示当前Cron任务列表
echo "当前Cron任务列表:"
crontab -l 3.创建恢复库脚本restore_mysql.sh给权限chmod +x restore_mysql.sh测试。
脚本中记得修改自己的备份成功的sql文件,原备份文件已经压缩,需解压使用使用命令gunzip xxx.sql.gz即可得到解压的sql文件xxx.sql,新建db1库进行恢复测试使用。
#!/bin/bash# 配置参数
mysql_host="127.0.0.1"
mysql_port="3306"
mysql_user="root"
mysql_pass="root"
db_name="dbname1"
sql_file="/data/mysql_backup/dbpack/db_backup_20250818_153420.sql" # mysql备份的目录
mysql_path="/usr/bin/mysql" # Linux下mysql通常在/usr/bin目录# 检查必要文件
if [ ! -f "$mysql_path" ]; thenecho "错误:未找到mysql程序!路径:$mysql_path"sleep 10exit 1
fiif [ ! -f "$sql_file" ]; thenecho "错误:未找到备份文件!路径:$sql_file"sleep 10exit 1
fi# 服务器已关闭强制SSL,直接连接
echo "开始恢复 $sql_file 到 $mysql_host 的 $db_name 数据库..."
MYSQL_PWD="$mysql_pass" "$mysql_path" --no-defaults -h"$mysql_host" -P"$mysql_port" -u"$mysql_user" \
--default-character-set=utf8mb4 "$db_name" < "$sql_file"# 显示结果
if [ $? -eq 0 ]; thenecho "恢复成功!"
elseecho "恢复失败!请确认服务器已执行:SET GLOBAL require_secure_transport = OFF;"
fi# 延迟15秒后自动退出
echo "15秒后自动退出..."
sleep 15
exit 0