MySQL备份与恢复-innobackupex

 :上一片myloder搞崩溃,为什么百度的博文都是抄袭一模一样的,哎烦!

这一片文章我们来介绍物理备份工具xtracebackup!

首先是安装可以percona官网下载安装,下载rpm包直接yum安装即可!

yum install -y perl-DBD-MySQL perl-DBI perl-Time-HiRes libaio*         #安装依赖包
yum
install -y percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
[root@test2 ~]# xtrabackup -v
xtrabackup version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
#下载的时候尽量下载新版本的percoan,这样会有对MySQL5.7的支持
#写这个博文的时候,官网最新版本好像是8.0的吧,这个8.0版本应该是为了支持MySQL8.x吧,后续再测一下!

XtraceBackup是由知名数据库软件服务企业Percona提供的一款热备工具,除了能够支持最为常见的MyISAM,INNODB引擎对象外,还支持XtraDB引擎。

查看percona的安装文件:

[root@test2 ~]# rpm -ql percona-xtrabackup-24-2.4.4-1.el6.x86_64
/usr/bin/innobackupex 
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream                 #以专用的xbstream格式压缩xtrabackup输出的信息。也可以使用tar 
/usr/bin/xtrabackup               
#最经常使用的就是这两个备份工具,其中之前的版本xtracebackup只能备份INNODB存储引擎,而innobackupex对xtracebackup进行了封装,不仅能备份INNODB存储
引擎,也能备份myisam存储引擎,但是查看官方2.4版本的文档时候,percona说在之后的版本会放弃innobackupex这个工具,建议使用xtracebackup命令! /usr/share/doc/percona-xtrabackup-24-2.4.4 /usr/share/doc/percona-xtrabackup-24-2.4.4/COPYING /usr/share/man/man1/innobackupex.1.gz /usr/share/man/man1/xbcrypt.1.gz /usr/share/man/man1/xbstream.1.gz /usr/share/man/man1/xtrabackup.1.gz

 

XtraceBackup备份有以下几个优点:

l  备份集高效,完整,可用。

l  备份任务执行过程中不会有阻塞任务

l  节省磁盘空间,降低网络带宽占用

l  备份集自动验证机制

l  恢复更快

xtrabackup必须在MySQL服务端执行(但是创建的备份集不一定是保存在本地),特别是通过innobackupex命令创建备份集时,由于操作需要连接数据库获取信息,因此还要指定的连接参数(用户名,密码),而且连接所使用的的用户,必须拥有正确的操作权限。

特别提醒:

percona官方在文档中说要在之后的版本中放弃innobackupex工具,推荐使用xtracebackupex工具,但是截至目前为止,我们公司线上环境的备份还是使用的innobackupex。因此这里我们首先介绍innobackupex的备份使用,然后再介绍xtracebackup的使用。

xtraceback2.4.x的官方文档地址:CLICK HEERE

innobackupex的备份与恢复

innobackupex的参数有很多,仅通过实例来讲解经常使用的,若需要某些参数可以查看官方文档!

一个完全备份

[root@test3 ~]# innobackupex --user=root --password=123456  /data/backup/          #备份很简单,/data/backup/为备份的目录
181128 18:50:47 innobackupex: Starting the backup operation

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".

