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

mysqldump 進階深度解析:權限模型、開關詳解、表級導出與存儲過程備份

     編輯:MySQL 資料庫相關知識

一、權限前置要求

  • 最低權限:SELECT + LOCK TABLES(目標庫/表)。
  • 使用 --tab 導出文本文件:額外需 FILE 權限(服務器進程寫文件)。
  • 導出存儲過程/函數/觸發器/事件:需 SHOW ROUTINE/TRIGGER/EVENT 權限(通常 SELECT on mysql.proc 等)。
  • 建議創建專用備份賬號:
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'StrongPass123!';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, PROCESS
ON *.* TO 'backup'@'localhost';
-- 若需 --tab
GRANT FILE ON *.* TO 'backup'@'localhost';
FLUSH PRIVILEGES;

二、完整開關參數詳解(補充 88238 文檔)

開關別名詳細行為
--add-drop-table每 CREATE TABLE 前插入 DROP TABLE IF EXISTS \`tbl\`;
--add-locks每表數據段包裹 LOCK TABLES \`tbl\` WRITE; ... UNLOCK TABLES;(MyISAM 加速,InnoDB 單事務無效)
--allow-keywords允許創建關鍵字列名(反引號包裹)
--complete-insert-cINSERT INTO \`tbl\` (\`col1\`,\`col2\`) VALUES ... 含列名,跨表導入安全
--compress-C客戶端-服務器協議壓縮(慢網絡有效)
--delayed-insertINSERT DELAYED(MyISAM/MEMORY 有效,InnoDB 忽略)
--extended-insert-e多行 VALUES (..),(..),...(默認開啟,--skip-extended-insert 關閉)
--flush-logs-F導出前 FLUSH LOGS 切換 binlog,配合 --master-data 定位
--force-f遇錯誤繼續(如表損壞、權限不足跳過)
--lock-tables-l每庫鎖表(MyISAM 一致性),與 --single-transaction 互斥
--no-create-info-t不輸出 CREATE TABLE,僅數據
--no-data-d不輸出 INSERT,僅結構
--opt綁定 --quick --add-drop-table --add-locks --extended-insert --lock-tables --set-charset --disable-keys(默認開啟)
--quick-q流式讀取(mysql_use_result),不緩存全表結果集,**大表必加**
--tab=path-T每表生成 tbl.sql(結構) + tbl.txt(數據),需服務器同機、FILE 權限、目錄可寫
--fields-terminated-by=,配合 -T,字段分隔符(默認 Tab)
--fields-enclosed-by='"'配合 -T,字段引用符(默認無)
--fields-escaped-by='\\'配合 -T,轉義符(默認 \)
--lines-terminated-by='\n'配合 -T,行結束符(默認 \n)
--routines-R導出存儲過程/函數(CREATE PROCEDURE/FUNCTION)
--triggers導出觸發器(默認開啟,--skip-triggers 關閉)
--events導出事件調度器
--databases-B後續參數視為库名,輸出 CREATE DATABASE / USE
--tables後續參數視為表名(跳過 -B 解析),混合導出利器
--where="cond"-w只導出滿足條件的行(如 id>1000、created_at>='2023-01-01')
--ignore-table=db.tbl排除表(可多次)
--set-gtid-purged={ON|OFF|AUTO}GTID 模式下控制 SET @@GLOBAL.GTID_PURGED 輸出(8.0/5.7.18+)
--default-character-set=utf8mb4強制連接字符集,防止亂碼,**必加**
--hex-blob二進制列十六進制(0x...),含 BLOB/BINARY/GEOMETRY 必加
--master-data=2輸出 -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=123; 註釋
--dump-slave=2從庫備份時記錄主庫 binlog 位置

三、實戰進階場景

1. 庫級導出 + 指定表 + 存儲過程

mysqldump -u backup -p -B db_name --tables tbl1 tbl2 -R \
  --single-transaction --master-data=2 --hex-blob \
  --default-character-set=utf8mb4 > out.sql

-B 觸發 CREATE DATABASE,--tables 限制只導 tbl1,tbl2,-R 導存儲過程。

2. 導出文本文件配合極速導入

# 導出
mysqldump -u backup -p --tab=/data/export --fields-terminated-by=, \
  --fields-enclosed-by='"' --lines-terminated-by='\n' \
  --single-transaction db tbl1

# 導入(極快,並行可用 mysqlimport)
mysqlimport -u root -p --local --fields-terminated-by=, \
  --fields-enclosed-by='"' --lines-terminated-by='\n' \
  db /data/export/tbl1.txt

3. 增量導出(按時間/主鍵)

# 按主鍵範圍
mysqldump -u backup -p --where="id BETWEEN 1000001 AND 2000000" \
  --single-transaction db big_table > incr_part2.sql

# 按時間(需索引支持)
mysqldump -u backup -p --where="created_at >= '2023-07-01'" \
  --single-transaction db log_table > incr_jul.sql

4. 存儲過程/觸發器/事件專項備份

mysqldump -u backup -p --no-data --routines --triggers --events \
  --default-character-set=utf8mb4 db > routines_only.sql

四、恢復驗證腳本

#!/bin/bash
# restore_test.sh
set -e
DB=test_restore_$(date +%s)
mysql -u root -p -e "CREATE DATABASE $DB CHARACTER SET utf8mb4;"
mysql -u root -p $DB < full_backup.sql
# 校驗表數、行數、關鍵表 checksum
mysql -u root -p -e "SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA='$DB';"
mysql -u root -p -e "CHECKSUM TABLE $DB.critical_table;"
echo "Restore test passed for $DB"
mysql -u root -p -e "DROP DATABASE $DB;"

五、常見陷阱補充

  • --tab 導出的 .txt 文件**不含列名**,導入時需 --columns 指定或表結構完全一致。
  • --master-data=1 輸出可執行的 CHANGE MASTER TO,**從庫導入時會報錯**(已有主庫信息),建議統一用 =2(註釋)。
  • GTID 模式下導入報 GTID_PURGED 錯誤:導入前執行 SET @@GLOBAL.GTID_PURGED=''; 或導出加 --set-gtid-purged=OFF。
  • 5.7/8.0 默認 sql_mode 嚴格,導入舊版導出可能報 Invalid default value、Data too long,需臨時放寬 sql_mode 或修正 SQL。
  • 大事務導入慢:SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; 導入後恢復。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved