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

MySQL mysqldump 完全指南:備份、恢復、參數優化與特殊表處理

     編輯:MySQL 資料庫相關知識

核心用法:備份與恢復

單庫備份(含建庫語句)

mysqldump -u root -p123456 --databases db1 > db1_backup.sql
# 壓縮備份
mysqldump -u root -p123456 --databases db1 | gzip > db1_backup.sql.gz

單庫備份(不含建庫語句,便於異名恢復)

mysqldump -u root -p123456 db1 > db1_data.sql
# 恢復到新庫
mysql -u root -p123456 new_db < db1_data.sql

恢復

# 普通恢復
mysql -u root -p123456 db1 < db1_backup.sql
# 直接解壓恢復
gzip -dc db1_backup.sql.gz | mysql -u root -p123456 db1

關鍵參數深度解析

參數說明建議場景
--quick / -q逐行讀取表數據,不緩存整張表到記憶體(預設開啟)大表備份必開,防 OOM
--opt綜合優化開關,含 --quick --add-drop-table --add-locks --extended-insert --lock-tables 等(預設開啟)常規備份無需顯式指定
--skip-opt關閉 --opt 全家桶需精細控制行為時使用
--single-transactionInnoDB 專用,啟動一致性快照,無需鎖表(需開啟 binlog)線上熱備份首選
--master-data=2輸出 CHANGE MASTER TO 註釋,記錄備份時刻 binlog 位置搭建從庫、PITR 基準點
--routines / -R導出存儲過程、函數、觸發器應用依賴存儲邏輯時必加
--triggers導出觸發器(預設開啟)通常保持開啟
--events導出 Event 調度任務使用定時任務時必加
--no-create-db不輸出 CREATE DATABASE異名恢復、多庫合併導入
--no-create-info不輸出 CREATE TABLE僅導數據,結構已存在
--no-data僅導結構遷移結構、對比 Schema
--compact精簡輸出,去除註釋、SET 變量等生成可讀性強的 Schema 文檔
--skip-comments去除版本、時間等註釋行版本控制存儲 SQL 文件
--databases / -B後續參數視為庫名,輸出含建庫語句多庫備份
--tables後續參數視為表名指定表備份
--where加 WHERE 條件導出子集歷史數據歸檔、分表導出

大數據量備份優化策略

  1. 並行導出:使用 mydumper 或自寫腳本按表並行 mysqldump,充分利用多核 CPU。
  2. 分片導出:大表配合 --where="id BETWEEN 1 AND 1000000" 分批導出,避免單文件過大導入失敗。
  3. 壓縮傳輸:mysqldump ... | gzip -c | ssh target "gunzip | mysql ..." 跨機器直接遷移,落地不佔磁碟。
  4. 關閉不必要的索引:導入前 DROP INDEX 非主鍵索引,導入後重建,大幅提升載入速度。

臨時表與 HEAP 表特殊說明

臨時表(CREATE TEMPORARY TABLE)

  • 僅在當前會話可見,斷開自動釋放。
  • mysqldump 不會 導出臨時表結構與數據。

HEAP (MEMORY) 表

  • 數據存內存,哈希索引,極快但重啟丟失。
  • 限制:不支援 BLOB/TEXT、AUTO_INCREMENT、NULL 索引、範圍查詢(僅 = 和 <=>)。
  • 必須指定 MAX_ROWS 防止佔滿內存;受 max_heap_table_size 限制。
  • mysqldump 會導出結構與數據,恢復後數據重新載入內存。

生產環境備份腳本範例(生產就緒)

#!/bin/bash
# 每日全量 + 增量 binlog 備份
BACKUP_DIR="/backup/mysql/$(date +%F)"
mkdir -p "$BACKUP_DIR"

# 全量備份(InnoDB 熱備,含 binlog 位置)
mysqldump -uroot -p"$MYSQL_PWD" \
  --single-transaction --master-data=2 --routines --triggers --events \
  --databases $(mysql -uroot -p"$MYSQL_PWD" -N -e "SHOW DATABASES LIKE 'biz_%';" | tr '\n' ' ') \
  | gzip > "$BACKUP_DIR/full_$(date +%H%M).sql.gz"

# 清理 7 天前備份
find /backup/mysql -type f -mtime +7 -name '*.gz' -delete

# 備份 binlog(需配置 log_bin 與 expire_logs_days)
rsync -av /var/lib/mysql/mysql-bin.* /backup/binlog/

常見坑點提醒

  • 導出不含存儲過程:忘加 -R 導致遷移後功能缺失。
  • 字符集亂碼:指定 --default-character-set=utf8mb4,確保連線與導出字符集一致。
  • --lock-all-tables 衝突:配合 --single-transaction 時不可同時使用 --lock-tables。
  • GTID 模式下恢復:目標庫需先 RESET MASTER 或 SET GTID_PURGED,否則報錯。

總結

mysqldump 是 MySQL 生態最通用的邏輯備份工具,掌握核心參數組合、大表優化策略與自動化腳本編寫,是 DBA 交付穩定備份體系的基本功。記住:備份未驗證恢復,等於沒備份。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved