首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

mysqldump 參數完整指南:導出導入大數據庫的最佳實踐

     編輯:MySQL 資料庫相關知識

mysqldump 參數完整指南:導出導入大數據庫的最佳實踐

當資料量大到 PHPMyAdmin、MySQL Workbench 等 GUI 工具力不從心時,命令列工具 mysqldump 是唯一可靠選擇。本文系統整理核心參數、常用組合與大數據庫遷移實戰技巧。

基本語法

mysqldump [OPTIONS] database [tables]
mysqldump [OPTIONS] --databases db1 [db2 ...]
mysqldump [OPTIONS] --all-databases

不指定表則導出整庫。執行 mysqldump --help 查看版本支援的完整選項。

關鍵參數詳細解析

參數短參數功能說明建議場景
--add-locks-每表導出前加 LOCK TABLES,後 UNLOCK TABLES。加速導入導入時預設開啟(含於 --opt)
--add-drop-table-每 CREATE TABLE 前加 DROP TABLE IF EXISTS重建環境、測試庫同步
--complete-insert-c使用完整 INSERT 語法(含欄位名)。避免欄位順序變更導致錯誤異構遷移、版本升級
--extended-insert-e多行合併 INSERT(INSERT INTO t VALUES (...),(...),...)。大幅縮小檔案、加速導入大數據庫必開(--opt 含之)
--quick-q不將整個結果集載入記憶體,逐行讀取寫出。大表必須,否則 OOM大數據庫必開(--opt 含之)
--opt-組合開啟:--add-drop-table --add-locks --create-options --quick --extended-insert --lock-tables --set-charset --disable-keys預設開啟,一般無需額外指定
--single-transaction-InnoDB 熱備份核心。啟動一致性快照,不鎖表,保證時間點一致性InnoDB 生產備份必加
--lock-tables-l鎖定所有表(READ LOCAL)。MyISAM 必須;InnoDB 用 --single-transaction 替代MyISAM 表備份
--no-data-d僅導出結構(DDL),不導資料結構遷移、審核 Schema
--no-create-info-t僅導出資料(INSERT),不含 CREATE TABLE資料同步、增量導入
--routines-R導出預存程序與函數完整遷移
--triggers--triggers導出觸發器(預設開啟)完整遷移
--events-E導出 Event 排程任務完整遷移
--hex-blob-二進位欄位(BLOB/BINARY)以十六進位導出,避免編碼問題含二進位資料的表
--default-character-set-指定連線字元集,防止亂碼非 utf8mb4 預設環境
--master-data=2-輸出 CHANGE MASTER TO 註解(2=註解形式),記錄 Binlog 位點,支援主從搭建主從同步初始化
--flush-logs-F備份前刷新 Binlog,配合 --master-data 獲得精確位點主從搭建、時間點恢復
--compress-C客戶端/伺服器通訊壓縮,低頻寬環境加速跨網段備份
--force-f遇錯誤繼續執行,不中斷損壞表搶救

大數據庫導出實戰組合

方案 A:InnoDB 生產熱備份(推薦)

mysqldump -u root -p \
  --single-transaction \
  --quick \
  --extended-insert \
  --hex-blob \
  --routines --triggers --events \
  --master-data=2 \
  --flush-logs \
  --default-character-set=utf8mb4 \
  my_database > backup_$(date +%F).sql

方案 B:MyISAM 傳統備份(需鎖表)

mysqldump -u root -p \
  --lock-tables \
  --quick \
  --extended-insert \
  --hex-blob \
  --routines --triggers --events \
  my_database > backup_$(date +%F).sql

方案 C:僅導出結構(Schema 遷移)

mysqldump -u root -p --no-data --routines --triggers --events my_database > schema.sql

方案 D:分表並行導出(極大表加速)

# 先導出結構
mysqldump -u root -p --no-data my_database > schema.sql

# 大表分批導出(配合 WHERE 條件)
mysqldump -u root -p --quick --where="id BETWEEN 1 AND 1000000" my_database big_table > big_table_part1.sql
mysqldump -u root -p --quick --where="id BETWEEN 1000001 AND 2000000" my_database big_table > big_table_part2.sql
# ... 並行執行多個分批

導入優化技巧

  1. 關閉自動提交與唯一檢查:
    mysql -u root -p my_database < backup.sql
    # 或在 SQL 檔案開頭加入:
    SET autocommit=0;
    SET unique_checks=0;
    SET foreign_key_checks=0;
    # 檔案結尾加入:
    SET foreign_key_checks=1;
    SET unique_checks=1;
    SET autocommit=1;
    COMMIT;
    
  2. 大檔案分批導入:split -l 100000 backup.sql part_ 然後逐個導入
  3. 使用 LOAD DATA INFILE 替代 INSERT:導出時加 --tab=/tmp --fields-terminated-by=',' 產生文字檔,導入快 20 倍
  4. 調大 max_allowed_packet:客戶端與伺服器同步設大(如 1G)防止大封包中斷

常見問題排查

現象原因解決
Out of memory / Killed未用 --quick,結果集全載入記憶體加上 --quick(--opt 含之)
MySQL server has gone away封包過大或導入耗時超過 wait_timeout調大 max_allowed_packet、wait_timeout
導入極慢自動提交、索引逐行維護、無批次關閉 autocommit/unique_checks,用 --extended-insert
編碼亂碼字元集不一致指定 --default-character-set=utf8mb4,確保資料庫/表/連線三者一致
備份檔案過大未壓縮、含不需要資料管線壓縮:mysqldump ... | gzip > backup.sql.gz
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved