萬盛學電腦網

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

MySQL 數據庫備份基礎知識全景指南:策略、工具、恢復與最佳實踐

備份兩大流派:邏輯備份 vs 物理備份

維度邏輯備份 (mysqldump)物理備份 (文件拷貝/xtrabackup)
原理導出 SQL 文本(CREATE + INSERT)直接拷貝數據文件(.ibd, .frm, .MYD, .MYI)
跨版本/架構遷移✅ 支持(文本可編輯)❌ 僅限同版本、同架構、同存儲引擎
速度慢(SQL 解析、索引重建)快(流式拷貝,無解析開銷)
一致性--single-transaction 熱備需鎖表或快照(LVM/ZFS)
恢復粒度庫/表/行級(文本編輯)通常為實例/庫級
壓縮管道 gzip 易實現需額外工具

核心原則:備份系統的「鐵律」

  1. 定期、自動化、無人值守:制定計劃(每日全量+每小時增量),寫入 crontab/調度系統
  2. 啟用 Binlog(更新日志):log_bin=ON,配合 binlog_format=ROW。備份是「全量基準點」,Binlog 是「增量重放」,二者結合實現**任意時間點恢復 (PITR)**
  3. 語義化命名:dbname_YYYYMMDD_HHMMSS.sql.gz,避免 backup1.sql 這類無意義名稱
  4. 異地多副本:備份文件**必須**存放在**不同機器、不同機房、不同存儲介質**上
  5. 定期驗證恢復:**未經驗證的備份 = 廢紙**。每季度至少一次全量恢復演練
  6. 備份文件過期策略:自動清理過期文件,防止磁盤寫滿

一、mysqldump 邏輯備份深度實戰

1. 全量備份標準命令

mysqldump --single-transaction --master-data=2 --flush-logs \
  --routines --triggers --events \
  --hex-blob --quick --opt \
  -u backup_user -p dbname | gzip > /backup/dbname_$(date +%F_%H%M%S).sql.gz

參數解讀:

  • --single-transaction:InnoDB 熱備,一致性快照,不阻塞寫入
  • --master-data=2:輸出 CHANGE MASTER TO 註釋(含 Binlog 文件/位點),用於搭建從庫/PITR
  • --flush-logs:輪轉 Binlog,使備份位點與新 Binlog 文件對齊
  • --routines/triggers/events:導出存儲過程、觸發器、事件
  • --hex-blob:二進制列十六進制導出,避免字符集問題
  • --quick:流式讀取,不緩存全量結果集
  • --opt:組合優化參數(--add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset)

2. 分表並行備份(大庫加速)

# 獲取所有表名
tables=$(mysql -N -e "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='dbname'")

# 並行導出(需 GNU parallel 或 xargs -P)
echo "$tables" | xargs -I {} -P 4 sh -c 'mysqldump --single-transaction -u backup_user -p dbname {} | gzip > /backup/dbname_{}_$(date +%F).sql.gz'

3. 只導結構 / 只導數據 / 條件導出

# 只結構
mysqldump --no-data -u backup_user -p dbname > schema.sql

# 只數據
mysqldump --no-create-info -u backup_user -p dbname > data.sql

# 條件導出(如近 30 天訂單)
mysqldump --where="created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)" -u backup_user -p dbname orders > recent_orders.sql