181128 18:50:47  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;host=localhost' as 'root'  (using password: YES).
181128 18:50:47  version_check Connected to MySQL server
181128 18:50:47  version_check Executing a version check against the server...
181128 18:50:47  version_check Done.
181128 18:50:47 Connecting to MySQL server host: localhost, user: root, password: set, port: 0, socket: (null)
Using server version 5.7.22-log
innobackupex version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /data/mysql
xtrabackup: open files limit requested 0, set to 1024
xtrabackup: using the following InnoDB configuration:
xtrabackup:   innodb_data_home_dir = .
xtrabackup:   innodb_data_file_path = ibdata1:12M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 2
xtrabackup:   innodb_log_file_size = 50331648
InnoDB: Number of pools: 1
181128 18:50:47 >> log scanned up to (13741543758)
xtrabackup: Generating a list of tablespaces
InnoDB: Allocated tablespace ID 48 for mysql/servers, old maximum was 0
181128 18:50:48 [01] Copying ./ibdata1 to /data/backup/2018-11-28_18-50-47/ibdata1 #拷贝的是ibd文件,然后分别拷贝每张表的文件,然后再拷贝redo日志
181128 18:50:48 >> log scanned up to (13741543758)
181128 18:50:49 >> log scanned up to (13741543758)
181128 18:50:50 [01]        ...done
181128 18:50:50 [01] Copying ./mysql/servers.ibd to /data/backup/2018-11-28_18-50-47/mysql/servers.ibd
181128 18:50:50 [01]        ...done
181128 18:50:50 [01] Copying ./mysql/time_zone_name.ibd to /data/backup/2018-11-28_18-50-47/mysql/time_zone_name.ibd
...... MySQL binlog position: filename
'test3-bin.000001', position '21818' 181128 18:51:12 [00] Writing backup-my.cnf 181128 18:51:12 [00] ...done 181128 18:51:12 [00] Writing xtrabackup_info 181128 18:51:12 [00] ...done xtrabackup: Transaction log of lsn (13741543749) to (13741543758) was copied. 181128 18:51:12 completed OK! #出现completed OK表示备份完成!

因为过程比较长,没有粘贴,可以看一下备份的过程!

innobackupex会在备份目录下面创建以当前时间点命名的备份文件如下:

[root@test3 ~]# cd /data/backup/
[root@test3 backup]# ls
2018-11-28_18-50-47             #以当前时间点命名的备份文件集
[root@test3 backup]# cd 2018-11-28_18-50-47/
[root@test3 2018-11-28_18-50-47]# ls          #看到的备份之后的文件集
backup-my.cnf  employees   hostinfo        ibdata1  mysql   performance_schema  sys   tpcc_test  xtrabackup_binlog_info  xtrabackup_info
cmdb           financesys  ib_buffer_pool  lianxi   mytest  sbtest              test  ts1.ibd    xtrabackup_checkpoints  xtrabackup_logfile
[root@test3 2018-11-28_18-50-47]# cd employees; ls #每个数据库中包含的表的结构文件(frm)和表数据文件(ibd)
current_dept_emp.frm  departments.frm  dept_emp.frm  dept_emp_latest_date.frm  dept_manager.ibd  employees.ibd  salaries.ibd  test2.frm  titles.frm
db.opt                departments.ibd  dept_emp.ibd  dept_manager.frm          employees.frm     salaries.frm   test1.frm     test3.frm  titles.ibd
[root@test3 employees]#


backup-my.cnf: 为当前数据库配置文件的备份!
xtrabackup_binlog_info:当前备份文件对应的二进制日志文件和position位置,做PIT恢复时使用。

[root@test3 2018-11-28_18-50-47]# cat xtrabackup_info #包含信息比较多
uuid = 85662dd9-f2fb-11e8-a47c-fa336351fc00 #当前数据库的UUID
name =
tool_name = innobackupex #包含备份的工具,备份的命令,备份工具的版本,MySQL的版本
tool_command = --user=root --password=... /data/backup/
tool_version = 2.4.4
ibbackup_version = 2.4.4
server_version = 5.7.22-log
start_time = 2018-11-28 18:50:47 #备份的开始时间
end_time = 2018-11-28 18:51:12 #备份的结束时间
lock_time = 0
binlog_pos = filename 'test3-bin.000001', position '21818' #二进制日志的位置
innodb_from_lsn = 0
innodb_to_lsn = 13741543749 #刷新到lsn的位置
partial = N
incremental = N #增量备份
format = file
compact = N
compressed = N
encrypted = N

[root@test3 2018-11-28_18-50-47]# cat xtrabackup_checkpoints #包含checkpoint的信息,以及备份方式
backup_type = full-backuped
from_lsn = 0
to_lsn = 13741543749
last_lsn = 13741543758
compact = 0
recover_binlog_info = 0

