MySQL备份与恢复-innobackupex
:上一片myloder搞崩溃,为什么百度的博文都是抄袭一模一样的,哎烦!
这一片文章我们来介绍物理备份工具xtracebackup!
首先是安装可以percona官网下载安装,下载rpm包直接yum安装即可!
yum install -y perl-DBD-MySQL perl-DBI perl-Time-HiRes libaio* #安装依赖包
yum install -y percona-xtrabackup--2.4.-.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--2.4.-.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--2.4.
/usr/share/doc/percona-xtrabackup--2.4./COPYING
/usr/share/man/man1/innobackupex..gz
/usr/share/man/man1/xbcrypt..gz
/usr/share/man/man1/xbstream..gz
/usr/share/man/man1/xtrabackup..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= /data/backup/ #备份很简单,/data/backup/为备份的目录
:: 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!". :: version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;host=localhost' as 'root' (using password: YES).
:: version_check Connected to MySQL server
:: version_check Executing a version check against the server...
:: 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 ''
:: [] Writing backup-my.cnf
:: [] ...done
:: [] Writing xtrabackup_info
:: [] ...done
xtrabackup: Transaction log of lsn () to () was copied.
:: completed OK! #出现completed OK表示备份完成! 因为过程比较长,没有粘贴,可以看一下备份的过程!
innobackupex会在备份目录下面创建以当前时间点命名的备份文件如下:
[root@test3 ~]# cd /data/backup/
[root@test3 backup]# ls
--28_18--47 #以当前时间点命名的备份文件集
[root@test3 backup]# cd --28_18--/
[root@test3 --28_18--]# 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/--28_18--/ #准备阶段的命令
:: 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. based on MySQL server 5.7. Linux (x86_64) (revision id: df58cf2)
xtrabackup: cd to /data/backup/--28_18--
xtrabackup: This target seems to be not prepared yet.
InnoDB: Number of pools:
.....
InnoDB: 5.7. started; log sequence number
xtrabackup: starting shutdown with innodb_fast_shutdown =
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number
:: 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= --no-timestamp /data/backup/test_`date +%F` #指定备份集的名字
[root@test3 ~]# cd /data/backup/
[root@test3 backup]# ls #查看备份集
test_2018--
[root@test3 backup]#
有时候因为socket文件不在默认位置,可以使用--socket指定位置:
[root@test2 ~]# innobackupex --user=root --password="7abec53701c3eefb" --no-timestamp /data/backup/testdb
:: 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!". :: version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup' as 'root' (using password: YES).
:: version_check Connected to MySQL server
:: version_check Executing a version check against the server...
:: version_check Done.
:: Connecting to MySQL server host: localhost, user: root, password: set, port: , 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= --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(), sysTime datetime);
Query OK, rows affected (0.02 sec) mysql> insert into tb3 select "aa", now();
Query OK, row affected (0.01 sec)
Records: Duplicates: Warnings: mysql> insert into tb3 select "bb", now();
Query OK, row affected (0.01 sec)
Records: Duplicates: Warnings: mysql> select * from tb3;
+------+---------------------+
| a | sysTime |
+------+---------------------+
| aa | -- :: |
| bb | -- :: |
+------+---------------------+
rows in set (0.00 sec)
3:开始增量备份
[root@test3 backup]# innobackupex --user=root --password= --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 =
last_lsn =
compact =
recover_binlog_info =
备份完成之后,我们需要恢复操作,记得上面恢复第一步是什么?准备数据,也就是redo已经提交的事务,回滚未提交的事务。增量备份也是这样,但是操作有些不同。
把全备文件备份一下,把数据库二进制日志也保存一下:【这一步为了二进制增备恢复做准备】
[root@test3 backup]# cp -r full_backup full_backup_bak
[root@test3 backup]# cp /data/mysql/test3-bin. /data/backup/
[root@test3 backup]# ls
full_backup full_backup_bak incre1 test3-bin.
恢复操作:
准备数据
第一准备全备:
[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
Server version: 5.7.-log MySQL Community Server (GPL) Copyright (c) , , 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.
ibbackup_version = 2.4.
server_version = 5.7.-log
start_time = -- ::
end_time = -- ::51 #全部结束的时间
lock_time =
binlog_pos = filename 'test3-bin.000001', position ''
innodb_from_lsn =
innodb_to_lsn =
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N
#基于二进制的日志点恢复
[root@test3 mysql]# cat xtrabackup_binlog_pos_innodb #全部备份结束的时间点
test3-bin.
[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. > /root/bak.sql
--start-datetime : 指定起始的时间点。
--stop-datetime: 指定结束的时间点。
--start-position: 指定二进制日志开始日志点。
--stop-position : 指定二进制日志结束的日志点。
上面四个参数可以配合使用
然后把上面导出sql文件导入到MySQL服务中。
mysql> set sql_log_bin=; #导入时,若文件较大会产生很多二进制日志文件,可以先把二进制日志文件关闭, 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 |
+------------------+
row in set (0.00 sec)
查看一下二进制日志:
[root@test3 backup]# mysqlbinlog test3-bin.
.......
# :: server id end_log_pos CRC32 0xcad0188f Query thread_id= exec_time= error_code=
SET TIMESTAMP=/*!*/;
create table tb3(a varchar(), sysTime datetime)
/*!*/;
# at 1973 #用时间截取的时候很可能是截取到了这个时间点就停止了,因此只有tb3这个表,没有后面的插入的第一条数据,因此我们选择用日志点截取数据
# 9:14:00 server id end_log_pos CRC32 0x670a3d93 Anonymous_GTID last_committed= sequence_number= rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at
# :: server id end_log_pos CRC32 0x6a82446d Query thread_id= exec_time= error_code=
SET TIMESTAMP=/*!*/;
BEGIN
/*!*/;
# at
# :: server id end_log_pos CRC32 0x7c9e9e8c Table_map: `sbtest`.`tb3` mapped to number
# at
# :: server id end_log_pos CRC32 0xda4461be Write_rows: table id flags: STMT_END_F BINLOG '
WD3/WxMFAAAANAAAAHwIAAAAAHUAAAAAAAEABnNidGVzdAADdGIzAAIPEgMFAAADjJ6efA==
WD3/Wx4FAAAALAAAAKgIAAAAAHUAAAAAAAEAAgAC//wCYWGZoXqTgL5hRNo=
'/*!*/;
# at
# :: server id end_log_pos CRC32 0x3b63c077 Xid =
COMMIT/*!*/;
# at 2247 #选择这个日志点
# :: server id end_log_pos CRC32 0xbd634458 Anonymous_GTID last_committed= sequence_number= rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at
# :: server id end_log_pos CRC32 0xb5eba130 Query thread_id= exec_time= error_code=
SET TIMESTAMP=/*!*/;
BEGIN
/*!*/;
# at
# :: server id end_log_pos CRC32 0xfcaf0343 Table_map: `sbtest`.`tb3` mapped to number
# at
# :: server id end_log_pos CRC32 0x080cd871 Write_rows: table id flags: STMT_END_F BINLOG '
Yz3/WxMFAAAANAAAAI4JAAAAAHUAAAAAAAEABnNidGVzdAADdGIzAAIPEgMFAAADQwOv/A==
Yz3/Wx4FAAAALAAAALoJAAAAAHUAAAAAAAEAAgAC//wCYmKZoXqTi3HYDAg=
'/*!*/;
# at
# :: server id end_log_pos CRC32 0x14fd7636 Xid =
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= --stop-position= test3-bin. > /root/bak.sql #截取二进制日志
导入数据,查看数据:
mysql> source bak.sql;
mysql> use sbtest;
Database changed
mysql> show tables;
+------------------+
| Tables_in_sbtest |
+------------------+
| tb3 |
+------------------+
row in set (0.00 sec) mysql> select * from tb3; #数据已经存在
+------+---------------------+
| a | sysTime |
+------+---------------------+
| aa | -- :: |
+------+---------------------+
row in set (0.00 sec)
增量备份有两种方法,一个是利用innobackupex的方式进行增量备份另一个是利用二进制日志进行增量备份;建议使用二进制日志增量备份!
我们公司的备份策略时,每一天凌晨全部备份,然后备份当天的二进制日志文件,这样就可以把数据恢复到任何一个时间点!
流压缩
上面备份的数据比较少,并没有考虑磁盘空间问题。下面我们来备份一个大库!
[root@test2 mariadb]# du -sh
47G .
#datadir的数据文件时47G,好吧也不是太大,能说明问题了!
查看备份之后的文件大小:
[root@test2 ~] innobackupex --user=root --password="" --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= /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/
:: 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. based on MySQL server 5.7. Linux (x86_64) (revision id: df58cf2)
:: [] decompressing ./ibdata1.qp
sh: qpress: command not found
cat: write error: Broken pipe
Error: thread 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 :
epel | 4.4 kB :
mariadb | 2.9 kB :
zabbix | 2.9 kB :
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--08_03--.tar.gz
DB_DIR=/data/mariadb
DB_PORT=`netstat -lntp |grep | 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
} check_ok() ##一个检测函数
{
if [ $? != ]; then
print_str "Some error has happened"
exit
else
sleep
fi
}
##检测是否给出要解压的文件
if [ $# != ]; then
print_str "Please give a tar file"
exit
fi if [ $DB_PORT == ] && [ $PROCESS_NUM == ]; then
print_str "It's stopping the mysql service"
service mysql stop >> $recover_log
check_ok
sleep
fi if [ $DB_PORT == ] && [ $PROCESS_NUM == ]; 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
恢复脚本
MySQL备份与恢复-innobackupex的更多相关文章
- mysql之 innobackupex备份+binlog日志的完全恢复【转】
前言: MySQL的完全恢复,我们可以借助于完整的 备份+binlog 来将数据库恢复到故障点. 备份可以是热备与逻辑备份(mysqldump),只要备份与binlog是完整的,都可以实现完全恢复. ...
- ch5 MySQL 备份与恢复
第 5 章 MySQL 备份与恢复 前言 数据库的备份与恢复一直都是 DBA 工作中最为重要的部分之一,也是基本工作之一.任何正式环境的数据库都必须有完整的备份计划和恢复测试,本章内容将主要介绍 My ...
- mysql常用操作 mysql备份与恢复
先登录mysql ==>mysql -uroot -p 查看数据库的版本 select version(); 查看有哪些库 show datases; 查看当前处于哪个库 select da ...
- 第 5 章 MySQL 备份与恢复
第 5 章 MySQL 备份与恢复 前言 数据库的备份与恢复一直都是 DBA 工作中最为重要的部分之一,也是基本工作之一.任何正式环境的数据库都必须有完整的备份计划和恢复测试,本章内容将主要介绍 My ...
- centos LAMP第四部分mysql操作 忘记root密码 skip-innodb 配置慢查询日志 mysql常用操作 mysql常用操作 mysql备份与恢复 第二十二节课
centos LAMP第四部分mysql操作 忘记root密码 skip-innodb 配置慢查询日志 mysql常用操作 mysql常用操作 mysql备份与恢复 第二十二节课 mysq ...
- Data Base mysql备份与恢复
mysql 备份与恢复 为什么要备份: 由于系统使用到了MySQL 数 据库,所以每天的工作,就设计到了MySQL数据库的备份问题.但如果每天手工来做MySQL数据库的定时备份,工作量不说,时间还不 ...
- Mysql备份与恢复(2)---逻辑备份
数据库及时备份可以帮助我们在数据库出现异常宕机时及时的使用备份数据进行恢复工作,将因为数据库宕机产生的影响降低到最小.上一篇针对使用xtrabackup工具进行物理备份和数据恢复做了一个详细讲解,本篇 ...
- mysql备份与恢复-xtracebackup
因为percona打算放弃使用innobackupex备份工具,因此我们这里也说明一下innobackupex的兄弟工具xtraceback工具的使用 这个工具的安装可以参考上面的一些博文,上面详细说 ...
- 27.MySQL备份与恢复
27.备份与恢复27.1 备份/恢复策略考虑因素:备份表的存储引擎(事务性or非事务性):全备份or增量备份用复制做异地备份定期备份,考虑恢复时间确保mysql打开log-bin,有了BINLOG,M ...
随机推荐
- DISTINCT 与 GROUP BY 的比较
看了很多文章,这两个SQL语句在不同的数据库上面的实现上可能有相同或有不同,但是应当要明确它们在功能概念上的区别,最终得出结论: GROUP BY 用来使用聚集函数获得值,比如 AVG, MAX, M ...
- 【紫书】Rails UVA - 514 栈
题意:判断出栈顺序是否合法 题解:两个指针,A指向入栈序列,B指向出栈. 的分三种情况:if 1.A==B :直接入栈加出栈即可A++,B++ else 2.和栈顶相同,直接出栈A==stac ...
- POJ - 3026 Borg Maze bfs+最小生成树。
http://poj.org/problem?id=3026 题意:给你一个迷宫,里面有 ‘S’起点,‘A’标记,‘#’墙壁,‘ ’空地.求从S出发,经过所有A所需要的最短路.你有一个特殊能力,当走到 ...
- UNSIGNED command-line client
High Performance MySQL, Third Edition by Baron Schwartz, Peter Zaitsev, and Vadim Tkachenko There ...
- Python-OpenCV —— 基本操作详解
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.MacOS操作系统上.它轻量级而且高效——由一系列 C 函数和少量C++类构成,同时提供了Pyt ...
- 【JMeter】如何录制创建及得到曲线图
前段时间公司需要对服务器进行压力测试,包括登录前的页面和登录后的页面,主要目的是测试负载均衡的实现效果.不知道是不是因为Jmeter不如loadRunner火爆还是什么,网上关于Jmeter的资料有很 ...
- mysql 权限管理 针对表的字段 级别 授权 columns_priv表
针对Mike账号 db1库下面的t1表的 id,name字段授予select权限,age字段授予update权限 授权格式 select(要授权的字段,要授权的字段) 用户括号 括起来 .updat ...
- 2.深度学习中的batch_size的理解
Batch_Size(批尺寸)是机器学习中一个重要参数,涉及诸多矛盾,下面逐一展开. 首先,为什么需要有 Batch_Size 这个参数? Batch 的选择,首先决定的是下降的方向.如果数据集比较小 ...
- python输出测试报告测试成功
import unittest # import HtmlTestRunner import HTMLTestRunner class DemoTest(unittest.TestCase): def ...
- pycharm Unresolved reference 无法引入包
1. 问题描述: 在项目中P存在文件夹A.B.C,A有文件夹a和b,在a中引入b的一个类, a.py: from b import func1 虽然运行成功,但是在Pycharm中显示: Unreso ...