二、物理備份:xtrabackup` (Percona XtraBackup) 熱備首選

  • 支持 InnoDB/XtraDB **非阻塞熱備份**
  • 支持**增量備份**(基於 LSN)
  • 支持**流式備份**直接傳輸到遠端
  • 支持**並行壓縮/解壓**
  • 恢復速度極快(直接拷貝文件 + --prepare 恢復)

全量備份

xtrabackup --backup --target-dir=/backup/full_$(date +%F) --user=backup_user --password=xxx --databases=dbname

增量備份

# 基於上次全量/增量的 LSN
xtrabackup --backup --target-dir=/backup/inc_$(date +%F_%H) \
  --incremental-basedir=/backup/full_20240101 --user=backup_user --password=xxx

恢復準備(必須步驟)

# 1. 準備全量備份(回放事務日志,使數據一致)
xtrabackup --prepare --target-dir=/backup/full_20240101

# 2. 合併增量備份(依次應用)
xtrabackup --prepare --target-dir=/backup/full_20240101 --incremental-dir=/backup/inc_20240101_01
xtrabackup --prepare --target-dir=/backup/full_20240101 --incremental-dir=/backup/inc_20240101_02
# ...

# 3. 恢復數據目錄(需停庫)
xtrabackup --copy-back --target-dir=/backup/full_20240101 --datadir=/var/lib/mysql
chown -R mysql:mysql /var/lib/mysql

三、Binlog 管理與 PITR(時間點恢復)

關鍵配置

[mysqld]
log_bin = mysql-bin
binlog_format = ROW
expire_logs_days = 7          # 自動清理 7 天前 Binlog
max_binlog_size = 1G
sync_binlog = 1               # 每次提交同步刷盤(最安全)
binlog_rows_query_log_events = ON  # 記錄原始 SQL(5.6+),利於審計

PITR 實戰步驟

  1. 找到最近一次全量備份(如 full_20240101.sql.gz)及其對應 Binlog 位點(--master-data=2 註釋中)
  2. 恢復全量備份:zcat full_20240101.sql.gz | mysql -u root -p dbname
  3. 提取並重放 Binlog:
# 查看 Binlog 事件
mysqlbinlog --start-position=12345 --stop-datetime="2024-01-02 10:30:00" mysql-bin.000001 > replay.sql

# 或管道直接重放
mysqlbinlog --start-position=12345 --stop-datetime="2024-01-02 10:30:00" mysql-bin.000001 | mysql -u root -p dbname

四、恢復場景與操作指南

場景 1:恢復整個數據庫(最簡單)

# 停寫入(維護窗口)
# 恢復全量
mysql -u root -p dbname < full_backup.sql
# 重放 Binlog 到故障點
mysqlbinlog --start-position=XXX mysql-bin.00000X | mysql -u root -p dbname

場景 2:恢復單表(較複雜)

  1. 從全量備份中提取該表 SQL(sed/awk 或 mysqldump 重導)
  2. 或:另起臨時實例恢復全量 → mysqldump 導出單表 → 導入生產庫
  3. 重放該表相關 Binlog(需 mysqlbinlog --database=dbname --table=table_name 過濾,5.6+ 支持)

場景 3:誤執行 DROP TABLE/DELETE 緊急恢復

  1. 立即 **停止寫入**(或設置 read_only=ON)
  2. 定位誤操作 Binlog 位置(mysqlbinlog --base64-output=DECODE-ROWS -v)
  3. 恢復到誤操作**之前**的位點
  4. 導出誤刪數據,重新導入

五、跨機器遷移/複製數據庫

方法一:管道直連(最快、無中間文件)

# 目標機創建庫
mysqladmin -h target_host -u root -p create dbname

# 源機管道傳輸(壓縮加速)
mysqldump --single-transaction --opt dbname | gzip -c | ssh target_host "gunzip | mysql -u root -p dbname"

方法二:xtrabackup` 流式傳輸

# 源機
xtrabackup --backup --stream=xbstream --target-dir=/tmp --databases=dbname | ssh target_host "xbstream -x -C /var/lib/mysql"
# 目標機需 --prepare 後啟動

六、總結:構建企業級備份體系

層級工具/策略RPORTO適用場景
核心交易庫xtrabackup 全量日增 + 增量小時級 + Binlog PITR< 1 分鐘分鐘級金融、訂單、用戶中心
業務分析庫mysqldump 每日全量 + Binlog24 小時小時級報表、數據倉庫
配置/字典表Git 管理 SQL 文件 / mysqldump 變更時觸發即時秒級元數據、字典表
測試/開發庫定期快照 / 不備份(可重建)不可用不可用非持久化環境

備份不是目的,**可恢復**才是目的。建立「備份→驗證→恢復演練→文檔更新」閉環,讓團隊在災難面前從容不迫。

copyright © 萬盛學電腦網 all rights reserved