MySQL 備份策略直接關係資料安全與災難恢復能力(RPO/RTO)。本文系統整理三大主流備份方式:邏輯備份(mysqldump)、熱備份工具(mysqlhotcopy)、物理檔案複製,並說明適用場景、操作指令與避坑指南。
| 需求 | 指令範例 |
|---|---|
| 備份單一資料庫 | mysqldump -h 192.168.1.100 -u root -p dbname > backup.sql |
| 備份指定資料表 | mysqldump -u root -p dbname tbl_name > tbl_backup.sql |
| 備份所有資料庫 | mysqldump -u root -p --all-databases > full_backup.sql |
| 僅備份結構(無資料) | mysqldump -u root -p -d --add-drop-table dbname > schema.sql |
| 匯入還原 | mysql -u root -p dbname < backup.sql 或 source backup.sql |
--single-transaction:InnoDB 熱備必加,取得一致性快照不鎖表。--master-data=2:備份檔含 CHANGE MASTER TO 註解,便於主從同步/增量恢復。--skip-lock-tables:避免權限不足導致 LOCK TABLES 失敗。--quick / --opt:大表備份避免記憶體暴漲(預設開啟)。⚠️ 限制:僅支援 MyISAM 引擎,需 Perl 環境(perl-DBI, perl-DBD-MySQL),且必須在資料庫伺服器本機執行。
yum -y install perl perl-DBI perl-DBD-MySQL
# 備份單一資料庫
/usr/local/mysql/bin/mysqlhotcopy -u root -p 'pwd' dbname /backup/dir
# 備份多個資料庫
/usr/local/mysql/bin/mysqlhotcopy -u root -p 'pwd' db1 db2 db3 /backup/dir
# 正則匹配資料庫名
/usr/local/mysql/bin/mysqlhotcopy -u root -p 'pwd' 'dbprefix.*' /backup/dir
# 記錄 binlog 位點(增量備份關鍵)
/usr/local/mysql/bin/mysqlhotcopy --flushlog --record_log_pos=mysql.backup_log dbname /backup/dir
datadirchown -R mysql:mysql /var/lib/mysql/dbnamenet stop mysqldata 目錄下對應資料庫資料夾net start mysql# 1. 找資料目錄
find / -name '*.MYD'
# 2. 進入目錄複製
cd /var/lib/mysql
cp -r dbname /backup/dbname_$(date +%F)
# 3. 權限修正
chown -R mysql:mysql /backup/dbname_*
# 4. 如需轉 SQL 可再用 mysqldump 匯出
| 維度 | mysqldump | mysqlhotcopy | 物理複製 |
|---|---|---|---|
| 引擎支援 | 全引擎 | 僅 MyISAM | 全引擎(需相同版本/配置) |
| 線上熱備 | 支援 (--single-transaction) | 支援 (LOCK TABLES) | 不支援(需停機) |
| 備份速度 | 較慢(SQL 解析/生成) | 極快(檔案級複製) | 極快 |
| 還原速度 | 慢(SQL 重放) | 快(檔案複製) | 快 |
| 跨版本/架構遷移 | 佳 | 差 | 差(版本、OS、配置需一致) |
| 適用場景 | 日常備份、異機還原、遷移 | 大型 MyISAM 庫、本機快速備份 | 檔案級快照、測試環境克隆 |
mysqldump --master-data=2FLUSH LOGS 產生新 binlogmysqlbinlog binlog.xxx | mysql 重放至指定位點/時間my.cnf 建議設定 expire_logs_days = 7 自動清理舊 binlog。
選對備份工具、驗證還原流程、定期演練,才是資料安全的真正保障。