共计 24396 个字符,预计需要花费 61 分钟才能阅读完成。
第 1 章 XtraBackup
1.1 XtraBackup介绍
InnoDB 有个商业的 InnoDB Hotbackup,可以对 InnoDB 引擎的表实现在线热备。而 percona 出品的 Xtrabackup,是 InnoDB Hotbackup 的一个开源替代品,可以在线对 InnoDB/XtraDB 引擎的表进行物理备份。mysqldump 支持在线备份,不过是逻辑备份,效率比较差。xtrabackup 是开源的 MySQL 备份工具,物理备份,效率很不错。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex,其中 xtrabackup 只能备份 InnoDB 和 XtraDB 两种数据表,innobackupex 则封装了 xtrabackup,同时可以备份 MyISAM 数据表。Xtrabackup 做备份的时候不能备份表结构、触发器等等,智能纷纷.idb 数据文件。另外 innobackupex 还不能完全支持增量备份,需要和 xtrabackup 结合起来实现全备的功能。
1.2 XtraBackup特点介绍
C语言编写,可以备份 Innodb、XtraD, 不拷贝 *.frm 文件
支持的引擎有:
InnoDB、Xtradb:hotbackup
MyISAM:with read lock
具有的特点有如下几点:
§ 1)备份过程快速、可靠;
§ (2)备份过程不会打断正在执行的事务;
§ (3)能够基于压缩等功能节约磁盘空间和流量;
§ (4)自动实现备份检验;
§ (5)还原速度快;
1.3 XtraBackup的下载安装
Xtrabackup工具由 Percona 公司开发的开源热备工具,可以到官网下载到最新的版本文件。
https://www.percona.com/downloads/下载各种版本,也可以在系统中使用 wget 下载。
方法一:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/RedHat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
安装依赖的包
yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL installperl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
方法二:
下载好的 rpm 包,直接使用 yum 安装,自动安装依赖包,但是需要有 epel 源的支持,所以要下载配置好 epe’ 源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install -y percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
1.4 XtraBackup备份用户需要的权限
RELOAD 和 LOCKTABLES 权限为了执行 FLUSHTABLES WITH READ LOCK
REPLICATION CLIENT 为了获取 binary log 位置
CREATE TABLESPACE 权限为了导入表,用户表级别的恢复
SUPER权限在 slave 环境下备份用来启动和关闭 slave 线程
1.5 XtraBackup备份
InnoDB 和非 InnoDB 文件的备份都是通过拷贝文件,但是实现的方式是不同的。
InnoDB是以 page 为粒度做的的(Xtrabackup),Xtrabackup在读取每个 page 时会校验 checksum 值,保证数据块是一致的
非 InnoDB 是cp或者 tar 命令,innobackupex在 cp MyISAM 文件时已经做了flush(FTWRL),磁盘上的文件也是完整的,所以最终备份集里的数据文件都是写入完整的
1.5.1 备份流程
1.5.2 全备流程图
1.5.3 增量备份流程图
1.6 Xtrabackup恢复
1.6.1 恢复流程图
1.7 Xtrabackup的使用
规范操作,我们先建好全备和增量备份的路径
[root@db01 backups]# pwd
/data/backups
[root@db01 backups]# ll
总用量 12
drwxr-xr-x 4 root root 4096 9月 4 17:28 full
drwxr-xr-x 4 root root 4096 9月 4 17:26 inc
操作过程:
mkdir/data/backups/{full,inc} -p
1.7.1 全备
*****生产环境中为了数据一致性最好是 ROW 模式,因为其他的模式数据会丢失*****
命令语法格式:
innobackupex --user=User--password=PWD
/data/backup/full
--slave-info --safe-slave-backup --parallel=4--safe-slave-backup-timeout=7200 --
rsync
–rsync 这个参数一般用作分布式数据库集群的时候
全备步骤:
1、准备一个 xtr_test 数据库,并在 xtr_test 数据库中插入 testbackup 表,字段包含 id,step 两个字段
mysql -uroot -p789 -S
/data/3306/mysql
.sock
show databases;
create database xtr_test;
use xtr_test;
select
database();
create table testbackup(
id
int not nullauto_increment primary key,step varchar(50))engine=innodb;
show tables;
desc testbackup;
show create table testbackup\G
结果样子:
mysql> desc testbackup;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
|
id
|int(11) | NO | PRI | NULL | auto_increment |
| step |varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows
in
set
(0.02 sec)
mysql> show create table testbackup\G
*************************** 1. row***************************
Table:testbackup
Create Table: CREATE TABLE `testbackup` (
`
id
`int(11) NOT NULL AUTO_INCREMENT,
`step`varchar(50) DEFAULT NULL,
PRIMARY KEY(`
id
`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row
in
set
(0.00 sec)
2、插入字段 “firstfull backup” 到testbackup表中
insert into testbackup(step) values(
'first fullbackup'
);
操作结果:
mysql>
select
* from testbackup;
+----+-------------------+
|
id
| step |
+----+-------------------+
| 1 | firstfull backup |
+----+-------------------+
1 row
in
set
(0.02 sec)
3、执行全备
此时,我们创建的 xtr_test 数据库中的 testbackup 表中有数据,而且我们创建的 /data/backups/full 文件下面没有任何内容。下面执行全备,操作命令上面已经给出,此次操作使用的多实例所以用到了 –socket 参数。
innobackupex --user=root --password=789
/data/backups/full
--slave-info --safe-slave-backup --parallel=4--safe-slave-backup-timeout=7200 --socket=
/data/3306/mysql
.sock
执行结果一定要看到“160905 20:01:38 completedOK!” OK的字样,才表示成功,从打出的日志我们也能看到备份的过程和上面给出的全备流程图对比起来。
正确输出以后会在 /data/backups/full 指定的目录中生成一个有时间和序号的目录,这个目录就是全备文件存放地方如:
[root@db01 ~]
# ls -lrt /data/backups/full/
总用量 4
drwxr-x--- 8 root root 4096 9 月 5 20:012016-09-05_20-01-32
1.7.2 增量备份
增量备份的前提是一定要有一个全备 ,只有有了全备才能进行所谓的增量备份!!!
增量备份的方式有两种,分别为:
第一种:通过全备的文件
innobackupex --user=root --password=789 --incremental --incremental-lsn=1783249
/data/backups/inc
--slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=
/data/3306/mysql
.sock
第二种方法:通过LSN
innobackupex --user=root --password=789 --incremental --incremental-lsn=1783249
/data/backups/inc
--slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=
/data/3306/mysql
.sock
1、准备好全备最新一次的全备文件,这里只做了一次,所以只有一个目录
[root@db01 ~]
# ls -lrt /data/backups/full/
总用量 4
drwxr-x--- 8 root root 4096 9 月 5 20:01 2016-09-05_20-01-32
2、对 xtr_test 数据库中的 testbackup 表,进行数据的插入,插入内容为“fist increment backup”
mysql> insert into testbackup(step)values(
'first increment backup'
);
Query OK, 1 row affected (0.02 sec)
mysql>
select
* from testbackup;
+----+------------------------+
|
id
| step |
+----+------------------------+
| 1 | firstfull backup |
| 2 | firstincrement backup |
+----+------------------------+
2 rows
in
set
(0.01 sec)
3、执行增量备份
这里我们要确定好最新一次的全备(强调)!!!
innobackupex --user=root --password=789--incremental --incremental-basedir=
/data/backups/full/
2016-09-05_20-01-32
/data/backups/inc
--slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200 --socket=
/data/3306/mysql
.sock
这里执行结果一定要看到 “completed OK!” OK 的字样,才表示成功如果是分布式也可以用 –rsync,我们会在创建的inc 目录下发现创建了一个以时间和序号命名的目录,这个目录就是 Xtrabackup 备份的增量。
执行结果:
[root@db01 ~]
# ll /data/backups/inc
总用量 4
drwxr-x--- 8 root root 4096 9 月 5 20:19 2016-09-05_20-19-48
TIP:innodb 默认是使用的系统表空间,我们可以通过配置参数来使 idb 文件到独立空间中 innodb_file_per_table = 1 这个是修改 idb 到独立空间,如果数据库是线上的,我们可以在配置文件 my.cnf 配置以上参数后,再使用 set globalinnodb_file_per_table= 1 临时生效。
alter table backupstep engine=innodb; 修改表的引擎,这个操作很费时间,需要在业务低点的时候操作
1.7.3 再增量备份的基础上再备份
在创建的 xtr_test 数据库中的 testbackup 表中再次插入内容“secondincrement backup”
mysql> insert into testbackup(step) values(
'secondincrement backup'
);
Query OK, 1 row affected (0.01 sec)
mysql>
select
* from testbackup;
+----+-------------------------+
|
id
| step |
+----+-------------------------+
| 1 | firstfull backup |
| 2 | first incrementbackup |
| 3 | secondincrement backup |
+----+-------------------------+
3 rows
in
set
(0.00 sec)
1、确定最新的全备文件
[root@db01 full]
# pwd
/data/backups/full
[root@db01 full]
# ls -lrt
总用量 4
drwxr-x--- 8 root root 4096 9 月 5 20:01 2016-09-05_20-01-32
2、确定上一次增量备份的 LSN 值
[root@db01 inc]
# ls -lrt
总用量 4
drwxr-x--- 8 root root 4096 9 月 5 20:19 2016-09-05_20-19-48
[root@db01 inc]
# cd 2016-09-05_20-19-48/
[root@db01 2016-09-05_20-19-48]
# ls
backup-my.cnf krik performance_schema xtrabackup_checkpoints xtr_test
ibdata1.delta mysql
test
xtrabackup_info
ibdata1.meta oldboy xtrabackup_binlog_info xtrabackup_logfile
[root@db01 2016-09-05_20-19-48]
# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1793716
# 这个值一定是和上一次全备的 last_lsn 一样,否则就是数据不全
to_lsn = 1794019
last_lsn = 1794019
compact = 0
recover_binlog_info = 0
4、
执行增量备份命令
innobackupex --user=root --password=789 --incremental--incremental-lsn=1794019
/data/backups/inc
--slave-info --safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=
/data/3306/mysql
.sock
这个值是通过查看最近一次增量备份的 xtrabackup_checkpoints 得到
这里执行结果一定要看到“completed OK!” OK的字样,才表示成功
执行结果会在指定的目录 /data/backups/inc 下生成一个新的文件
[root@db01 2016-09-05_20-19-48]
# cd ..
[root@db01 inc]
# pwd
/data/backups/inc
[root@db01 inc]
# ls -lrt
总用量 8
drwxr-x--- 8 root root 4096 9 月 5 20:19 2016-09-05_20-19-48
drwxr-x--- 8 root root 4096 9 月 5 21:18 2016-09-05_21-18-30
到此我们对数据进行了完整的备份,下面会再创建一条语句,但是不会做增量备份,为了是下面测试二进制日志恢复数据。接下来要玩大的了,删库,后面看看能恢复回来不
生产环境中为了数据一致性最好是 ROW 模式,因为其他的模式数据会丢失
mysql> show variables like
"log_bin"
;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row
in
set
(0.00 sec)
mysql> show variables like
"%binlog_format%"
;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row
in
set
(0.00 sec)
ot root 418 9 月 4 15:34backup-my.cnf
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2017-04/142477p2.htm
第 2 章 数据库恢复
这里只做 redo,不做 undo
2.1 恢复数据前准备
数据库的恢复,是从全备 —>1 次增量 —>2 次增量 ……—>N 次增量直到故障点的位置的顺序来恢复的
如果是全备:最近一次的全备—-> binlog
2.1.1 创建新的语句为二进制日志恢复做准备
mysql> insert into testbackup(step)values(
'second increment backup'
);
Query OK, 1 row affected (0.01 sec)
mysql>
select
* from testbackup;
+----+-------------------------+
|
id
| step |
+----+-------------------------+
| 1 | firstfull backup |
| 2 | firstincrement backup |
| 3 | secondincrement backup |
+----+-------------------------+
3 rows
in
set
(0.00 sec)
mysql> insert into testbackup(step)values(
'last backup'
);
Query OK, 1 row affected (0.00 sec)
mysql>
select
* from testbackup;
+----+-------------------------+
|
id
| step |
+----+-------------------------+
| 1 | firstfull backup |
| 2 | firstincrement backup |
| 3 | secondincrement backup |
| 4 |last backup |
+----+-------------------------+
4 rows
in
set
(0.00 sec)
mysql> truncate table testbackup;
Query OK, 0 rows affected (0.02 sec)
mysql>
select
* from testbackup;
Empty
set
(0.00 sec)
2.2 恢复第一次的全备数据库
恢复数据库的时候一定会重启一次数据库的,所以我们可以选择停库操作(如果可以的情况下),下面以停库操作练习:
1、 停掉数据库
[root@db01 inc]
# /data/3306/mysql stop
Stoping MySQL...
[root@db01 inc]
# netstat -lntup|grep 3306
[root@db01 inc]
#
2、 恢复最近一次的全备,*****在操作前一定要先备份*****
[root@db01 backups]
# for i in `ls/data/backups/`;do cp -r $i /data/backups/$i.bak;done
[root@db01 backups]
# ls
full full.bak inc inc.bak
[root@db01 backups]
# cp -r /data/3306/data/data/backups/3306_data.bak
[root@db01 backups]
# ls
3306_data.bak full full.bak inc inc.bak
3、 导入全备数据
innobackupex --user=root --password=789 --apply-log--redo-only
/data/backups/full/2016-09-05_20-01-32--socket
=
/data/3306/mysql
.sock
要确认看到 OK 字样,表示导入成功
2.3 恢复第一次全备后的第一次增量备份
1、 确定第一次增量备份的文件目录
[root@db01 inc]
# ls -lrt
总用量 8
drwxr-x--- 8 root root 4096 9 月 5 20:19 2016-09-05_20-19-48
drwxr-x--- 8 root root 4096 9 月 5 21:18 2016-09-05_21-18-30
通过时间排序可以看到这里第一次是2016-09-05_20-19-48,工作中可以自定义一些名字
2、 执行增量恢复
innobackupex --user=root --password=789 --apply-log--redo-only
/data/backups/full/2016-09-05_20-01-32
--incremental-
dir
=
/data/backups/inc/2016-09-05_20-19-48--socket
=
/data/3306/mysql
.sock
看到 OK 字样表示成功
2.4 恢复第一次全备后的第二次增量备份
innobackupex --user=root --password=789 --apply-log--redo-only
/data/backups/full/2016-09-05_20-01-32
--incremental-
dir
=
/data/backups/inc/2016-09-05_21-18-30--socket
=
/data/3306/mysql
.sock
到此 Xtrabackup 昨晚了 redo 操作,下面我们要把他写入数据文件中。这一步才是把数据放到数据库中
数据写入数据文件:
innobackupex --user=root --password=789--apply-log
/data/backups/full/2016-09-05_20-01-32
--socket=
/data/3306/mysql
.sock
同样是看到 OK 字样表示执行成功。
2.5 恢复数据到实例 3306 的数据中
Xtrabackup恢复是把所有的增量都叠加到了全备的身上,也就是恢复用的全备。它就是数据库 data,我们把这个全备目录替换了3306 数据库的 data 数据
[root@db01 full]
# rm -fr /data/3306/data/
[root@db01 full]
# mv 2016-09-05_20-01-32//data/3306/data
[root@db01 full]
# ll /data/3306/data
总用量 163884
-rw-r----- 1 root root 418 9 月 5 20:01 backup-my.cnf
-rw-r----- 1 root root 134217728 9 月 5 22:12 ibdata1
-rw-r----- 1 root root 4194304 9 月 5 22:12 ib_logfile0
-rw-r----- 1 root root 4194304 9 月 5 22:12 ib_logfile1
-rw-r----- 1 root root 4194304 9 月 5 22:12 ib_logfile2
-rw-r----- 1 root root 12582912 9 月 5 22:12 ibtmp1
drwxr-x--- 2 root root 4096 9 月 5 22:10 krik
drwxr-x--- 2 root root 4096 9 月 5 22:10 mysql
drwxr-x--- 2 root root 4096 9 月 5 22:10 oldboy
drwxr-x--- 2 root root 4096 9 月 5 22:10 performance_schema
drwxr-x--- 2 root root 4096 9 月 5 22:10
test
-rw-r----- 1 root root 22 9 月 5 22:10 xtrabackup_binlog_info
-rw-r--r-- 1 root root 33 9 月 5 22:12 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root 113 9 月 5 22:12 xtrabackup_checkpoints
-rw-r----- 1 root root 630 9 月 5 22:10 xtrabackup_info
-rw-r----- 1 root root 8388608 9 月 5 22:04 xtrabackup_logfile
drwxr-x--- 2 root root 4096 9 月 5 22:10 xtr_test
[root@db01 full]
# chown -R mysql.mysql/data/3306/data/
[root@db01 full]
# ll /data/3306/data
总用量 163884
-rw-r----- 1 mysql mysql 418 9 月 5 20:01 backup-my.cnf
-rw-r----- 1 mysql mysql 134217728 9 月 5 22:12 ibdata1
-rw-r----- 1 mysql mysql 4194304 9 月 5 22:12 ib_logfile0
-rw-r----- 1 mysql mysql 4194304 9 月 5 22:12 ib_logfile1
-rw-r----- 1 mysql mysql 4194304 9 月 5 22:12 ib_logfile2
-rw-r----- 1 mysql mysql 12582912 9 月 5 22:12 ibtmp1
drwxr-x--- 2 mysql mysql 4096 9 月 5 22:10 krik
drwxr-x--- 2 mysql mysql 4096 9 月 5 22:10 mysql
drwxr-x--- 2 mysql mysql 4096 9 月 5 22:10 oldboy
drwxr-x--- 2 mysql mysql 4096 9 月 5 22:10 performance_schema
drwxr-x--- 2 mysql mysql 4096 9 月 5 22:10
test
-rw-r----- 1 mysql mysql 22 9 月 5 22:10 xtrabackup_binlog_info
-rw-r--r-- 1 mysql mysql 33 9 月 5 22:12 xtrabackup_binlog_pos_innodb
-rw-r----- 1 mysql mysql 113 9 月 5 22:12 xtrabackup_checkpoints
-rw-r----- 1 mysql mysql 630 9 月 5 22:10 xtrabackup_info
-rw-r----- 1 mysql mysql 8388608 9 月 5 22:04 xtrabackup_logfile
drwxr-x--- 2 mysql mysql 4096 9 月 5 22:10 xtr_test
重启数据库测试
[root@db01 full]
# cd /data/3306
[root@db01 3306]
# ./mysql start
Starting MySQL...
[root@db01 3306]
# netstat -lntup|grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 56714
/mysqld
mysql>
select
* from testbackup;
+----+-------------------------+
|
id
| step |
+----+-------------------------+
| 1 | firstfull backup |
| 2 | firstincrement backup |
| 3 | secondincrement backup |
+----+-------------------------+
3 rows
in
set
(0.00 sec)
测试增量恢复正常,但是我们最后做的一次操作,没有出现,下面使用二进制 binglog 来恢复
2.6 binlog日志恢复数据
使用 binlog 恢复数据,我们需要来确定一个 “ 范围 ” 这里我们需要确定从第二次增量备份后到 执行删除表的 sql 语句之前这个范围;查找范围,我们可以使用时间范围、位置点 pos 来取这个范围。
2.6.1 查找第二次增量的位置点
[root@db01 2016-09-05_21-18-30]
# catxtrabackup_binlog_info
mysql-bin.000010 1201
这里我们知道了第二次增量结束后的位置点事1201,我们将以这个位置点为起止位置点
2.6.2 查找删表语句时候的位置点
由于测试 binlog 日志文件少,这里很好查找,生产中要根据时间点来截取一段时间范围内,然后在去查找
[root@db01 3306]
# mysqlbinlog--base64-output=decode-rows mysql-bin.000010
# at 1376
#160905 21:46:41 server id 1 end_log_pos 1403 Xid = 164
COMMIT/*!*/;
# at 1403
#160905 21:46:59 server id 1 end_log_pos 1495 Query thread_id=7 exec_time=0 error_code=0
SET TIMESTAMP=1473083219/*!*/;
truncate table testbackup
/*!*/;
# at 1495
#160905 21:52:16 server id 1 end_log_pos 1514 Stop
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
通过查找到语句后,我们找到了位置点,我们可以导出一个文件,通过 vim 编辑来搜索语句
2.6.3 binlog恢复数据
通过上面找出的起止点和终止点来恢复数据
mysqlbinlog --base64-output=decode-rows -
v
--start-position=1201 --stop-position=1403 mysql-bin.000010
来再次确认
恢复:
[root@db01 3306]
# mysqlbinlog --start-position=1201--stop-position=1403 mysql-bin.000010|mysql -uroot -p789 -S/data/3306/mysql.sock
数据中查看:
mysql>
select
* from testbackup;
+----+-------------------------+
|
id
| step |
+----+-------------------------+
| 1 | firstfull backup |
| 2 | firstincrement backup |
| 3 | secondincrement backup |
| 4 |last backup |
+----+-------------------------+
4 rows
in
set
(0.01 sec)
附录 —Xtrabackup 参数详解
Xtrabackup常用参数选项如下:
–slave-info:
它会记录 master 服务器的 binary log 的pos和 name。会把记录的信息记录在xtrabackup_slave_info。在备份从库时, 可以使用该参数, 加上 –slave-info 备份目录下会多生成一个 xtrabackup_slave_info 文件 , 这里会保存主日志文件以及偏移 , 文件内容类似于:CHANGE MASTER TOMASTER_LOG_FILE=”, MASTER_LOG_POS=0。
这个参数适用的场景:假设现在有主库 A 和从库 B,目前想再添加一台备库C,并让备库C 以主库 A 为master;因为主库 A 是生产库,压力一般比较大,所以我们就在备库 B 上备份一个数据库,然后把这个备份拿到 C 服务器上 并导入到 C 库,接下来再在 C 服务器上执行 change master 的命令:其中 master_host 是A的 ip, 而master_log_file和 master_log_pos 就是这个 xtrabackup_slave_info 里面的值
–safe-salve-backup:
它会停止 slave SQL 进程,等备份完后,重新打开 slave 的SQL进程
–force-tar –stream=tar /tmp
这些命令是用来压缩备份为 tar 文件。具体看官方文档
–defaults-file=#
默认配置文件的路径,如果不该参数,xtrabackup将从依次从以下位置查找配置文件 /etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、~/.my.cnf,并读取配置文件中的[mysqld] 和[xtrabackup]配置段。[mysqld]中只需要指定 datadir、innodb_data_home_dir、innodb_data_file_path、innodb_log_group_home_dir、innodb_log_files_in_group、innodb_log_file_size6 个参数即可让 xtrabackup 正常工作。
–defaults-extra-file=#
如果使用了该参数,在读取了全局配置文件之后,会再读取这里指定的配置文件
–target-dir=name
备份文件的存放目录路径
–backup
实施备份到target-dir
–prepare
实施对备份文件进行恢复前的准备 ( 生成InnoDB log file)
–print-param
打印备份或恢复时需要的参数
–use-memory=#
该参数在 prepare 的时候使用,控制 prepare 时innodb实例使用的内存量
–suspend-at-end
在 target-dir 目录下产生一个 xtrabackup_suspended 文件,将 xtrabackup 进程挂起,不停地将数据文件的变化同步到备份文件,直到用户手工删除 xtrabackup_suspended 文件
–throttle=#
每秒 IO 次数 , 限制 backup 时使用的 I/O 操作量,使备份对数据库正常业务的影响最小化
–log-stream
该参数在 backup 的时候使用,将 xtrabackup_logfile 的内容输出到标准输出,使用该参数时会自动使用 suspend-at-end 参数,innobackupex脚本的 stream 模式会使用该参数。
–incremental-lsn=name
增量备份时只拷贝 LSN 比该参数指定值新的 ibd pages,前次备份到了哪个LSN 可以看前次备份集的 xtrabackup_checkpoints 文件
–incremental-basedir=name
该参数在 backup 的时候使用,备份比该参数指定位置的备份集新的idb pages
–incremental-dir=name
该参数在 prepare 的时候使用,指定 prepare 时产生的 .delta 文件和日志文件的存放路径
–tables=name
在备份 file-per-table 类型的数据文件时使用,使用正则表达式指定需要备份的 innodb 表
–datadir=name
MySQL数据库的数据文件目录
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-04/142477.htm
第 1 章 XtraBackup
1.1 XtraBackup介绍
InnoDB 有个商业的 InnoDB Hotbackup,可以对 InnoDB 引擎的表实现在线热备。而 percona 出品的 Xtrabackup,是 InnoDB Hotbackup 的一个开源替代品,可以在线对 InnoDB/XtraDB 引擎的表进行物理备份。mysqldump 支持在线备份,不过是逻辑备份,效率比较差。xtrabackup 是开源的 MySQL 备份工具,物理备份,效率很不错。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex,其中 xtrabackup 只能备份 InnoDB 和 XtraDB 两种数据表,innobackupex 则封装了 xtrabackup,同时可以备份 MyISAM 数据表。Xtrabackup 做备份的时候不能备份表结构、触发器等等,智能纷纷.idb 数据文件。另外 innobackupex 还不能完全支持增量备份,需要和 xtrabackup 结合起来实现全备的功能。
1.2 XtraBackup特点介绍
C语言编写,可以备份 Innodb、XtraD, 不拷贝 *.frm 文件
支持的引擎有:
InnoDB、Xtradb:hotbackup
MyISAM:with read lock
具有的特点有如下几点:
§ 1)备份过程快速、可靠;
§ (2)备份过程不会打断正在执行的事务;
§ (3)能够基于压缩等功能节约磁盘空间和流量;
§ (4)自动实现备份检验;
§ (5)还原速度快;
1.3 XtraBackup的下载安装
Xtrabackup工具由 Percona 公司开发的开源热备工具,可以到官网下载到最新的版本文件。
https://www.percona.com/downloads/下载各种版本,也可以在系统中使用 wget 下载。
方法一:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/RedHat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
安装依赖的包
yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL installperl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
方法二:
下载好的 rpm 包,直接使用 yum 安装,自动安装依赖包,但是需要有 epel 源的支持,所以要下载配置好 epe’ 源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install -y percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
1.4 XtraBackup备份用户需要的权限
RELOAD 和 LOCKTABLES 权限为了执行 FLUSHTABLES WITH READ LOCK
REPLICATION CLIENT 为了获取 binary log 位置
CREATE TABLESPACE 权限为了导入表,用户表级别的恢复
SUPER权限在 slave 环境下备份用来启动和关闭 slave 线程
1.5 XtraBackup备份
InnoDB 和非 InnoDB 文件的备份都是通过拷贝文件,但是实现的方式是不同的。
InnoDB是以 page 为粒度做的的(Xtrabackup),Xtrabackup在读取每个 page 时会校验 checksum 值,保证数据块是一致的
非 InnoDB 是cp或者 tar 命令,innobackupex在 cp MyISAM 文件时已经做了flush(FTWRL),磁盘上的文件也是完整的,所以最终备份集里的数据文件都是写入完整的
1.5.1 备份流程
1.5.2 全备流程图
1.5.3 增量备份流程图
1.6 Xtrabackup恢复
1.6.1 恢复流程图
1.7 Xtrabackup的使用
规范操作,我们先建好全备和增量备份的路径
[root@db01 backups]# pwd
/data/backups
[root@db01 backups]# ll
总用量 12
drwxr-xr-x 4 root root 4096 9月 4 17:28 full
drwxr-xr-x 4 root root 4096 9月 4 17:26 inc
操作过程:
mkdir/data/backups/{full,inc} -p
1.7.1 全备
*****生产环境中为了数据一致性最好是 ROW 模式,因为其他的模式数据会丢失*****
命令语法格式:
innobackupex --user=User--password=PWD
/data/backup/full
--slave-info --safe-slave-backup --parallel=4--safe-slave-backup-timeout=7200 --
rsync
–rsync 这个参数一般用作分布式数据库集群的时候
全备步骤:
1、准备一个 xtr_test 数据库,并在 xtr_test 数据库中插入 testbackup 表,字段包含 id,step 两个字段
mysql -uroot -p789 -S
/data/3306/mysql
.sock
show databases;
create database xtr_test;
use xtr_test;
select
database();
create table testbackup(
id
int not nullauto_increment primary key,step varchar(50))engine=innodb;
show tables;
desc testbackup;
show create table testbackup\G
结果样子:
mysql> desc testbackup;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
|
id
|int(11) | NO | PRI | NULL | auto_increment |
| step |varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows
in
set
(0.02 sec)
mysql> show create table testbackup\G
*************************** 1. row***************************
Table:testbackup
Create Table: CREATE TABLE `testbackup` (
`
id
`int(11) NOT NULL AUTO_INCREMENT,
`step`varchar(50) DEFAULT NULL,
PRIMARY KEY(`
id
`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row
in
set
(0.00 sec)
2、插入字段 “firstfull backup” 到testbackup表中
insert into testbackup(step) values(
'first fullbackup'
);
操作结果:
mysql>
select
* from testbackup;
+----+-------------------+
|
id
| step |
+----+-------------------+
| 1 | firstfull backup |
+----+-------------------+
1 row
in
set
(0.02 sec)
3、执行全备
此时,我们创建的 xtr_test 数据库中的 testbackup 表中有数据,而且我们创建的 /data/backups/full 文件下面没有任何内容。下面执行全备,操作命令上面已经给出,此次操作使用的多实例所以用到了 –socket 参数。
innobackupex --user=root --password=789
/data/backups/full
--slave-info --safe-slave-backup --parallel=4--safe-slave-backup-timeout=7200 --socket=
/data/3306/mysql
.sock
执行结果一定要看到“160905 20:01:38 completedOK!” OK的字样,才表示成功,从打出的日志我们也能看到备份的过程和上面给出的全备流程图对比起来。
正确输出以后会在 /data/backups/full 指定的目录中生成一个有时间和序号的目录,这个目录就是全备文件存放地方如:
[root@db01 ~]
# ls -lrt /data/backups/full/
总用量 4
drwxr-x--- 8 root root 4096 9 月 5 20:012016-09-05_20-01-32
1.7.2 增量备份
增量备份的前提是一定要有一个全备 ,只有有了全备才能进行所谓的增量备份!!!
增量备份的方式有两种,分别为:
第一种:通过全备的文件
innobackupex --user=root --password=789 --incremental --incremental-lsn=1783249
/data/backups/inc
--slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=
/data/3306/mysql
.sock
第二种方法:通过LSN
innobackupex --user=root --password=789 --incremental --incremental-lsn=1783249
/data/backups/inc
--slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=
/data/3306/mysql
.sock
1、准备好全备最新一次的全备文件,这里只做了一次,所以只有一个目录
[root@db01 ~]
# ls -lrt /data/backups/full/
总用量 4
drwxr-x--- 8 root root 4096 9 月 5 20:01 2016-09-05_20-01-32
2、对 xtr_test 数据库中的 testbackup 表,进行数据的插入,插入内容为“fist increment backup”
mysql> insert into testbackup(step)values(
'first increment backup'
);
Query OK, 1 row affected (0.02 sec)
mysql>
select
* from testbackup;
+----+------------------------+
|
id
| step |
+----+------------------------+
| 1 | firstfull backup |
| 2 | firstincrement backup |
+----+------------------------+
2 rows
in
set
(0.01 sec)
3、执行增量备份
这里我们要确定好最新一次的全备(强调)!!!
innobackupex --user=root --password=789--incremental --incremental-basedir=
/data/backups/full/
2016-09-05_20-01-32
/data/backups/inc
--slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200 --socket=
/data/3306/mysql
.sock
这里执行结果一定要看到 “completed OK!” OK 的字样,才表示成功如果是分布式也可以用 –rsync,我们会在创建的inc 目录下发现创建了一个以时间和序号命名的目录,这个目录就是 Xtrabackup 备份的增量。
执行结果:
[root@db01 ~]
# ll /data/backups/inc
总用量 4
drwxr-x--- 8 root root 4096 9 月 5 20:19 2016-09-05_20-19-48
TIP:innodb 默认是使用的系统表空间,我们可以通过配置参数来使 idb 文件到独立空间中 innodb_file_per_table = 1 这个是修改 idb 到独立空间,如果数据库是线上的,我们可以在配置文件 my.cnf 配置以上参数后,再使用 set globalinnodb_file_per_table= 1 临时生效。
alter table backupstep engine=innodb; 修改表的引擎,这个操作很费时间,需要在业务低点的时候操作
1.7.3 再增量备份的基础上再备份
在创建的 xtr_test 数据库中的 testbackup 表中再次插入内容“secondincrement backup”
mysql> insert into testbackup(step) values(
'secondincrement backup'
);
Query OK, 1 row affected (0.01 sec)
mysql>
select
* from testbackup;
+----+-------------------------+
|
id
| step |
+----+-------------------------+
| 1 | firstfull backup |
| 2 | first incrementbackup |
| 3 | secondincrement backup |
+----+-------------------------+
3 rows
in
set
(0.00 sec)
1、确定最新的全备文件
[root@db01 full]
# pwd
/data/backups/full
[root@db01 full]
# ls -lrt
总用量 4
drwxr-x--- 8 root root 4096 9 月 5 20:01 2016-09-05_20-01-32
2、确定上一次增量备份的 LSN 值
[root@db01 inc]
# ls -lrt
总用量 4
drwxr-x--- 8 root root 4096 9 月 5 20:19 2016-09-05_20-19-48
[root@db01 inc]
# cd 2016-09-05_20-19-48/
[root@db01 2016-09-05_20-19-48]
# ls
backup-my.cnf krik performance_schema xtrabackup_checkpoints xtr_test
ibdata1.delta mysql
test
xtrabackup_info
ibdata1.meta oldboy xtrabackup_binlog_info xtrabackup_logfile
[root@db01 2016-09-05_20-19-48]
# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1793716
# 这个值一定是和上一次全备的 last_lsn 一样,否则就是数据不全
to_lsn = 1794019
last_lsn = 1794019
compact = 0
recover_binlog_info = 0
4、
执行增量备份命令
innobackupex --user=root --password=789 --incremental--incremental-lsn=1794019
/data/backups/inc
--slave-info --safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=
/data/3306/mysql
.sock
这个值是通过查看最近一次增量备份的 xtrabackup_checkpoints 得到
这里执行结果一定要看到“completed OK!” OK的字样,才表示成功
执行结果会在指定的目录 /data/backups/inc 下生成一个新的文件
[root@db01 2016-09-05_20-19-48]
# cd ..
[root@db01 inc]
# pwd
/data/backups/inc
[root@db01 inc]
# ls -lrt
总用量 8
drwxr-x--- 8 root root 4096 9 月 5 20:19 2016-09-05_20-19-48
drwxr-x--- 8 root root 4096 9 月 5 21:18 2016-09-05_21-18-30
到此我们对数据进行了完整的备份,下面会再创建一条语句,但是不会做增量备份,为了是下面测试二进制日志恢复数据。接下来要玩大的了,删库,后面看看能恢复回来不
生产环境中为了数据一致性最好是 ROW 模式,因为其他的模式数据会丢失
mysql> show variables like
"log_bin"
;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row
in
set
(0.00 sec)
mysql> show variables like
"%binlog_format%"
;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row
in
set
(0.00 sec)
ot root 418 9 月 4 15:34backup-my.cnf
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2017-04/142477p2.htm