MySQL备份2 ----- 物理备份¶
一. 使用xtrabackup8.4对MySQL8.4进行物理备份¶
1. 安装xtrabackup¶
[root@4 ~]# ls
anaconda-ks.cfg percona-xtrabackup-84.zip
[root@4 ~]# mount /dev/sr0 /media/cdrom
mount: /media/cdrom: WARNING: source write-protected, mounted read-only.
[root@4 ~]# unzip percona-xtrabackup-84.zip
Archive: percona-xtrabackup-84.zip
creating: percona-xtrabackup-84/
inflating: percona-xtrabackup-84/percona-telemetry-agent-1.0.1-1.el9.x86_64.rpm
inflating: percona-xtrabackup-84/percona-xtrabackup-84-8.4.0-1.1.el9.x86_64.rpm
inflating: percona-xtrabackup-84/percona-xtrabackup-84-debuginfo-8.4.0-1.1.el9.x86_64.rpm
inflating: percona-xtrabackup-84/percona-xtrabackup-84-debugsource-8.4.0-1.1.el9.x86_64.rpm
inflating: percona-xtrabackup-84/percona-xtrabackup-test-84-8.4.0-1.1.el9.x86_64.rpm
[root@4 ~]# cd percona-xtrabackup-84
[root@4 percona-xtrabackup-84]# dnf -y install percona-xtrabackup-84-8.4.0-1.1.el9.x86_64.rpm
3. 备份原理的实现¶
对于Innodb引擎备份过程
在备份开始的时候(10:00开始,10:02备份结束)立即出发checkpoint动作,将内存数据页刷写到磁盘。
拷贝次数所有的数据文件(LSN=1000),再次过程中产生的日志文件(LSN=1000),在此过程中产生的日志文件(to_lsn=1000 redo lats_lsn=1020和undo)也信息备份数据页面+日志
热备份:备份某个时间点的数据,将北方过程中产生的变化也备份出来
4. 备份命令简单实用和备份内容介绍¶
[root@4 percona-xtrabackup-84]# xtrabackup --user=root --password=Abcd1234 --backup --target-dir=/backup
[root@4 percona-xtrabackup-84]# cd /backup/ && ls #进入到备份好的的文件中
backup-my.cnf ibdata1 sys uuu xtrabackup_logfile
binlog.000007 mysql test xtrabackup_binlog_info xtrabackup_tablespaces
binlog.index mysql.ibd undo_001 xtrabackup_checkpoints
ib_buffer_pool performance_schema undo_002 xtrabackup_info
[root@4 backup]# cat /backup/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 22474647
last_lsn = 22474647
flushed_lsn = 22474647
redo_memory = 0
redo_frames = 0
# backup-my.cnf: 包含备份数据库的如下信息:innodb的一些配置信息、数据库的server ID、数据库的服务器UUID、master key id(安全相关)
# xtrabackup_binlog_info: 其记录了备份完成时binlog的位置和GTID信息,用于复制的搭建
# xtrabackup_ckeckpoints: 该文件对于后续的增量备份有用
backup_type = full-backuped # 备份类型:全备份
from_lsn = 0 # 备份中包含的事务日志序列号的起点
to_lsn = 22474647 # 操作保存时的事务日志序列号的结束点
last_lsn = 22474647 # 备份结束时的事务日志系列号,下次增量备份的起始位置,这里的数值会自动增加9 flushed_lsn = 22474647 # 刷新的LSN点
二. 利用xtrabackup进行全备份及恢复¶
1. 全备份¶
[root@4 ~]# xtrabackup --user=root --password=Abcd1234 --backup --target-dir=/backup/full
[root@4 ~]# ls /backup/full
backup-my.cnf ib_buffer_pool mysql.ibd test uuu xtrabackup_info
binlog.000010 ibdata1 performance_schema undo_001 xtrabackup_binlog_info xtrabackup_logfile
binlog.index mysql sys undo_002 xtrabackup_checkpoints xtrabackup_tablespaces
2. 恢复全备份¶
Ⅰ. 前提
恢复的路径(为MySQL数据文件所在的目录)必须是空的,MySQL不需要启动
Ⅱ. 停止数据库
[root@4 ~]# systemctl kill mysqld
Ⅲ. 删除数据
[root@4 ~]# ls /data/mysql/data/
auto.cnf '#ib_16384_0.dblwr' '#innodb_temp' private_key.pem test
ca-key.pem '#ib_16384_1.dblwr' mysql public_key.pem undo_001
ca.pem ib_buffer_pool mysql.ibd server-cert.pem undo_002
client-cert.pem ibdata1 mysql_upgrade_history server-key.pem uuu
client-key.pem '#innodb_redo' performance_schema sys
[root@4 ~]# rm -rf /data/mysql/data/*
[root@4 ~]# ls /data/mysql/data/
Ⅳ. 准备备份恢复(使用redo前滚,使用undo回滚,保证数据一致性)
[root@4 ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/full
[root@4 ~]# xtrabackup --prepare --target-dir=/backup/full
[root@4 ~]# rm -rf /backup/full/binlog*
Ⅴ. 恢复数据
模拟数据故障
将数据全部删除[root@4 ~]# rm -rf /data/mysql/data/*
Ⅵ. 恢复数据
[root@4 ~]# xtrabackup --user=root --password=Abcd1234 --port=3306 --datadir=/data/mysql/data --copy-back --target-dir=/backup/full
此方法依赖于/etc/my.cnf
Ⅶ. 修改权限启动数据库服务
三. 利用xtrabackup进行全备份、增量备份以及恢复¶
1. 增量备份介绍¶
增量备份只备份从上一次备份以来发生变化的数据,而不是每次都拷贝全部数据。优点是节省磁盘空间和备份时间。
2. 增量备份的链条关系¶
每次增量备份都依赖它前面的那次备份。例如:
恢复顺序必须为: 先恢复 A → 把 B 合并到 A → 把 C 合并到 A,缺任何一环都无法恢复。这就是"依赖于全备份和上一次备份"的意思。
每次备份都会记录一个 LSN(日志序列号)范围,保证备份之间的数据是连续的、可衔接的。
3. XBK(XtraBackup)的增量恢复方式¶
XBK 工具本身不能直接用增量备份来恢复。正确做法是:
# 1. 先把全备份做 prepare(预备)
xtrabackup --prepare --apply-log-only --target-dir=/backup/full
# 2. 把增量备份合并(apply)到全备份中
xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1
# 3. 再用合并后的全备份去恢复
xtrabackup --copy-back --target-dir=/backup/full
简记:增量不能直接用,必须先合并到全备份,再用全备份恢复。
4. 增量备份策略的设计与实现¶
备份策略:每周日全备份,周一到周六是增量备份
(1). 周日全备份
[root@4 ~]# rm -rf /backup/*
[root@4 ~]# xtrabackup --user=root --password=Abcd1234 --backup --target-dir=/backup/full
(2). 模拟数据改变
-- 2. 创建数据库
mysql> create database full charset utf8mb4;
Query OK, 1 row affected, 1 warning (0.00 sec)
-- 3. 进入数据库并创建表t1
mysql> use full;
Database changed
mysql> create table t1(id int);
Query OK, 0 rows affected (0.00 sec)
-- 4. 在t1表中加入数据
mysql> insert into t1 values(1),(2),(3);
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0
-- 5. 提交数据
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> \q
Bye
(3). 周一的增量备份
[root@4 ~]# xtrabackup --user=root --password=Abcd1234 --backup\
> --target-dir=/backup/inc1 --incremental-basedir=/backup/full
(4). 周二数据模拟
[root@4 ~]# mysql -uroot -pAbcd1234
mysql> create database inc1 charset utf8mb4;
Query OK, 1 row affected (0.00 sec)
mysql> use inc1;
Database changed
mysql> create table t2(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t2 values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
(5). 周二的增量备份
[root@4 ~]# xtrabackup --user=root --password=Abcd1234 --backup \
> --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
(6). 查看备份信息
[root@4 ~]# cat /backup/full/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 22706065
last_lsn = 22706065
flushed_lsn = 22706065
redo_memory = 0
redo_frames = 0
[root@4 ~]# cat /backup/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 22706065
to_lsn = 22737561
last_lsn = 22737561
flushed_lsn = 22737561
redo_memory = 0
redo_frames = 0
[root@4 ~]# cat /backup/inc2/xtrabackup_checkpoints
[root@4 ~]# cat /backup/inc2/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 22737561
to_lsn = 22754110
last_lsn = 22754110
flushed_lsn = 22754110
redo_memory = 0
redo_frames = 0
5. 全备份与增量备份的恢复¶
a. 准备备份
备份完成后我们得到了非一致性的备份文件
即需要对未提交的事务进行回滚以及对提交的事务进行前滚
这个过程在xtrabackup中叫做准备阶段(prepare stage)
只有这个阶段完成后该备份文件才可以被使用
第一次全备份、第一次增量备份、第二次增量备份三次备份我们同意可以使用--aply-log进行恢复动作,相当于Oracle的recover动作
我们需要以此进行prepare,即按照如下步骤进行:
prepare第一次全备份
prepare第一次增量备份
prepare第二次增量备份还有需要
其中需要注意的是和prepare全备份不一样,除了最后一步,我们都需要在备份时候加上--apply-log-only
该参数使prepare支队commit过的语句进行提交,而不是回滚未提交的语句,这样做是为了能够继续prepare
如果没有加上--apply-log-only则prepare过的数据文件为一致转繁体,无法继续prepare
如果有内存空闲,可以使用--use-memory加快速度
合并备份
# 第1步:prepare 全备份
[root@4 ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/full
# 第2步:合并 inc1
[root@4 ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1
# 第3步:合并 inc2(★ 也加 --apply-log-only)
[root@4 ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc2
# 第4步:最终化全备份(★ 不加 --apply-log-only)
[root@4 ~]# xtrabackup --prepare --target-dir=/backup/full
# 查看恢复准备的备份信息
[root@4 ~]# cat /backup/full/xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 22754110
last_lsn = 22754110
flushed_lsn = 22754110
redo_memory = 0
redo_frames = 0
# 注:为什么最后一步不加?
加了 --apply-log-only → 只应用已提交事务,不回滚未提交的,方便后续继续合并增量
不加(最后一步)→ 既应用已提交的,也回滚未提交的,数据变成最终一致状态,不能再合并增量的
b. 模拟故障
[root@4 ~]# systemctl kill mysqld
[root@4 ~]# ss -tuanp|grep 3306
[root@4 ~]# rm -rf /data/mysql/data/*
[root@4 ~]# ls /data/mysql/data/*
[root@4 ~]# rm -rf /data/mysql/log/*
c. 恢复
[root@4 ~]# xtrabackup --user=root --password=Abcd1234 --port=3306\
> --datadir=/data/mysql/data --copy-back --target-dir=/backup/full
#此方法依赖于/etc/my.cnf
[root@4 ~]# chown -R mysql.mysql /data/mysql/data/*
[root@4 ~]# systemctl start mysqld
#修改权限,并重启数据库服务