«

xtrabackup备份工具使用

指尖二进制 • 1 年前 • 891 次点击 • XTRABACKUP


[TOC]

1:xtrabackup简介

针对InnoDB存储引擎,MySQL本身没有提供合适的热备工具,ibbackup虽是一款高效的首选热备方式,但它是是收费的。好在Percona公司给大家提供了一个开源、免费的Xtrabackup热备工具,它可实现ibbackup的所有功能,并且还扩展支持真正的增量备份功能,是商业备份工具InnoDB Hotbackup的一个很好的替代品。

Xtrabackup包括两个主要工具:Xtrabackup和innobackupex:
Xtrabackup只能备份InnoDB和XtraDB两种引擎表,而不能备份MyISAM数据表。
innobackupex则封装了xtrabackup,同时可以备份MyISAM数据表。Xtrabackup做备份的时候不能备份表结构、触发器等等,智能区分.idb数据文件。另外innobackupex还不能完全支持增量备份,需要和xtrabackup结合起来实现全备的功能

2:xtrbackup 安装

(mysql5.7.20需安装最新版XtraBackup2.4.9)

下载:

[root@site ~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.9-ra467167cdd4-el7-x86_64-bundle.tar

解压:

[root@site ~]# tar fx Percona-XtraBackup-2.4.9-ra467167cdd4-el7-x86_64-bundle.tar

Yum安装并解决依赖:

[root@site ~]#  yum install percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

注意:安装完成以后记得更改你的/etc/my.cnf配置文件指定数据目录,因为Xtrabackup是根据你的/etc/my.cnf配置文件来获取你备份的文件,比如在/etc/my.cnf的[mysqld] 下添加datadir=/usr/local/mysql/data,然后重启mysql

3:使用

我们一般使用innobackupex脚本
innobackupex是perl脚本对xtrabackup的封装,和功能扩展。
备份准备工作:
权限和链接
xtrabackup需要连接到数据库和datadir操作权限。
xtrabackup或者innobackupex在使用过程中涉及到2类用户权限:

  1. 系统用户,用来调用innobackupex或者xtrabackup
    连接到服务:innobackupex或者xtrabackup通过—user和—password连接到数据库服务
    $ innobackupex --user=DBUSER --password=SECRET /path/to/backup/dir/
    $ innobackupex --user=LUKE --password=US3TH3F0RC3 --stream=tar ./ | bzip2 - 压缩
    $ xtrabackup --user=DVADER --password=14MY0URF4TH3R --backup --target-dir=/data/bkps/

  2. 数据库用户,数据库内使用的用户
    需要的权限:连接到服务是为了执行备份,需要在datadir上有read,write和execute权限。在数据库中需要以下权限:
    RELOAD和LOCK TABLES权限为了执行FLUSH TABLES WITH READ LOCK 。
    REPLICATION CLIENT为了获取binary log 位置
    CREATE TABLESPACE权限为了导入表,用户表级别的恢复
    SUPER权限在slave环境下备份用来启动和关闭slave线程

其他连接选项:
Tmpion Description
–port The port to use when connecting to the database server with TCP/IP.
–socket The socket to use when connecting to the local database.
–host The host to use when connecting to the database server with TCP/IP.
可以单独创建用来备份数据库的用户,安全,并赋予对应的权限

4:全备和全备还原

使用innobackupex创建全备
创建备份:

[root@site ~]# innobackupex --user=root --password=123456 /tmp/db_backup/
190521 16:54:12 completed OK!
[root@site ~]#  ls /tmp/db_backup/2019-05-22_10-23-54/

[root@site ~]# mkdir /tmp/db_backup -p
[root@site ~]# innobackupex --user=root --password=123456 /tmp/db_backup/ 2>>/tmp/db_backup/db_backup.log
[root@site ~]# ls /tmp/db_backup/2019-05-21_16-55-51/
[root@site ~]# cat /tmp/db_backup/db_backup.log

2>>/tmp/db_backup/db_backup.log #不显示输出信息,输出信息重定向到db_backup.log

内部机制:在备份的时候innobackupex会调用xtrabackup来备份innodb表,并复制所有的表定义,其他引擎的表(MyISAM,MERGE,CSV,ARCHIVE)。
其他选项:
--no-timestamp,指定了这个选项备份会直接备份在BACKUP-DIR,不再创建时间戳文件夹。
--default-file,指定配置文件,用来配置innobackupex的选线

[root@site ~]# innobackupex --user=root --password=123456 --no-timestamp /tmp/db_backup/full
[root@site ~]# ls /tmp/db_backup/full/

innobackupex --user=root --password=123456 --no-timestamp /tmp/db_backup/full (使用--no-timestamp时,后面的这个full目录必须跟上且不能提前自己建立,它由innobackupex自动建立,否则会报错innobackupex: Error: Failed to create backup directory)

使用innobackupex还原备份

使用innobackupex --copy-back来还原备份
停止mysql:
systemctl stop mysqld
删除数据:(危险动作): rm -rf /var/lib/mysql/*
还原:

[root@site ~]# innobackupex --copy-back /tmp/db_backup/2019-05-21_16-55-51/
[root@site ~]# ll /var/lib/mysql/
[root@site ~]# chown -R mysql:mysql /var/lib/mysql/ #不然mysql无法启动
[root@site ~]# systemctl start mysqld
[root@site ~]# mysql -uroot -p123456

注:datadir必须是为空的,innobackupex –copy-back不会覆盖已存在的文件,还要注意,还原时需要先关闭服务,如果服务是启动的,那么就不能还原到datadir。

5:创建增量备份和还原

增量备份作用:减少备份数据重复,节省磁盘空间,缩短备份时间
增量备份的实现,依赖于innodb页上面的LSN(log sequence number),每次对数据库的修改都会导致LSN自增。增量备份会复制指定LSN<日志序列号>之后的所有数据页。

创建增量备份

1:首先创建全备
在创建增量备份之前需要一个全备,不然增量备份是没有意义的。

[root@site ~]# innobackupex --user=root --password=123456 /root/

这样就会在/root/下创建一个时间戳文件夹 2019-05-22_14-16-11,文件夹下就是备份文件
检查备份文件夹下的xtrabackup-checkpoints,查看信息

[root@site ~]# cat /root/2019-05-22_14-16-11/xtrabackup_checkpoints 
backup_type = full-backuped #全备份
from_lsn = 0
to_lsn = 2525224
last_lsn = 2525233  #创建第一个增量备份
compact = 0
recover_binlog_info = 0

进行建库、建表插入一些数据

[root@site ~]# mysql -uroot -p123456
mysql> create database test;
mysql> use test
mysql> create table emp (empno numeric(4) not null,ename varchar(10),job varchar(9),mgr numeric(4),hiredate datetime,sal numeric(7, 2),comm numeric(7, 2),deptno numeric(2));
mysql> insert into emp values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
mysql> select * from emp;
  1. 使用--incremental创建增量备份
    innobackupex --user=root --password=123456 --incremental /增量1路径 --incremental-basedir=全备路径 后面指定这哪个全备上进行增量备份
    [root@site ~]# innobackupex --user=root --password=123456 --incremental /root/ --incremental-basedir=/root/2019-05-22_14-16-11/

再查看LSN<日志序列号>

[root@site ~]# cat 2019-05-22_14-18-31/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2525224
to_lsn = 2530075
last_lsn = 2530084
compact = 0
recover_binlog_info = 0

3:增量备份创建的替代方法
可以使用指定—incremental-lsn来代替—incremental-basedir的方法创建增量备份。

[root@site ~]# mysql -uroot -p123456
mysql> use test
mysql> insert into emp values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
[root@site ~]# innobackupex --user=root --password=123456 --incremental /root/ --incremental-lsn=2525224 #lsn序列号的:from_lsn

注意:xtrabackup只会影响xtradb或者innodb的表,其他引擎的表在增量备份的时候只会复制整个文件,不会差异。

还原增量备份

增量备份的恢复比全备要复杂一点,第一步是在所有备份目录下重做已提交的日志,如:
测试:
停止mysql,删除数据rm –rf /var/lib/mysql/*

先应用全备日志(--apply-log,暂时不需要做回滚操作--redo-only)--第一次全备份的名字

[root@site ~]# innobackupex --apply-log --redo-only /root/2019-05-22_14-16-11/

合并增量到全备中(一致性的合并)

[root@site ~]# innobackupex --apply-log --incremental-dir=/root/2019-05-22_14-18-31/ /root/2019-05-22_14-16-11/
[root@site ~]# innobackupex --apply-log /root/2019-05-22_14-16-11/

使用innobackupex命令进行恢复(推荐)

[root@site ~]# innobackupex --copy-back /root/2019-05-22_14-16-11/ 
[root@site ~]# chown -R mysql.mysql /var/lib/mysql/
[root@site ~]# systemctl start mysqld
[root@site ~]# mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

6:简洁办法,增量备份与恢复

方法一:
1:先进行第一次全备

innobackupex  --user=root --password=123456 --no-timestamp /root/xfull

插入一些数据:

[root@site ~]# mysql -uroot -p123456
mysql> create database test;
mysql> use test
mysql> create table emp (empno numeric(4) not null,ename varchar(10),job varchar(9),mgr numeric(4),hiredate datetime,sal numeric(7, 2),comm numeric(7, 2),deptno numeric(2));
insert into emp values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
insert into emp values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
insert into emp values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
insert into emp values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
insert into emp values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
insert into emp values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
insert into emp values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
insert into emp values (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000, null, 20);
insert into emp values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
insert into emp values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
insert into emp values (7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100, null, 20);
insert into emp values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
insert into emp values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
insert into emp values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);

2:再进行增量备份

innobackupex --user=root --password=123456  --incremental --no-timestamp --incremental-basedir=/root/xfull/  /root/xinz1

恢复
1:先应用全备日志(--apply-log,暂时不需要做回滚操作--redo-only)

innobackupex --apply-log --redo-only /root/xfull/

2:合并增量到全备中(一致性的合并)

innobackupex --apply-log --incremental-dir=/root/xinz1 /root/xfull/
innobackupex --apply-log /root/xfull

3:合并完成进行恢复
方法一:直接将备份文件复制回来

cp -a /backup/full/ /var/lib/mysql/
chown -R mysql.mysql /var/lib/mysql/

方法二:使用innobackupex命令进行恢复(推荐)

[root@site ~]# innobackupex --copy-back /root/xfull
[root@site ~]# chown -R mysql.mysql /var/lib/mysql/
[root@site ~]# systemctl start mysqld
[root@site ~]# mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)
还没收到回复