mysqldump -d 僅導出結構定義(CREATE TABLE/VIEW/PROCEDURE 等),不包含任何數據行,是架構遷移、版本控制、審計合規的核心工具。
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
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
mysqldump -u root -p -d --databases db1 db2 db3 > multi_db_struct.sql
# 獲取用戶庫列表
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 | 目標庫已存在時 |
# 過濾註釋行、空行、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