萬盛學電腦網

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

mysqldump 資料庫備份還原完整操作指南

mysqldump 備份與還原:從基礎到生產級實踐

系統整理 mysqldump 核心參數、備份策略、還原方法、壓縮傳輸、跨版本遷移等實戰技巧。

備份工具對比

工具類型適用引擎特點
mysqldump邏輯備份所有跨版本、可編輯、較慢
mysqlhotcopy物理備份MyISAM快、已棄用
xtrabackup物理熱備InnoDB不鎖表、速度快、增量備份
binlog增量備份所有時間點恢復 (PITR)
文件拷貝物理冷備MyISAM需停機、版本強綁定

核心備份命令詳解

基本備份

mysqldump -h host -u user -p db_name > backup.sql

帶 DROP TABLE 的備份 (覆蓋式還原)

mysqldump --add-drop-table -u user -p db_name > backup.sql

壓縮備份 (節省空間/傳輸)

mysqldump -h host -u user -p db_name | gzip > backup.sql.gz

備份指定表

mysqldump -h host -u user -p db_name table1 table2 > tables.sql

同時備份多庫

mysqldump -h host -u user -p --databases db1 db2 db3 > multi.sql

只備份結構 (無數據)

mysqldump --no-data --databases db1 db2 > structure.sql

備份所有資料庫

mysqldump --all-databases > all.sql

生產環境推薦參數組合

# MyISAM 表
mysqldump -u user -p \
  --default-character-set=utf8mb4 \
  --opt \
  --extended-insert=false \
  --triggers -R --hex-blob \
  -x db_name > backup.sql

# InnoDB 表 (熱備份,不鎖表)
mysqldump -u user -p \
  --default-character-set=utf8mb4 \
  --opt \
  --extended-insert=false \
  --triggers -R --hex-blob \
  --single-transaction \
  db_name > backup.sql

參數深度解析

參數含義建議
--opt快捷組合:add-drop-table, add-locks, create-options, disable-keys, extended-insert, lock-tables, quick, set-charset預設開啟,可用 --skip-opt 禁用
--quick / -q流式讀取,不緩存結果集大表必加
--single-transaction事務一致性視圖 (InnoDB)線上備份必加
--lock-all-tables / -x全局讀鎖,所有表一致性MyISAM/混合引擎
--disable-keysINSERT 間禁用索引,導入後重建MyISAM 大幅加速導入
--extended-insert多行 VALUES 批次 INSERT預設開啟,加快導入
--hex-blob二進制欄位十六進制導出含 BLOB/BINARY 必加
--routines / -R導出存儲過程/函數完整備份加上
--master-data=2註釋記錄 binlog 位置搭建 Slave 必加

還原/導入方法

命令行導入

mysql -h host -u user -p db_name < backup.sql

壓縮文件導入

gunzip < backup.sql.gz | mysql -u user -p db_name

客戶端 SOURCE 導入

mysql -u user -p
USE db_name;
SOURCE /path/backup.sql;

跨伺服器直接遷移

mysqldump -u user -p -h source_host db_name \
  --single-transaction --quick --routines --triggers \
  | mysql -u user -p -h target_host -C db_name

常見問題與解決

⚠️ 導入大小限制

phpMyAdmin/Web 介面受 upload_max_filesize、post_max_size、memory_limit 限制,預設 2MB。解決:

  • 修改 php.ini 三參數並重啟 PHP
  • 改用命令行導入 (無大小限制)
  • 分割 SQL 文件:split -l 50000 big.sql part_

⚠️ 字符集亂碼

導出導入字符集不一致導致亂碼。解決:

  • 導出指定:--default-character-set=utf8mb4
  • 導入指定:--default-character-set=utf8mb4
  • 文件編碼確認:file backup.sql

備份驗證腳本範例

#!/bin/bash
# backup_verify.sh
DB="mydb"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%F_%H%M)
FILE="${BACKUP_DIR}/${DB}_${DATE}.sql.gz"

# 1. 備份
mysqldump -u backup -p'pass' --single-transaction --quick --routines --triggers --hex-blob --default-character-set=utf8mb4 $DB | gzip > $FILE

# 2. 驗證文件非空且可解壓
if [[ -s $FILE ]] && gzip -t $FILE; then
    echo "[$(date)] Backup OK: $FILE"
else
    echo "[$(date)] Backup FAILED: $FILE" >&2
    exit 1
fi

# 3. 刪除 7 天前備份
find $BACKUP_DIR -name "${DB}_*.sql.gz" -mtime +7 -delete

建立標準化備份流程、定期演練還原,是資料安全的基石。

copyright © 萬盛學電腦網 all rights reserved