首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

mysqldump 避坑指南:--databases 參數導致誤刪數據庫的慘痛教訓

     編輯:MySQL 綜合教學

慘劇現場

執行備份命令後,**目標數據庫被清空**,僅剩 `CREATE DATABASE`/`USE` 语句,數據全無!

兩條命令的致命差異

命令 1:帶 `--databases` (禍根)

mysqldump -S /data/mysql/test_3306/mysql.sock \
  --single-transaction --force \
  --databases tpcc > v1.sql

輸出包含:
`CREATE DATABASE IF NOT EXISTS tpcc;`
`USE tpcc;`
`DROP TABLE IF EXISTS ...;`
**導入時會先 `DROP DATABASE` 重建!**

命令 2:不帶 `--databases` (安全)

mysqldump -S /data/mysql/test_3306/mysql.sock \
  --single-transaction --force \
  tpcc > v2.sql

輸出僅含:表結構 `CREATE TABLE` + 數據 `INSERT`,**無庫級操作**,導入不影響其他庫。

根因分析

  • `--databases` 觸發 **「多庫模式」**:輸出 `CREATE DATABASE`、`USE`、禁用外鍵、鎖表等庫級控制語句
  • 導入時 `mysql < v1.sql` 會 **執行 `DROP DATABASE IF EXISTS tpcc`** (隱含在 `CREATE DATABASE` 邏輯中) → **數據庫級覆蓋**
  • 無 `--databases` 為 **「單庫模式」**:純表級導出,導入僅操作表,**安全增量/覆蓋**

驗證截圖

命令1輸出含CREATE DATABASE

命令2輸出純表結構數據

避坑鐵律

  1. 單庫備份/遷移:嚴禁 `--databases`**
  2. 多庫備份:必須 `--databases` 或 `--all-databases`**
  3. 導入前 **必看 SQL 文件頭 20 行**,確認是否含 `CREATE DATABASE`/`DROP DATABASE`
  4. 生產導入 **務必在事務/只讀模式下驗證**,或先導入測試庫

最佳實踐模板

# 單庫備份 (推薦)
mysqldump -h host -u user -p --single-transaction --routines --triggers --events \
  db_name > db_name_$(date +%F).sql

# 多庫備份
mysqldump -h host -u user -p --single-transaction --routines --triggers --events \
  --databases db1 db2 > multi_db_$(date +%F).sql

# 全量備份
mysqldump -h host -u user -p --single-transaction --routines --triggers --events \
  --all-databases > full_$(date +%F).sql

補充:`--force` 參數

遇到表損壞/錯誤**繼續執行不中斷**,配合 `--single-transaction` 保證一致性視圖。但**不代表能修復數據**,錯誤表數據可能缺失,導入後必須校驗行數/校驗和。

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