xtrabackup入门安装和使用

1. xtrabackup介绍
MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabakackup有2个工具,分别是xtrabakup、innobakupe。

Percona-xtrabackup是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。

2. xtrabackup优点
(1)备份速度快,物理备份可靠

(2)备份过程不会打断正在执行的事务(无需锁表)

(3)能够基于压缩等功能节约磁盘空间和流量

(4)自动备份校验

(5)还原速度快

(6)可以流传将备份传输到另外一台机器上

(7)在不增加服务器负载的情况备份数据

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子进程结束后退出

4.安装

下载地址:https://www.percona.com/downloads/

[root@zwy1 ~]# wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.22/binary/redhat/8/x86_64/Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bundle.tar
--2021-05-09 18:28:29--  https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.22/binary/redhat/8/x86_64/Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bundle.tar
Resolving downloads.percona.com (downloads.percona.com)... 162.220.4.222
Connecting to downloads.percona.com (downloads.percona.com)|162.220.4.222|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 76595200 (73M) [application/x-tar]
Saving to: ‘Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bundle.tar’

Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-b 100%[=====================================================================================================>]  73.05M  7.08MB/s    in 12s     

2021-05-09 18:28:43 (6.27 MB/s) - ‘Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bundle.tar’ saved [76595200/76595200]

[root@zwy1 ~]# ls
all-210508.sql  anaconda-ks.cfg  mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz  nginx-1.18.0  nginx-1.18.0.tar.gz  pass  Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bundle.tar

解压

[root@zwy1 ~]# tar xf Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bundle.tar 
[root@zwy1 ~]# ls
all-210508.sql                              nginx-1.18.0         Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bundle.tar  percona-xtrabackup-24-debugsource-2.4.22-1.el8.x86_64.rpm
anaconda-ks.cfg                             nginx-1.18.0.tar.gz  percona-xtrabackup-24-2.4.22-1.el8.x86_64.rpm             percona-xtrabackup-test-24-2.4.22-1.el8.x86_64.rpm
mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz  pass                 percona-xtrabackup-24-debuginfo-2.4.22-1.el8.x86_64.rpm   percona-xtrabackup-test-24-debuginfo-2.4.22-1.el8.x86_64.rpm

依赖包安装

[root@zwy1 ~]# yum -y install percona-xtrabackup-24-2.4.22-1.el8.x86_64.rpm 
Last metadata expiration check: 0:55:29 ago on Sun 09 May 2021 06:18:30 PM CST.
Dependencies resolved.
==============================================================================================================================================================================================
 Package                                            Architecture                   Version                                                         Repository                            Size
==============================================================================================================================================================================================
Installing:
 percona-xtrabackup-24                              x86_64                         2.4.22-1.el8                                                    @commandline                         7.7 M

5.常用命令

innobackupex

常用选项:  
   --host            指定主机
   --user             指定用户名
   --password          指定密码
   --port           指定端口
   --databases        指定数据库
   --incremental     创建增量备份
   --incremental-basedir      指定包含完全备份的目录
   --incremental-dir            指定包含增量备份的目录   
   --apply-log                 对备份进行预处理操作             
   --defaults-file=/etc/my.cnf  指定的备份数据的配置文件
   
     一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态
   --redo-only      不回滚未提交事务
   --copy-back     恢复备份目录

6.xtrabackup备份和恢复

使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件,这些文件会被保存到一个以时间命名的目录当中。在备份的同时,innobackupex还会在备份目录中创建如下文件:

1)xtrabackup_checkpoints -- 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息:

每个InnoDB页(通常为16k大小)
都会包含一个日志序列号,即LSN,LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的

(2)xtrabackup_binlog_info  --  mysql服务器当前正在使用的二进制日志文件及备份这一刻位置二进制日志时间的位置

(3)xtrabackup_binlog_pos_innodb  --  二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position

(4)xtrabackup_binary  --  备份中用到的xtrabackup的可执行文件;

(5)backup-my.cnf  --  备份命令用到的配置选项信息:

在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录:如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据

注意:备份时需启动MySQL,恢复时需关闭MySQL,清空mysql数据目录且不能重新初始化,恢复数据后应该立即进行一次完全备份

软链接

