備份是最後防線,恢復才是目的。建立「定期備份、開啟 Binlog、定期演練」三位一體體系。
# 備份步驟
systemctl stop mysqld
tar -zcf /backup/mysql_cold_$(date +%F).tar.gz /var/lib/mysql
systemctl start mysqld
# 備份啟動後產生的 binlog
cp /var/lib/mysql/mysql-bin.* /backup/binlog/
# 恢復步驟
systemctl stop mysqld
rm -rf /var/lib/mysql/*
tar -zxf /backup/mysql_cold_2024-01-15.tar.gz -C /
systemctl start mysqld
# 重放 binlog
mysqlbinlog /backup/binlog/mysql-bin.000001 | mysql -u root -p
優點:速度快、文件級一致性。缺點:需停服務、跨版本/架構遷移受限。
# 夜間低峰備份(-F 刷新 binlog 便於增量)
mysqldump -u root -p --single-transaction --routines --triggers --events -F db_name > db_name_$(date +%F).sql
# 壓縮
gzip db_name_$(date +%F).sql
# 恢復
mysql -u root -p db_name < db_name_2024-01-15.sql
# 重放備份後的 binlog
mysqlbinlog /var/lib/mysql/mysql-bin.000002 | mysql -u root -p
-- 導出(方法1:SELECT INTO OUTFILE)
SELECT * INTO OUTFILE '/tmp/order_tab.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM order_tab;
-- 導出(方法2:mysqldump -T)
mysqldump -u root -p -T /tmp db_name order_tab --fields-terminated-by=','
-- 導入(方法1:LOAD DATA)
LOAD DATA [LOCAL] INFILE '/tmp/order_tab.csv' INTO TABLE order_tab
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
-- 導入(方法2:mysqlimport)
mysqlimport -u root -p [--local] db_name order_tab.txt --fields-terminated-by=','
-- 跨平台注意:Windows \r\n vs Linux \n,指定 LINES TERMINATED BY
前提:log_bin=ON,binlog_format=ROW(推薦)
# 假設 10:00 發生誤操作,恢復到 09:59:59
mysqlbinlog --stop-datetime="2024-01-15 09:59:59" /var/lib/mysql/mysql-bin.000001 | mysql -u root -p
# 跳過故障時段,繼續重放後續
mysqlbinlog --start-datetime="2024-01-15 10:01:00" /var/lib/mysql/mysql-bin.000001 | mysql -u root -p
# 1. 導出故障前後 binlog 片段分析
mysqlbinlog --start-datetime="2024-01-15 09:55:00" --stop-datetime="2024-01-15 10:05:00" \
/var/lib/mysql/mysql-bin.000001 > /tmp/restore.sql
# 2. 編輯文件,定位錯誤語句前後 position(如 368312, 368315)
# 3. 恢復到錯誤前
mysqlbinlog --stop-position="368312" /var/lib/mysql/mysql-bin.000001 | mysql -u root -p
# 4. 從錯誤後繼續
mysqlbinlog --start-position="368315" /var/lib/mysql/mysql-bin.000001 | mysql -u root -p
# 損壞癥狀:查詢中斷、.MYI 丟失、記錄文件損壞
# 方法1:myisamchk(需停庫)
myisamchk -r /var/lib/mysql/db/tbl_name # 標準修復
myisamchk -o /var/lib/mysql/db/tbl_name # 強力修復(慢)
# 方法2:SQL 語句(在線)
CHECK TABLE tbl_name [QUICK|FAST|MEDIUM|EXTENDED|CHANGED];
REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [QUICK] [EXTENDED] [USE_FRM];
| 工具 | 類型 | 特點 |
|---|---|---|
| Percona XtraBackup | 物理熱備 | 開源、InnoDB 非阻塞、支持流式傳輸、增量備份 |
| MyDumper/MyLoader | 邏輯並行 | 多線程、壓縮、比 mysqldump 快 5-10 倍 |
| mysqlbinlog | Binlog 工具 | 官方、PITR 核心、支持遠程流式讀取 |
| gh-ost / pt-osc | 在線 DDL | 大表變更不鎖表、可配合備份窗口 |
備份未經恢復演練 = 沒備份。建立備份清單:庫表清單、備份頻率、保留周期、異地存儲、恢復步驟文檔、責任人、演練記錄。