xtrabackup_logfile:【未知】

执行恢复

恢复分为两个步骤:

准备恢复:所谓准备恢复,就是要为恢复做准备。就是说备份集没办法直接拿来用,因为这中间可能存在未提交或未回滚的事务,数据文件不一致,所以需要一个队备份集的准备过程。

[root@test3 ~]# innobackupex --apply-log /data/backup/2018-11-28_18-50-47/        #准备阶段的命令   
181128 19:16:57 innobackupex: Starting the apply-log operation

IMPORTANT: Please check that the apply-log run completes successfully.
           At the end of a successful apply-log run innobackupex
           prints "completed OK!".

innobackupex version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
xtrabackup: cd to /data/backup/2018-11-28_18-50-47
xtrabackup: This target seems to be not prepared yet.
InnoDB: Number of pools: 1
.....
InnoDB: 5.7.13 started; log sequence number 13741544981
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 13741545378
181128 19:17:02 completed OK!

执行恢复:innobackupex提供了--copy-back参数,就是将指定的备份集,恢复到指定的路径下面(这个指定的路径是配置文件中datadir指定的路径)!

[root@test3 ~]# service mysqld stop       #首先停掉数据库
Shutting down MySQL.... SUCCESS! 
[root@test3 ~]# rm -fr /data/mysql/*      #情况datadir指定的目录,若是线上环境,确保一定备份过
[root@test3 ~]# innobackupex --copy-back /data/backup/2018-11-28_18-50-47/     #备份命令
181128 19:20:58 innobackupex: Starting the copy-back operation

IMPORTANT: Please check that the copy-back run completes successfully.
           At the end of a successful copy-back run innobackupex
           prints "completed OK!".

innobackupex version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
......
181128 19:21:30 [01] Copying ./xtrabackup_info to /data/mysql/xtrabackup_info
181128 19:21:30 [01]        ...done
181128 19:21:30 [01] Copying ./xtrabackup_binlog_pos_innodb to /data/mysql/xtrabackup_binlog_pos_innodb
181128 19:21:30 [01]        ...done
181128 19:21:30 [01] Copying ./xtrabackup_galera_info to /data/mysql/xtrabackup_galera_info
181128 19:21:30 [01]        ...done
181128 19:21:30 [01] Copying ./ibtmp1 to /data/mysql/ibtmp1
181128 19:21:30 [01]        ...done
181128 19:21:30 completed OK!        #恢复完成

数据库恢复之后,启动数据库:

[root@test3 ~]# chown -R mysql:mysql /data/mysql/
[root@test3 ~]# service mysqld start
Starting MySQL.. SUCCESS!

至此一个完全备份的数据恢复工作完成!

在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录,我们可以自定义备份集的名字如下:

[root@test3 ~]# innobackupex --user=root --password=123456 --no-timestamp /data/backup/test_`date +%F`  #指定备份集的名字
[root@test3 ~]# cd /data/backup/
[root@test3 backup]# ls           #查看备份集
 test_2018-11-28
[root@test3 backup]#

有时候因为socket文件不在默认位置,可以使用--socket指定位置:

[root@test2 ~]# innobackupex --user=root --password="7abec53701c3eefb" --no-timestamp /data/backup/testdb
181128 19:40:10 innobackupex: Starting the backup operation

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".

181128 19:40:10  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup' as 'root'  (using password: YES).
181128 19:40:10  version_check Connected to MySQL server
181128 19:40:10  version_check Executing a version check against the server...
181128 19:40:10  version_check Done.
181128 19:40:10 Connecting to MySQL server host: localhost, user: root, password: set, port: 0, socket: (null)
Failed to connect to MySQL server: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2).
[root@test2 ~]# innobackupex --user=root --password="7abec53701c3eefb" --no-timestamp --socket=/var/lib/mysql/mysql.sock  data/backup/testdb

 增量备份与恢复

