Xtrabackup备份(全量、增量)与恢复

一、Xtrabackup介绍

Xtrabackup是Percona团队开发的用于MySQL数据库物理热备份的开源备份工具,具有备份速度快、支持备份数据压缩、自动校验备份数据、支持流式输出、备份过程中几乎不影响业务等特点,是目前各个云厂商普遍使用的MySQL备份工具。

Xtrabackup有两个主要的工具:xtrabackup、innobackupex

1)xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表

2)innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的,innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便,同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。

Xtrabackup备份官方MySQL流程:

1、兼容性检查: Xtrabackup社区版本只支持 MyISAM , InnoDB , CSV , MRG_MYISAM 四种存储引擎的表,其他存储引擎的表不会备份;在这一步中,通过查询tables,若发现存在表的存储引擎不是上述四种引擎之一,会打印warning, 表明Xtrabackup不会备份该表。

2、启动redo后台备份线程:启动redo后台备份线程,从备份实例的最近一次checkpoint LSN的位置开始备份所有增量的redo log,一直持续到备份任务结束。

3、加载所有的innodb表空间:打开并扫描所有innodb表的数据文件,检查所有表空间的第一个页面,初始化所有表的内存结构。

4、备份innodb表:遍历步骤3所构建的表的内存结构,备份每一个innodb表的数据文件,备份的过程中会检查每个页面的数据是否正确。

5、加备份锁 FLUSH TABLES WITH READ LOCK (FTWRL):FTWRL锁是MySQL实例级的读锁,加锁过程复杂,且加锁之后,所有表的所有更新操作以及DDL都会堵塞。

6、备份非innodb表:因为在步骤5我们已经对实例加了读锁,因此,此时备份非innodb表是安全的,此时一定没有写业务。

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

Xtrabackup备份(全量、增量)与恢复

# 将备份输出信息保存到文件

[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/

Xtrabackup备份(全量、增量)与恢复

[root@localhost ~]# /etc/init.d/mysqld start

5)验证恢复数据

[root@localhost ~]# mysql -uroot -pAa123456

Xtrabackup备份(全量、增量)与恢复

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;

Xtrabackup备份(全量、增量)与恢复

原创文章,作者:admin,如若转载,请注明出处:https://hostingchat.cn/384.html

(0)
admin的头像admin
上一篇 2022年8月31日 下午3:22
下一篇 2022年9月1日 上午11:30

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注