標準單表導出指令
# 本機
mysqldump -h127.0.0.1 -u dbuser -p'dbpass' -e --opt dbname tablename > tablename_bak.sql
# SSH 遠端直導(無需登入遠端主機)
ssh user@db-host "mysqldump -h127.0.0.1 -u dbuser -p'dbpass' -e --opt dbname tablename" > local_tablename_bak.sql
# 參數解析
-e, --extended-insert # 使用多行 INSERT,縮小檔案、加快還原
--opt # 等同 --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset
血淚教訓:編輯器「隱藏」資料行
現象:用 EditPlus/Notepad++/VS Code 打開 .sql,只看到 CREATE TABLE,沒有 INSERT 語句,以為備份失敗。
真相:檔案過大(如 200MB+),編輯器預設只載入前 N 行或截斷顯示,INSERT 在檔案後半段。
驗證:tail -n 5 tablename_bak.sql 或 grep -c "^INSERT" tablename_bak.sql 即可見資料行。
建議:大檔案用 less、vim、head/tail、split 處理,勿用圖形編輯器全開。
進階:壓縮、分卷、並行導出
# 管道壓縮(節省磁碟與網路)
mysqldump -u root -p db table | gzip > table.sql.gz
# 分卷(配合 split,適合傳輸限制大小)
mysqldump -u root -p db table | gzip | split -b 100m - table.sql.gz.part.
# 多表並行導出(mydumper,需額外安裝)
mydumper -h 127.0.0.1 -u root -p -B db -T table -t 8 -o ./dumpdir
# -t 8 八執行緒並行,速度提升 5-8 倍
還原驗證清單
head -n 20 table.sql 確認 CREATE TABLE 結構正確。
grep -c "^INSERT" table.sql 確認資料行筆數 > 0。
mysql -u root -p db < table.sql 還原無報錯。
SELECT COUNT(*) FROM db.table; 對比筆數一致。
CHECKSUM TABLE db.table; 來源/目標校驗碼一致(最強驗證)。
常見參數陷阱
| 參數 | 誤區 | 正確用法 |
| -p | -ppass 無空格;-p pass 會提示輸入 | -p'pass' 或 --password='pass' 最明確 |
| --single-transaction | 只對 InnoDB 有效;MyISAM 仍會鎖表 | InnoDB 表必加,確保一致性快照不阻塞寫入 |
| --master-data=2 | 以註解形式記錄 binlog 位點,適合建立 Slave | 遷移/建 Slave 時必加 |
| --no-data (-d) | 僅導結構 | 結構遷移、建測試庫用 |
| --where | 導出部分資料 | --where="id > 1000 AND status=1" |
備份未驗證等於沒備份。建立「導出 → 壓縮 → 校驗 → 異地存放 → 定期演練還原」完整閉環,才是資料安全的基石。