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;
| 開關 | 別名 | 詳細行為 |
|---|---|---|
--add-drop-table | 每 CREATE TABLE 前插入 DROP TABLE IF EXISTS \`tbl\`; | |
--add-locks | 每表數據段包裹 LOCK TABLES \`tbl\` WRITE; ... UNLOCK TABLES;(MyISAM 加速,InnoDB 單事務無效) | |
--allow-keywords | 允許創建關鍵字列名(反引號包裹) | |
--complete-insert | -c | INSERT INTO \`tbl\` (\`col1\`,\`col2\`) VALUES ... 含列名,跨表導入安全 |
--compress | -C | 客戶端-服務器協議壓縮(慢網絡有效) |
--delayed-insert | INSERT 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 位置 |
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 導存儲過程。
# 導出
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
# 按主鍵範圍
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
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_PURGED 錯誤:導入前執行 SET @@GLOBAL.GTID_PURGED=''; 或導出加 --set-gtid-purged=OFF。sql_mode 嚴格,導入舊版導出可能報 Invalid default value、Data too long,需臨時放寬 sql_mode 或修正 SQL。SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; 導入後恢復。