MySQL备份与恢复—xtrabackup

xtrabackup

toc

一、原理与概念

1.什么是xtrabackup

  Percona-xtrabackup是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。开源、免费的MySQL热备份软件,它可以为InnoDB和XtraDB数据库执行非阻塞备份(对于MyISAM的备份同样需要加表锁)。
  在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabakackup有2个工具,分别是xtrabakup、innobakupe。
  Percona XtraBackup是一个开源的热备份工具,适用于基于MySQL的服务器,它不会在备份期间锁定你的数据库。它的设计目的是使备份成为一个无缝的过程,而不会影响生产环境中服务器的性能。
重要提示:版本8.0.6中添加了对MyRocks存储引擎的支持。
Percona XtraBackup 8.0不支持TokuDB存储引擎。由于MySQL 8.0引入的数据字典、redo日志和undo日志与以前的版本不兼容,Percona XtraBackup 8.0目前也不支持8.0之前的版本。
特点:

  • 创建热InnoDB备份而不暂停数据库
  • 对MySQL进行增量备份
  • 流压缩MySQL备份到另一个服务器
  • 在线在MySQL服务器之间移动表
  • 轻松创建新的MySQL复制从服务器
  • 备份MySQL而不增加服务器的负载

2.xtrabackup实现机制

  Percona XtraBackup基于InnoDB的崩溃恢复功能。它复制你的InnoDB数据文件,导致在内部数据不一致随后它会对文件执行崩溃恢复,以使它们具有一致性和可用性。这是因为InnoDB维护了一个重做日志,也称为事务日志。其中包含了每次对InnoDB更改的记录。当InnoDB启动时,它检查数据文件和事务日志,并执行两个步骤。它将提交的事务日志项应用到数据文件中,并对撤销任何未提交但是已经修改数据的事务。
  Percona XtraBackup通过在启动时记住日志序列号(LSN),然后复制来工作
数据文件。这需要一些时间,所以如果文件正在更改,那么它们将反映数据库的不同状态的时间点。同时,Percona XtraBackup运行一个监视事务的后台进程记录文件,并从中复制更改。Percona XtraBackup需要不断地这样做,因为事务日志以循环方式编写,一段时间后可以重用。Percona XtraBackup需要事务日志记录自开始执行以来对数据文件的每次更改。以循环方式编写,一段时间后可以重用。Percona XtraBackup需要事务日志记录自开始执行以来对数据文件的每次更改。
Percona XtraBackup使用备份锁作为刷新表的轻量级替代
只有在Percona XtraBackup完成对所有InnoDB/XtraDB数据和日志的备份后,才会对MyISAM和其他非InnoDB表进行锁定。Percona XtraBackup使用这个自动复制非innodb数据以避免阻塞
DML查询修改InnoDB表。

3.xtrabackup的备份流程


(1)innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;
(2)xtrabackup在备份innoDB数据是,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待状态(等待文件被创建)
(3)xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)
(4)innobackupex收到xtrabackup通知后哦,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。
(5)当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;
(6)xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;
(7)innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES;
(8)最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。

二、环境规划

1.版本信息

  • 系统版本:CentOS Linux release 7.6.1810 (Core)
  • 数据库版本:MySQL8.0.15
  • 软件包信息: percona-xtrabackup-80-8.0.13

2.IP规划

三、部署与测试

1.部署

[root@mysql8 ~]# yum -y install percona-xtrabackup-80-8.0.13-1.el7.x86_64.rpm 
[root@mysql8 ~]# rpm -qa |grep xtrabackup
percona-xtrabackup-80-8.0.13-1.el7.x86_64
[root@mysql8 ~]# innobackupex
bash: innobackupex: command not found...
#xtrabackup8.0以后已经没有innobackupex命令。使用xtrabackup
#创建进行备份的用户
mysql> create user 'xtra'@'%' identified by '1234';
Query OK, 0 rows affected (0.00 sec)
#授权
mysql>  grant backup_admin,process,reload,lock tables,replication client on *.* to 'xtra'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT SELECT ON performance_schema.log_status TO 'xtra'@'%';
Query OK, 0 rows affected (0.11 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

2.测试

登入数据库创建测试表

mysql> select count(*) from vote_records;
+----------+
| count(*) |
+----------+
|     999  |
+----------+
1 row in set (0.00 sec)

进行备份与恢复
1)创建备份目录

全量备份的目录为[root@mysql8 ~]# mkdir /data/backup -p
增量备份的目录为[root@mysql8 ~]# mkdir /data/backupIncr -p

2)在数据库启动的状态下进行备份

#全备
[root@mysql8 ~]# xtrabackup --defaults-file=/data/mysql/mysql_3306/my_3306.cnf --host=192.168.0.35 --user=xtra --password=1234 --port=3306 --backup --parallel=3 --target-dir=/data/backup/
#备份完成后,在测试表中插入一条数据然后进行增备
mysql> select count(*) from vote_records;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.00 sec)
#增备
[root@mysql8 ~]# xtrabackup --defaults-file=/data/mysql/mysql_3306/my_3306.cnf --host=192.168.0.35 --user=xtra --password=1234 --port=3306 --backup --parallel=3 --target-dir=/data/backupIncr  --incremental-basedir=/data/backup

3)执行误操作删库

mysql> drop database xtratest ;

4)开始恢复

  • 将原来的数据文件和日志文件等信息删除
[root@mysql8 mysql_3306]# pwd
/data/mysql/mysql_3306
[root@mysql8 mysql_3306]# ls
data  logs  my_3306.cnf  tmp  undolog
[root@mysql8 mysql_3306]# rm -rf data/*
[root@mysql8 mysql_3306]# rm -rf logs/*
[root@mysql8 mysql_3306]# rm -rf undolog/*
  • 准备全备的redo日志
[root@mysql8 ~]# xtrabackup --defaults-file=/data/mysql/mysql_3306/my_3306.cnf --prepare --apply-log-only --target-dir=/data/backup
  • 准备增备的redo日志(相当于把全备和增备日志合并,如果只恢复全备数据不执行这步)
[root@mysql8 ~]# xtrabackup  --defaults-file=/data/mysql/mysql_3306/my_3306.cnf --prepare --apply-log-only --target-dir=/data/backup  --incremental-dir=/data/backupIncr
  • 全备份准备过程
[root@mysql8 ~]# xtrabackup --defaults-file=/data/mysql/mysql_3306/my_3306.cnf --prepare --target-dir=/data/backup
  • 将数据文件拷回
[root@mysql8 ~]# xtrabackup --defaults-file=/data/mysql/mysql_3306/my_3306.cnf  --host=192.168.0.35 --user=xtra --password=1234 --port=3306 --datadir=/data/mysql/mysql_3306/data/ --copy-back --target-dir=/data/backup/
  • 对新拷贝入的文件进行权限修改
[root@mysql8 ~]# chown -R mysql.mysql /data
[root@mysql8 ~]# chmod -R 755 /data

备份恢复完成,启动实例

5)查看最终效果(加入服务以及相关优化https://blog.csdn.net/qq_43250333/article/details/107563508)

#这里我把mysql加入了服务,所以启动方式可能不同
[root@mysql8 ~]# systemctl start mysqld
mysql> select count(*) from vote_records;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.00 sec)

增量恢复完成





原文地址:https://www.cnblogs.com/plutozzl/p/13391695.html