MySQL 備份策略分為「檔案層級直接複製」與「邏輯備份工具」兩大流派。本文詳細比較兩者優缺點、適用場景與操作步驟,並完整說明 mysqldump 核心參數與還原指令。
原理: MyISAM 引擎將每個資料庫對應一個資料夾,裡含 .frm(結構)、.MYD(資料)、.MYI(索引)。若直接複製整個資料庫資料夾至同版本、同架構的 MySQL datadir,即可完成遷移/還原。
FLUSH TABLES WITH READ LOCK 確保一致性)。datadir/資料庫名 整個資料夾到目標機器相同路徑。| 優點 | 缺點/風險 |
|---|---|
| 速度極快(檔案層級複製) | 僅限 MyISAM,InnoDB 共用表空間無法單庫複製 |
| 無需 SQL 解析、相容性問題少 | 需完全相同版本、相同作業系統、相同架構(32/64位) |
| 適合大量資料快速遷移 | 官方未正式文檔化,升級版本可能失效 |
| 無法做增量備份、無法跨版本遷移 |
mysqldump 將資料庫導出為 SQL 腳本,支援跨版本、跨平台、跨引擎,是官方推薦的標準備份方式。
mysqldump [options] db_name [tables]
mysqldump [options] --databases db1 db2 ...
mysqldump [options] --all-databases
| 參數 | 說明 |
|---|---|
--opt | 綜合優化選項:--quick --add-drop-table --add-locks --extended-insert --lock-tables,產出最快匯入的 SQL。 |
--quick, -q | 不緩衝查詢結果直接輸出,避免大表佔滿記憶體。 |
--add-drop-table | 每個 CREATE TABLE 前加 DROP TABLE IF EXISTS,還原時自動覆蓋。 |
--add-locks | 每表導出前 LOCK TABLES、後 UNLOCK TABLES,加速插入。 |
--extended-insert, -e | 使用多行 INSERT 語法,減小檔案、加快匯入。 |
--lock-tables, -l | 備份期間鎖定所有表(MyISAM 需要),InnoDB 建議改用 --single-transaction。 |
--single-transaction | InnoDB 專用:啟動交易一致性讀取,不鎖表,適合線上熱備份。 |
--no-create-info, -t | 僅導出資料,不含 CREATE TABLE。 |
--no-data, -d | 僅導出結構,不含資料。 |
--where, -w | 條件篩選導出資料,如 -w "id>100"。 |
--host, -h | 指定遠端主機。 |
--user, -u | 指定用戶名。 |
--password, -p | 指定密碼(-ppwd 或留空互動輸入)。 |
--port, -P | 指定埠號。 |
--socket, -S | 指定本地 socket 檔。 |
--compress, -C | 啟用壓縮傳輸(客戶端與伺服器均需支援)。 |
--flush-logs, -F | 備份前刷新二進位日誌,配合 PITR(時間點復原)。 |
--master-data | 在輸出中加入 CHANGE MASTER TO,記錄備份時的 binlog 位置,支援主從同步初始化。 |
# 1. 單庫完整備份(生產環境推薦,InnoDB 熱備份)
mysqldump --single-transaction --master-data=2 --flush-logs --routines --triggers -u root -p db_name > backup_$(date +%F).sql
# 2. 僅導出結構
mysqldump --no-data -u root -p db_name > schema.sql
# 3. 導出特定表
mysqldump -u root -p db_name table1 table2 > tables.sql
# 4. 所有資料庫
mysqldump --all-databases --single-transaction -u root -p > all_dbs.sql
# 5. 遠端備份並壓縮
mysqldump -h 192.168.1.10 -u backup_user -p --single-transaction db_name | gzip > backup.sql.gz
# 1. 建立目標資料庫
mysqladmin -u root -p create target_db
# 2. 匯入 SQL 腳本
mysql -u root -p target_db < backup.sql
# 3. 壓縮檔直接匯入
gunzip < backup.sql.gz | mysql -u root -p target_db
log_bin,配合 --master-data 記錄位置,異常時可做 Point-In-Time Recovery。--where 分批或 mydumper 多執行緒工具。選擇備份方式取決於引擎、版本一致性、停機容忍度與復原時間目標(RTO)。生產環境強烈建議以 mysqldump --single-transaction 或 mydumper/Percona XtraBackup(InnoDB 物理熱備份)為主,檔案複製法僅作為同版本 MyISAM 快速遷移的輔助手段。