mysqldump 是 MySQL 官方提供的邏輯備份工具,支援全庫、單表、結構、資料多種維度導出,配合管道可直接壓縮、遠程傳輸。本文彙整最常用的備份/還原場景與參數說明,適合 DBA 與開發人員速查。
mysqldump -h主機 -u用戶 -p密碼 資料庫名 [表名...] > 輸出檔.sql
注意:-p 後無空格直接接密碼(不安全,建議省略讓終端機提示輸入),或使用 --defaults-extra-file 指定憑證檔。
| 場景 | 指令範例 | 關鍵參數說明 |
|---|---|---|
| 備份整個資料庫 | mysqldump -u root -p dbname > dbname.sql | 預設包含 CREATE TABLE、INSERT 語句 |
| 備份單張表 | mysqldump -u root -p dbname users > dbname_users.sql | 表名放在資料庫名之後 |
| 僅備份結構(無資料) | mysqldump -u root -p -d --add-drop-table dbname > structure.sql | -d no-data;--add-drop-table 便於覆蓋匯入 |
| 多庫同時備份 | mysqldump -u root -p --databases db1 db2 db3 > multi.sql | --databases 會在輸出加入 CREATE DATABASE |
| 備份所有資料庫 | mysqldump -u root -p --all-databases > all.sql | 含 mysql 系統庫,遷移實例最適用 |
| GZIP 即時壓縮備份 | mysqldump -u root -p dbname | gzip > dbname.sql.gz | 管道導向 gzip,節省磁碟空間 |
| 帶 DROP TABLE 的備份 | mysqldump --add-drop-table -u root -p dbname > with_drop.sql | 匯入前自動刪除同名表,避免衝突 |
| 排除特定表 | mysqldump -u root -p dbname --ignore-table=dbname.logs > no_logs.sql | --ignore-table 可重複指定 |
# 一般還原
mysql -h主機 -u用戶 -p密碼 目標資料庫 < 備份檔.sql
# 還原 GZIP 壓縮檔
gunzip < dbname.sql.gz | mysql -u用戶 -p密碼 目標資料庫
# 直接跨伺服器遷移(管道串聯)
mysqldump -h源主機 -u用戶 -p密碼 dbname | mysql -h目標主機 -u用戶 -p密碼 dbname
#!/bin/bash
# /usr/local/bin/mysql_daily_backup.sh
BACKUP_DIR="/backup/mysql"
DATE=$(date +%F)
mkdir -p "$BACKUP_DIR"
mysqldump -u backup_user -p'strong_password' --all-databases --single-transaction --routines --triggers | gzip > "$BACKUP_DIR/all_dbs_$DATE.sql.gz"
# 保留 7 天
find "$BACKUP_DIR" -name 'all_dbs_*.sql.gz' -mtime +7 -delete
加入 crontab -e:0 2 * * * /usr/local/bin/mysql_daily_backup.sh
--single-transaction:InnoDB 熱備份必備,避免鎖表,保證一致性視圖。--routines --triggers --events:備份存儲過程、觸發器、事件調度器。--master-data=2:輸出 CHANGE MASTER TO 註釋(含 binlog 位點),便於主從同步搭建。--hex-blob:二進制欄位以十六進制導出,避免字符集問題。mysqldump --tab=/tmp --where="id%10=0" dbname tbl 配合多進程。SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0;。