XtraBackup工具,是一款强大的支持在线热备份的工具,备份过程中不锁库表,非常适合生产环境,由专业组织Percona提供。
它主要包含两个组件:
------xtrabackup: C 程序,支持innodb/xtradb
------innobackupex: 以perl脚本封装Xtraback,还支持myisam
下面上点实战操作:
1、安装软件 :yum -y install perl-DBD-mysql perl-Digest-MD5 --------依赖包
rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm ----------依赖包
rpm -ivh percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm ------主程序包
pm -ql percona-xtrabackup-24 ---------列出percona程序目录列表
man xtrabackup -------------查询相关man帮助
man innobackupex -------查询相关man帮助
2、完全备份和恢复
2-1、完全备份
innobackupex --user root --password 123456 --databases="mysql performance_schema sys gamedb " /allbak --no-timestamp(不新建时间目录) 备份 mysql performance_schema sys gamedb这几个库
ls /allbak (备份目录下既有备份的数据又有日志文件)
cat xtrabackup_checkpoints --------查看日至序列号lsn
2-2、准备恢复数据 (回滚备份目录下日志信息)
]#innobackupex --user root --password 123456 \
--databases="mysql performance_schema sys gamedb " \
--apply-log /allbak
]# systemctl stop mysqld------先将服务停下
]# rm -rf /var/lib/mysql/*--------再删除主目录
2-3、把备份目录下数据库拷贝回数据库目录下
]#innobackupex --user root --password 123456 \
--databases="mysql performance_schema sys gamedb " \
--copy-back /allbak
2-4、修改数据库目录所有者和组用户改为mysql
]# chown -R mysql:mysql /var/lib/mysql
启动数据库服务
]# systemctl start mysqld
2-5、登录查看数据。
]# mysql -uroot -p123456
mysql> show databases;
mysql> select * from gamedb.a;
3、增量备份
增量备份:备份上次备份后,所有新产生的数据。
innobackupex 增量备份
3-1第1次备份 所有数据
]# innobackupex --user root --password 123456 /fullbak --no-timestamp
3-2、完全备份后向表里存储新数据
insert into gamedb.a values(9090),(990);
insert into gamedb.b values(880),(8080);
select * from gamedb.a; select * from gamedb.b;
3-3、对数据做增量备份
]# innobackupex --user root --password 123456 --incremental /new1dir --incremental-basedir=/fullbak --no-timestamp
--incremental /new1dir -----------指定增量备份存放的位置
--incremental-basedir=/fullbak--------指定增量备份时从何处开始备份所参考的备份文件
]# ls /new1dir
3-4、增量备份后继续向表中存储新数据
insert into gamedb.a values(60),(660);
insert into gamedb.b values(780),(7780);
select * from gamedb.a; select * from gamedb.b;
3-5、对数据做增量备份
]# innobackupex --user root --password 123456 --incremental /new2dir --incremental-basedir=/new1dir --no-timestamp
注意这里参考的文件是/new1dir
]# ls /new2dir---------查看lsn 日志序列号
3-6、innobackupex 增量恢复
准备恢复数据
]# innobackupex --user root --password 123456 --apply-log --redo-only /fullbak
]#innobackupex --user root --password 123456 --apply-log --redo-only /fullbak --incremental-dir=/new1dir
]#innobackupex --user root --password 123456 --apply-log --redo-only /fullbak --incremental-dir=/new2dir
注意:以上三步作完便将SQL日志命令合并了
]# rm -rf /new1dir/
]# rm -rf /new2dir/
把备份目录下的数据拷贝到数据库目录并修改所有者和组为mysql
systemctl stop mysqld
rm -rf /var/lib/mysql/*
]# innobackupex --user root --password 123456 --copy-back /fullbak
启动数据库服务
]# chown -R mysql:mysql /var/lib/mysql
]# systemctl start mysqld
登录查看数据 select * from gamedb.a;
3-7、恢复后继续存储数据,执行增量备份
]# innobackupex --user root --password 123456 --incremental /dir1 --incremental-basedir=/fullbak --no-timestamp
注意此时做增量备份时参考的备份文件继续是/fullbak,因为之前在作准备恢复文件时已经将SQL日志命令合并了。
4、在生产中我们使用脚本实现
vim /root/allbak.sh
#!/bin/bash
day=`date +%F`
innobackupex --user root --password 123456 /fullbak_${day} --no-timestamp
:wq
vim /root/newallbak.sh
#!/bin/bash
jt=`date +%d`
zt=` expr $jt - 1 `
m=`date +%m`
innobackupex --user root --password 123456 --incremental /new${m}_${jt}dir --incremental-basedir=/new${m}_${zt}dir --no-timestamp
:wq
chmod +x /root/allbak.sh
chmod +x /root/newallbak.sh
00 23 * * 1 /root/allbak.sh
00 23 * * 2-7 /root/newallbak.sh
5、使用innobackupex完全备份文件恢复单个表
5-1、备份一个数据库
]#innobackupex --user root --password 123456 \
--databases="gamedb" /gamedbbak --no-timestamp
5-2、删除该数据库下的一张表(模拟生产环境中误删)
mysql> drop table gamedb.a;
mysql> system ls /var/lib/mysql/gamedb/a.*
mysql> system ls /var/lib/mysql/gamedb/b.*
5-3、恢复单个表
create table gamedb.a(id int);-----参考所删表的结构重新创建该表同样名称的新表
mysql> system ls /var/lib/mysql/gamedb/a.*
mysql> alter table gamedb.a discard tablespace;--------- 删除表空间 a.ibd
mysql> system ls /var/lib/mysql/gamedb/a.*
]#innobackupex --user root --password 123456 \
--apply-log --export /gamedbbak------------ 导出表信息 ,会 在/gamedbbak/gamedb/下生成a.{cfg,exp,ibd} 三个文件
]# cp /gamedbbak/gamedb/a.{cfg,exp,ibd} /var/lib/mysql/gamedb/
]# chown mysql:mysql /var/lib/mysql/gamedb/a.*
mysql> alter table gamedb.a import tablespace;--------导入表空间,通过cfg,exp,ibd来恢复表内容生成与备份前a.ibd一样的a.ibd
]# rm -rf /var/lib/mysql/gamedb/a.{cfg,exp} 删除表信息文件
MySQL> select * from gamedb.a;
感谢您的拜读!!!