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

Percona XtraBackup 完整指南:MySQL 熱備份與增量恢復實戰教學

     編輯:MySQL 資料庫相關知識

前言

Percona XtraBackup 是目前最熱門的 MySQL 開源熱備份工具,支援 InnoDB、XtraDB 與 MyISAM 儲存引擎,能在不鎖定資料表、不中斷服務的情況下完成完整備份與增量備份。本文將從安裝、完整備份、增量備份到還原流程,完整演示生產環境常用操作。

一、安裝 Percona XtraBackup

1.1 透過 YUM 快速安裝(推薦)

Percona 官方提供 YUM Repository,安裝極為簡單:

# 匯入 Percona 官方 RPM 簽名金鑰並建立 repo
rpm -Uhv https://repo.percona.com/yum/percona-release-latest.noarch.rpm

# 驗證套件是否可用
yum list | grep percona

輸出應包含 xtrabackup、percona-server 等相關套件,即表示來源已就緒。

1.2 手動建立 Repo 檔案(備用方案)

若無法直接安裝 RPM,可手動建立 /etc/yum.repos.d/percona.repo:

[percona]
name = CentOS $releasever - Percona
baseurl = https://repo.percona.com/centos/$releasever/os/$basearch/
enabled = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona
gpgcheck = 1

存檔後執行 yum clean all && yum makecache 重建快取,再以 yum install percona-xtrabackup-24(或對應版本)安裝。

二、建立備份專用帳號(最小權限原則)

CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'StrongPassw0rd!';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, PROCESS, SUPER ON *.* TO 'bkpuser'@'localhost';
FLUSH PRIVILEGES;

說明:
RELOAD 用於 FLUSH TABLES WITH READ LOCK;
LOCK TABLES 允許鎖表;
REPLICATION CLIENT 取得 binlog 位置;
PROCESS 查看執行緒狀態;
SUPER 執行 SET GLOBAL 等管理指令。

三、完整備份(Full Backup)

innobackupex \
  --user=bkpuser \
  --password='StrongPassw0rd!' \
  --socket=/var/lib/mysql/mysql.sock \
  --defaults-file=/etc/my.cnf \
  --no-timestamp \
  /backup/full_$(date +%F)

關鍵參數:

  • --no-timestamp:不在目錄名加入時間戳,方便腳本固定路徑。
  • --defaults-file:指定 MySQL 設定檔,確保 datadir、innodb_data_file_path 等參數正確。

備份完成後,目錄結構如下:

/backup/full_2024-05-20/
├── backup-my.cnf
├── xtrabackup_checkpoints
├── xtrabackup_info
└── ... (各資料庫目錄與 .ibd 檔案)

四、增量備份(Incremental Backup)

增量備份需以最近一次完整或增量備份為基準(--incremental-basedir)。

4.1 第一次增量備份(基於完整備份)

innobackupex \
  --user=bkpuser --password='StrongPassw0rd!' \
  --socket=/var/lib/mysql/mysql.sock \
  --defaults-file=/etc/my.cnf \
  --incremental /backup/inc1_$(date +%F) \
  --incremental-basedir=/backup/full_2024-05-20

4.2 第二次增量備份(基於上一次增量備份)

innobackupex \
  --user=bkpuser --password='StrongPassw0rd!' \
  --socket=/var/lib/mysql/mysql.sock \
  --defaults-file=/etc/my.cnf \
  --incremental /backup/inc2_$(date +%F) \
  --incremental-basedir=/backup/inc1_2024-05-20

生產建議: 每日 1 次完整備份 + 每小時 1 次增量備份,配合 cron 自動化;保留 7 天完整、48 小時增量。

五、備份資料「準備」與還原

XtraBackup 產出的資料尚未套用 redo log,**不可直接啟動 MySQL**,必須先執行 --apply-log(準備階段)。

5.1 準備完整備份(Base)

innobackupex --apply-log --use-memory=4G /backup/full_2024-05-20

5.2 合併增量備份到完整備份

# 合併第一次增量
innobackupex --apply-log --redo-only --use-memory=4G \
  --incremental-dir=/backup/inc1_2024-05-20 \
  /backup/full_2024-05-20

# 合併第二次增量
innobackupex --apply-log --redo-only --use-memory=4G \
  --incremental-dir=/backup/inc2_2024-05-20 \
  /backup/full_2024-05-20

--redo-only 表示僅重放已提交事務,不回滾未提交事務,必須在每次合併增量時加上;最後一次合併完成後,再執行一次不帶 --redo-only 的 --apply-log 完成最終回滾。

5.3 還原資料(Copy-back)

# 確保目標 datadir 為空
systemctl stop mysqld
rm -rf /var/lib/mysql/*

innobackupex --copy-back --defaults-file=/etc/my.cnf /backup/full_2024-05-20

# 修正權限並啟動
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld

六、常見問題與最佳實踐

ibdata1 過大導致備份久還原後 MySQL 無法啟動
現象原因解決
備份速度極慢未指定 --use-memory 或記憶體不足視實體記憶體給 1~4G;若為 SSD 可加 --parallel=4 多執行緒
共享表空間未啟用 innodb_file_per_table重建表啟用獨立表空間,或使用 --incremental 減少完整備份頻率
權限錯誤或 my.cnf 路徑不一致檢查 datadir、innodb_log_file_size 等參數與備份時一致

七、自動化備份腳本範例

#!/bin/bash
# /usr/local/bin/xtrabackup_daily.sh
set -euo pipefail
FULL_DIR="/backup/full_$(date +%F)"
INC_DIR="/backup/inc_$(date +%H-%M)"
innobackupex --user=bkpuser --password='****' --socket=/var/lib/mysql/mysql.sock \
  --defaults-file=/etc/my.cnf --no-timestamp $FULL_DIR
# 刪除 7 天前完整備份
find /backup -maxdepth 1 -type d -name 'full_*' -mtime +7 -exec rm -rf {} \;

加入 crontab -e:0 2 * * * /usr/local/bin/xtrabackup_daily.sh > /var/log/xtrabackup.log 2>&1


結語: 掌握 XtraBackup 完整→增量→準備→還原流程,即可建立 RPO 接近零、RTO 可控的 MySQL 備份體系。建議每季演練一次全量還原,驗證備份可用性。

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