首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 備份神器 mysqldump 參數詳解與最佳實踐

     編輯:MySQL 綜合教學

MySQL 備份神器 mysqldump 參數詳解與最佳實踐

mysqldump 是 MySQL 官方提供的邏輯備份工具,支援全庫、單表、結構、資料、壓縮、遠端等多種場景。掌握核心參數,能應對 99% 的備份遷移需求。

一、基礎語法

mysqldump [options] db_name [tbl_name ...]
mysqldump [options] --databases db_name ...
mysqldump [options] --all-databases

二、核心參數分類速查表

分類參數短選項說明建議場景
連線認證--host-h主機名/IP遠端備份
--user-u用戶名
--password-p密碼(不建議明文,留空交互輸入)
--port-P端口,預設 3306
輸出控制--no-data-d僅導出結構 (DDL)結構遷移、Schema 比對
--no-create-info-t僅導出資料 (INSERT)資料同步、測試資料製造
--add-drop-table每表前加 DROP TABLE IF EXISTS重複導入安全
--add-drop-database庫級 DROP DATABASE IF EXISTS全庫重建
--complete-insert-cINSERT 含欄位名跨版本/異構導入
--extended-insert-e多行合併 INSERT(預設開啟)大表加速,關閉利於斷點續傳
一致性與鎖--single-transactionInnoDB 熱備份,啟動事務快照InnoDB 生產必加
--lock-all-tables-x全庫鎖定 (FLUSH TABLES WITH READ LOCK)MyISAM/混合引擎
--lock-tables-l逐庫鎖定 (LOCK TABLES READ)單庫一致性
--flush-logs-F備份前切換 Binlog配合 PITR 恢復
--master-data=1 註釋 CHANGE MASTER; =2 註釋並含位置建立從庫
--dump-slave從庫備份時記錄主庫位置從庫做備份源
資料處理--hex-blob二進位欄位十六進位導出含 BLOB/BINARY/GEOMETRY 必加
--quick-q逐行讀取不緩存結果集大表必加,防 OOM
--where-wWHERE 條件過濾資料增量/分片導出
--ignore-table忽略指定表排除大日誌/臨時表
--replace用 REPLACE INTO 替代 INSERT主鍵衝突覆蓋導入
存儲程序/事件--routines-R導出預存程序/函數完整遷移
--triggers導出觸發器(預設開啟)
--events-E導出 Event Scheduler 事件
--set-gtid-purgedAUTO/OFF/ON,控制 GTID 資訊輸出GTID 複制環境

三、常用組合範例

1. 生產環境全量熱備份 (InnoDB)

mysqldump -h127.0.0.1 -uroot -p --single-transaction \
  --master-data=2 --flush-logs --hex-blob --routines --triggers --events \
  --quick --add-drop-table --extended-insert \
  --databases db1 db2 > full_$(date +%F).sql

2. 僅導出結構(Schema 遷移)

mysqldump -uroot -p --no-data --add-drop-table --routines --triggers --events db_name > schema.sql

3. 大表分片導出(配合 where 條件)

mysqldump -uroot -p --quick --where="created_at >= '2024-01-01'" db_name big_table > part1.sql

4. 遠端壓縮傳輸導入

mysqldump -h src_host -uroot -p --single-transaction --quick db_name | gzip | ssh target_host "gunzip | mysql -uroot -p db_name"

5. 導出為 CSV/TSV(便於導入其他系統)

mysqldump -uroot -p --tab=/tmp/export --fields-terminated-by=, --fields-enclosed-by=\" --lines-terminated-by=\n db_name tbl_name

四、還原/導入最佳實踐

1. 直接導入 SQL 檔

mysql -uroot -p db_name < backup.sql

2. 進入 MySQL 再 source(適合大檔案、需交互)

mysql -uroot -p db_name
mysql> source /path/to/backup.sql

3. 關閉外鍵/唯一檢查加速導入

mysql -uroot -p db_name -e "SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0; SET AUTOCOMMIT=0;"
mysql -uroot -p db_name < backup.sql
mysql -uroot -p db_name -e "SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; SET AUTOCOMMIT=1; COMMIT;"

4. 並行導入工具:myloader (mydumper 配套)

myloader -h 127.0.0.1 -u root -p -d /export_dir -t 8

五、常見坑點與解決

問題原因解決
ERROR 1153: packet too largemax_allowed_packet 過小調大 mysqld 與 client 端同參數
導出卡住/極慢未加 --quick,結果集全載入記憶體大表必加 --quick
導入報 Duplicate entry目標表已有資料加 --add-drop-table 或導入前 TRUNCATE
函數導入報 1418 錯誤binlog 開啟且函數未聲明 DETERMINISTICSET GLOBAL log_bin_trust_function_creators=1
字符集亂碼導出/導入字符集不一致指定 --default-character-set=utf8mb4
GTID 資訊干擾新叢集--set-gtid-purged=AUTO 輸出 GTID指定 --set-gtid-purged=OFF

六、自動化備份腳本範例

#!/bin/bash
# /usr/local/bin/mysql_backup.sh
BACKUP_DIR="/backup/mysql/$(date +%F)"
mkdir -p "$BACKUP_DIR"
mysqldump -uroot -p${MYSQL_PWD} --single-transaction --master-data=2 \
  --flush-logs --hex-blob --routines --triggers --events \
  --quick --add-drop-database --all-databases | gzip > "$BACKUP_DIR/full.sql.gz"
find /backup/mysql -type f -mtime +7 -name '*.gz' -delete
# crontab: 0 2 * * * /usr/local/bin/mysql_backup.sh

七、進階替代方案

  • Percona XtraBackup:物理熱備份,速度快、支援增量、不阻塞寫入,適合 TB 級
  • mydumper/myloader:多執行緒邏輯備份/還原,比 mysqldump 快 3~10 倍
  • MySQL Shell Dump/Load:MySQL 8.0+ 官方並行工具,支援 OCI Object Storage、S3 直傳
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved