mysqldump 是最通用的邏輯備份工具,但默認參數存在鎖表時間長、非一致性、誤刪風險等坑點。本文梳理生產級參數組合、增量備份策略、主從搭建標準流程、全量+二進制日誌恢復實戰。
| 默認參數 | 風險 | 建議 |
|---|---|---|
--lock-tables | 全庫鎖表,阻塞寫入 | 改用 --single-transaction(InnoDB) |
--add-drop-table | 生成 DROP TABLE,誤執行導致數據丟失 | 恢復時加 --skip-add-drop-table 或手動審核 |
不含 --routines | 不備份存儲過程/函數 | 顯式加上 --routines --triggers --events |
不含 --master-data | 無 Binlog 位點,無法做增量恢復/搭建從庫 | 加 --master-data=2(註釋輸出) |
# 核心業務庫(InnoDB 為主) mysqldump -u$USER -p$PASS \ --single-transaction \ --master-data=2 \ --routines --triggers --events \ --flush-logs \ --databases db1 db2 db3 \ > /backup/full_$(date +%F_%H%M).sql # 系統庫(MyISAM,需鎖表獲取一致性) mysqldump -u$USER -p$PASS \ --flush-privileges \ --lock-all-tables \ --databases mysql \ > /backup/mysql_sys_$(date +%F_%H%M).sql
參數解析:
--single-transaction:啟動事務快照(RR 隔離級別),無鎖一致性備份,**僅適用 InnoDB**--master-data=2:輸出 CHANGE MASTER TO MASTER_LOG_FILE='binlog.xxx', MASTER_LOG_POS=yyy; 作為註釋,不加鎖(配合 single-transaction)--flush-logs:備份瞬間滾動 Binlog,便於增量備份切分點對齊--routines --triggers --events:完整備份可編程對象# 1. 定時滾動 Binlog(每小時/每日) mysqladmin -u$USER -p$PASS flush-logs # 2. 歸檔滾動前的 Binlog 文件 # 從 master-data=2 記錄的位點開始,收集所有後續 Binlog # 建議:rsync 到異地存儲,保留 7-30 天 # 3. 定期清理(PURGE BINARY LOGS TO 'binlog.xxx') # 僅在確認全量備份+後續 Binlog 完整可用後執行
server-id=1, log_bin=mysql-bin, binlog_format=ROW, sync_binlog=1, innodb_flush_log_at_trx_commit=1server-id=101, relay_log=relay-bin, read_only=1, skip_slave_start=1GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.%' IDENTIFIED BY 'StrongPass';
mysqldump -uroot -p \ --single-transaction --master-data=2 --routines \ --databases db1 db2 > /backup/repl_base.sql
scp /backup/repl_base.sql slave_host:/tmp/ mysql -uroot -p < /tmp/repl_base.sql
head -50 /tmp/repl_base.sql | grep "CHANGE MASTER TO" # 輸出:-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000010', MASTER_LOG_POS=809; mysql -uroot -p -e " CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl', MASTER_PASSWORD='StrongPass', MASTER_LOG_FILE='mysql-bin.000010', MASTER_LOG_POS=809; START SLAVE; SHOW SLAVE STATUS\G"
驗證 Slave_IO_Running: Yes, Slave_SQL_Running: Yes
場景:誤執行 DELETE FROM users WHERE id > 100,需恢復到誤操作前。
full_20240115_0200.sql + 後續所有 Binlog# 停服務、清空 datadir、重新初始化 systemctl stop mysqld rm -rf /var/lib/mysql/* /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql systemctl start mysqld mysql_secure_installation # 設置密碼 # 導入全量 mysql -uroot -p < full_20240115_0200.sql
# 1. 解析 Binlog 定位誤操作位置 mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000027 | grep -n -A5 -B5 "DELETE FROM users" # 找到 position=12345 # 2. 應用 Binlog 到指定位置(排除誤操作事務) mysqlbinlog --stop-position=12345 mysql-bin.000027 | mysql -uroot -p mysqlbinlog mysql-bin.000028 | mysql -uroot -p # 後續完整 Binlog
SELECT COUNT(*) FROM users; 恢復正確--quick(默認開啟)流式讀取,避免緩存整個結果集SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;,導入後 COMMIT; 恢復--default-character-set=utf8mb4,或確保 my.cnf client 區塊已配置--set-gtid-purged=OFF 避免 GTID 集合衝突(5.6+)mysql -uroot -p < shard_x.sql &| 場景 | 推薦工具 | 理由 |
|---|---|---|
| 小/中型庫(< 100GB)、異構遷移、邏輯審計 | mysqldump | 通用、可編輯、跨版本 |
| 大型庫(> 100GB)、極速恢復、物理一致性 | XtraBackup / MyDumper | 物理備份、並行、無鎖、恢復快 |
| 主從搭建(大庫) | XtraBackup + xtrabackup_binlog_info | 無需鎖表、自動記錄 Binlog 位點 |
| 雲遷移 | 云廠商 DTS / mydumper/loader | 並行、增量同步、校驗 |