Percona XtraBackup 是目前最主流的 MySQL 熱備份工具,支援 InnoDB、XtraDB 以及 MyISAM 等儲存引擎,具備不鎖表、增量備份、壓縮加密、流式傳輸等企業級特性。本文系統整理官方手冊精華,涵蓋安裝部署、核心參數解析、各類備份還原場景、複製環境應用及效能調優實戰,幫助 DBA 快速構建高可用備份體系。
自動配置倉庫:
rpm -Uhv https://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
安裝完成後驗證倉庫可用性:
yum list | grep percona
正常應顯示 xtrabackup.x86_64 等套件資訊,即可直接 yum install xtrabackup。
從官網下載對應版本 RPM 包,依序解決依賴關係安裝:
wget https://www.percona.com/downloads/XtraBackup/.../percona-xtrabackup-24-2.4.28-1.el7.x86_64.rpm
rpm -ivh percona-xtrabackup-*.rpm
注意:CentOS 7/8、Ubuntu 20.04/22.04 需選對應發行版包,避免 glibc 版本衝突。
| 維度 | innobackupex (Perl 腳本) | xtrabackup (C 原生二進制) |
|---|---|---|
| 功能範圍 | 全庫備份(含 .frm、MyISAM、CSV 等) | 僅 InnoDB/XtraDB 數據與日誌檔 |
| 還原方式 | --copy-back 一鍵還原 | 需手動 rsync/cp 並修正權限 |
| 增量備份 | 支援 --incremental 參數 | 支援 --incremental-basedir 或 --incremental-lsn |
| 並行處理 | --parallel 多線程複製檔案 | --parallel 多線程讀取數據頁 |
| 適用場景 | 全庫遷移、異構引擎混合環境 | 純 InnoDB 大規模集群、腳本二次開發 |
# 1. 建立備份(自動生成時間戳目錄)
innobackupex --user=bkpuser --password=secret /data/backups/
# 2. 準備備份(重做提交事務、回滾未提交事務、重建日誌檔)
innobackupex --apply-log --use-memory=4G /data/backups/2024-01-15_10-30-00/
# 3. 還原備份(需停庫、datadir 為空)
systemctl stop mysqld
innobackupex --copy-back /data/backups/2024-01-15_10-30-00/
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
# 備份
xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/data/backups/full
# 準備(需執行兩次以生成 ib_logfile*)
xtrabackup --prepare --target-dir=/data/backups/full
xtrabackup --prepare --target-dir=/data/backups/full
# 還原(手動同步)
rsync -avrP /data/backups/full/ /var/lib/mysql/
chown -R mysql:mysql /var/lib/mysql
InnoDB 每次修改數據頁都會遞增 LSN。增量備份僅複製 LSN 大於基準點的數據頁,透過 xtrabackup_checkpoints 記錄 from_lsn 到 to_lsn 區間。
# 基礎全備
innobackupex /data/backups # 假設產生 BASE=/data/backups/2024-01-15_00-00-00
# 第一層增量
innobackupex --incremental /data/backups --incremental-basedir=$BASE
# 產生 INC1=/data/backups/2024-01-15_06-00-00
# 第二層增量(基於 INC1)
innobackupex --incremental /data/backups --incremental-basedir=$INC1
# 產生 INC2=/data/backups/2024-01-15_12-00-00
# 1. 基礎全備僅重做(--redo-only)
innobackupex --apply-log --redo-only $BASE
# 2. 依序應用增量(除最後一個外皆加 --redo-only)
innobackupex --apply-log --redo-only $BASE --incremental-dir=$INC1
innobackupex --apply-log --redo-only $BASE --incremental-dir=$INC2
# 3. 最後回滾未提交事務
innobackupex --apply-log $BASE
避坑指南: 若誤加 --redo-only 於最後一步,MySQL 啟動時仍會自動回滾,但會延長啟動時間;若順序錯誤導致 LSN 斷層,備份鏈直接報廢,務必用 cat xtrabackup_checkpoints 核對 from_lsn/to_lsn 連續性。
# 本地壓縮並行 4 線程,流式傳輸至備份服務器
innobackupex --stream=xbstream --compress --compress-threads=4 --parallel=4 ./ \
| ssh backup@10.0.0.50 "xbstream -x -C /mnt/backups/mysql/"
# 解壓備份(需安裝 qpress)
innobackupex --decompress --parallel=4 /mnt/backups/mysql/
--throttle=100:限制每秒 100 次 I/O(約 100 MB/s),避免備份佔滿磁盤帶寬影響業務。--lock-wait-timeout=180 --lock-wait-threshold=40 --kill-long-queries-timeout=20:智慧型鎖等待策略,超過 40 秒的長查詢自動 KILL,最長等待 180 秒獲取全域鎖。# 生成金鑰
openssl rand -base64 24 > /etc/xtrabackup/keyfile
# 加密備份
innobackupex --encrypt=AES256 --encrypt-key-file=/etc/xtrabackup/keyfile \
--stream=xbstream ./ | ssh backup@10.0.0.50 "xbstream -x -C /mnt/backups/"
# 解密還原
xbcrypt -d -a AES256 -f /etc/xtrabackup/keyfile -i backup.xbstream -o - | xbstream -x
innobackupex --slave-info /data/backups(自動生成 xtrabackup_slave_info 含 CHANGE MASTER 語句)rsync -avprP -e ssh /data/backups/$TIMESTAMP slave:/var/lib/mysql/server-id=2、skip-slave-startGRANT REPLICATION SLAVE ON *.* TO 'repl'@'slave_ip' IDENTIFIED BY 'pass';cat xtrabackup_binlog_info 或 xtrabackup_slave_infoSlave_IO_Running=Yes, Slave_SQL_Running=YesMySQL 5.6+ / MariaDB 10.0+ 支援 GTID,重建步驟簡化為:
# Master 開啟 GTID
gtid_mode=ON, enforce_gtid_consistency=ON, log_bin=mysql-bin
# Slave 同步備份後,無需指定 binlog 位點
CHANGE MASTER TO MASTER_HOST='master', MASTER_USER='repl', MASTER_PASSWORD='pass', MASTER_AUTO_POSITION=1;
START SLAVE;
| 參數 | 語法範例 | 適用場景 |
|---|---|---|
--include | --include='^order_db\.order_' | 正則匹配表名,所有庫目錄皆建立(可能為空) |
--tables-file | echo "order_db.order_2024" > /tmp/t.txt; --tables-file=/tmp/t.txt | 精確指定表清單,僅建立匹配庫目錄 |
--databases | --databases="order_db mysql" | 指定庫列表,非 InnoDB 表受影響,InnoDB 仍全備 |
# 1. 備份端準備並匯出元數據
innobackupex --apply-log --export /data/backups/full/
# 產生 .ibd, .exp (Percona), .cfg (MySQL 5.6+/MariaDB 10.0+)
# 2. 目標端建立同結構表並捨棄表空間
CREATE TABLE order_db.order_2024 (...) ENGINE=InnoDB;
ALTER TABLE order_db.order_2024 DISCARD TABLESPACE;
# 3. 複製 .ibd/.cfg 至目標 datadir/order_db/,修正權限
# 4. 匯入表空間
ALTER TABLE order_db.order_2024 IMPORT TABLESPACE;
innobackupex --compact /data/backups(xtrabackup_checkpoints 顯示 compact=1)innobackupex --apply-log --rebuild-indexes --rebuild-threads=8 /data/backups/... 重建索引(耗時最長)--rebuild-indexes,大幅縮短準備窗口。開啟 innodb_log_archive=ON 後,舊 redo log 被覆寫前自動歸檔為 ib_log_archive_<LSN>。備份時指定 --innodb-log-arch-dir 即可實現「任意時間點準備」,無需維護複雜增量鏈:
xtrabackup_56 --prepare --target-dir=/data/backup/full \
--innodb-log-arch-dir=/data/archived_logs --to-archived-lsn=5536301566
innodb_buffer_pool_dump_at_shutdown=1 + innodb_buffer_pool_load_at_startup=1,重啟秒級預熱緩衝池,消除「冷啟動」效能抖動。| 現象 | 根因 | 規避方案 |
|---|---|---|
| 增量備份應用報錯 "LSN mismatch" | 增量鏈順序錯誤或中間遺失 | 嚴格按 xtrabackup_checkpoints 遞增 LSN 應用;備份腳本加入校驗邏輯 |
| 準備階段 OOM | --use-memory 設過大超過物理記憶體 | 設定為物理記憶體 70%-80%,預留 OS 與其他進程空間 |
| 還原後 MySQL 啟動極慢 | 未執行第二次 --prepare 生成 ib_logfile* | 全備準備務必執行兩次 --prepare,或啟動前預熱 |
| 部分備份還原報 "tablespace id mismatch" | .cfg/.exp 元數據與目標實例字典不一致 | 嚴格同步表結構;MySQL 5.6+ 優先用 .cfg 驗證,MariaDB 10.0+ 可直匯 .ibd |
| 備份期間業務卡頓 | FLUSH TABLES WITH READ LOCK 等待長查詢 | 啟用 --lock-wait-threshold + --kill-long-queries-timeout;大表考慮分庫分表降低鎖範圍 |
xtrabackup_checkpoints 中 to_lsn 增長速率、備份耗時、備份檔大小、準備階段耗時。Percona XtraBackup 憑藉「不鎖表熱備份、增量鏈靈活、流式傳輸高效」三大核心優勢,成為 MySQL 生產環境備份的事實標準。掌握其 LSN 機制、準備階段邏輯、複製環境整合細節,並建立自動化驗證與監控體系,才能真正落實「備份無小事,還原才是硬道理」的運維哲學。