0.0 文档说明
0.1 文档简介
本文档为 Red Hat Enterprise Linux和CentOS操作系统的部署指南。
0.2 适用对象
本文档适用于全司系统运维工程师。
1.0 基础准备
1.1 系统环境
[root@xtarbackup ~]# cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
[root@xtarbackup ~]# uname -a
Linux xtarbackup 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
1.2 CentOS7 install MySQL5.6
安裝 MySQL Repository
rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
安裝 MySQL 套件
yum install mysql-community-server
启动 mysqld
systemctl start mysqld
查看 MySQL server 的运行状态
systemctl status mysqld
ps -ef | grep mysql
开机自启动 mysqld
systemctl enable mysqld
设置 MySQL 密码
/usr/bin/mysql_secure_installation
启动 MySQL
mysql -uroot -p
2.0 Percona XtraBackup
2.1 关于 Percona XtraBackup
Percona XtraBackup是世界上唯一一款免费的MySQL热备份软件,可以为InnoDB和XtraDB 数据库执行非阻塞备份。
Percona XtraBackup 的优点
1.快速可靠的备份
2.备份期间不间断的事务处理
3.节省磁盘空间和网络带宽
4.自动备份验证
5.由于更快的恢复时间,运行时间更长
2.2 Xtrabackup可以做什么
1)在线(热)备份整个库的InnoDB, XtraDB表
2)在xtrabackup的上一次整库备份基础上做增量备份(innodb only)
3)以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)
==MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。==
2.3 Percona XtraBackup 工作原理
支持对InnoDB存储引擎的增量备份
1)首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。
2)在进行增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。首先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;接着,开始拷贝全部的数据文件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。
2.3.1 innobackupex备份mysql数据的流程
innobackupex首先调用xtrabackup来备份innodb数据文件,当xtrabackup完成后,innobackupex就查看文件xtrabackup_suspended ;然后执行“FLUSH TABLES WITH READ LOCK”来备份其他的文件。
2.3.2 innobackupex恢复mysql数据的流程
innobackupex首先读取my.cnf,查看变量(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)对应的目录是存在,确定相关目录存在后,然后先copy myisam表和索引,然后在copy innodb的表、索引和日志。
2.4 innobackupex备份和恢复的工作原理
2.4.1 备份的工作原理
如果在程序启动阶段未指定模式,innobackupex将会默认以备份模式启动。默认情况下,此脚本以--suspend-at-end选项启动xtrabackup,然后xtrabackup程序开始拷贝InnoDB数据文件。当xtrabackup程序执行结束,innobackupex将会发现xtrabackup创建了xtrabackup_suspended_2文件,然后执行FLUSH TABLES WITH READ LOCK,此语句对所有的数据库表加读锁。然后开始拷贝其他类型的文件。
如果--ibbackup未指定,innobackupex将会自行尝试确定使用的xtrabackup的binary。其确定binary的逻辑如下:首先判断备份目录中xtrabackup_binary文件是否存在,如果存在,此脚本将会依据此文件确定使用的xtrabackup binary。否则,脚本将会尝试连接database server,通过server版本确定binary。
如果连接无法建立,xtrabackup将会失败,需要自行指定binary文件。
在binary被确定后,将会检查到数据库server的连接是否可以建立。其执行逻辑是:建立连接、执行query、关闭连接。若一切正常,xtrabackup将以子进程的方式启动。
FLUSH TABLES WITH READ LOCK是为了备份MyISAM和其他非InnoDB类型的表,此语句在xtrabackup已经备份InnoDB数据和日志文件后执行。在这之后,将会备份 .frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, .par, and .opt 类型的文件。
当所有上述文件备份完成后,innobackupex脚本将会恢复xtrabackup的执行,等待其备份上述逻辑执行过程中生成的事务日志文件。接下来,表被解锁,slave被启动,到server的连接被关闭。接下来,脚本会删掉xtrabackup_suspended_2文件,允许xtrabackup进程退出。
2.4.2 恢复的工作原理
为了恢复一个备份,innobackupex需要以--copy-back选项启动。
innobackupex将会首先通过my.cnf文件读取如下变量:datadir, innodb_data_home_dir, innodb_data_file_path, innodb_log_group_home_dir,并确定这些目录存在。
接下来,此脚本将会首先拷贝MyISAM表、索引文件、其他类型的文件(如:.frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, par and .opt files),接下来拷贝InnoDB表数据文件,最后拷贝日志文件。
拷贝执行时将会保留文件属性,在使用备份文件启动MySQL前,可能需要更改文件的owener(如从拷贝文件的user更改到mysql用户)。
2.5 Percona XtraBackup 的两个工具
xtrabackup :只能用于热备份innodb,xtradb两种数据引擎表的工具,不能备份其他表。
innobackupex:是一个对xtrabackup封装的perl脚本,提供了用于myisam(会锁表)和innodb引擎,及混合使用引擎备份的能力。主要是为了方便同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。
innobackupex比xtarbackup有更强的功能,它整合了xtrabackup和其他的一些功能,它不但可以全量备份/恢复,还可以基于时间的增量备份与恢复。innobackupex同时支持innodb,myisam。
2.6 在Red Hat Enterprise Linux和CentOS上安装 Percona XtraBackup
1.安装Percona Yum存储库的最简单的方法是安装一个 配置yum并安装Percona GPG密钥的RPM。
yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
2.测试存储库
yum list | grep percona
3.安装软件包
yum install percona-xtrabackup-24 -y
提醒:为了成功安装Percona XtraBackup 我们还需要先安装 libev软件包,libev软件包可以从EPEL存储库安装 。
2.6.1 警告
1.将二进制日志备份出来一份,生产环境中二进制日志切记不要和数据文件放在一起,最好不要在同一分区甚至同一物理磁盘, 以免一旦玉石俱焚,悔之晚矣
2.多实例恢复,xtarbackup需要指定对应的my.cnf
3.可以加一个--no-timestamp参数不生产这个目录,直接备份到 /data/xtrabackup/下
2.6.2 基本概念
热备份:读写不受影响(mysqldump-->innodb)
温备份:仅可以执行读操作(mysqldump-->myisam)
冷备份:离线备份,读写都不可用
逻辑备份:将数据导出文本文件中(mysqldump)
物理备份:将数据文件拷贝(xtrabackup、mysqlhotcopy)
完整备份:备份所有数据
增量备份:仅备份上次完整备份或增量备份以来变化的数据
差异备份:仅备份上次完整备份以来变化的数据
3.0 全量备份和恢复
3.1 全量备份操作
执行下面语句进行全备:
mysql的配置文件路径/etc/my.cnf
全量备份后的数据存放目录是/backup/mysql/data
mkdir -p /backup/mysql/data/
全量备份命令
innobackupex --defaults-file=/etc/my.cnf --user=root /backup/mysql/data/
出现下面的信息,表示备份已经ok。
170911 22:42:48 Executing UNLOCK TABLES
170911 22:42:48 All tables unlocked
170911 22:42:48 Backup created in directory '/backup/mysql/data/2017-09-11_22-42-46/'
170911 22:42:48 [00] Writing /backup/mysql/data/2017-09-11_22-42-46/backup-my.cnf
170911 22:42:48 [00] ...done
170911 22:42:48 [00] Writing /backup/mysql/data/2017-09-11_22-42-46/xtrabackup_info
170911 22:42:48 [00] ...done
xtrabackup: Transaction log of lsn (1625997) to (1625997) was copied.
170911 22:42:48 completed OK!
上面执行的备份语句会将mysql数据文件(即由my.cnf里的变量datadir指定)拷贝至备份目录下(/backup/mysql/data)
==注意:如果不指定--defaults-file,默认值为/etc/my.cnf。==
备份成功后,将在备份目录下创建一个时间戳目录(本例创建的目录为/backup/mysql/data/2017-09-11_22-42-46),在该目录下存放备份文件。
[root@xtarbackup 2017-09-11_22-42-46]# ll
total 12312
-rw-r-----. 1 root root 418 Sep 11 22:42 backup-my.cnf
-rw-r-----. 1 root root 12582912 Sep 11 22:42 ibdata1
drwxr-x---. 2 root root 4096 Sep 11 22:42 mysql
drwxr-x---. 2 root root 4096 Sep 11 22:42 performance_schema
-rw-r-----. 1 root root 113 Sep 11 22:42 xtrabackup_checkpoints
-rw-r-----. 1 root root 441 Sep 11 22:42 xtrabackup_info
-rw-r-----. 1 root root 2560 Sep 11 22:42 xtrabackup_logfile
还可以在远程进行全量备份,命令如下:
innobackupex --defaults-file=/etc/my.cnf --user=root --host=127.0.0.1 --parallel=2 --throttle=200 /backup/mysql/data >/backup/mysql/data/bak.log 2>&1
参数解释:
--user=root 备份操作用户名,一般都是root用户
--host=127.0.0.1 主机ip,本地可以不加(适用于远程备份)。注意要提前在mysql中授予连接的权限,最好备份前先测试用命令中的用户名、密码和host能否正常连接mysql。
--parallel=2 --throttle=200 并行个数,根据主机配置选择合适的,默认是1个,多个可以加快备份速度。
/backup/mysql/data 备份存放的目录
>/backup/mysql/data/bak.log 2>&1 备份日志,将备份过程中的输出信息重定向到bak.log
查看备份的目录
[root@xtarbackup data]# ll /backup/mysql/data/
total 32
drwxr-x---. 4 root root 4096 Sep 11 22:49 2017-09-11_22-48-59
-rw-r--r--. 1 root root 26094 Sep 11 22:49 bak.log //备份信息都记录在这个日志里,如果备份失败,可以到这里日志里查询
创建测试数据
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.01 sec)
mysql> create database xtra_test;
Query OK, 1 row affected (0.00 sec)
mysql> use xtra_test;
Database changed
mysql> CREATE TABLE person (
-> number INT(11),
-> name VARCHAR(255),
-> birthday DATE
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> CREATE TABLE xtrabackup (number INT(11),name VARCHAR(255),birthday DATE);
Query OK, 0 rows affected (0.03 sec)
mysql> show tables;
+---------------------+
| Tables_in_xtra_test |
+---------------------+
| person |
| xtrabackup |
+---------------------+
2 rows in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| xtra_test |
+--------------------+
4 rows in set (0.00 sec)
3.2 全量备份后的恢复操作
查看当前数据库状态
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| xtra_test |
+--------------------+
4 rows in set (0.00 sec)
mysql> use xtra_test;
Database changed
mysql> show tables;
+---------------------+
| Tables_in_xtra_test |
+---------------------+
| person |
| xtrabackup |
+---------------------+
2 rows in set (0.00 sec)
删除数据库
mysql> drop database xtra_test;
Query OK, 2 rows affected (0.03 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
==注意:恢复之前==
1)要先关闭数据库
2)要删除数据文件和日志文件(也可以mv移到别的地方,只要确保清空mysql数据存放目录就行)
查看MySQLd进程
root@xtarbackup data]# ps -ef|grep mysqld
mysql 3261 1 0 21:06 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql 3427 3261 0 21:06 ? 00:00:10 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root 12778 2999 0 23:05 pts/0 00:00:00 grep --color=auto mysqld
由上面可以看出mysql的数据和日志存放目录是/var/lib/mysql
关闭数据库
[root@xtarbackup mysql]# systemctl stop mysqld
[root@xtarbackup mysql]# pwd
/var/lib/mysql
[root@xtarbackup mysql]# ls
auto.cnf ibdata1 ib_logfile0 ib_logfile1 mysql mysql.sock performance_schema
#要删除数据文件和日志文件(也可以mv移到别的地方,只要确保清空mysql数据存放目录就行)
[root@xtarbackup mysql]# mv /var/lib/mysql/* /tmp/
[root@xtarbackup mysql]# ls /var/lib/mysql
来一次全备
innobackupex --defaults-file=/etc/my.cnf --user=root /backup/mysql/data/
恢复数据
innobackupex --defaults-file=/etc/my.cnf --user=root --use-memory=1G --apply-log /backup/mysql/data/2017-09-11_23-37-21/
innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /backup/mysql/data/2017-09-11_23-37-21/
chown -R mysql.mysql /var/lib/mysql/
出现上面的信息,说明数据恢复成功了!!
从上面的恢复操作可以看出,执行恢复分为两个步骤:
1)第一步恢复步骤是应用日志(apply-log),为了加快速度,一般建议设置--use-memory(如果系统内存充足,可以使用加大内存进行备份 ),这个步骤完成之后,目录/backup/mysql/data/2017-09-11_23-37-21/下的备份文件已经准备就绪。
2)第二步恢复步骤是拷贝文件(copy-back),即把备份文件拷贝至原数据目录下。
最后,启动mysql,查看数据是否恢复回来了
systemctl start mysqld
查看已恢复的数据
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| xtra_test |
+--------------------+
4.0 增量备份和恢复
==特别注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。==
4.1 增量备份操作
==增量备份需要基于全量备份==
先假设我们已经有了一个全量备份(如上面的/backup/mysql/data/2017-09-11_23-37-21/),我们需要在该全量备份的基础上做第一次增量备份。
innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/backup/mysql/data/2017-09-11_23-37-21/ --incremental /backup/mysql/data/
其中:
--incremental-basedir 指向全量备份目录
--incremental 指向增量备份的目录
[root@xtarbackup ~]# ll /backup/mysql/data/
总用量 8
drwxr-x---. 5 root root 4096 9月 11 23:39 2017-09-11_23-37-21 //全量备份目录
drwxr-x---. 5 root root 4096 9月 11 23:59 2017-09-11_23-59-49 //增量备份目录
上面语句执行成功之后,会在--incremental执行的目录下创建一个时间戳子目录(本例中为:/backup/mysql/data/2017-09-11_23-59-49),在该目录下存放着增量备份的所有文件。
在备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息,其中可以查出
1)全量备份的信息如下:
[root@xtarbackup ~]# cd /backup/mysql/data/2017-09-11_23-37-21
[root@xtarbackup 2017-09-11_23-37-21]# cat xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 1630141
last_lsn = 1630141
compact = 0
recover_binlog_info = 0
2)基于以上全量备份的增量备份的信息如下:
[root@xtarbackup 2017-09-11_23-59-49]# cd /backup/mysql/data/2017-09-11_23-59-49
[root@xtarbackup 2017-09-11_23-59-49]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1630141
to_lsn = 1630258
last_lsn = 1630258
compact = 0
recover_binlog_info = 0
从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn。
那么,我们是否可以在增量备份的基础上再做增量备份呢?
答案是肯定的,只要把--incremental-basedir执行上一次增量备份的目录即可,如下所示:
[root@xtarbackup data]# ll
drwxr-x---. 5 root root 4096 9月 11 23:39 2017-09-11_23-37-21 //全备目录
drwxr-x---. 5 root root 4096 9月 11 23:59 2017-09-11_23-59-49 //增备目录
//在增备目录的基础上再增量备份
innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/backup/mysql/data/2017-09-11_23-59-49/ --incremental /backup/mysql/data/
查看增备之后的目录
[root@xtarbackup data]# ll
drwxr-x---. 5 root root 4096 9月 11 23:39 2017-09-11_23-37-21 //全备目录
drwxr-x---. 5 root root 4096 9月 11 23:59 2017-09-11_23-59-49 //增备目录1
drwxr-x---. 5 root root 4096 9月 12 00:28 2017-09-12_00-28-51 //增备目录2
增量备份目录2的from_lsn正好等于增量备份目录1的to_lsn
//全量备份目录
[root@xtarbackup 2017-09-11_23-37-21]# cat xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 1630141
last_lsn = 1630141
compact = 0
recover_binlog_info = 0
//增量备份目录1
[root@xtarbackup 2017-09-11_23-59-49]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1630141
to_lsn = 1630258
last_lsn = 1630258
compact = 0
recover_binlog_info = 0
//增量备份目录2
[root@xtarbackup 2017-09-12_00-28-51]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1630258
to_lsn = 1630258
last_lsn = 1630258
compact = 0
recover_binlog_info = 0
可以看到,第二次增量备份的from_lsn是从上一次增量备份的to_lsn开始的
4.2 增量备份后的恢复操作
增量备份的恢复要比全量备份复杂很多,增量备份与全量备份有着一些不同,尤其要注意的是:
1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。
2)基于所有的备份将未提交的事务进行“回滚”。于是,操作就变成了:不能回滚,因为有可能第一次备份时候没提交,在增量中已经成功提交
第一步是在所有备份目录下重做已提交的日志==(注意备份目录路径要跟全路径)==
其中:
==一定要全路径==
BASE-DIR 是指全量备份的目录
INCREMENTAL-DIR-1 是指第一次增量备份的目录
INCREMENTAL-DIR-2 是指第二次增量备份的目录,以此类推。
这里要注意的是:
1 最后一步的增量备份并没有--redo-only选项!回滚进行崩溃恢复过程
2 可以使用--use_memory提高性能。
3 以上语句执行成功之后,最终数据在BASE-DIR(即全量目录)下,其实增量备份就是把增量目录下的数据,整合到全变量目录下,然后在进行,全数据量的还原。
4 第一步完成之后,我们开始下面关键的第二步,即拷贝文件,进行全部还原!注意:必须先停止mysql数据库,然后清空数据库目录(这里是指/var/lib/mysql)下的文件。
5 innobackupex --copy-back BASE-DIR
6 同样地,拷贝结束之后,记得检查下数据目录(这里指/var/lib/mysql/的权限是否正确(修改成mysql:mysql),然后再重启mysql。
4.3 增量恢复案例说明
假设我们已经有了一个全量备份 2017-09-11_23-37-21 删除在上面测试创建的两个增量备份
[root@xtarbackup data]# pwd
/backup/mysql/data
[root@xtarbackup data]# ll
drwxr-x---. 5 root root 4096 9月 11 23:39 2017-09-11_23-37-21
drwxr-x---. 5 root root 4096 9月 11 23:59 2017-09-11_23-59-49
drwxr-x---. 5 root root 4096 9月 12 00:28 2017-09-12_00-28-51
[root@xtarbackup data]# mv 2017-09-11_23-59-49 /tmp/
[root@xtarbackup data]# mv 2017-09-12_00-28-51 /tmp/
[root@xtarbackup data]# ll
drwxr-x---. 5 root root 4096 9月 11 23:39 2017-09-11_23-37-21
假设在全量备份后,mysql数据库中又有新数据写入
[root@xtarbackup data]# mysql
mysql> create database bao;
mysql> use bao;
mysql> create table jia(
-> id int3,
-> name varchar(20)
-> );
mysql> insert into jia values(1,"chen");
mysql> select * from jia;
+------+------+
| id | name |
+------+------+
| 1 | chen |
+------+------+
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bao |
| mysql |
| performance_schema |
| xtra_test |
+--------------------+
然后进行一次增量备份:
[root@xtarbackup ~]# ll /backup/mysql/data/
drwxr-x---. 5 root root 4096 9月 11 23:39 2017-09-11_23-37-21 //全量备份目录
innobackupex --defaults-file=/etc/my.cnf --incremental-basedir=/backup/mysql/data/2017-09-11_23-37-21/ --incremental /backup/mysql/data/
[root@xtarbackup ~]# ll /backup/mysql/data/
drwxr-x---. 5 root root 4096 9月 11 23:39 2017-09-11_23-37-21 //全量备份目录
drwxr-x---. 6 root root 4096 9月 12 00:49 2017-09-12_00-49-09 //增量备份目录
接着再在mysql数据库中写入新数据
mysql> use bao;
mysql> insert into jia values(2,"bao");
Query OK, 1 row affected (0.01 sec)
mysql> insert into jia values(3,"jia");
Query OK, 1 row affected (0.02 sec)
mysql> insert into jia values(4,"unix");
Query OK, 1 row affected (0.02 sec)
mysql> select * from jia;
+------+------+
| id | name |
+------+------+
| 1 | chen |
| 2 | bao |
| 3 | jia |
| 4 | unix |
+------+------+
接着在增量的基础上再进行一次增量备份
--incremental-basedi 要写上次最后增量备份的目录
[root@xtarbackup ~]# ll /backup/mysql/data/
drwxr-x---. 5 root root 4096 9月 11 23:39 2017-09-11_23-37-21 //全量备份
drwxr-x---. 6 root root 4096 9月 12 00:49 2017-09-12_00-49-09
[root@xtarbackup ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/backup/mysql/data/2017-09-12_00-49-09/ --incremental /backup/mysql/data/
[root@xtarbackup ~]# ll /backup/mysql/data/
drwxr-x---. 5 root root 4096 9月 11 23:39 2017-09-11_23-37-21 //全量备份
drwxr-x---. 6 root root 4096 9月 12 00:49 2017-09-12_00-49-09 //增量备份1
drwxr-x---. 6 root root 4096 9月 12 01:10 2017-09-12_01-10-41 //增量备份2
现在 drop 数据库bao 、 xtra_test
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bao |
| mysql |
| performance_schema |
| xtra_test |
+--------------------+
5 rows in set (0.01 sec)
mysql> drop database bao;
Query OK, 1 row affected (0.03 sec)
mysql> drop database xtra_test;
Query OK, 1 row affected (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
接下来就开始进行数据恢复操作:
先恢复应用日志(注意最后一个不需要加--redo-only参数)
# /backup/mysql/data/2017-09-11_23-37-21 是全备目录
innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /backup/mysql/data/2017-09-11_23-37-21
# /backup/mysql/data/2017-09-11_23-37-21 全备目录 + /backup/mysql/data/2017-09-12_00-49-09 增备目录1
innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /backup/mysql/data/2017-09-11_23-37-21 --incremental-dir=/backup/mysql/data/2017-09-12_00-49-09
# /backup/mysql/data/2017-09-11_23-37-21 全备目录 + /backup/mysql/data/2017-09-12_01-10-41 增备目录2
innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /backup/mysql/data/2017-09-11_23-37-21 --incremental-dir=/backup/mysql/data/2017-09-12_01-10-41
到此,恢复数据工作还没有结束!还有最重要的一个环节,就是把增量目录下的数据整合到全量备份目录下,然后再进行一次全量还原。
停止mysql数据库,并清空数据目录
stop MySQL service or drop /var/lib/mysql/*
[root@xtarbackup ~]# systemctl stop mysqld
[root@xtarbackup ~]# ll /var/lib/mysql/
-rw-rw----. 1 mysql mysql 56 9月 11 23:40 auto.cnf
-rw-r-----. 1 mysql mysql 12582912 9月 12 01:55 ibdata1
-rw-r-----. 1 mysql mysql 50331648 9月 12 01:55 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 9月 11 23:39 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 9月 11 23:39 ibtmp1
drwxr-x---. 2 mysql mysql 4096 9月 11 23:39 mysql
drwxr-x---. 2 mysql mysql 4096 9月 11 23:39 performance_schema
-rw-r-----. 1 mysql mysql 441 9月 11 23:39 xtrabackup_info
[root@xtarbackup ~]# rm -fr /var/lib/mysql/*
最后拷贝文件,并给数据目录的mysql.mysql权限
//这里的目录是全备的目录
[root@xtarbackup ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /backup/mysql/data/2017-09-1
查看当前的权限
[root@xtarbackup ~]# ll /var/lib/mysql/
总用量 122892
drwxr-x---. 2 root root 47 9月 12 02:28 bao
-rw-r-----. 1 root root 12582912 9月 12 02:28 ibdata1
-rw-r-----. 1 root root 50331648 9月 12 02:28 ib_logfile0
-rw-r-----. 1 root root 50331648 9月 12 02:28 ib_logfile1
-rw-r-----. 1 root root 12582912 9月 12 02:28 ibtmp1
drwxr-x---. 2 root root 4096 9月 12 02:28 mysql
drwxr-x---. 2 root root 4096 9月 12 02:28 performance_schema
-rw-r-----. 1 root root 523 9月 12 02:28 xtrabackup_info
drwxr-x---. 2 root root 61 9月 12 02:28 xtra_test
更改用户组和用户为mysql.mysql
[root@xtarbackup ~]# chown -R mysql.mysql /var/lib/mysql/*
[root@xtarbackup ~]# ll /var/lib/mysql/
总用量 122892
drwxr-x---. 2 mysql mysql 47 9月 12 02:28 bao
-rw-r-----. 1 mysql mysql 12582912 9月 12 02:28 ibdata1
-rw-r-----. 1 mysql mysql 50331648 9月 12 02:28 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 9月 12 02:28 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 9月 12 02:28 ibtmp1
drwxr-x---. 2 mysql mysql 4096 9月 12 02:28 mysql
drwxr-x---. 2 mysql mysql 4096 9月 12 02:28 performance_schema
-rw-r-----. 1 mysql mysql 523 9月 12 02:28 xtrabackup_info
drwxr-x---. 2 mysql mysql 61 9月 12 02:28 xtra_test
start mysqld
[root@xtarbackup ~]# systemctl start mysqld
登录 mysql 查看结果
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bao |
| mysql |
| performance_schema |
| xtra_test |
+--------------------+
5 rows in set (0.00 sec)
mysql> select * from bao.jia;
+------+------+
| id | name |
+------+------+
| 1 | chen |
| 2 | bao |
| 3 | jia |
| 4 | unix |
+------+------+
4 rows in set (0.00 sec)
==另外注意: 上面在做备份的时候,将备份目录和增量目录都放在了同一个目录路径下,其实推荐放在不同的路径下,方便管理!==
比如:
/backup/mysql/data/full 存放全量备份目录
/backup/mysql/data/daily1 存放第一次增量备份目录
/backup/mysql/data/daily2 存放第二次增量目录
以此类推
==在恢复的时候,注意命令中的路径要跟对!==
5.0 innobackupex 参数
==xtrabackup命令只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候必须有对应表结构文件(.frm)。用innobackupex命令,此命令相当于冷备份,复制数据目录的索引,数据,结构文件,但会有短暂的锁表(时间依赖于MyISAM大小)。==
innobackupex 常用参数说明 --defaults-file 同xtrabackup的--defaults-file参数
--apply-log 对xtrabackup的--prepare参数的封装
--copy-back 做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir ;
--remote-host=HOSTNAME 通过ssh将备份数据存储到进程服务器上;
--stream=[tar] 备份文件输出格式, tar时使用tar4ibd , 该文件可在XtarBackup binary文件中获得.如果备份时有指定--stream=tar, 则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩, 在XtraBackup的binary包中可获得该文件)。
在使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。
--tmpdir=DIRECTORY 当有指定--remote-host or --stream时, 事务日志临时存储的目录,默认采用MySQL配置文件中所指定的临时目录tmpdir
--redo-only --apply-log组, 强制备份日志时只redo ,跳过rollback。这在做增量备份时非常必要。
--use-memory= #该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量
--throttle=IOS 同xtrabackup的--throttle参数
--sleep=是给ibbackup使用的,指定每备份1M数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看ibbackup的手册 ;
--compress[=LEVEL] 对备份数据迚行压缩,仅支持ibbackup,xtrabackup还没有实现;
--include=REGEXP 对 xtrabackup参数--tables的封装,也支持ibbackup。备份包含的库表,例如:--include="test.",意思是要备份 test库中所有的表。如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:test1和test2,则写 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test"。
--databases=LIST 列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份;
--uncompress 解压备份的数据文件,支持ibbackup,xtrabackup还没有实现该功能;
--slave-info, 备 份从库, 加上--slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET 指定mysql.sock所在位置,以便备份进程登录mysql.
更多参数见:http://www.percona.com/doc/percona-xtrabackup/2.1/innobackupex/innobackupex_option_reference.html
6.0 innobackupex 全量/增量 备份脚本
可以根据自己线上数据库情况,编写全量和增量备份脚本,然后结合crontab设置计划执行。
比如:每周日的1:00进行全量备份,每周1-6的1:00进行增量备份。
还可以在脚本里编写邮件通知信息(可以用mail或sendemail)
7.0 FAQ
7.1 可能报错
Can't locate Time/HiRes.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 23.
BEGIN failed--compilation aborted at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 23.
解决方案:
.pm实际上是Perl的包,只需安装perl-Time-HiRes即可:
[root@test-huanqiu percona-xtrabackup-2.1.9]# yum install -y perl-Time-HiRes
7.2 可能报错
Can't locate DBI.pm in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /usr/local/webserver/mysql5.1.57/bin/mysqlhotcopy line 25.
BEGIN failed--compilation aborted at /usr/local/webserver/mysql5.1.57/bin/mysqlhotcopy line 25.
报错原因:系统没有按安装DBI组件。
DBI(Database Interface)是perl连接数据库的接口。其是perl连接数据库的最优秀方法,他支持包括Orcal,Sybase,mysql,db2等绝大多数的数据库。
解决办法:
安装DBI组件(Can't locate DBI.pm in @INC-mysql接口)
或者单独装DBI、Data-ShowTable、DBD-mysql 三个组件
[root@test-huanqiu percona-xtrabackup-2.1.9]# yum -y install perl-DBD-MySQL
接着使用innobackupex命令测试是否正常
[root@test-huanqiu percona-xtrabackup-2.1.9]# innobackupex --help
Options:
--apply-log
Prepare a backup in BACKUP-DIR by applying the transaction log file
named "xtrabackup_logfile" located in the same directory. Also,
create new transaction logs. The InnoDB configuration is read from
the file "backup-my.cnf".
--compact
Create a compact backup with all secondary index pages omitted. This
option is passed directly to xtrabackup. See xtrabackup
documentation for details.
--compress
This option instructs xtrabackup to compress backup copies of InnoDB
data files. It is passed directly to the xtrabackup child process.
Try 'xtrabackup --help' for more details.
7.3 可能报错
161130 05:56:48 innobackupex: Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_file=/usr/local/mysql/my.cnf;mysql_read_default_group=xtrabackup' as 'root' (using password: YES).
innobackupex: Error: Failed to connect to MySQL server as DBD::mysql module is not installed at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 2956.
解决办法:
[root@test-huanqiu ~]# yum -y install perl-DBD-MySQL.x86_64
......
Package perl-DBD-MySQL-4.013-3.el6.x86_64 already installed and latest version //发现本机已经安装了
[root@test-huanqiu ~]# rpm -qa|grep perl-DBD-MySQL
perl-DBD-MySQL-4.013-3.el6.x86_64
发现本机已经安装了最新版的perl-DBD-MYSQL了,但是仍然报出上面的错误!!
莫慌~~继续下面的操作进行问题的解决
查看mysql.so依赖的lib库
[root@test-huanqiu ~]# ldd /usr/lib64/perl5/auto/DBD/mysql/mysql.so
linux-vdso.so.1 => (0x00007ffd291fc000)
libmysqlclient.so.16 => not found //这一项为通过检查,缺失libmysqlclient.so.16库导致
libz.so.1 => /lib64/libz.so.1 (0x00007f78ff9de000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f78ff7a7000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f78ff58e000)
libm.so.6 => /lib64/libm.so.6 (0x00007f78ff309000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f78ff09d000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f78fecb9000)
libc.so.6 => /lib64/libc.so.6 (0x00007f78fe924000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f78fe721000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f78fe4dd000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f78fe1f5000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f78fdff1000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f78fddc5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f78fdbc0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f78ffe1d000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f78fd9b5000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f78fd7b2000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f78fd597000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f78fd37a000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f78fd15a000)
以上结果说明缺少libmysqlclient.so.16这个二进制包,找个官方原版的mysql的libmysqlclient.so.16替换了即可!
[root@test-huanqiu~]# find / -name libmysqlclient.so.16 //查看本机并没有libmysqlclient.so.16库文件
查看mysql/lib下的libmysqlclinet.so库文件
[root@test-huanqiu~]# ll /usr/local/mysql/lib/
total 234596
-rw-r--r--. 1 mysql mysql 19520800 Nov 29 12:27 libmysqlclient.a
lrwxrwxrwx. 1 mysql mysql 16 Nov 29 12:34 libmysqlclient_r.a -> libmysqlclient.a
lrwxrwxrwx. 1 mysql mysql 17 Nov 29 12:34 libmysqlclient_r.so -> libmysqlclient.so
lrwxrwxrwx. 1 mysql mysql 20 Nov 29 12:34 libmysqlclient_r.so.18 -> libmysqlclient.so.18
lrwxrwxrwx. 1 mysql mysql 24 Nov 29 12:34 libmysqlclient_r.so.18.1.0 -> libmysqlclient.so.18.1.0
lrwxrwxrwx. 1 mysql mysql 20 Nov 29 12:34 libmysqlclient.so -> libmysqlclient.so.18
lrwxrwxrwx. 1 mysql mysql 24 Nov 29 12:34 libmysqlclient.so.18 -> libmysqlclient.so.18.1.0
-rwxr-xr-x. 1 mysql mysql 8858235 Nov 29 12:27 libmysqlclient.so.18.1.0
-rw-r--r--. 1 mysql mysql 211822074 Nov 29 12:34 libmysqld.a
-rw-r--r--. 1 mysql mysql 14270 Nov 29 12:27 libmysqlservices.a
drwxr-xr-x. 3 mysql mysql 4096 Nov 29 12:34 plugin
将mysql/lib/libmysqlclient.so.18.1.0库文件拷贝到/lib64下,拷贝后命名为libmysqlclient.so.16
[root@test-huanqiu~]# cp /usr/local/mysql/lib/libmysqlclient.so.18.1.0 /lib64/libmysqlclient.so.16
[root@test-huanqiu~]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/mysql/lib/
/lib64/
[root@test-huanqiu~]# ldconfig
最后卸载perl-DBD-MySQL,并重新安装perl-DBD-MySQL
[root@test-huanqiu~]# rpm -qa|grep perl-DBD-MySQL
perl-DBD-MySQL-4.013-3.el6.x86_64
[root@test-huanqiu~]# rpm -e --nodeps perl-DBD-MySQL
[root@test-huanqiu~]# rpm -qa|grep perl-DBD-MySQL
[root@test-huanqiu~]# yum -y install perl-DBD-MySQL
待重新安装后,再次重新检查mysql.so依赖的lib库,发现已经都通过了
[root@test-huanqiu~]# ldd /usr/lib64/perl5/auto/DBD/mysql/mysql.so
linux-vdso.so.1 => (0x00007ffe3669b000)
libmysqlclient.so.16 => /usr/lib64/mysql/libmysqlclient.so.16 (0x00007f4af5c25000)
libz.so.1 => /lib64/libz.so.1 (0x00007f4af5a0f000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f4af57d7000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f4af55be000)
libm.so.6 => /lib64/libm.so.6 (0x00007f4af533a000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4af50cd000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4af4ce9000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4af4955000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f4af4751000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f4af450d000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f4af4226000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f4af4021000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f4af3df5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f4af3bf1000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4af61d1000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f4af39e5000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f4af37e2000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f4af35c8000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4af33aa000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f4af318b000)
7.4 可能报错
sh: xtrabackup_56: command not found
innobackupex: Error: no 'mysqld' group in MySQL options at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 4350.
有可能是percona-xtrabackup编译安装后,在编译目录的src下存在xtrabackup_innodb55,只需要其更名为xtrabackup_55,然后拷贝到上面的/home/mysql/admin/bin/percona-xtrabackup-2.1.9/下即可!