xtrabackup :只可以备份innodb;
但是我们也需要备份myisam,然后就出来了一个工具:innobackupex
一、innobackupex 备份:
1.1 查看数据目录:
[root@zhdy-03 ~]# ls /data/mysql/
auto.cnf db1 ibdata1 ib_logfile0 ib_logfile1 mysql mysql2 performance_schema test zhdy01 zhdy02 zhdy03 zhdy-03.err zhdy-03.pid
其实我们完全可以使用mysqldump去备份myisam和innodb,但是速度有点慢,如果遇到大的数据库很浪费时间!
下面我们就对如上的一些数据进行备份:
1.2 安装percona-xtrabackup工具:
[root@zhdy-03 ~]# rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
[root@zhdy-03 ~]# yum list | grep percona
[root@zhdy-03 ~]# yum install percona-xtrabackup -y
1.3 创建一个备份的用户:
先使用root账户登录;
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bakuser'@'localhost' identified by 'zhangduanya';
Query OK, 0 rows affected (0.00 sec)
创建一个bakuser,且授予RELOAD,LOCK TABLES,REPLICATION CLIENT权限。
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
刷新一下权限;
1.4 备份:
首先创建一个备份的目录;
[root@zhdy-03 ~]# mkdir -p /data/backup/
[root@zhdy-03 ~]# innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password='zhangduanya' -S /tmp/mysql.sock /data/backup
--defaults-file用来根据my.cnf的信息找打听他datadir数据存储目录
-S /tmp/mysql.sock指定socket,此方法只适用于本地连接,等同于“mysql -uroot -p123456”
/data/backup最后跟要备份到的目标目录
[root@zhdy-03 backup]# du -sh *
92M 2017-08-23_21-23-46
如果在备份的时候有任何的错误,它会自动的停止,并输出错误的信息!
1.5 备份对比:
[root@zhdy-03 backup]# ls /data/mysql/
auto.cnf db1 ibdata1 ib_logfile0 ib_logfile1 mysql mysql2
performance_schema test zhdy01 zhdy02 zhdy03 zhdy-03.err zhdy-03.pid
[root@zhdy-03 backup]# ls /data/backup/2017-08-23_21-23-46/
backup-my.cnf ibdata1 mysql2 test xtrabackup_info zhdy01 zhdy03
db1 mysql performance_schema xtrabackup_checkpoints xtrabackup_logfile zhdy02
其实备份的文件+目录几乎是一样的,但是是不可以直接恢复使用的!
但是du -sh 的时候会小很多是因为部分数据可能是缓存之类的
二、innobackupex 恢复:
2.1 模拟数据库被删除:
先停掉数据库;
[root@zhdy-03 backup]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS!
[root@zhdy-03 backup]# mv /data/mysql /data/mysql.bak
[root@zhdy-03 backup]# ls /data/
backup mysql.bak wwwroot
[root@zhdy-03 backup]# mkdir -p /data/mysql
[root@zhdy-03 backup]# chown -R mysql.mysql /data/mysql
2.2 恢复数据:
第一步只是初始化了一下;
[root@zhdy-03 backup]# innobackupex --use-memory=512M --apply-log 2017-08-23_21-23-46/
-use-memory=512M:意思是恢复数据指定使用的内存为512M;
(因为这是虚拟机,所以只是测试,要是线上的服务器64G我们可以使用32G来恢复数据,这样速度会更快些)
--apply-log:指定需要恢复的日志文件
2.3 现在进行恢复:
[root@zhdy-03 backup]# innobackupex --defaults-file=/etc/my.cnf --copy-back ./2017-08-23_21-23-46/
即可恢复咱们的备份到mysql目录,而且是原来的位置因为这里调用了datadir的缘故吧
再次检查:
[root@zhdy-03 data]# du -sh *
190M backup
188M mysql
188M mysql.bak
132M wwwroot
三、innobackupex增量备份
3.1 先全量
innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password=zhangduanya -S /tmp/mysql.sock/data/backup
这里没有-S的指定socket其他步骤相同,测试后不加-S不可备份,这里需补上
xtrabackup: Transaction log of lsn (3037472) to (3037472) was copied.
170824 22:57:58 completed OK!
-----------
等待出现如上消息,意味着我们已经对全量备份完毕。
查看全量备份:
[root@zhdy-03 ~]# ls /data/backup/
2017-08-24_22-57-43
[root@zhdy-03 ~]# du -sh /data/backup/
92M /data/backup/
3.2 创建增量备份
再开始之前,我们先模拟增加一个库,就是更改一下里面的数据库
[root@zhdy-03 ~]# mysql -uroot -pzhangduanya -e "create database db123" //创建一个db123库
[root@zhdy-03 ~]# mysql -uroot -pzhangduanya db123 < /tmp/mysqlbak.sql //把之前备份的数据恢复得到db123库
##注意不用在乎这里备份进去的数据是什么,这是在测试其可用性
第一次增量备份:
[root@zhdy-03 ~]# innobackupex --user=bakuser --password='zhangduanya' -S /tmp/mysql.sock
--incremental /data/backup --incremental-basedir /data/backup/2017-08-24_22-57-43
##这里不需要指定mysql目录了--defaults-file因为和这里没关系了
##指定专门用来备份的账号密码,目录和全量备份的数据
[root@zhdy-03 backup]# du -sh *
92M 2017-08-24_22-57-43
16M 2017-08-24_23-10-21
---------------------------
第一次增量备份的数据只有16M;
3.3 模拟执行第二次增量备份
[root@zhdy-03 backup]# mysql -uroot -pzhangduanya -e "create database lalala"
#创建库
[root@zhdy-03 backup]# mysql -uroot -pzhangduanya lalala < /tmp/mysqlbak.sql
#导入点数据
[root@zhdy-03 backup]# ls /data/mysql/
auto.cnf db123 ib_logfile0 lalala mysql2 test zhdy02 zhdy-03.err
db1 ibdata1 ib_logfile1 mysql performance_schema zhdy01 zhdy03 zhdy-03.pid
#找到我们创建的两个db123,和lalala
[root@zhdy-03 backup]# innobackupex --user=bakuser --password='zhangduanya' -S /tmp/mysql.sock
--incremental /data/backup --incremental-basedir /data/backup/2017-08-24_23-10-21
[root@zhdy-03 backup]# du -sh *
92M 2017-08-24_22-57-43
16M 2017-08-24_23-10-21
17M 2017-08-24_23-41-33
-----------------------------
这里特别注意,也是困扰很多人的一个关键操作,我们再次做增量备份的时候要基于刚刚已经做了的基础上面再次增量,
也就是2017-08-24_23-10-21。也就是说这样这次的增量里面才会有刚刚第一次增量时添加的db123库
四、增量备份的恢复
4.1 为了还原真实性,我模拟删除数据库,并且停掉mysql,利用咱们已经备份的数据去恢复它。
[root@zhdy-03 backup]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS!
[root@zhdy-03 data]# ls
backup mysql wwwroot
[root@zhdy-03 data]# mv /data/mysql/ /data/mysqlbak
[root@zhdy-03 data]# ls /data/
backup mysqlbak wwwroot
[root@zhdy-03 data]# mkdir /data/mysql
[root@zhdy-03 data]# chown -R mysql.mysql /data/mysql
[root@zhdy-03 data]# ls
backup mysql mysqlbak wwwroot
为了不容易混淆,我先把backup目录中的这些备份展示出来:
[root@zhdy-03 backup]# ls
2017-08-24_22-57-43 ##全量
2017-08-24_23-10-21 ##一次增量
2017-08-24_23-41-33 ##二次增量
4.2 先初始化全量备份:
[root@zhdy-03 data]# innobackupex --apply-log --redo-only /data/backup/2017-08-24_22-57-43
--apply-log:指定需要恢复的日志文件
--redo-only:这个是整合合并的东西初始化时候用,最后一步不需要整合了
----
/data/backup/2017-08-24_22-57-43:此为咱们第一次全量备份的数据。
4.3 初始化整合第一次的增量:
[root@zhdy-03 backup]# innobackupex --apply-log --redo-only /data/backup/2017-08-24_22-57-43
--incremental-dir=/data/backup/2017-08-24_23-10-21
4.4 初始化整合第二次的增量:
[root@zhdy-03 backup]# innobackupex --apply-log --redo-only /data/backup/2017-08-24_22-57-43
--incremental-dir=/data/backup/2017-08-24_23-41-33
##实验得出如果我们再次做增量备份的时候没有基于刚刚已经做了的基础上面再次增量,那么第二次备份恢复初始化就会报错
4.5 再次把整合好的增量再次初始化一下:
[root@zhdy-03 backup]# innobackupex --apply-log /data/backup/2017-08-24_22-57-43
#这里就没有了--redo-only
4.6 最后一步恢复:
[root@zhdy-03 ~]# innobackupex --copy-back /data/backup/2017-08-24_22-57-43/
再次检查数据:
[root@zhdy-03 ~]# ls /data/mysql
db1 db123 ibdata1 ib_logfile0 ib_logfile1 lalala mysql mysql2
performance_schema test xtrabackup_info zhdy01 zhdy02 zhdy03
刚刚创建的db123和lalala也已经全部恢复!
[root@zhdy-03 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!