Percona XtraBackup 是目前最熱門的 MySQL 開源熱備份工具,支援 InnoDB、XtraDB 與 MyISAM 儲存引擎,能在不鎖定資料表、不中斷服務的情況下完成完整備份與增量備份。本文將從安裝、完整備份、增量備份到還原流程,完整演示生產環境常用操作。
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 等相關套件,即表示來源已就緒。
若無法直接安裝 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 等管理指令。
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-basedir)。
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
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(準備階段)。
innobackupex --apply-log --use-memory=4G /backup/full_2024-05-20
# 合併第一次增量 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 完成最終回滾。
# 確保目標 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
| 現象 | 原因 | 解決 |
|---|---|---|
| 備份速度極慢 | 未指定 --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 備份體系。建議每季演練一次全量還原,驗證備份可用性。