| 層級 | 工具/方式 | 特點 | RPO/RTO |
|---|---|---|---|
| 邏輯全量 | mysqldump --single-transaction --routines --triggers --events | 可跨版本、可編輯、壓縮率高 | RPO=備份間隔、RTO=導入時間 |
| 物理全量 | xtrabackup / mysqlbackup (企業版) | 非阻塞、速度快、含索引、支援增量 | RPO=備份間隔、RTO=拷貝+應用日誌 |
| 二進制日誌 | log_bin + expire_logs_days | 增量變更、支援 PITR | RPO=秒級、RTO=重放時間 |
| 快照/複製 | LVM/ZFS/EBS 快照、檔案系統複製 | 近零影響、需一致性鎖或 crash-consistent | RPO=快照間隔、RTO=掛載時間 |
mysqldump -u root -p \
--single-transaction \ # InnoDB 一致性快照,無鎖
--routines --triggers --events \
--master-data=2 \ # 輸出 CHANGE MASTER TO 註解 (binlog 位置)
--hex-blob \ # 二進制欄位十六進制輸出
--quick \ # 逐行輸出,不緩衝全表
--compress \ # 壓縮傳輸
--databases db1 db2 > backup_$(date +%F).sql
mysql -u root -p < backup_2024-01-15.sql
若為 GTID 複寫環境,導入前需 SET @@GLOBAL.gtid_purged='...' 或使用 --set-gtid-purged=OFF。
--master-data=2 註解中)。mysqlbinlog --start-position=12345 --stop-datetime='2024-01-15 14:30:00' \
mysql-bin.000123 | mysql -u root -p
從全量備份中提取單表:
# 方法一:sed/awk 提取 (適合小表)
sed -n '/^CREATE TABLE `target_table`/,/^CREATE TABLE `/p' backup.sql > table.sql
# 方法二:載入到臨時實例再 mysqldump 單表 (推薦大表)
# 1. 啟動臨時實例 datadir=/tmp/recovery
# 2. 載入全量備份
# 3. mysqldump --single-transaction temp_db target_table > target_table.sql
# 4. 導入生產庫
# xtrabackup 還原
xtrabackup --prepare --target-dir=/backup/full
systemctl stop mysql
rm -rf /var/lib/mysql/*
xtrabackup --copy-back --target-dir=/backup/full
chown -R mysql:mysql /var/lib/mysql
systemctl start mysql
FLUSH LOGS 產生新 binlog,避免後續寫入干擾。mysqlbinlog 定位誤操作前的位置。binlog_row_image=FULL,可用 binlog2sql 反解生成回滾 SQL。CHECKSUM TABLE、pt-table-checksum)。