[root@zwy1 ~]# mkdir /var/lib/mysql/           #监听地址映射
[root@zwy1 ~]# ln -s /tmp/mysql.sock /var/lib/mysql/  
[root@zwy1 ~]# ll  /tmp/mysql.sock   /var/lib/mysql/mysql.sock
srwxrwxrwx. 1 mysql mysql  0 May  9 19:09 /tmp/mysql.sock
lrwxrwxrwx. 1 root  root  15 May  9 19:22 /var/lib/mysql/mysql.sock -> /tmp/mysql.sock

6.1完全备份

语法

innobackupex --user=账号 --password=密码 --host=主机 /back/ 数据存放路径

查看数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> select * from  school.student;
+----+-----------+------+-------+
| id | name      | age  | score |
+----+-----------+------+-------+
|  1 | tom       |   20 |  NULL |
|  2 | jerry     |   14 |  NULL |
|  3 | zhangshan |   18 |  NULL |
|  4 | lisi      |   26 |    90 |
|  5 | heigou    |   24 |  NULL |
+----+-----------+------+-------+
5 rows in set (0.01 sec)

全部备份

innobackupex -uroot -p4564949e /back

 

模拟误删

[root@zwy1 ~]# mysql -uroot -p4564949e  -e 'drop database school;'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@zwy1 ~]# mysql -uroot -p4564949e  -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

恢复

[root@zwy1 ~]# rm -rf /opt/data/ #删除整个数据库

[root@zwy1 ~]# innobackupex     -uroot -p4564949e  --apply-log  /back/2021-05-09_20-40-24/ #合并数据库
[root@zwy1 ~]# innobackupex     -uroot -p4564949e  --copy-back  /back/2021-05-09_20-40-24/  #恢复数据库
[root@zwy1 ~]# chown -R mysql.mysql /opt/data/ #给数据库权限
[root@zwy1 ~]# pkill mysql   #结束进程
[root@zwy1 ~]# service mysqld restart #重启
 ERROR! MySQL server PID file could not be found!
Starting MySQL. SUCCESS! 

[root@zwy1 ~]# mysql -uroot -p4564949e -e 'show databases;'  #登录查看数据库
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+

6.2 增量备份

#先全备数据库

mysql> select * from school.student; #原表
+----+-----------+------+-------+
| id | name | age | score |
+----+-----------+------+-------+
| 1 | tom | 20 | NULL |
| 2 | jerry | 14 | NULL |
| 3 | zhangshan | 18 | NULL |
| 4 | lisi | 26 | 90 |
| 5 | heigou | 24 | NULL |
+----+-----------+------+-------+



在stu表里插入内容

mysql> insert student(name,age)values('jb',25),('zk',21),('xb',26),('qf',26)
-> ;
Query OK, 4 rows affected (0.04 sec)
Records: 4 Duplicates: 0 Warnings: 0

 

mysql> select * from student;
+----+-----------+------+-------+
| id | name | age | score |
+----+-----------+------+-------+
| 1 | tom | 20 | NULL |
| 2 | jerry | 14 | NULL |
| 3 | zhangshan | 18 | NULL |
| 4 | lisi | 26 | 90 |
| 5 | heigou | 24 | NULL |
| 6 | jb | 25 | NULL |
| 7 | zk | 21 | NULL |
| 8 | xb | 26 | NULL |
| 9 | qf | 26 | NULL |
+----+-----------+------+-------+
9 rows in set (0.00 sec)

进行增量备份

[root@zwy1 ~]# innobackupex  -uroot -p4564949e  --incremental /back/ --incremental-basedir=/back/2021-05-09_20-40-24/ #进行增量备份

--incremental 打开增备的开关
--incremental /backup/ 增量备份文件保存的位置,如果不指定文件名会默认生成一个以时间戳命名的文件

--incremental-basedir=/back/2021-05-09_20-40-24/ 指定是基于谁做增备的

[root@zwy1 ~]# ll /back/ total 4 drwxr-x---. 6 root root 4096 May 9 21:34 2021-05-09_20-40-24 #全备 drwxr-x---. 6 root root 263 May 9 22:01 2021-05-09_22-01-34 #增备

# 查看备份的xtrabackup_checkpoints

