Xtrabackup企业实战
一、为什么要使用Xtrabackup进行企业级数据备份?
- 快速备份速度,物理备份更可靠。
- 备份过程不会中断正在执行的事务,无需锁表。
- 支持压缩等功能,节约磁盘空间和流量。
- 自动备份校验。
- 快速恢复速度。
- 可以将备份传输到另一台机器。
- 节约磁盘空间和网络带宽。
二、常见备份工具:mysqldump、xtrabackup、innobackupex等
- 当数据量超过100GB时,使用mysqldump(逻辑备份)备份速度慢,恢复速度慢,并且在备份期间会锁表,导致数据库只能进行查询而无法写入数据。
- 对于TB级别的生产数据,推荐使用xtrabackup(物理备份)或innobackupex(实际上是通过脚本调用xtrabackup)进行备份。
- xtrabackup只能备份InnoDB和XtraDB两种引擎的表,无法备份MyISAM数据表。
- innobackupex可以同时备份InnoDB和MyISAM表,但需要对MyISAM加读锁。
三、Xtrabackup备份原理
准备阶段
- Xtrabackup首先通过读取数据库的my.cnf(或my.ini)配置文件获取数据库连接信息和参数设置。
- 它启动一个名为"backup-prepare"的特殊服务器进程,用于协调备份操作。
- 在准备阶段,Xtrabackup创建一个备份目录,并在该目录中创建必要的控制文件和日志文件。
备份阶段
- Xtrabackup使用InnoDB的多版本并发控制(MVCC)机制来保证备份的一致性。
- 首先,它会对所有InnoDB表进行FLUSH TABLES操作,将所有未提交的事务刷新到磁盘,并锁定表结构。
- 然后,Xtrabackup会遍历每个InnoDB表,并按页(page)进行备份。
- 对于每个页,Xtrabackup会读取页数据以及相关的页元数据,如页类型、LSN(Log Sequence Number)、校验和等。
- 为了提高备份速度,Xtrabackup可以利用InnoDB的快照机制(如果可用)来避免读取正在被其他事务修改的页数据。
- 备份过程中的所有读操作都是通过直接访问磁盘上的数据文件完成的,无需加载到内存中。
完成阶段
- 当备份阶段完成后,Xtrabackup会对备份进行一致性校验,以确保备份数据的完整性和正确性。
- 接下来,Xtrabackup会将备份目录中的日志文件复制到相应的位置,并生成一个备份元数据文件,其中包含备份相关的信息和参数设置。
- 备份过程结束后,可以使用Xtrabackup提供的工具进行数据库还原或执行增量备份等操作。
四、备份策略
- 企业备份一般采用备份策略(周一到周六增量备份、周天全量备份)
- 备注:增量备份前提是有完整全量备份
五、常见安装方式
1、Centos7安装两种方式(rpm和源码)
官网地址:https://www.percona.com/downloads
mysql版本不同下载内容不同
wget https://repo.percona.com/centos/7/RPMS/noarch/percona-release-0.1-8.noarch.rpm
rpm -ivh https://repo.percona.com/centos/7/RPMS/noarch/percona-release-0.1-8.noarch.rpm
yum install percona-xtrabackup-80.x86_64 -y
xtrabackup -version
五、XtraBackup实战
1、mysql运行在docker容器内
#重点mysql运行在docker里面的使用xtrabackup如下:
mkdir /opt/xtrabackup/mysql_backup #备份路径
mkdir /opt/xtrabackup/mysql_conf docker mysql 里面的配置
docker cp mysql_backup:/etc/mysql/my.cnf /opt/xtrabackup/mysql_conf
docker cp mysql_backup:/etc/mysql/conf.d /opt/xtrabackup/mysql_conf
docker cp mysql_backup:/var/run/mysqld /opt/xtrabackup/mysql_conf
查看mysqlbinlog位置
show variables like 'log_%';
2、全量备份数据与恢复(整个mysql库)
#修改宿主机外面my.cnf为宿主机存在文件夹。
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --backup --datadir=/data/mysql --target-dir=/opt/xtrabackup/mysql_backup --user=root --password=cdct+22f --port=3307 --host=192.168.197.100 --no-server-version-check
数据删除恢复:
备注:如果是本地mysql一定要授权 chown -R mysql:mysql /var/lib/mysql/*
使用参数:apply-log恢复,完整:--copy-back
通常数据库备份完成后,数据尚不能直接用于恢复操作,因为备份数据是一个过程,在备份过程中,有任务会写入数据,可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。
因此此时数据文件仍处于不一致状态,基于--apply-log可以通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态,方可进行恢复数据。
测试:
先删除/data/mysql下面的数据
准备全备份的日志:
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --prepare --apply-log-only --target-dir=/opt/xtrabackup/mysql_backup --user=root --password=cdct+22f --port=3307 --host=192.168.197.100 --no-server-version-check
全备份准备:
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --prepare --target-dir=/opt/xtrabackup/mysql_backup --user=root --password=cdct+22f --port=3307 --host=192.168.197.100 --no-server-version-check
恢复:
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --datadir=/data/mysql --copy-back --target-dir=/opt/xtrabackup/mysql_backup --user=root --password=cdct+22f --port=3307 --host=192.168.197.100 --no-server-version-check
验证数据:
3、全量备份和增量备份与恢复(整个mysql库)
必须要完全备份后才能增量备份
增量备份数据:
mkdir -p /opt/xtrabackup/mysql_backup_2023_0628
插入新数据:
INSERT INTO `test`.`casbin_rule`(`ptype`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES ('p', 'guest', '/api/v1/deploy/k3s/dev_01', 'GET', '', '', '');
INSERT INTO `test`.`casbin_rule`(`ptype`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES ('p', 'guest', '/api/v1/deploy/k3s/dev_02', 'GET', '', '', '');
第一次增量备份
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --backup --target-dir=/opt/xtrabackup/mysql_backup_2023_0628 --incremental-basedir=/opt/xtrabackup/mysql_backup --user=root --password=cdct+22f --port=3307 --host=192.168.197.100 --no-server-version-check
验证:
一定是基于第一次增量备份基础上操作
第二次增量备份:一定是基于第一次增量备份基础上操作
插入新数据:
INSERT INTO `test`.`casbin_rule`(`ptype`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES ('p', 'guest', '/api/v1/deploy/k3s/test_01', 'GET', '', '', '');
INSERT INTO `test`.`casbin_rule`(`ptype`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES ('p', 'guest', '/api/v1/deploy/k3s/test_02', 'GET', '', '', '');
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --backup --target-dir=/opt/xtrabackup/mysql_backup_2023_0629 --incremental-basedir=/opt/xtrabackup/mysql_backup_2023_0628 --user=root --password=cdct+22f --port=3307 --host=192.168.197.100 --no-server-version-check
查看备份路径文件夹
查看to_lsn起始值与from_lsn结束值能否对应
增量备份恢复步骤如下:
说明:第一次全备,第二次在全备的基础上做增量,第三次在第二次增量备份上做增量,同理第四次在第三次的基础上做增量…(恢复的时候也是依次,第一次整合全备,第二次全备基础是整合增量备份的。第三次在第二次增量基础上整合增量。
-
备份:X=X+A+B+C
-
恢复:X->A->B-C
1、删除原有数据库rm -rf /data/mysql/*
2、全量备份基于apply-log数据一致性xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --prepare --apply-log-only --target-dir=/opt/xtrabackup/mysql_backup --user=root --password=cdct+22f --port=3307 --host=192.168.197.100 --no-server-version-check
3、执行第一次增量备份的日志
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --prepare --apply-log-only --target-dir=/opt/xtrabackup/mysql_backup --incremental-dir=/opt/xtrabackup/mysql_backup_2023_0628 --user=root --password=cdct+22f --port=3307 --host=192.168.197.100
4、执行第二次增量备份的日志xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --prepare --apply-log-only --target-dir=/opt/xtrabackup/mysql_backup --incremental-basedir=/opt/xtrabackup/mysql_backup_2023_0629 --user=root --password=cdct+22f --port=3307 --host=192.168.197.100
5、执行完整数据恢复
全库准备:xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --prepare --target-dir=/opt/xtrabackup/mysql_backup --user=root --password=cdct+22f --port=3307 --host=192.168.197.100
全库恢复:
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --datadir=/data/mysql --copy-back --target-dir=/opt/xtrabackup/mysql_backup --user=root --password=cdct+22f --port=3307 --host=192.168.197.100
验证数据:
4、xtrabackup对单个test数据库全量备份和增量备份与恢复
- 全量备份对test库
mkdir -p /opt/xtrabackup/mysql_test
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --databases=test --backup --datadir=/data/mysql --target-dir=/opt/xtrabackup/mysql_test --user=root --password=cdct+22f --port=3307 --host=192.168.197.100
- 第一次增量备份(test库)
新增一张approval表
CREATE TABLE `approval` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增编号',
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
`env_id` bigint(20) DEFAULT NULL COMMENT '环境ID',
`is_enabled` tinyint(1) DEFAULT '0' COMMENT '是否开启审批',
PRIMARY KEY (`id`),
KEY `idx_approval_deleted_at` (`deleted_at`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
mkdir -p /opt/xtrabackup/mysql_test_bak01
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --databases=test --backup --target-dir=/opt/xtrabackup/mysql_test_bak01 --incremental-basedir=/opt/xtrabackup/mysql_test --user=root --password=cdct+22f --port=3307 --host=192.168.197.100
- 第二次增量备份(test库)
插入新数据
INSERT INTO `test`.`hosts_group`( `name`, `parent_id`, `hide`, `sort_id`) VALUES ('华为云', 0, 0, 3);
mkdir -p /opt/xtrabackup/mysql_test_bak02
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --databases=test --backup --target-dir=/opt/xtrabackup/mysql_test_bak02 --incremental-basedir=/opt/xtrabackup/mysql_test_bak01 --user=root --password=cdct+22f --port=3307 --host=192.168.197.100
查看to_lsn起始值与from_lsn结束值能否对应
-
现在不小心删除了阿里云跟腾讯云和app表
删除test库中的app表
drop table app;
备注:对于使用XtraBackup进行备份的情况,全量和增量备份是分别针对一个干净的目标数据目录进行的。因此,不能直接在现有的数据库中进行全量和增量恢复。 -
恢复开始:
1、全量备份基于apply-log数据一致性xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --prepare --apply-log-only --target-dir=/opt/xtrabackup/mysql_test --user=root --password=cdct+22f --port=3307 --host=192.168.197.100
2、第一次增量备份日志准备
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --prepare --apply-log-only --target-dir=/opt/xtrabackup/mysql_test --incremental-dir=/opt/xtrabackup/mysql_test_bak01 --user=root --password=cdct+22f --port=3307 --host=192.168.197.100
3、第二次增量备份日志准备
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --prepare --apply-log-only --target-dir=/opt/xtrabackup/mysql_test --incremental-dir=/opt/xtrabackup/mysql_test_bak02 --user=root --password=cdct+22f --port=3307 --host=192.168.197.100
4、全库准备
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --prepare --target-dir=/opt/xtrabackup/mysql_test --user=root --password=cdct+22f --port=3307 --host=192.168.197.100
备注:全库恢复前提目标库必须是空的不然会报错如下:
#先备份源路径/data/mysql cp -b /data/mysql /data/mysql_bak rm -rf /data/mysql
5、全库恢复:
xtrabackup --defaults-file=/opt/xtrabackup/mysql_conf/my.cnf --datadir=/data/mysql --copy-back --target-dir=/opt/xtrabackup/mysql_test --user=root --password=cdct+22f --port=3307 --host=192.168.197.100 scp -r /data/mysql/* /data/mysql_bak/ && rm -rf /data/mysql/* && scp -r /data/mysql_bak/ * /data/mysql/
数据库验证:
5、恢复过程中的疑问解答:
第一次全量备份:备份了a/b/c三张表 第一次增量备份:并添加了d表 完成增量备份。
删除a表:在第二次增量备份之前删除了a表。 第二次增量备份:在第二次增量备份后,删除了d表中的某一条数据能恢复。 但是:a表为什么不能恢复?
a表在第二次增量备份之前被删除,因此无法从备份中恢复。增量备份是基于上一次备份的变化进行的,而在第二次增量备份之前删除的数据不会包含在备份中。
在第一次增量备份之后,您添加了d表并完成了增量备份。
然后,您删除了a表并进行了第二次增量备份。在这个过程中,备份只记录了已有的变化,而不会包含在第一次增量备份之后删除的a表。
因此,如果a表在第二次增量备份之前被删除,无法从备份中恢复a表的数据。只有在备份中存在的数据变化才能在恢复时使用。