當數據量超 10GB,mysqldump 導出導入耗時過長,且會阻塞寫入(需 --single-transaction 才不阻塞 InnoDB)。Percona XtraBackup 支援 **InnoDB 熱備份(不加鎖)**、**增量備份**、**流式傳輸**、**壓縮**,是大數據量生產環境的標準備份工具。
--slave-info、--stream 等便捷參數。生產建議直接使用 innobackupex。
# 下載對應 OS/MySQL 版本的 RPM/DEB
# 例如 CentOS 7 + MySQL 5.7
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum install -y percona-xtrabackup-24 # 2.4 系列支援 MySQL 5.7/8.0
# 依賴包自動解決:perl-Time-HiRes, perl-DBD-MySQL, libaio 等
版本匹配關鍵: XtraBackup 2.2 不支援 MySQL 5.1.73,報錯 Unsupported server version。請嚴格對照 官方兼容性矩陣 選版本。
[mysqld]
datadir=/var/lib/mysql # 必須顯式指定,否則還原報錯 "Please set parameter 'datadir'"
innodb_log_file_size=50M # 若備份報錯 "log file size different",需與實際 ib_logfile 大小一致
# 備份到本地目錄(會生成時間戳子目錄)
innobackupex --defaults-file=/etc/my.cnf --user=root /backup/full/
# 單庫備份
innobackupex --defaults-file=/etc/my.cnf --user=root --database=db_name /backup/full/
# 流式備份 + 壓縮直傳遠端(節省本地磁碟)
innobackupex --defaults-file=/etc/my.cnf --user=root --stream=tar /backup/ | gzip > /backup/full_$(date +%F_%H-%M-%S).tar.gz
# 或直接 SSH 遠端
innobackupex --defaults-file=/etc/my.cnf --user=root --stream=tar /backup/ | ssh user@remote "cat > /remote/backup/full_$(date +%F).tar.gz"
systemctl stop mysqld
mv /var/lib/mysql /var/lib/mysql_bak_$(date +%F)
mkdir -p /var/lib/mysql
# 1) 準備備份 (redo log 重放,使數據文件一致)
innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /backup/full/2024-01-15_10-30-00/
# 2) 拷貝回數據目錄
innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /backup/full/2024-01-15_10-30-00/
# 3) 修正權限並啟動
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
原理:基於 LSN (Log Sequence Number) 推進。首次全量備份記錄 to_lsn,後續增量只備份 LSN 大於上次的頁。
# 基於全量備份做第一次增量
innobackupex --defaults-file=/etc/my.cnf --user=root \
--incremental-basedir=/backup/full/2024-01-15_10-30-00 \
--incremental /backup/incr/
# 基於上一次增量做第二次增量
innobackupex --defaults-file=/etc/my.cnf --user=root \
--incremental-basedir=/backup/incr/2024-01-15_12-00-00 \
--incremental /backup/incr/
cat /backup/full/2024-01-15_10-30-00/xtrabackup_checkpoints
# backup_type = full-prepared
# from_lsn = 0
# to_lsn = 23853959
cat /backup/incr/2024-01-15_12-00-00/xtrabackup_checkpoints
# backup_type = incremental
# from_lsn = 23853959
# to_lsn = 23854112
# 1) 準備全量基礎 (--redo-only 只重做,不回滾未提交事務)
innobackupex --apply-log --redo-only /backup/full/2024-01-15_10-30-00/
# 2) 合併第一次增量
innobackupex --apply-log --redo-only /backup/full/2024-01-15_10-30-00/ \
--incremental-dir=/backup/incr/2024-01-15_12-00-00/
# 3) 合併第二次增量 (最後一次可不加 --redo-only)
innobackupex --apply-log /backup/full/2024-01-15_10-30-00/ \
--incremental-dir=/backup/incr/2024-01-15_14-00-00/
# 4) 恢復同全量流程:--copy-back → chown → start mysqld
| 參數 | 說明 |
|---|---|
--defaults-file | 指定 my.cnf 路徑,必須包含 [mysqld] datadir |
--apply-log | 相當於 xtrabackup --prepare,重做 redo log 使備份一致 |
--copy-back | 將備份文件拷貝回 datadir |
--incremental | 啟用增量備份模式 |
--incremental-basedir | 指定上一次備份目錄(全量或增量) |
--redo-only | 增量合併時只 redo,不 undo,必須加在除最後一次外的所有合併步驟 |
--stream=tar | 流式輸出,配合 gzip/ssh 遠程備份 |
--tmpdir | 流式備份時 xtrabackup_logfile 臨時目錄,防止 /tmp 爆滿 |
--throttle=IOS | 限制每秒 I/O 操作數,減輕備份對業務影響 |
--slave-info | 備份 Slave 時記錄 Master 位點,生成 xtrabackup_slave_info 便於重做 Slave |
--include=REGEXP | 只備份匹配的表,如 --include="db.tbl1|db.tbl2" |
--databases=LIST | 指定備份的庫列表,空格分隔 |
--use-memory=# | prepare 階段 InnoDB 實例內存限制,大備份建議設 1G+ |
mysqldump 導出 → 導入生產庫。pt-table-checksum)。--encrypt=AES256,保護備份文件安全。XtraBackup/innobackupex 是 MySQL 物理熱備份的工業標準。掌握 全量 → 增量鏈 → --apply-log --redo-only 合併 → --copy-back 恢復 核心流程,配合流式傳輸、節流、驗證機制,可構建 RPO 接近 0、RTO 可控的企業級備份體系。