xtrabackup备份数据库
介绍
一般来说,在生产部署服务的时候,需要考虑,生产数据库需要备份,在主从之外,恢复数据的话,需要可以手动配置的机制,防止出现极端情况,主从全崩。
本文主要参考:https://www.cnblogs.com/linuxk/p/9372990.html这位大佬的操作记录,根据自己实际操作的情况,对实际命令做了一些补充。具体参考本文的话,可以两个博客对照着看。
Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力(同时也可以备份innodb,xtradb)。
常用选项:
–host 指定主机
–user 指定用户名
–password 指定密码
–port 指定端口
–databases 指定数据库
–incremental 创建增量备份
–incremental-basedir 指定包含完全备份的目录
–incremental-dir 指定包含增量备份的目录
–apply-log 对备份进行预处理操作
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
–redo-only 不回滚未提交事务
–copy-back 恢复备份目录
安装
主从都要安装
下载在最后的参考链接部分
安装xtrabackup:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
rpm -qa |grep xtrabackup
安装包复制:
scp -r root@172.30.11.99:/mha/xtrabackup/ /mha/
全量备份
主库全量备份:
新建备份文件夹: BACKUP-DIR 目录自定义
innobackupex --defaults-file=/mha/mysql/install/public/mysql/my.cnf --user=root --password='XXXX' --host=172.30.11.36 --port=3308 --socket=/mha/mysql/install/public/mysql/mysql.sock /mha/xtrabackup/BACKUP-DIR/
从库停止数据库
sh stop.sh
(用户可用mysql自带的命令实现停止数据库命令)
从库复制主库的备份数据
scp -r root@172.30.11.36:/mha/xtrabackup/BACKUP-DIR/ /mha/xtrabackup/
会得到全量备份目录:
2022-02-17_15-28-40
从库上,执行,合并数据,使数据文件处于一致性的状态
innobackupex --apply-log /mha/xtrabackup/BACKUP-DIR/2022-02-17_15-28-40/
从库 在slave上删除原有的数据
rm -rf /mha/mysql/install/public/mysql/data/
其实就是删除data这个文件夹
配置my.cnf的数据目录路径,否则会报错,要和master一致
所以,一般主从复制架构,建议主从配置文件夹一毛一样
datadir=/mha/mysql/install/public/mysql/data
在slave上数据恢复
innobackupex --defaults-file=/mha/mysql/install/public/mysql/my.cnf --user=slave --copy-back /mha/xtrabackup/BACKUP-DIR/2022-02-17_15-28-40/
权限问题
slave上查看数据目录,可以看到数据已经恢复,但是属主会有问题,需要进行修改,所以一般使用mysql的运行用户进行恢复,否则需要进行修改属主和属组信息
修改属主属组—这一步我没做,看服务器情况
chown -R mysql.mysql /mha/mysql/install/public/mysql/data/
chown -R mysql /mha/mysql/install/public/mysql/data/
登录数据库
cd /mha/mysql/install/public/mysql/bin
./mysql -h 127.0.0.1 -P 3308 -u root -pXXXXX
数据权限恢复
----------------------------如果恢复的数据没有权限,可以用如下方式恢复权限-----------------------------
使用工具:pt-show-grants,这个是在percona-toolkit工具集里面,笔者下载rpm,发现无法安装,于是下载了gz格式,解压后,发现bin目录里面就就有这个,可以直接./使用。如下:
xtrabackup
pt-show-grants的功能是格式化打印输出MySQL上的赋权,以便你可以有效地复制、比较以及版本控制。
下载在最后的参考链接部分。
下载工具集:
wget percona.com/get/percona-toolkit.gz
percona-toolkit
tar -xzvf percona-toolkit.tar.gz
在这里:/mha/xtrabackup/percona-toolkit-3.3.1/bin
打印主库权限:
cd /mha/xtrabackup/percona-toolkit-3.3.1/bin
./pt-show-grants --host=172.30.11.36 --port=3308 --user=root --password='XXXX' --socket=/mha/mysql/install/public/mysql/mysql.sock --charset=utf8
复制打印的权限,在从库执行以root用户:
具体权限就不贴出来了,是一批sql语句,可以直接运行的那种。注意查看权限是否对。
增量备份
使用innobackupex进行增量备份,每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推。
需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。
“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
①需要在每个备份 (包括完全和各个增量备份)上,将已经提交的事务进行"重放"。“重放"之后,所有的备份数据将合并到完全备份上。
②基于所有的备份将未提交的事务进行"回滚”
主库全量备份
笔者用了上面的全量备份数据,这里就没有操作,和上面的一样,生成一个全量备份文件夹
主库:使用innobackupex进行增量备份
innobackupex --user=root --password='XXXX' --host=127.0.0.1 --port=3308 --incremental /mha/xtrabackup/BACKUP-DIR/ --incremental-basedir=/mha/xtrabackup/BACKUP-DIR/2022-02-17_15-28-40/
获取的备份数据案例:
#: 全量的备份: 2022-02-17_15-28-40
#: 增量的备份: 2022-02-18_17-30-24
全量:
backup_type = full-backuped
from_lsn = 0
to_lsn = 2617200
last_lsn = 2617209
compact = 0
recover_binlog_info = 0
增量:
backup_type = incremental
from_lsn = 2617200
to_lsn = 2635316
last_lsn = 2635325
compact = 0
recover_binlog_info = 0
可以看到
lsn
0----->2617200 – 全量
2617200------>2635316 – 增量
模拟宕机
关掉主数据库,模拟宕机,删除主库数据
cd /mha/mysql/mysqlpackage
sh stop.sh
cd /mha/mysql/install/public/mysql/
rm -rf data/
---------执行到这里了。。。。。。。。。。。。。。 从库99 主库36
这次在主库上操作:
主库:合并全备数据目录,确保数据的一致性
“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
①需要在每个备份 (包括完全和各个增量备份)上,将已经提交的事务进行"重放"。“重放"之后,所有的备份数据将合并到完全备份上。
②基于所有的备份将未提交的事务进行"回滚”
注意,这里的主库恢复数据和上面的不一样,增加了 --redo-only选型
innobackupex --apply-log --redo-only /mha/xtrabackup/BACKUP-DIR/2022-02-17_15-28-40/
主库:将增量备份数据合并到全备数据目录当中
注意,这里的主库恢复数据和上面的不一样,增加了 --redo-only选项
innobackupex --apply-log --redo-only /mha/xtrabackup/BACKUP-DIR/2022-02-17_15-28-40/ --incremental-dir=/mha/xtrabackup/BACKUP-DIR/2022-02-18_17-30-24/
恢复数据(数据会合并到完全备份的数据上):
-- innobackupex --copy-back /backups/2022-02-17_15-28-40/
innobackupex --defaults-file=/mha/mysql/install/public/mysql/my.cnf --user=root --copy-back /mha/xtrabackup/BACKUP-DIR/2022-02-17_15-28-40/
启动数据库,查看恢复情况
略
参考博客:
xtrabackup:
https://www.cnblogs.com/linuxk/p/9372990.html
https://www.dqzboy.com/1346.html
下载:
https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/
pt-show-grants:
https://dba.stackexchange.com/questions/41165/xtrabackup-backup-grants
https://www.cnblogs.com/bjx2020/p/10614979.html
https://blog.csdn.net/sweeper_freedoman/article/details/79939638
下载:
https://www.percona.com/doc/percona-toolkit/3.0/pt-show-grants.html#downloading
https://www.percona.com/software/mysql-database/percona-xtrabackup