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