首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

mysqldump 備份與還原完整指南:從單表到全庫、壓縮、單表恢復與權限處理的實戰速查表

     編輯:MySQL 資料庫相關知識

核心參數速查表

參數作用建議場景
--single-transactionInnoDB 一致性備份不鎖表 (RR 隔離級別)線上業務庫必加
--master-data=2輸出檔案含 Binlog 位點 (註釋形式),利於從庫搭建主從架構必加
--routines --triggers --events備份存儲過程/觸發器/事件完整備份必加
--hex-blob二進位欄位用十六進位導出含 BLOB/BINARY/GEOMETRY 必加
--quick逐行讀取不緩衝整個結果集大表必加 (預設開啟)
--lock-tables=false不鎖表 (配合 single-transaction)線上備份
--set-gtid-purged=OFF不輸出 GTID 資訊 (避免匯入衝突)跨實例遷移
--column-statistics=08.0+ 禁用統計資訊導出 (避免鎖表)8.0+ 線上備份

常用備份命令模板

# 1. 單庫備份 (生產標準)
mysqldump -u root -p --single-transaction --routines --triggers --events \
  --master-data=2 --hex-blob --quick \
  mydb > mydb_$(date +%F_%H%M).sql

# 2. 全庫備份 (含系統帳號)
mysqldump -u root -p --all-databases --single-transaction --routines --triggers --events \
  --master-data=2 --hex-blob > full_$(date +%F_%H%M).sql

# 3. 壓縮備份 (管道流式,不佔磁碟臨時空間)
mysqldump -u root -p --single-transaction mydb | gzip > mydb_$(date +%F_%H%M).sql.gz
# 或並行壓縮 (多核加速)
mysqldump -u root -p --single-transaction mydb | pigz -p 4 > mydb_$(date +%F_%H%M).sql.gz

# 4. 單表備份
mysqldump -u root -p --single-transaction mydb t1 t2 > mydb_t1_t2_$(date +%F).sql

# 5. 僅結構 (Schema)
mysqldump -u root -p -d mydb > mydb_schema_$(date +%F).sql

# 6. 僅資料 (無建表語句)
mysqldump -u root -p -t mydb > mydb_data_$(date +%F).sql

# 7. 指定 Where 條件導出 (增量/分片)
mysqldump -u root -p --single-transaction --where="created_at > '2024-01-01'" mydb orders > orders_2024.sql

還原命令模板

# 1. 還原單庫 (需先建庫)
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4;"
mysql -u root -p mydb < mydb_2024-01-15.sql

# 2. 還原壓縮檔
gunzip -c mydb_2024-01-15.sql.gz | mysql -u root -p mydb
# 或
zcat mydb_2024-01-15.sql.gz | mysql -u root -p mydb

# 3. 還原全庫 (含 mysql 系統庫)
mysql -u root -p < full_2024-01-15.sql
# ⚠️ 還原 mysql 庫後必須執行
mysql -u root -p -e "FLUSH PRIVILEGES;"

# 4. 還原單表 (從全量檔提取)
# 方法 A: sed 提取 (小檔案)
sed -n '/^-- Table structure for table `t1`/,/^-- Table structure for table/p' full.sql > t1.sql
mysql -u root -p mydb < t1.sql
# 方法 B: 專用工具 (大檔案)
# mysql_utils / mydumper/myloader 支援平行匯入

單表還原進階:從 Binlog 精準恢復

若備份檔不含目標表最新資料,需結合 Binlog:

# 1. 找到備份時間點對應的 Binlog 位置
head -30 mydb_backup.sql
# -- Position to start replication from: mysql-bin.000023 456789

# 2. 提取該位置後的 Binlog 事件 (僅目標表)
mysqlbinlog --start-position=456789 --database=mydb --table=t1 \
  /var/lib/mysql/mysql-bin.000023 | mysql -u root -p mydb

# 3. 或使用 mysqlbinlog 導出 SQL 再審核執行
mysqlbinlog --start-position=456789 --database=mydb --table=t1 \
  /var/lib/mysql/mysql-bin.000023 > t1_incremental.sql
# 審核後執行
mysql -u root -p mydb < t1_incremental.sql

權限與系統表特殊處理

  • 還原 mysql 系統庫 (含 user、db、tables_priv 等) 後,**必須執行 FLUSH PRIVILEGES;** 重新載入權限快取,否則新帳號不生效、舊帳號不失效
  • 跨版本還原 (如 5.7→8.0) 系統表結構不同,**嚴禁直接還原 mysql 庫**,應用 mysql_upgrade 或手動同步帳號
  • GTID 模式下還原:目標實例需 SET @@GLOBAL.gtid_purged='...' 避免 GTID 衝突

效能優化技巧

  • 並行匯入:mydumper (備份) + myloader (還原),多執行緒、壓縮、Chunk 分片,速度提升 5-10 倍
  • 關閉索引:大量導入前 ALTER TABLE t DISABLE KEYS; (MyISAM) / 導入後 ALTER TABLE t ENABLE KEYS;;InnoDB 5.7+ 支援 innodb_disable_sort_file_cache 但效果有限
  • 調大參數:還原時臨時調大 innodb_buffer_pool_size、innodb_log_file_size、bulk_insert_buffer_size (MyISAM)
  • 禁用雙重寫/Redo Log fsync (極端追求速度、可接受風險):
    SET GLOBAL innodb_doublewrite = OFF;
    SET GLOBAL innodb_flush_log_at_trx_commit = 2;
    -- 還原完成後恢復並重啟

自動化備份腳本骨架 (每日 02:00 執行)

#!/bin/bash
set -euo pipefail
BACKUP_DIR="/backup/mysql"
RETENTION_DAYS=7
DATE=$(date +%F_%H%M)
DB_LIST=$(mysql -u root -p'xxx' -NBe "SHOW DATABASES WHERE \`Database\` NOT IN ('information_schema','performance_schema','sys')")

for DB in $DB_LIST; do
    FILE="${BACKUP_DIR}/${DB}_${DATE}.sql.gz"
    mysqldump -u root -p'xxx' --single-transaction --routines --triggers --events \
        --master-data=2 --hex-blob --quick "$DB" | pigz -p 4 > "$FILE"
    # 驗證檔案非空
    if [[ ! -s "$FILE" ]]; then
        echo "ERROR: $FILE empty" | mail -s "Backup Failed" admin@example.com
        exit 1
    fi
done

# 清理舊備份
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

# 上傳異地 (可選)
# rclone copy "$BACKUP_DIR" remote:mysql-backup/$(hostname)/
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved