MySQL备份与恢复之Xtrabackup工具(二)
(一)Xtrabackup工具简介
percona公司的备份工具,性能比较高。物理备份工具。
特点:
物理备份工具,在同级数据量基础上,都要比逻辑备份性能要好的多。
特别是在数据量比较大的时候,体现的更加明显。
备份方式:
1、拷贝数据文件(myisam存储引擎可以直接cp拷贝,但是innodb的不行)
2、拷贝数据页
备份原理(innodb):
1、对于innodb表,可以实现热备
(1)在数据还有修改操作的时刻,直接将数据文件中的数据页备份
此时,备份走的数据对于当前mysql来讲是不一致。
(2) 将备份过程中的redo和undo一并备走。
(3)为了恢复的时候,只要保证备份出来的数据页LSN能和redo LSN匹配,
将来恢复的就是一致的数据。redo应用和undo的应用。
2、对与myisam表,实现自动锁表拷贝文件。
(二)Xtrabackup软件安装:
1、安装
(1)依赖包解决
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
wget http://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/libev-4.15-1.el6.rf.x86_64.rpm
rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
(2)下载Xtrabackup软件并安装
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 -y install percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
2、命令参数详解和备份举例
创建备份路径
mkdir /server/backup -p
innobackupex参数讲解:
--user=
--password=
--socket= //配置文件/etc/my.cnf里面指定了,就不需要指定了
--no-timestamp
全备例子:
innobackupex --user=root --password=oldboy123 /server/backup/ //备份时,需要指定备份路径,这种会以时间戳为目录,备份出来
innobackupex --no-timestamp /server/backup/full //以full目录来存放数据
(三)全备备份恢复实战:
1、数据备份
innobackupex --user=root --password=oldboy123 --no-timestamp /server/backup/full
2、恢复数据前的准备(合并xtabackup_log_file和备份的物理文件)
innobackupex --apply-log --use-memory=32M /server/backup/full/
3、模拟故障
停库:
pkill mysqld
破坏数据:
cd /application/mysql/data
\rm -rf *
4、恢复
(cp -a /server/backup/full/* /application/mysql/data) //一般不建议用这种方式,用第二种方式最佳
或者
innobackupex --copy-back /server/backup/full/ ###注意:恢复时,要确认数据路径是空的,并且数据库是停掉的
chown -R mysql.mysql /application/mysql/data //递归授权太重要了,不然数据库启动不了,切记!!!已经踩过坑了
启动:
/etc/init.d/mysqld start
(四)xtrabackup 实现增量备份及故障恢复:
周日全备,周一到周六做增量
1、周日全备:
mkdir /backup/full
innobackupex --user=root --password=123 --no-timestamp /backup/full/
2、模拟数据变化(周一数据变化)
mysql> insert into t1 values(7,'zhao3');
。
。
3、第一增量(周一晚上增量):
innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/full/ /backup/inc1
4、模拟数据变化(周二数据变化)
insert into t1 values(8,'tangyong');
。
。
5、第二次增量(周二晚上增量):
innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/inc1 /backup/inc2
6、模拟数据损坏
n多的操作。。。。。
周三上午10:00时刻,删除t1表
drop table t1;
7、数据恢复前准备:
innobackupex --apply-log --redo-only /backup/full
innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full
innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full
innobackupex --apply-log /backup/full
8、数据恢复:(切记,恢复前需要关闭数据库)
Error: datadir must be specified. (这种情况需要在/etc/my.cnf配置文件里面指定data数据文件目录)
innobackupex --copy-back /backup/full/
启动数据库:
chown -R mysql.mysql /applicaion/mysql/data/ 注意:更改所属主和组,必须要做,否则启动不了
/etc/init.d/mysql start
作业:生产恢复案例:
背景:
1、xtrabackup备份策略每周日,full全备
2、xtrabackup周一到周六,inc1-inic6
3、总数据量200G
4、周三上午10点误删除表t1,数据量1G左右
5、周二晚上inc2备份完成之后到周三上午10点又做了很多操作
如何将数据库恢复到t1表误删除之前状态?
思路:
1、停业务,挂维护页
2、找备用库
3、合并full inc1 inc2
4、截取周二晚上inc2备份后到周三上午10点,t1表删除之前的binlog日志
5、将合并后的full 截取的binlog恢复到备用库
6、验证数据可用性和完整性
7、使用备用库替代生产库使用或者将t1表导出并导入回生产库
8、业务恢复
作业实践验证-方法1: (常用方法)
innobackupex增量备份实践
1、周末晚上对数据进行全量备份
innobackupex --user=root --password=oldboy123 --no-timestamp /backup/full
2、周一对数据进行输入等操作
insert into t1 values(9,'tang1');
insert into t1 values(10,'tang2');
3、周一晚上对数据进行增量备份
innobackupex --user=root --password=oldboy123 --incremental --no-timestamp --incremental-basedir=/backup/full/ /backup/inc1
4、周二对数据进行输入操作
insert into t1 values(11,'tao1');
insert into t1 values(12,'tao2');
5、周二晚上对数据进行增量备份
innobackupex --user=root --password=oldboy123 --incremental --no-timestamp --incremental-basedir=/backup/inc1 /backup/inc2
6、周三对数据进行输入操作
insert into t1 values(13,'shanchu1');
insert into t1 values(14,'shanchu2');
7、周三备份前对数据进行删除操作
drop table t1;
8、数据恢复前准备
innobackupex --apply-log --redo-only /backup/full
innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full
innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full
innobackupex --apply-log /backup/full
9、数据进行恢复
innobackupex --copy-back /backup/full/
启动数据库:
chown -R mysql.mysql /applicaion/mysql/data/ 注意:更改所属主和组,必须要做,否则启动不了
/etc/init.d/mysql start
10、二进制日志截取
[root@db02 full]# more xtrabackup_binlog_pos_innodb //查看到最后一次备份的标志位
my-bin.000003 906
show binary logs和show binlog events in 'my-bin.000003'; //查看到删表前的标志位
| my-bin.000003 | 1275 | Xid | 1 | 1306 | COMMIT / xid=68 /
mysqlbinlog --start-position=906 --stop-position=1306 /data/binlog/my-bin.000003 >/backup/binlog.sql
11、进行binlog日志文件的恢复 //到此,xtrabackup备份的数据和binlog二进制备份的数据已经全部恢复
临时关闭二进制日志
set sql_log_bin=0;
恢复操作
source /backup/binlog.sql;
作业实践验证-方法2:
//注:这种表结构只有问开发,必须知道表结构才行,这种方法可以不需要恢复所有数据,针对丢失的1G数据恢复就可以了。
drop table t1; //模拟t1表被误删
create table t1 (id int,name varchar(20)); //注:这种表结构只有问开发,必须知道表结构才行
alter table t1 discard tablespace;
cd /application/mysql/data/oldboy
cp /backup/full/oldboy/t1.ibd ./ //将inc2状态下的t1.ibd文件拷贝过来
chown -R mysql.mysql * //修改文件所属,改为mysql
alter table t1 import tablespace;