| 工具 | 類型 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| mysqldump | 邏輯備份 | 跨版本、可編輯、單表恢復易 | 大庫備份/恢復極慢,鎖表(MyISAM) | < 50GB、異構遷移 |
| LVM 快照 | 物理備份 | 近熱備、文件系統級 | 操作複雜、難腳本化、需 LVM | 已用 LVM 的環境 |
| XtraBackup | 物理熱備 | 不阻塞寫入、速度快、支持增量、壓縮、流式傳輸、並行 | MyISAM 只能溫備、需 innodb_file_per_table、版本綁定 | InnoDB 大庫生產首選 |
# 配置 Percona Yum 源
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release enable tools release
# 安裝 XtraBackup 2.4(5.7)或 8.0(8.0)
yum install -y percona-xtrabackup-24 # 5.7
# yum install -y percona-xtrabackup-80 # 8.0
# 驗證
xtrabackup --version
innobackupex --version
xtrabackup:底層引擎,只備份 InnoDB,不含表結構innobackupex:Perl 封裝腳本,支持 MyISAM、表結構、完整實例備份(**主力工具**)xbstream:流式打包/解包,配合網絡傳輸xbcrypt:加密/解密備份文件xbcloud:雲存儲上傳/下載| 參數 | 作用 | 典型用法 |
|---|---|---|
--apply-log | 準備備份:回滾未提交事務、重放已提交事務,使數據一致 | 備份後必須執行,增量備份每層都要執行 |
--redo-only | 準備增量備份時僅重做,不回滾未提交事務 | 基備+增量合併過程中,除最後一層外都加此參數 |
--copy-back | 還原:將備份文件複製回目標 datadir | 目標目錄必須為空,還原後修改權限 |
--incremental | 增量備份模式 | 配合 --incremental-basedir 指定基準目錄 |
--stream=tar | 流式輸出到 stdout,配合管道壓縮/傳輸 | innobackupex --stream=tar /backup | gzip > backup.tar.gz |
--parallel=N | 並行複製文件數(需 innodb_file_per_table) | 大庫加速,如 --parallel=4 |
--remote-host | 直接備份到遠程主機 | --remote-host=user@host /remote/path |
# 1. 全量備份
innobackupex --user=root --password='Pass123!' --no-timestamp /backup/full_base
# 2. 準備(使數據一致)
innobackupex --apply-log /backup/full_base
# === 模擬故障 ===
systemctl stop mysqld
rm -rf /data/mysql/*
# 3. 還原
innobackupex --copy-back /backup/full_base
chown -R mysql:mysql /data/mysql
systemctl start mysqld
# 0. 基準全量備份
innobackupex --user=root --password='Pass123!' /backup
# 假設生成 /backup/2023-01-01_00-00-00
# 1. 第一次增量
innobackupex --user=root --password='Pass123!' --incremental /backup \
--incremental-basedir=/backup/2023-01-01_00-00-00
# 生成 /backup/2023-01-01_01-00-00
# 2. 第二次增量(基於上一次增量)
innobackupex --user=root --password='Pass123!' --incremental /backup \
--incremental-basedir=/backup/2023-01-01_01-00-00
# 生成 /backup/2023-01-01_02-00-00
# === 準備階段:由基向增量順序合併 ===
# 基備重做
innobackupex --apply-log --redo-only /backup/2023-01-01_00-00-00
# 第一增量重做
innobackupex --apply-log --redo-only /backup/2023-01-01_00-00-00 \
--incremental-dir=/backup/2023-01-01_01-00-00
# 第二增量重做(最後一層可不加 --redo-only,或加上再最後執行一次無參數 apply-log)
innobackupex --apply-log --redo-only /backup/2023-01-01_00-00-00 \
--incremental-dir=/backup/2023-01-01_02-00-00
# 最終統一準備(可選,確保徹底一致)
innobackupex --apply-log /backup/2023-01-01_00-00-00
# === 還原 ===
systemctl stop mysqld
rm -rf /data/mysql/*
innobackupex --copy-back /backup/2023-01-01_00-00-00
chown -R mysql:mysql /data/mysql
systemctl start mysqld
# 本地壓縮
innobackupex --user=root --password='Pass123!' --stream=tar /backup | gzip > /backup/full_$(date +%F_%H-%M-%S).tar.gz
# 遠程直接傳輸(強烈推薦,無本地落盤壓力)
innobackupex --user=root --password='Pass123!' --stream=tar /backup | \
ssh backup_user@backup_server "cat > /backup/mysql/full_$(date +%F_%H-%M-%S).tar"
innobackupex --user=root --password='Pass123!' --parallel=4 /backup
# 需 innodb_file_per_table=ON,多表空間文件並行複製
# 方式 1:正則匹配表名(需 innodb_file_per_table)
innobackupex --user=root --password='Pass123!' --include='^mydb\.t_' /backup
# 方式 2:文件列表
echo -e 'mydb.t1\nmydb.t2' > /tmp/tables.txt
innobackupex --user=root --password='Pass123!' --tables-file=/tmp/tables.txt /backup
# 方式 3:指定庫(含所有表)
innobackupex --user=root --password='Pass123!' --databases='mydb testdb' /backup
部分備份還原:無法直接 --copy-back,需 --apply-log --export 產生 .cfg/.ibd,再在目標庫 CREATE TABLE ... DISCARD TABLESPACE; ALTER TABLE ... IMPORT TABLESPACE; 導入。
# 源庫:備份並導出
innobackupex --user=root --password='Pass123!' --databases='mydb.t1' /backup
innobackupex --apply-log --export /backup/2023-01-01_00-00-00
# 產生 t1.ibd, t1.cfg (5.7) 或 t1.sdi (8.0)
# 目標庫:建表結構、棄用表空間、導入
# 1. 獲取建表語句
SHOW CREATE TABLE mydb.t1;
# 2. 目標庫建表
CREATE TABLE mydb.t1 (...) ENGINE=InnoDB;
# 3. 棄用表空間
ALTER TABLE mydb.t1 DISCARD TABLESPACE;
# 4. 複製 ibd/cfg 到目標 datadir/mydb/
# 5. 導入表空間
ALTER TABLE mydb.t1 IMPORT TABLESPACE;
# crontab -e
# 每日 02:00 全量備份(流式壓縮上傳異地)
0 2 * * * /scripts/xtrabackup_full.sh >> /var/log/xtrabackup_full.log 2>&1
# 每 6 小時增量備份
0 */6 * * * /scripts/xtrabackup_incr.sh >> /var/log/xtrabackup_incr.log 2>&1
xtrabackup_incr.sh 關鍵邏輯:自動尋找最新基備/增量目錄作為 --incremental-basedir。
RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT 等權限chown -R mysql:mysql,檢查 innodb_log_file_size 與配置一致