增量备份时与全备一起结合使用的,因此这里我们会说明一个全部的过程。

1:首先对目前的数据库做一个全备

[root@test3 ~]# innobackupex --user=root --password=123456 --no-timestamp /data/backup/full_backup
[root@test3 ~]# cd /data/backup/
[root@test3 backup]# ls #全部备份的文件
full_backup

2:对数据做一些修改,如下

mysql> use sbtest;              #创建了一张表,然后插入了两条记录
Database changed
mysql> create table tb3(a varchar(5), sysTime datetime);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into tb3 select "aa", now();
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into tb3 select "bb", now();
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from tb3;
+------+---------------------+
| a    | sysTime             |
+------+---------------------+
| aa   | 2018-11-29 09:14:00 |
| bb   | 2018-11-29 09:14:11 |
+------+---------------------+
2 rows in set (0.00 sec)

3:开始增量备份

[root@test3 backup]# innobackupex --user=root --password=123456 --no-timestamp --incremental /data/backup/incre1 --incremental-basedir=/data/backup/full_backup

--no-timestamp: 上面已经说过,自己定义备份集的名字
--incremental /data/backup/incre1 :参数说明这次备份时一个增量备份,后面的路径指定增量备份的目录
--incremental-basedir=/data/backup/full_backup :增量备份时基于全备的,这个参数就是说明本次的增量备份时基于那次的全备,指向全备的目录文件

查看增量备份的文件记录:

[root@test3 incre1]# cat xtrabackup_checkpoints
backup_type = incremental                 #备份类型
from_lsn = 13741583205                    #需要说明增量备份只能INNODB,xtrack存储引擎,备份是基于lsn的改变的
to_lsn = 13741590096
last_lsn = 13741590105
compact = 0
recover_binlog_info = 0

备份完成之后,我们需要恢复操作,记得上面恢复第一步是什么?准备数据,也就是redo已经提交的事务,回滚未提交的事务。增量备份也是这样,但是操作有些不同。

把全备文件备份一下,把数据库二进制日志也保存一下:【这一步为了二进制增备恢复做准备

[root@test3 backup]# cp -r  full_backup full_backup_bak
[root@test3 backup]# cp /data/mysql/test3-bin.000001 /data/backup/
[root@test3 backup]# ls
full_backup  full_backup_bak  incre1  test3-bin.000001

恢复操作:

准备数据

第一准备全备:
[root@test3 ~]# innobackupex  --apply-log --redo-only --use-memory=1G /data/backup/full_backup

--use-memory=1G #表示使用的内存大小

第二步:把增量备份在全备上面回放,也就是把增量备份附加到全备上。
[root@test3 ~]# innobackupex --apply-log --redo-only /data/backup/full_backup --incremental-dir=/data/backup/incre1

整个恢复操作分为两步
1:准备全部备份,保证文件的一致性。
2:把所有的增量备份附加到全备备份上。如果有多个增量备份,则每一个增量备份文件都要执行附加操作。但是要注意顺序,可以查看增量备份的xtrabackup_checkpoints文件
根据lsn来确定文件的顺序

开始恢复

[root@test3 ~]# service mysqld  stop
[root@test3 ~]# rm -fr /data/mysql/*
[root@test3 ~]# innobackupex --copy-back /data/backup/full_backup
[root@test3 ~]# chown -R mysql:mysql /data/mysql/

#启动数据库,若是之前插入的两条数据存在,则说明增量备份恢复成功!
[root@test3 ~]# service mysqld start
Starting MySQL... SUCCESS!
[root@test3 ~]# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.22-log MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use sbtest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from tb3; #增量备份插入的数据存在
+------+---------------------+
| a    | sysTime             |
+------+---------------------+
| aa   | 2018-11-29 09:14:00 |
| bb   | 2018-11-29 09:14:11 |
+------+---------------------+
2 rows in set (0.00 sec)

特别提示:

若有多个增量备份,则每一个增量备份都要重放到全备的文件中,一定要注意重放增量备份时候的顺序,可以在xtrabackup_checkpoints文件中根据lsn的大小来判断文件的顺序。

