本文演示基於 mysqldump 的完整備份與 mysqlbinlog 增量恢復實戰流程,採雙節點架構(Node1 備份、Node2 恢復),涵蓋 MyISAM/InnoDB 不同引擎的備份策略、主從日誌座標記錄與點對點恢復驗證。
/data/mysql。hellodb,含 students 表。mkdir -p /data/mysql chown mysql:mysql /data/mysql # 複製現有 binlog 至新目錄 cp /var/lib/mysql/mysql-bin.* /data/mysql/ # 修改配置 vim /etc/my.cnf.d/server.cnf [server] log_bin=/data/mysql/mysql-bin systemctl restart mariadb
# 查看表引擎 mysql -e "USE hellodb; SHOW TABLE STATUS\G;" # MyISAM:需鎖表、記錄 binlog 座標、刷新日誌 mysqldump -uroot --lock-tables --master-data=2 --flush-logs --databases hellodb > /root/hellodb_myis.sql # InnoDB:單一交易熱備、記錄 binlog 座標、刷新日誌 mysqldump -uroot --single-transaction --master-data=2 --flush-logs --databases hellodb > /root/hellodb_inno.sql
參數說明:
--single-transaction:InnoDB 熱備核心,不鎖表。
--master-data=2:在輸出檔以註釋形式記錄 CHANGE MASTER TO MASTER_LOG_FILE='...', MASTER_LOG_POS=...;。
--flush-logs:備份瞬間滾動產生新 binlog,便於後續增量切點。
mysql -e "USE hellodb; INSERT INTO students (Name,Age,Gender,ClassID,TeacherID) VALUES ('caocao',99,'M',6,8); DELETE FROM students WHERE StuID=3;"
# 配置 binlog 目錄 mkdir -p /data/mysql vim /etc/my.cnf [mysqld] log_bin=/data/mysql/mysql-bin chown -R mysql:mysql /data systemctl start mariadb # 恢復全量備份 mysql < /root/hellodb_inno.sql # 檢查備份檔中的 binlog 座標 grep "CHANGE MASTER" /root/hellodb_inno.sql # 輸出範例:-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=245;
mysqlbinlog --start-position=245 /var/lib/mysql/mysql-bin.000002 > /root/binlog.sql scp /root/binlog.sql 192.168.1.114:/root/
mysql < /root/binlog.sql
mysql -e "USE hellodb; SELECT * FROM students;" # 預期包含新增的 caocao (StuID=26) ,且 StuID=3 已刪除
| 階段 | 關鍵動作 | 工具/參數 |
|---|---|---|
| 全量備份 | InnoDB 熱備 + 記錄 binlog 座標 | mysqldump --single-transaction --master-data=2 --flush-logs |
| 全量恢復 | 導入 SQL 並讀取備份檔中的 CHANGE MASTER 註釋 | mysql < dump.sql |
| 增量導出 | 從記錄位置解析 binlog 為 SQL | mysqlbinlog --start-position=POS log_file |
| 增量恢復 | 執行導出的 SQL | mysql < binlog.sql |