MySQL 備份分為邏輯備份 (SQL 語句) 與物理備份 (資料檔案) 兩大類。本文系統整理四種備份類型、三種備份狀態、主流工具對比與企業級備份腳本實戰。
| 類型 | 說明 | 頻率建議 | 優/缺點 |
|---|---|---|---|
| 完全備份 | 整個資料庫所有物件 | 每週 1 次 | 完整但耗時耗空間 |
| 交易日誌備份 | 增量變更記錄 | 每小時/更頻繁 | 快、空間小、需完整備份為基準 |
| 差異/增量備份 | 上次完全備份後的變更 | 每天 1 次 | 恢復快、介於完全與日誌間 |
| 檔案備份 | 資料庫檔案層面備份 | 極大資料庫專用 | 需多檔案儲存架構 |
# MyISAM (需鎖表) mysqldump --databases test --lock-all-tables --flush-logs > backup_`date +%F-%H-%M`.sql # InnoDB (熱備份,無需鎖表) mysqldump --databases test --single-transaction --flush-logs --master-data=2 > backup_`date +%F-%H-%M`.sql # 只備份結構 mysqldump -u user -p -d --add-drop-table db_name > structure.sql
恢復注意: SET SQL_LOG_BIN=0; 關閉二進制日誌加速恢復。
# 1. 加全域讀鎖並刷新日誌 mysql> FLUSH TABLES WITH READ LOCK; mysql> FLUSH LOGS; # 2. 建立快照卷 (需 LVM 環境) lvcreate -L 1G -s -n data-snap -p -r /dev/myvg/mydata # 3. 釋放鎖 mysql> UNLOCK TABLES; # 4. 掛載快照備份 mount -r /dev/myvg/data-snap /mnt/snap tar -czf backup.tar.gz /mnt/snap # 5. 釋放快照 umount /mnt/snap lvremove /dev/myvg/data-snap
# 視窗 1: 加鎖並記錄 binlog 位置 mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS; -- 記錄 File, Position # 視窗 2: 打包資料目錄 cd /usr/local/mysql/data tar -zcvf mysql_backup_`date +%F`.tar.gz ./ # 視窗 1: 釋放鎖 mysql> UNLOCK TABLES;
innodb_file_per_table=ON)# 完全備份 xtrabackup --backup --target-dir=/backup/full --user=root --password=xxx # 增量備份 (基於上次完全備份) xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full # 準備/恢復 xtrabackup --prepare --target-dir=/backup/full xtrabackup --prepare --target-dir=/backup/full --incremental-dir=/backup/inc1 xtrabackup --copy-back --target-dir=/backup/full