数据库用第三方软件percona之innobackupex完全备份和增量备份及恢复

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;

感谢您的拜读!!!

猜你喜欢

转载自blog.csdn.net/perfect11_1/article/details/81104512