MySQL-xtrabackup

  Xtrabackup是由percona提供的mysql数据库备份工具是一个对,支持在线(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。需要注意的是xtrabackup只支持Innodb引擎。原理说起来很复杂,不过使用的时候还是相对很简单的。
官方文档信息::https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html
  xtrabackup支持全表备份,单表备份,增量备份。需要注意的是这个备份工具相当依赖于二进制日志,如果没有开启二进制日志的话是不能使用此工具进行备份的。

工具准备

  其实主要是要安装这个工具,可以使用yum进行安装,也可以到官方网站下载,注意这个工具在epel源,包名叫 percona-xtrabackup,但建议在官网下载进行安装。因为本人使用yum安装的版本莫名报错。工具的官方网站是https://www.percona.com,官方提供了已经编译的rpm包,下载直接安装即可。

全表备份还原

  所谓全表备份就是讲所有的数据库全部进行备份。在安装好之后在需要备份的主机上执行一下命令即可。

innobackupex --user='user_name' -password='password' /path/backup 

  不出意外的话就可以等待备份的完成了,根据数据量的大小备份时间会有较大差别。系统会自动在指定的文件夹下创建以当前时间为名的目录。备份的数据就存放在其中。数据备份完成之后注意将备份的数据存放在比较可靠的地方,切忌不可和备份主机放在一起。否则便失去了备份的意义。
  然后就是还原,虽然备份的时候可以热备即不停服务,但还原的时候是一定要停掉的。否则可能出现无法预料的问题。而且需要将已经出问题的数据库移除。具体命令如下:

systemctl stop mysqld
rm -rf /var/lib/mysqldb/*
innobackupex --apply-log /path/backup/xxx
innobackupex --copy-back /path/backup/xxx
chown -R mysql.mysql /var/lib/mysqldb/
systemctl start mysql

第一条命令用来停止服务,如果是在生产环境中无论如何进行数据还原的时候都是要停止服务的。
第二条比较有风险,其实不建议使用rm直接删除,可以使用mv移动到其他安全的地方,如果数据恢复失败,至少不至于全军覆没。
第三条用来整理备份的数据 ,所谓整理主要是回滚未提交的事物和重做已经提交的事物。
第四条将备份的数据恢复到对应的数据库目录,但要求数据库目录为空,所以第二步也是必须的。
第五条用来修改数据库的权限,确保恢复的数据可以被MySQL正常访问。
最后一条启动服务,然后检查数据内容是否正确。

增量备份

  所谓增量备份即在前一个全表备份基础上只备份变化的数据,也就是说,做增量备份的前提是必须有一个增量备份。为了方便和全表备份进行区分,建议将增量备份放在不同的文件夹中进行存放。比如这里以上一个全表备份为基础,增量备份命令如下:

innobackupex --incremental /path/incbak --incremental-basedir=/path/backup/xxx

  需要注意的一点是增量备份依赖于全表备份,所以在备份的时候除了指定是增量备份,还要指定基于的全表备份的路径。
  增量备份的还原和全表备份的还原差别不大,只是些许的参数有差别,具体如下:

systemctl stop mysqld
rm -rf /var/lib/mysql/*
innobackupex --apply-log --redo-only /path/backup/xxx
innobackupex --apply-log --redo-only /path/backup/xxx --incremental-dir=/path/incbak/xxx
innobackupex --copy-back /path/backup/xxx
shown -R mysql.mysql /var/lib/mysql
systemctl start mysql

前两步还是一样的,主要是第三步指定了一个参数’–redo-only’,什么意思呢,是这样的,在我们做全表备份的时候很有可能存在一个事物并没有完成,即在全表备份中存在一个没有提交的事物,而这个工具又是热备,所以在备份完成之后事物提交之后,这个没有完成的事物会有一部分在增量备份中。这个参数的含义就是如果有在备份中存在未提交的事物,不要回滚。
第四步中的’–redo-only’可以省略,但是如果有更多的增量备份则按照这个格式继续添加即可。
第五步用来将备份的数据复制到对应的数据库目录,之后就和全表备份相同,修改权限,启动服务进行测试。
注意,在第五步进行数据拷贝的时候,指定的是全表备份的目录,原因是第四条命令会把增量备份的内容整理到全表备份中,指定全表备份文件的路径就可以进行恢复了。
多次增量备份,多次增量备份和单次增量备份步骤大致相同,只是需要注意的是在备份的时候basedir要基于前一次的增量备份,如在第二次增量备份的时候–incremental-basedir的路径为第一次增量备份的路径。

单表备份

  单表备份其实挺麻烦的,主要是在还原的时候还是要把要还原的那张表给删了。命令其实还是很简单的。

innobackupex --include="data.table" /path/tablebak

然后还需要备份表结构,命令如下:

mysql -e 'show create table data.table' > data.table.bak.sql

到这里就备份结束了。只是在还原的时候并不能直接还原,需要吧导出的sql文件进行些许的修改。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!