備份是數據庫生存底線。本文系統梳理 MySQL 免費備份工具生態,對比邏輯備份、物理備份、Binlog 增量、文件級拷貝四大流派,提供 MyISAM/InnoDB 異構表的差異化策略。
| 工具/方案 | 類型 | 引擎支持 | 熱備份 | 增量 | 跨版本 | 恢復速度 |
|---|---|---|---|---|---|---|
| mysqldump | 邏輯 | 全支持 | 是(單事務) | 配合 Binlog | 優 | 慢(重建索引) |
| mysqlhotcopy | 物理 | 僅 MyISAM | 否(鎖表) | 否 | 否 | 快 |
| BACKUP TABLE | 物理 | 僅 MyISAM | 在線鎖表 | 否 | 否 | 慢(需重建索引) |
| SELECT INTO OUTFILE | 邏輯 | 全支持 | 否 | 否 | 優 | 中(LOAD DATA) |
| Binlog (mysqlbinlog) | 增量 | 全支持 | 是 | 原生 | 優 | 中 |
| XtraBackup | 物理 | InnoDB 熱備 | 是(非阻塞) | 支持 | 同大版本 | 極快 |
| 物理文件拷貝 | 物理 | 全支持 | 否(需鎖/停機) | 否 | 版本強綁定 | 最快 |
mysqldump -u$user -p$pass \
--default-character-set=utf8mb4 \
--opt \
--extended-insert=false \
--triggers \
--routines \
--hex-blob \
--lock-all-tables \
db_name > db_name.sql
--opt = --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset--lock-all-tables 全局讀鎖,保證一致性--disable-keys 導入時延遲索引構建,大幅提速mysqldump -u$user -p$pass \
--default-character-set=utf8mb4 \
--opt \
--extended-insert=false \
--triggers \
--routines \
--hex-blob \
--single-transaction \
--master-data=2 \
db_name > db_name.sql
--single-transaction:啟動一致性快照,非阻塞,需 REPEATABLE READ 隔離級--master-data=2:輸出 Binlog 位點註釋,便於增量恢復/從庫搭建--quick:流式讀取,避免大結果集佔用內存# 方式一:mysql 客戶端管道
mysql -u$user -p$pass db_name < db_name.sql
# 方式二:SOURCE 命令(需絕對路徑,mysql 進程用戶可讀)
mysql> SOURCE /backup/db_name.sql;
# 全量備份
xtrabackup --backup --target-dir=/backup/full_$(date +%F) --user=$user --password=$pass
# 增量備份(基於上次 LSN)
xtrabackup --backup --target-dir=/backup/inc_$(date +%F) \
--incremental-basedir=/backup/full_2024-01-15 --user=$user --password=$pass
# 準備/合併(恢復前必須)
xtrabackup --prepare --target-dir=/backup/full_2024-01-15
xtrabackup --prepare --target-dir=/backup/full_2024-01-15 --incremental-dir=/backup/inc_2024-01-16
# 恢復(需停止 MySQL,datadir 為空)
xtrabackup --copy-back --target-dir=/backup/full_2024-01-15
chown -R mysql:mysql /var/lib/mysql
# 1. 啟用 Binlog (my.cnf)
[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=ROW
expire_logs_days=7
# 2. 切換 Binlog 產生新文件
FLUSH LOGS;
# 3. 定期備份 Binlog 文件(配合全量備份時間點)
rsync -av /var/lib/mysql/mysql-bin.* /backup/binlog/
# 4. 時間點恢復
mysqlbinlog --start-datetime="2024-01-15 10:00:00" \
--stop-datetime="2024-01-15 14:30:00" \
/backup/binlog/mysql-bin.000012 | mysql -u$user -p$pass db_name
STOP SLAVE SQL_THREAD → 備份 → START SLAVECHECKSUM TABLE# 表碎片整理(在線、非阻塞)
ALTER TABLE tbl_name ENGINE=InnoDB;
# 啟動強制恢復(my.cnf,僅讀模式導出數據)
[mysqld]
innodb_force_recovery = 4 # 1-6 遞增激進,4 為安全上限
| 業務級別 | 全量頻率 | 增量頻率 | 保留週期 | 驗證頻率 |
|---|---|---|---|---|
| 核心交易 | 每日 | 每小時 | 30 天全量 + 7 天增量 | 每週 |
| 重要業務 | 每週 | 每日 | 8 週全量 + 14 天增量 | 每月 |
| 一般業務 | 每週 | 無 | 4 週 | 每季 |
沒有驗證的備份 = 沒有備份。建立「備份-驗證-演練」閉環,才是真正的數據安全。