萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 結構備份全攻略:mysqldump 導出表結構與庫結構的最佳實踐

核心參數:-d / --no-data

mysqldump -d 僅導出結構定義(CREATE TABLE/VIEW/PROCEDURE 等),不包含任何數據行,是架構遷移、版本控制、審計合規的核心工具。

常用備份場景與命令

1. 備份單表結構

mysqldump -u root -p -d db_name table_name > table_structure.sql

# 示例:備份 mysql 库 servers 表結構
mysqldump -u root -p'admin' -d mysql servers > /backup/mysql_servers_struct_$(date +%F).sql

2. 備份整庫結構(所有表、視圖、存儲過程、函數、觸發器)

mysqldump -u root -p -d db_name > db_structure.sql

# 示例:備份 mysql 系統庫完整結構
mysqldump -u root -p'admin123' -d mysql > /backup/mysql_full_struct_$(date +%F).sql

3. 備份多庫結構

mysqldump -u root -p -d --databases db1 db2 db3 > multi_db_struct.sql

4. 備份所有用戶庫結構(排除系統庫)

# 獲取用戶庫列表
mysql -u root -p -N -e "SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('mysql','information_schema','performance_schema','sys')" | xargs mysqldump -u root -p -d --databases > all_user_db_struct.sql

進階參數組合

參數作用推薦場景
-d / --no-data不導出數據所有結構備份
--routines導出存儲過程/函數完整結構備份(默認開啟)
--triggers導出觸發器完整結構備份(默認開啟)
--events導出事件調度器需顯式開啟
--single-transaction事務一致性讀(InnoDB)在線業務庫備份
--skip-lock-tables不鎖表配合 single-transaction
--add-drop-table加 DROP TABLE IF EXISTS重導入環境(默認開啟)
--no-create-db不包含 CREATE DATABASE目標庫已存在時

輸出文件處理與版本控制

清理註釋與空行(適合 Git 存儲)

# 過濾註釋行、空行、MySQL 版本註釋
grep -v -E "^--|^$|^\/\*!" backup.sql > backup_clean.sql

# 或使用 sed
sed -i -e '/^--/d' -e '/^$/d' -e '/^\/\*!/d' backup.sql

按表拆分文件(便於代碼審查)

#!/bin/bash
# split_struct.sh
DB=$1
OUT_DIR="/backup/struct/${DB}_$(date +%F)"
mkdir -p $OUT_DIR

mysqldump -u root -p -d $DB | awk '
  /^CREATE TABLE/ { 
    if (f) close(f); 
    match($0, /`([^`]+)`/, arr); 
    f = "'$OUT_DIR'/" arr[1] ".sql" 
  } 
  { print > f }'

自動化備份腳本(生產就緒)

#!/bin/bash
# /usr/local/bin/backup_structure.sh
BACKUP_ROOT="/backup/structure"
DATE=$(date +%F_%H-%M)
MYSQL_USER="backup_user"
MYSQL_PASS="xxx"
MYSQL_HOST="127.0.0.1"
RETENTION_DAYS=30

mkdir -p ${BACKUP_ROOT}/${DATE}

# 獲取用戶庫列表
DBS=$(mysql -h${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_PASS} -N -e \
  "SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('mysql','information_schema','performance_schema','sys')")

for DB in $DBS; do
  echo "備份庫結構: $DB"
  mysqldump -h${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_PASS} \
    -d --routines --triggers --events --single-transaction \
    --skip-lock-tables ${DB} | gzip > ${BACKUP_ROOT}/${DATE}/${DB}_struct.sql.gz
done

# 清理舊備份
find ${BACKUP_ROOT} -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} \;

echo "結構備份完成: ${BACKUP_ROOT}/${DATE}"

驗證與恢復測試

# 1. 語法檢查
mysql -u root -p test_db < backup.sql 2>&1 | head -20

# 2. 空庫導入驗證
mysql -u root -p -e "CREATE DATABASE verify_db;"
mysql -u root -p verify_db < backup.sql
mysql -u root -p -e "SHOW TABLES FROM verify_db;"

# 3. 對比源庫與目標庫結構差異
pt-table-sync --dry-run --print h=127.0.0.1,D=source_db h=127.0.0.1,D=verify_db

生產環境建議

  1. 結構備份每日一次,存儲至異地存儲(S3/OSS/NFS)
  2. 納入 Git 版本控制,追蹤 DDL 變更歷史
  3. 上線前必須在預發環境驗證結構兼容性
  4. 定期演練「空庫導入結構 → 數據遷移」全流程
copyright © 萬盛學電腦網 all rights reserved