資料庫備份是災難恢復的最後防線。本文針對 MyISAM 表型,詳細解析四種主流備份策略的優劣、適用場景與實作細節。
| 策略 | 類型 | 適用規模 | 優點 | 缺點 |
|---|---|---|---|---|
| 直接拷貝檔案 | 物理冷備份 | 小型、停機可接受 | 最快、最簡單 | 需鎖表停寫、無增量、跨版本風險 |
| mysqlhotcopy | 物理熱備份 | 小型、僅 MyISAM | 速度快、支援單表 | 僅本機、僅 MyISAM、Perl 相依 |
| mysqldump | 邏輯備份(全量+增量) | 中型、跨平台遷移 | 通用、可壓縮、可篩選 | 大資料集慢、鎖表久、恢復慢 |
| 主從複制 | 即時熱備份 | 大型、高可用架構 | 零停機、即時同步、可分流讀 | 架構複雜、需監控、非邏輯備份替代 |
-- 1. 鎖定所有表並刷新至磁碟
FLUSH TABLES WITH READ LOCK;
-- 2. 複製資料目錄(保持鎖定狀態下操作)
cp -r /var/lib/mysql /backup/mysql_$(date +%F)
-- 3. 釋放鎖定
UNLOCK TABLES;
恢復:停止 MySQL → 覆蓋資料目錄 → 啟動 MySQL。
# 安裝 Perl DBD::mysql
perl Makefile.PL -mysql_config=/usr/local/mysql/bin/mysql_config
make && make install
# 每日備份腳本 (crontab 0 3 * * *)
#!/bin/sh
mysqlhotcopy -u root -p 'password' --flushlog --quiet database_name /backup/mysqlhotcopy/
# 單庫
mysqldump -u root -p --single-transaction --master-data=2 --routines --triggers db_name > db_full_$(date +%F).sql
# 全庫
mysqldump -u root -p --all-databases --single-transaction --master-data=2 > all_full_$(date +%F).sql
關鍵參數:
--single-transaction:InnoDB 熱備份不鎖表--master-data=2:記錄 Binlog 位置(註解形式),利於增量恢復--routines --triggers --events:包含程式物件# 啟用 Binlog (my.cnf)
[mysqld]
log-bin = mysql-bin
server-id = 1
expire_logs_days = 7
# 定期刷新 Binlog
mysqladmin -u root -p flush-logs
# 備份新產生的 Binlog 檔案
cp /var/lib/mysql/mysql-bin.00000X /backup/binlog/
mysql -u root -p < db_full_20240101.sqlmysqlbinlog mysql-bin.00000X | mysql -u root -p詳細配置請參考 《如何配置 MySQL 主從複制》。核心優勢:
CHANGE MASTER TO MASTER_DELAY = 3600)gpg、openssl)