利用二进制日志做增量恢复

上面innobackupex的增量恢复,有点不方便,若是要恢复到某个时间点,显得有点无能为力了!但是二进制日志可以,二进制日志可以恢复指定时间点。

在上面的插入数据中,我们插入两条数据,但是一个要求,我们只要恢复到2018-11-29 09:14:00的数据,也就是插入的第二条数据不需要了!

我们上面备份了全备和二进制日志,现在就可以使用了!

基于全备恢复所有的数据,然后根据二进制日志把数据库恢复到我们要的时间点!

#执行全部备份的恢复
[root@test3 ~]#  innobackupex  --apply-log /data/backup/full_backup_bak
[root@test3 ~]# service mysqld stop [root@test3 ~]# rm -fr /data/mysql/ [root@test3 ~]# innobackupex --copy-back /data/backup/full_backup_bak [root@test3 ~]# chown -R mysql:mysql [root@test3 ~]# chown -R mysql:mysql /data/mysql/ [root@test3 ~]# service mysqld start Starting MySQL.. SUCCESS! [root@test3 ~]# mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.22-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use sbtest; #全备的时候,我们并没有在sbtest下面创建tb3这张表 Database changed mysql> show tables; Empty set (0.00 sec)

 #执行基于二进制时间点的恢复

innobackupex备份的是,命令结束的时候的全部数据文件,可以在如下文件查看全备的时间信息:

#有两种恢复方式基于时间点恢复
[root@test3 mysql]# cat xtrabackup_info uuid = e44e6a70-f373-11e8-a5cd-fa336351fc00 name = tool_name = innobackupex tool_command = --user=root --password=... --no-timestamp /data/backup/full_backup tool_version = 2.4.4 ibbackup_version = 2.4.4 server_version = 5.7.22-log start_time = 2018-11-29 09:12:17 end_time = 2018-11-29 09:12:51 #全部结束的时间 lock_time = 0 binlog_pos = filename 'test3-bin.000001', position '1782' innodb_from_lsn = 0 innodb_to_lsn = 13741583205 partial = N incremental = N format = file compact = N compressed = N encrypted = N
#基于二进制的日志点恢复 [root@test3 mysql]#
cat xtrabackup_binlog_pos_innodb #全部备份结束的时间点 test3-bin.000001 1227 [root@test3 mysql]#

导出要恢复时间段的二进制日志文件:

我们要截取的日志时间段是从 全备结束 到 2018-11-29 09:14:00 这个时间点的文件。全备结束时间点作为起始点,起始点有两种确定方式,第一种上面文件中

的end_time指定的时间点;第二种二进制日志的position位置。这两种方式都可以。

 

[root@test3 mysql]# cd /data/backup/
[root@test3 backup]# mysqlbinlog --start-datetime="2018-11-29 09:12:51" --stop-datetime="2018-11-29 09:14:00" test3-bin.000001 > /root/bak.sql
--start-datetime : 指定起始的时间点。
--stop-datetime: 指定结束的时间点。
--start-position: 指定二进制日志开始日志点。
--stop-position : 指定二进制日志结束的日志点。
上面四个参数可以配合使用

 

然后把上面导出sql文件导入到MySQL服务中。

mysql> set sql_log_bin=0;          #导入时,若文件较大会产生很多二进制日志文件,可以先把二进制日志文件关闭,

mysql> source bak.sql;             #导入文件,可以使用mysql直接导入

mysql> set sql_log_bin=1;           #导入完成之后,开启二进制日志文件 

查看数据:

mysql> use sbtest;   #完了演砸了,但是数据库已经存在了,说明这种方法是正确的!
Database changed
mysql> select * from tb3;
Empty set (0.01 sec)

mysql> show tables;
+------------------+
| Tables_in_sbtest |
+------------------+
| tb3              |
+------------------+
1 row in set (0.00 sec)

查看一下二进制日志:

