MySQL 備份核心工具 mysqldump 功能強大但參數繁多。本文整理從單表到全庫、從本地到遠程、從文本到壓縮、從手動到自動化的完整備份腳本庫,並深度解析關鍵參數,助你構建企業級備份體系。
| 參數 | 作用 | 建議 |
|---|---|---|
--single-transaction | InnoDB 熱備份,啟動一致性快照,不鎖表 | ✅ 生產必加 |
--routines | 備份預存程序/函數 | ✅ |
--triggers | 備份觸發器 | ✅ |
--events | 備份定時任務 | ✅ |
--quick / -q | 流式讀取,不緩存整個結果集到記憶體 | ✅ 大表必加 |
--hex-blob | 二進制欄位用十六進制導出,避免字元集問題 | ✅ |
--add-drop-table | 建表前加 DROP TABLE,便於覆蓋還原 | 按需 |
--no-data / -d | 只備份結構(Schema) | 遷移結構用 |
--no-create-info / -t | 只備份資料,不含建表語句 | 資料遷移用 |
--databases / -B | 多庫備份,輸出包含 CREATE DATABASE/USE | 多庫備份 |
--all-databases / -A | 備份所有資料庫 | 全例備份 |
--master-data=2 | 輸出 CHANGE MASTER TO 註釋(從庫同步座標) | 主從搭建 |
--flush-logs | 備份前切換 Binlog,配合增量備份 | 增量備份基點 |
mysqldump -h localhost -u root -p \
--single-transaction --routines --triggers --events \
--quick --hex-blob --add-drop-table \
my_database > backup_$(date +%F_%H-%M-%S).sql
mysqldump -u root -p --single-transaction --quick my_database | gzip > backup_$(date +%F).sql.gz
# 解壓還原
gunzip < backup.sql.gz | mysql -u root -p my_database
mysqldump -u root -p my_database users orders products > backup_tables.sql
mysqldump -u root -p --databases db1 db2 db3 > multi_db_backup.sql
mysqldump -u root -p --no-data --databases db1 db2 > schema_only.sql
mysqldump -u root -p --all-databases --single-transaction --routines --triggers --events > full_instance_backup.sql
mysqldump -h source_host -u root -p --single-transaction my_database | \
mysql -h target_host -u root -p -C my_database
@echo off
set MYSQL_BIN="C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump.exe"
set DB_USER=root
set DB_PASS=your_password
set DB_NAME=my_database
set BACKUP_DIR=D:\MySQL_Backup
set YMD=%date:~0,4%%date:~5,2%%date:~8,2%
set HMS=%time:~0,2%%time:~3,2%%time:~6,2%
set HMS=%HMS: =0%
mkdir "%BACKUP_DIR%\%YMD%" 2>nul
%MYSQL_BIN% -u%DB_USER% -p%DB_PASS% --single-transaction --routines --triggers --events --quick --hex-blob %DB_NAME% > "%BACKUP_DIR%\%YMD%\%DB_NAME%_%YMD%_%HMS%.sql"
if %errorlevel% equ 0 (
echo [%date% %time%] Backup OK
) else (
echo [%date% %time%] Backup FAILED
exit /b 1
)
REM 保留 7 天
forfiles /p "%BACKUP_DIR%" /s /m *.* /d -7 /c "cmd /c del @path" 2>nul
#!/bin/bash
# /usr/local/bin/mysql_daily_backup.sh
# Cron: 0 2 * * * /usr/local/bin/mysql_daily_backup.sh >> /var/log/mysql_backup.log 2>&1
set -euo pipefail
DB_USER="root"
DB_PASS="your_password"
DB_NAME="my_database"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%F_%H-%M-%S)
FILE="${DB_NAME}_${DATE}.sql.gz"
mkdir -p "${BACKUP_DIR}/$(date +%F)"
mysqldump -u${DB_USER} -p${DB_PASS} \
--single-transaction --routines --triggers --events --quick --hex-blob \
${DB_NAME} | gzip > "${BACKUP_DIR}/$(date +%F)/${FILE}"
if [[ ${PIPESTATUS[0]} -eq 0 ]]; then
echo "[$(date)] OK: ${FILE}"
else
echo "[$(date)] FAILED" >&2
exit 1
fi
find "${BACKUP_DIR}" -type f -name "*.sql.gz" -mtime +7 -delete
| 備份類型 | 還原命令 |
|---|---|
| 純 SQL 檔 | mysql -u root -p db_name < backup.sql |
| 壓縮 SQL (.gz) | gunzip < backup.sql.gz | mysql -u root -p db_name |
| 多庫備份 (含 CREATE DATABASE) | mysql -u root -p < multi_db_backup.sql |
| 全例備份 | mysql -u root -p < full_backup.sql |
| 只還原某表 (從全量備份中提取) | sed -n '/^CREATE TABLE `table_name`/,/^CREATE TABLE/p' full_backup.sql | mysql -u root -p db_name |
mysqldump 參數組合決定備份質量:**生產環境必加 --single-transaction --routines --triggers --events --quick --hex-blob**。配合壓縮、加密、異地存儲、定時任務、自動驗證,構建「可恢復、可審計、可擴展」的備份體系。記住:**未經驗證的備份 = 沒有備份。**