一、Xtrabackup介绍
Xtrabackup是Percona团队开发的用于MySQL数据库物理热备份的开源备份工具,具有备份速度快、支持备份数据压缩、自动校验备份数据、支持流式输出、备份过程中几乎不影响业务等特点,是目前各个云厂商普遍使用的MySQL备份工具。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex
文章源自小柒网-https://www.yangxingzhen.cn/8226.html
1)xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
文章源自小柒网-https://www.yangxingzhen.cn/8226.html
2)innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的,innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便,同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。
文章源自小柒网-https://www.yangxingzhen.cn/8226.html
Xtrabackup备份官方MySQL流程:
文章源自小柒网-https://www.yangxingzhen.cn/8226.html
1、兼容性检查: Xtrabackup社区版本只支持 MyISAM , InnoDB , CSV , MRG_MYISAM 四种存储引擎的表,其他存储引擎的表不会备份;在这一步中,通过查询tables,若发现存在表的存储引擎不是上述四种引擎之一,会打印warning, 表明Xtrabackup不会备份该表。
文章源自小柒网-https://www.yangxingzhen.cn/8226.html
2、启动redo后台备份线程:启动redo后台备份线程,从备份实例的最近一次checkpoint LSN的位置开始备份所有增量的redo log,一直持续到备份任务结束。
文章源自小柒网-https://www.yangxingzhen.cn/8226.html
3、加载所有的innodb表空间:打开并扫描所有innodb表的数据文件,检查所有表空间的第一个页面,初始化所有表的内存结构。
文章源自小柒网-https://www.yangxingzhen.cn/8226.html
4、备份innodb表:遍历步骤3所构建的表的内存结构,备份每一个innodb表的数据文件,备份的过程中会检查每个页面的数据是否正确。
文章源自小柒网-https://www.yangxingzhen.cn/8226.html
5、加备份锁 FLUSH TABLES WITH READ LOCK (FTWRL):FTWRL锁是MySQL实例级的读锁,加锁过程复杂,且加锁之后,所有表的所有更新操作以及DDL都会堵塞。
文章源自小柒网-https://www.yangxingzhen.cn/8226.html
6、备份非innodb表:因为在步骤5我们已经对实例加了读锁,因此,此时备份非innodb表是安全的,此时一定没有写业务。
文章源自小柒网-https://www.yangxingzhen.cn/8226.html
7、记录binlog当前的GTID信息:请注意,此时我们仍持有全局读锁。这一步主要是方便我们使用该备份集快速地创建出备机。
8、停止redo备份线程。
9、释放锁资源,备份结束。
二、XtraBackup命令种类
序号 |
命令 |
描述 |
1 |
xbcrypt | 用于加密或解密备份的数据 |
2 |
xbstream | 用于压缩或者解压缩xbstream文件 |
3 |
xtrabackup | 用于备份使用InnoDB、XtraDB作为存储引擎的数据表,该命令仅备份表数据文件,所以通常用在增量备份上 |
4 |
innobackupex | 是上面三种命令的perl脚本封装,可以使用该命令备份MyISAM数据表,并且只有使用该命令才能备份表数据文件、表定义文件、表索引文件,所以通常用在全量备份上 |
三、Xtrabakcup安装
1、下载安装包
Xtrabakcup下载地址:https://www.percona.com/downloads/选择自己的版本下载
[root@localhost ~]# wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.21/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.21-r5988af5-el7-x86_64-bundle.tar
2、解压
[root@localhost ~]# tar xf Percona-XtraBackup-2.4.21-r5988af5-el7-x86_64-bundle.tar
3、安装xtrabackup
[root@localhost ~]# yum -y install percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm
[root@localhost ~]# innobackupex --version
xtrabackup: recognized server arguments: --datadir=/data/mysql --log_bin=mysql-bin --server-id=1 --innodb_buffer_pool_size=1G
innobackupex version 2.4.21 Linux (x86_64) (revision id: 5988af5)
4、Xtrabakcup使用
1)用户权限说明
备份数据库时会涉及到两个用户:系统用户与数据库内部的用户
2)系统用户
需要在数据目录(配置文件设置的数据目录)上具有读写执行权限(rwx)
3)数据库内部用户
RELOAD和LOCK TABLES权限,执行FLUSH TABLES WITH READ LOCA;
REPLICATION CLIENT权限,获取binary log(二进制日志文件)位置;
CREATE TABLEPACE权限,导入表,用户表级别的恢复;
SUPER权限,在slave环境下备份用来启用和关闭slave线程。
4)常用命令格式和参数
1、命令格式:
innobackupex [参数] [目的地址] [源地址]
2、常用参数
--user #指定数据库备份用户
--password #指定数据库备份用户密码
--port #指定数据库端口
--host #指定备份主机
--socket #指定socket文件路径
--parallel=4 #并行个数,根据主机配置选择合适的,默认是1个,多个可以加快备份速度。
--throttle=400 #io限制数,一般来说并行能增加速度,但是IO也高,限制能减少影响
--databases #备份指定数据库,多个空格隔开,如–databases”dbname1 dbname2”,不加备份所有库
--defaults-file #指定my.cnf配置文件
--apply-log #日志回滚
--incremental #增量备份,后跟增量备份路径
--incremental-basedir #增量备份,指上次增量备份路径
--redo-only #合并全备和增量备份数据文件
--copy-back #将备份数据复制到数据库,数据库目录要为空
--move-back #这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本
--no-timestamp #生成备份文件不以时间戳为目录名
--stream #指定流的格式做备份,--stream tar,将备份文件归档
--remote-host user@ip DST_DIR #备份到远程主机
5、Xtrabakcup完整备份和还原
1)创建当天日期备份目录
[root@localhost ~]# mkdir -p /data/backup/$(date +%Y%m%d)
2)完整备份
# 终端输出日志
[root@localhost ~]# innobackupex --host=127.0.0.1 --user=root --password='Aa123456' --parallel=4 /data/backup/20220830
# 将备份输出信息保存到文件
[root@localhost ~]# innobackupex --host=127.0.0.1 --user=root --password='Aa123456' --parallel=4 /data/backup/20220830 2> backup.log
# 不使用时间戳创建目录,可自动指定创建备份目录
[root@localhost ~]# innobackupex --host=127.0.0.1 --user=root --password='Aa123456' --no-timestam /data/backup/20220830/mysql_bak 2> backup.log
# ls查看自己指定的目录
[root@localhost ~]# ls /data/backup/20220830/
2022-08-30_16-12-33 2022-08-30_16-15-48 2022-08-30_16-16-05 mysql_bak
3)数据还原
注意:innobackupex -copy-back不会覆盖已存在的文件。而且还原时需要先关闭服务,如果服务是启动的,那么就不能还原数据
# 停止服务
[root@localhost ~]# /etc/init.d/mysqld stop
# 删除数据目录数据(危险操作,请在测试环境操作)
[root@localhost ~]# rm -rf /data/mysql/*
1)恢复第一步:应用日志
innobackupex --apply-log --use-memory=4G /data/backup/20220830/2022-08-30_16-16-05
2)恢复第二步:拷贝文件
innobackupex --copy-back --use-memory=4G /data/backup/20220830/2022-08-30_16-16-05
3)恢复第三步:修改文件权限
chown -R mysql.mysql /data/mysql
4)启动Mysql服务
[root@localhost ~]# ls -l /data/mysql/
[root@localhost ~]# /etc/init.d/mysqld start
5)验证恢复数据
[root@localhost ~]# mysql -uroot -pAa123456
6、Xtrabakcup增量备份和还原
注:增量备份的实现,依赖于innodb也上面的LSN(log sequence number),每次对数据库的修改都会导致LSN自增。增量备份会复制指定LSN<日志序列号>之后的所有数据页。
1、查看完整备份的LSN
[root@localhost ~]# cd /data/backup/20220830/2022-08-30_16-16-05
[root@localhost 2022-08-30_16-16-05]# cat xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 2774122
last_lsn = 2774131
compact = 0
recover_binlog_info = 0
flushed_lsn = 2774131
2、创建增量备份
# 创建测试数据,以2022-08-30_16-16-05时间戳创建第一个增量备份,并查看LSN
mysql> create database test;
ERROR 1007 (HY000): Can't create database 'test'; database exists
mysql> create table test.user(id int,name varchar(20));
Query OK, 0 rows affected (0.04 sec)
mysql> insert into test.user values(1,'test');
Query OK, 1 row affected (0.02 sec)
mysql> insert into test.user values(2,'test2');
Query OK, 1 row affected (0.01 sec)
mysql> insert into test.user values(3,'test3');
Query OK, 1 row affected (0.01 sec)
mysql> select * from test.user;
+------+-------+
| id | name |
+------+-------+
| 1 | test |
| 2 | test2 |
| 3 | test3 |
+------+-------+
3 rows in set (0.00 sec)
[root@localhost 2022-08-30_16-16-05]# innobackupex --user=root --password=Aa123456 --incremental /data/backup/mysql_bak --incremental-basedir=/data/backup/20220830/2022-08-30_16-16-15
[root@localhost 2022-08-30_16-16-05]# cd /data/backup/mysql_bak/2022-08-30_16-40-45
[root@localhost 2022-08-30_16-40-45]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2774122
to_lsn = 2781594
last_lsn = 2781603
compact = 0
recover_binlog_info = 0
flushed_lsn = 2781603
3、数据还原
1)先初始化全量备份
[root@localhost 2022-08-30_16-40-45]# innobackupex --apply-log --redo-only /data/backup/20220830/2022-08-30_16-16-05
2)初始化整合增量备份到全量备份(把全量备份跟增量备份进行一个结合)
[root@localhost 2022-08-30_16-40-45]# innobackupex --apply-log --redo-only /data/backup/20220830/2022-08-30_16-16-05 --incremental-dir=/data/backup/mysql_bak/2022-08-30_16-40-45
3)查看全量备份xtrabackup_checkpoints
[root@localhost 2022-08-30_16-40-45]# cd /data/backup/20220830/2022-08-30_16-16-05/
[root@localhost 2022-08-30_16-16-05]# cat xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 2781594
last_lsn = 2781603
compact = 0
recover_binlog_info = 0
flushed_lsn = 2781603
# 对之前查看的第一次增量备份的.latest_lsn位置,在应用第一次增量备份到全量后,可以看到last_lsn已经被应用和第一次全量备份的位置相同了
4)停止mysqld服务并删除数据目录文件
[root@localhost 2022-08-30_16-16-05]# /etc/init.d/mysqld stop
[root@localhost 2022-08-30_16-16-05]# rm -rf /data/mysql/*
5)使用--copy-back参数恢复拷贝到数据目录
[root@localhost 2022-08-30_16-16-05]# innobackupex --copy-back /data/backup/20220830/2022-08-30_16-16-05
6)验证数据还原,启动Mysql服务并授权
[root@localhost 2022-08-30_16-16-05]# chown -R mysql.mysql /data/mysql/
[root@localhost 2022-08-30_16-16-05]# /etc/init.d/mysqld start
[root@localhost 2022-08-30_16-16-05]# mysql -uroot -pAa123456
mysql> select * from test.user;
若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如本文“对您有用”,欢迎随意打赏,谢谢!
评论