[root@test3 backup]# mysqlbinlog test3-bin.000001
.......
#181129  9:13:47 server id 5  end_log_pos 1973 CRC32 0xcad0188f     Query    thread_id=13    exec_time=0    error_code=0
SET TIMESTAMP=1543454027/*!*/;
create table tb3(a varchar(5), sysTime datetime)
/*!*/;
# at 1973        #用时间截取的时候很可能是截取到了这个时间点就停止了,因此只有tb3这个表,没有后面的插入的第一条数据,因此我们选择用日志点截取数据
#181129  9:14:00 server id 5  end_log_pos 2038 CRC32 0x670a3d93     Anonymous_GTID    last_committed=9    sequence_number=10    rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 2038
#181129  9:14:00 server id 5  end_log_pos 2120 CRC32 0x6a82446d     Query    thread_id=13    exec_time=0    error_code=0
SET TIMESTAMP=1543454040/*!*/;
BEGIN
/*!*/;
# at 2120
#181129  9:14:00 server id 5  end_log_pos 2172 CRC32 0x7c9e9e8c     Table_map: `sbtest`.`tb3` mapped to number 117
# at 2172
#181129  9:14:00 server id 5  end_log_pos 2216 CRC32 0xda4461be     Write_rows: table id 117 flags: STMT_END_F

BINLOG '
WD3/WxMFAAAANAAAAHwIAAAAAHUAAAAAAAEABnNidGVzdAADdGIzAAIPEgMFAAADjJ6efA==
WD3/Wx4FAAAALAAAAKgIAAAAAHUAAAAAAAEAAgAC//wCYWGZoXqTgL5hRNo=
'/*!*/;
# at 2216
#181129  9:14:00 server id 5  end_log_pos 2247 CRC32 0x3b63c077     Xid = 92
COMMIT/*!*/;
# at 2247            #选择这个日志点
#181129  9:14:11 server id 5  end_log_pos 2312 CRC32 0xbd634458     Anonymous_GTID    last_committed=10    sequence_number=11    rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 2312
#181129  9:14:11 server id 5  end_log_pos 2394 CRC32 0xb5eba130     Query    thread_id=13    exec_time=0    error_code=0
SET TIMESTAMP=1543454051/*!*/;
BEGIN
/*!*/;
# at 2394
#181129  9:14:11 server id 5  end_log_pos 2446 CRC32 0xfcaf0343     Table_map: `sbtest`.`tb3` mapped to number 117
# at 2446
#181129  9:14:11 server id 5  end_log_pos 2490 CRC32 0x080cd871     Write_rows: table id 117 flags: STMT_END_F

BINLOG '
Yz3/WxMFAAAANAAAAI4JAAAAAHUAAAAAAAEABnNidGVzdAADdGIzAAIPEgMFAAADQwOv/A==
Yz3/Wx4FAAAALAAAALoJAAAAAHUAAAAAAAEAAgAC//wCYmKZoXqTi3HYDAg=
'/*!*/;
# at 2490
#181129  9:14:11 server id 5  end_log_pos 2521 CRC32 0x14fd7636     Xid = 93
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

 

用日志点重新导入一下

mysqlbinlog --start-position=1227 --stop-position=2247 test3-bin.000001 > /root/bak.sql  #截取二进制日志

导入数据,查看数据:

mysql> source bak.sql;
mysql> use sbtest; Database changed mysql> show tables; +------------------+ | Tables_in_sbtest | +------------------+ | tb3 | +------------------+ 1 row in set (0.00 sec) mysql> select * from tb3; #数据已经存在 +------+---------------------+ | a | sysTime | +------+---------------------+ | aa | 2018-11-29 09:14:00 | +------+---------------------+ 1 row in set (0.00 sec)

 

 

增量备份有两种方法,一个是利用innobackupex的方式进行增量备份另一个是利用二进制日志进行增量备份;建议使用二进制日志增量备份!

我们公司的备份策略时,每一天凌晨全部备份,然后备份当天的二进制日志文件,这样就可以把数据恢复到任何一个时间点!

