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

小柒助手 MySQL评论1,3149字数 2275阅读7分35秒阅读模式

一、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;

若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如本文“对您有用”,欢迎随意打赏,谢谢!

继续阅读
Wechat
微信扫一扫,加我!
weinxin
我的微信
微信号已复制
微信公众号
微信扫一扫,关注我!
weinxin
我的公众号
公众号已复制
MySQL最后更新:2022-11-25
小柒助手
  • 本文由 小柒助手 发表于 2022年8月31日 15:33:36
  • 声明:本站所有文章,如无特殊说明或标注,本站文章均为原创。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。转载请务必保留本文链接:https://www.yangxingzhen.cn/8226.html
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

拖动滑块以完成验证