[root@zwy1 ~]# cat /back/2021-05-09_20-40-24/xtrabackup_checkpoints  #全量
backup_type = full-prepared #备份类型
from_lsn = 0   #从0开始
to_lsn = 4287175 #结束位置
last_lsn = 4287184 
compact = 0
recover_binlog_info = 0
flushed_lsn = 4287184

[root@zwy1 ~]# cat /back/2021-05-09_22-01-34/xtrabackup_checkpoints #增量
backup_type = incremental
from_lsn = 4287175
to_lsn = 4289950
last_lsn = 4289959
compact = 0
recover_binlog_info = 0
flushed_lsn = 4289959

 

增量备份恢复

1依赖于上次备份增量

2他的恢复依赖于全备

3增量必须合并到全备中才可以恢复

#停止数据库
[root@zwy1 ~]# service mysqld stop
Shutting down MySQL.. SUCCESS! 
#删除数据目录中的内容
[root@zwy1 ~]# rm -rf /opt/data/
#合并全备数据目录,确保数据的一致性

[root@zwy1 ~]# innobackupex  -uroot -p4564949e --apply-log --redo-only /back/2021-05-09_20-40-24/

#将增量备份数据合并到全量目录中

[root@zwy1 ~]# innobackupex  -uroot -p4564949e --apply-log --redo-only /back/2021-05-09_20-40-24/ --incremental-dir=/back/2021-05-09_22-01-34/
#查看合并后全量数据是否增加

[root@zwy1 ~]# cat /back/2021-05-09_20-40-24/xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 4289950
last_lsn = 4289959
compact = 0
recover_binlog_info = 0
flushed_lsn = 4289959

 

#恢复数据

[root@zwy1 ~]# innobackupex -uroot -p4564949e --copy-back /back/2021-05-09_20-40-24/

#查看恢复后的数据

[root@zwy1 ~]# ll /opt/data/
total 122924
-rw-r-----. 1 root root 391 May 9 22:32 ib_buffer_pool
-rw-r-----. 1 root root 12582912 May 9 22:32 ibdata1
-rw-r-----. 1 root root 50331648 May 9 22:32 ib_logfile0
-rw-r-----. 1 root root 50331648 May 9 22:32 ib_logfile1
-rw-r-----. 1 root root 12582912 May 9 22:32 ibtmp1
drwxr-x---. 2 root root 4096 May 9 22:32 mysql
drwxr-x---. 2 root root 8192 May 9 22:32 performance_schema
drwxr-x---. 2 root root 58 May 9 22:32 school
drwxr-x---. 2 root root 8192 May 9 22:32 sys
-rw-r-----. 1 root root 21 May 9 22:32 xtrabackup_binlog_pos_innodb
-rw-r-----. 1 root root 524 May 9 22:32 xtrabackup_info
-rw-r-----. 1 root root 1 May 9 22:32 xtrabackup_master_key_id

 

#修改属主和属组为mysql

chown -R mysql.mysql /opt/data

#启动数据库

service mysqld start

#查看数据是否恢复

[root@zwy1 ~]# mysql -uroot -p4564949e -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+

 

[root@zwy1 ~]# mysql -uroot -p4564949e -e 'select *from school.student;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+-----------+------+-------+
| id | name | age | score |
+----+-----------+------+-------+
| 1 | tom | 20 | NULL |
| 2 | jerry | 14 | NULL |
| 3 | zhangshan | 18 | NULL |
| 4 | lisi | 26 | 90 |
| 5 | heigou | 24 | NULL |
| 6 | jb | 25 | NULL |
| 7 | zk | 21 | NULL |
| 8 | xb | 26 | NULL |
| 9 | qf | 26 | NULL |
+----+-----------+------+-------+

 

 

已经可以看到数据 恢复成功

总结:
(1)增量备份需要使用参数--incremental指定需要备份到哪个目录,使用--incremental-basedir指定是基于谁做增量备份,注意,如果有多个增量备份时要指定的是基于上一次的增量做的增量备份;

(2)进行数据备份时,需要使用参数--apply-log redo-only先合并全备数据目录数据,确保全备数据目录数据的一致性;

(3)再将增量备份数据使用参数--incremental-dir合并到全备数据当中;

(4)最后通过最后的全备数据进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复

 

posted @ 2021-05-09 22:41  #44  阅读(381)  评论(0)    收藏  举报