流压缩

上面备份的数据比较少,并没有考虑磁盘空间问题。下面我们来备份一个大库!

[root@test2 mariadb]# du -sh
47G    .
#datadir的数据文件时47G,好吧也不是太大,能说明问题了!

查看备份之后的文件大小:

[root@test2 ~] innobackupex --user=root --password="123456" --no-timestamp --socket=/var/lib/mysql/mysql.sock  /test/backup/testdb
[root@test2 ~]# cd /test/backup/
[root@test2 backup]# ls
testdb
[root@test2 backup]# du -sh #可以看到备份的文件也是47G
47G    .
[root@test2 backup]#

#innobackupex是逻辑备份,就是拷贝数据,因此备份文件和源文件的大小相差不大

引入流压缩:

[root@test2 backup]# innobackupex --user=root --password="7abec53701c3eefb" --no-timestamp --socket=/var/lib/mysql/mysql.sock --stream=tar /tmp |gzip -> testdb.tar.gz

--stram=tar : 指定标准输出格式,一种是tar,另一种是xbstream;xbstream是xtraceback提供的,解压的时候需要专用命令处理,考虑通用性,选择用tar!

/tmp : 流格式标准输出,临时存放于/tmp目录下面

| gzip -> : 通过管道把流格式输出传给gzip进行压缩

#压缩备份完之后,查看一下压缩之后文件的大小:
[root@test2 backup]# ll -h testdb.tar.gz
-rw-r--r-- 1 root root 18G Nov 29 11:27 testdb.tar.gz

压缩之前文件是47个G
未压缩的备份文件是47个G,
压缩之后备份文件是18个G。

之前的使用流压缩备份出来的命令,解压时必须带上 “-i” 参数!

[root@test3 backup]# tar -ixvf testdb.tar.gz -C db/        #之前的版本解压时候必须带上-i参数,否则会报错的

-C :直接把解压的文件放到指定的目录中,在恢复时,我们可以直接放到datadir指定的目录当中、

[root@test3 backup]# tar -zxvf testdb.tar.gz -C db/ #但是2.4版本直接使用zxvf解压也是可以的!percona优化了很多参数

文件解压之后,然后需要准备文件也就是需要使用--apply-log选项,之后进行恢复就可以了!恢复过程可以参照上面的恢复过程!

percona还有一种压缩方式,官方文档给出的就是这种压缩方式:CLICK HERE!

#备份指令如下
[root@test2 ~]# innobackupex --user=root --password="7abec53701c3eefb" --socket="/var/lib/mysql/mysql.sock" --no-timestamp --compress --compress-threads=4  /test/backup/compress_db

--compress:开启压缩

--compress-threads=4 : 使用4个压缩线程

备份的文件如下:
[root@test2 backup]# cd compress_db
[root@test2 compress_db]# ls #文件如下
backup-my.cnf.qp  ib_buffer_pool.qp  mysql               xtrabackup_binlog_info.qp  xtrabackup_info.qp
financesys        ibdata1.qp         performance_schema  xtrabackup_checkpoints     xtrabackup_logfile.qp
[root@test2 compress_db]# du -sh #文件大小为23G
23G    .

#这个压缩文件,对表结构文件(frm)和表数据文件(ibd)都进行了压缩,压缩后的后缀名为 .qp!

在xtraceback2.1.4之前需要使用一个简短的shell来解压备份出来的文件,在2.1.4之后可以使用如下命令解压!

[root@test2 backup]# innobackupex --decompress /test/backup/compress_db/    
181129 13:55:50 innobackupex: Starting the decrypt and decompress operation

IMPORTANT: Please check that the decrypt and decompress run completes successfully.
           At the end of a successful decrypt and decompress run innobackupex
           prints "completed OK!".

