當單庫超 10GB,mysqldump 導出耗時數小時、鎖表影響業務、恢復更慢。Percona XtraBackup 提供:
--stream=tar 直輸遠端/對象存儲,無需本地落盤--compress --compress-threads=4 邊備份邊壓縮innobackupex 封裝自動加全局讀鎖備份 MyISAM# 1. 配置 Percona 源
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release enable tools release
# 2. 安裝 xtrabackup (包含 innobackupex)
yum install -y percona-xtrabackup-80 # MySQL 8.0 兼容版
# 或 percona-xtrabackup-24 (MySQL 5.7)
# 3. 驗證
xtrabackup --version
innobackupex --version
[mysqld]
datadir = /var/lib/mysql # 必須顯式指定,否則 restore 失敗
innodb_log_file_size = 1G # 與生產一致,否則 prepare 階段報錯
log_bin = mysql-bin
server_id = 1
gtid_mode = ON
enforce_gtid_consistency = ON
innobackupex --defaults-file=/etc/my.cnf \
--user=root --password='xxx' \
--no-timestamp \
/backup/full_20240501
產出目錄結構:/backup/full_20240501/ 包含所有 .ibd, .frm, xtrabackup_checkpoints, xtrabackup_info, backup-my.cnf
innobackupex --defaults-file=/etc/my.cnf \
--user=root --password='xxx' \
--databases='app_db' \
/backup/app_db_full
# 本地壓縮存儲
innobackupex --defaults-file=/etc/my.cnf \
--user=root --password='xxx' \
--stream=tar --compress --compress-threads=4 \
/backup | gzip > /backup/full_$(date +%F_%H%M).tar.gz
# 直傳遠端服務器 (免密 SSH)
innobackupex --defaults-file=/etc/my.cnf \
--user=root --password='xxx' \
--stream=tar \
/backup | ssh backup-user@10.0.0.2 "cat > /remote/backup/full_$(date +%F).tar"
InnoDB 每個頁有 LSN。全備記錄 to_lsn,增量備份僅拷貝 LSN > 上次 to_lsn 的頁。
# 1. 基準全備 (假設目錄 base_full)
innobackupex --defaults-file=/etc/my.cnf --user=root -p --no-timestamp /backup/base_full
# 2. 第一次增量 (基於 base_full)
innobackupex --defaults-file=/etc/my.cnf --user=root -p \
--incremental-basedir=/backup/base_full \
--incremental /backup/inc1
# 3. 第二次增量 (基於 inc1)
innobackupex --defaults-file=/etc/my.cnf --user=root -p \
--incremental-basedir=/backup/inc1 \
--incremental /backup/inc2
# 查看 LSN 鏈
cat /backup/base_full/xtrabackup_checkpoints
# backup_type = full-prepared
# from_lsn = 0
# to_lsn = 12345678
cat /backup/inc1/xtrabackup_checkpoints
# backup_type = incremental
# from_lsn = 12345678
# to_lsn = 12345890
# 1. 停止 MySQL
systemctl stop mysqld
# 2. 備份原數據目錄 (保險)
mv /var/lib/mysql /var/lib/mysql.bak.$(date +%F)
mkdir -p /var/lib/mysql
chown mysql:mysql /var/lib/mysql
# 3. Prepare 階段 (回放 redo log 使數據一致)
innobackupex --defaults-file=/etc/my.cnf --user=root -p \
--apply-log /backup/full_20240501
# 4. Copy-back (拷貝文件到 datadir)
innobackupex --defaults-file=/etc/my.cnf --user=root -p \
--copy-back /backup/full_20240501
# 5. 權限修正並啟動
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
# 1. Prepare 基準全備 (--redo-only 跳過 rollback 階段)
innobackupex --apply-log --redo-only /backup/base_full
# 2. 合併第一次增量
innobackupex --apply-log --redo-only /backup/base_full \
--incremental-dir=/backup/inc1
# 3. 合併第二次增量
innobackupex --apply-log --redo-only /backup/base_full \
--incremental-dir=/backup/inc2
# 4. 最後一次完整 prepare (不加 --redo-only,執行 rollback)
innobackupex --apply-log /backup/base_full
# 5. Copy-back & 啟動 (同全量恢復步驟 4-5)
innobackupex --copy-back /backup/base_full
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
MySQL 5.6+ / 8.0 支持 DISCARD/IMPORT TABLESPACE 單表導入:
# 1. 目標庫建空表結構
CREATE TABLE `app_db`.`user` LIKE `app_db`.`user`;
# 2. 丟棄表空間
ALTER TABLE `app_db`.`user` DISCARD TABLESPACE;
# 3. 拷貝備份中的 user.ibd + user.cfg (exp 文件) 到 datadir/app_db/
cp /backup/full_20240501/app_db/user.ibd /var/lib/mysql/app_db/
cp /backup/full_20240501/app_db/user.cfg /var/lib/mysql/app_db/
# 4. 導入表空間
ALTER TABLE `app_db`.`user` IMPORT TABLESPACE;
| 參數 | 說明 | 典型值 |
|---|---|---|
--defaults-file | 指定 my.cnf 路徑 | /etc/my.cnf |
--user/--password | 連接認證 | root/xxx |
--parallel=N | 並行拷貝線程數 | 4-8 (CPU 核心數) |
--compress | 啟用壓縮 (需 qpress) | 配合 --compress-threads |
--throttle=IOPS | 限制讀取 IOPS,減輕業務影響 | 100-200 |
--slave-info | 備份從庫時記錄主庫 Binlog 位點 | 生成 xtrabackup_slave_info |
--safe-slave-backup | 備份前停止 SQL 線程,確保一致性 | 從庫備份推薦 |
--tmpdir | 臨時文件目錄 (流式備份時避免 /tmp 爆滿) | /data/tmp |
--use-memory=GB | prepare 階段內存分配 | 4G-8G |
xtrabackup_checkpoints 中 to_lsn 增長正常innobackupex: fatal error: no 'datadir' option--use-memory 分配足夠內存加速XtraBackup 是 MySQL 大數據量備份的行業標準配置,掌握其增量鏈合併、單表導入、流式傳輸等進階用法,能構建 RPO<5min、RTO<30min 的企業級備份體系。