innobackupex version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
181129 13:55:50 [01] decompressing ./ibdata1.qp
sh: qpress: command not found
cat: write error: Broken pipe
Error: thread 0 failed.
[root@test2 backup]# yum install -y qpress
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
base                                                                                                                                                 | 3.7 kB     00:00     
epel                                                                                                                                                 | 4.4 kB     00:00     
mariadb                                                                                                                                              | 2.9 kB     00:00     
zabbix                                                                                                                                               | 2.9 kB     00:00     
No package qpress available.       #这里报错了没有qpress这个命令,这个命令需要从percona官网下载!网络有点渣,随后补上!
Error: Nothing to do

compress压缩备份之后的数据是23个G,而流压缩备份是18个G,源文件大小是47个G!根据存储来说建议使用流压缩吧!

 

#备份指定的库,而不是全部的库!

#!/bin/bash
#在备份指定库时,可以使用--include参数,也可以使用--tables-file参数,把指定的库写在文件中
User="root"
Hostip=x.x.x.x
Passwd="x.x.x.x.x.x"
Tbname="fi_repayplan.fi_reapyplan,fi_repayplan.fi_reapyplan_bank_once,fi_repayplan.fi_reapyplan_boc,fi_repayplan.fi_reapyplan_ccb,fi_repayplan.fi_reapyplan_irr,fi_repayplan.fi_reapyplan_irrmoney,fi_repayplan.fi_reapyplan_money,fi_repayplan.fi_reapyplan_once,fi_repayplan.fi_reapyplan_oncemoney"

innobackupex --user=${User} --password=${Passwd} --host=${Hostip} --no-timestamp --include=${Tbname} --stream=tar /tmp | gzip > /data/fi_repayplan-`date +%F`.tar.gz 
备份指定的库

 

#一个用于恢复的脚步

#!/bin/badh
#Auth: wangxz
#需要把要解压的文件作为脚本执行的参数
#例如:sh huifu.sh xxx_2017-07-08_03-01-01.tar.gz
DB_DIR=/data/mariadb
DB_PORT=`netstat -lntp |grep 3306 | wc -l`
PROCESS_NUM=`ps aux |grep mysql |wc -l`
recover_log=/tmp/recover.log
print_str() ##打印说明信息
{
    echo -e "------------\e[0;31;1m $1 \e[0m-------------------"    
    sleep 1
}

check_ok()  ##一个检测函数
{
    if [ $? != 0 ]; then
        print_str "Some error has happened"
        exit
    else
        sleep 1
    fi
}
##检测是否给出要解压的文件
if [ $# !=  1 ]; then
    print_str "Please give a tar file"
    exit
fi
 
if [ $DB_PORT == 1 ] && [ $PROCESS_NUM == 3 ]; then
    print_str "It's stopping the mysql service"
    service mysql stop >> $recover_log
    check_ok
    sleep 3
fi

if [ $DB_PORT == 0 ] && [ $PROCESS_NUM == 1 ]; then
    print_str "The mysql service is not running!"
fi

###清楚datadir目录
print_str "Delete the datadir"
rm -fr $DB_DIR/*
check_ok
sleep 3

###解压数据库
print_str "Start Uncompress the backup file"
tar -ixvf $1 -C $DB_DIR/>> $recover_log
check_ok
sleep 3 

###准备数据库备份
print_str "apply log the datadir"
innobackupex --apply-log $DB_DIR  >> $recover_log
check_ok
sleep 3

###修改权限
chown -R mysql:mysql $DB_DIR
sleep 3

###启动数据库
service mysql start >>$recover_log
check_ok
###检测是否启动成功
PROCESSLIST=`ps aux |grep mysql |wc -l`
PORT_NUM=`netstat -lntp |grep 3306 | wc -l`
if [ $PROCESSLIST -gt 1 ] && [ $PORT_NUM -le 1 ]; then
    print_str "the mysql service has started successfully!"
    rm -fr $recover_log
    check_ok
    print_str "The log was deleted successfully!"
else
    print_str  "Some unexcept things has happened"
fi  
恢复脚本

 

posted @ 2018-11-28 20:51  夜间独行的浪子  阅读(10944)  评论(0编辑  收藏  举报