执行全量备份命令如下
#innobackupex --defaults-file=/etc/my.cnf --host=192.168.1.146 --user=root --password=123123 /backup
命令参数选项讲解:- -defaults选项指定了备份数据库的时候,从哪个配置文件中获取配置信息,这个选项的作用的是你的数据库是编译安装的时候,指定你的配置文件在哪里,如果你是默认yum安装的,那这个选项可以忽略。- -host选项指定数据库的ip地址,- -user选项指定使用哪个用户连接到数据库进行备份,- -password选项指定对应的用户的密码。后面的的目录是备份目录,意思你数据库备份要放到哪个目录下。
从上面我们可以发现,如果使用root用户,备份本机上的数据库,那么- -host选项与- -user选项都可以省略,- -password选项也可以代替为对应的短选项-p,同时,如果使用默认的配置文件,- -defaults-file选项也可以省略
简易的全量备份命令如下
#innobackupex -p123123 /backup
如果在另一台mysql服务器恢复,则先确保安装了同样版本的mysql,并且安装了xtrabackup.
将全量备份拷贝至新的mysql服务器上
#scp -r /backup/2017-04-06_21-53-13/ 192.168.1.120:/testdir/
对数据进行准备工作,合成可用的一致数据,- -use-memory选项不是必须的
#innobackupex --apply-log --use-memory=4G /testdir/2017-04-06_21-53-13/
恢复命令中参数讲解:- -apply-log 选项表示将目录中的日志应用到备份数据中。如果我们的备份时长很长,那么期间备份的事务日志容量会很大,- -use-memory选项可以加速准备工作的完成,这个选项的作用是使用指定大小的内存完成准备工作。
完成准备工作之后,确定新的MySQL服务器上的mysql服务已经停止,确定对应的数据目录中没有任何文件,删除数据目录与对应的日志。
#systemctl stop mysqld
#rm -rf /var/lib/mysql/*
完成上述工作后,将准备好的数据还原回对应的数据目录中
#innobackupex --datadir=/var/lib/mysql --copy-back /testdir/2017-04-06_21-53-13/
上述的- -datadir选项这里不讲,应该也能猜到他的作用,这里如果数据库的配置文件my.cnf里设置了datadir对应的目录,那么可以省略- -datadir选项。这里需要注意的是datadir目录必须为空目录。否则在执行上述命令时会报错。
数据还原拷贝完之后,将对应数据目录中的文件属主和属组设为mysql用户。
#chown -R mysql: /var/lib/mysql/
完成上述步骤后,启动mysql服务,这里mysql利用xtrabackup进行全力备份和恢复就完成了,我们可以看到数据库数据以及恢复。
#systemctl start mysqld
xtrabackup不仅可以对数据库进行全量备份,还可以进行增量备份和差量备份。增量备份和差量备份的区别,可以用下面两个图进行理解。
差量备份:
增量备份:从上面两个图我们可以看出,全量备份是差量和增量的基础,所以我们进行差量和增量备份的时候,需要先进行全量备份。
备份命令如下
首先进行全量备份
#innobackupex -p123123 /backup
全量备份完成后,在/backup目录下,可以看到一个以备份时间为名称的备份文件夹。
# ls /backup
2017-04-08_13-36-11
其次针对上次的全量备份进行增量备份或者差量备份。
# innobackupex -p123123 --incremental /backup --incremental-basedir=/backup/2017-04-08_13-36-11/
增量备份选项参数含义:- -incremental选项表示本次备份是一个增量备份,本次增量备份将备份至/backup目录下,本次增量备份针对于/backup/2017-04-08_13-36-11/的增量。其实讲到这里我们应该也能看出,上述命令也能用于差量备份,只需将上述命令中的- -incremental-basedir选项的值每次的设定为全量备份的路径即可,其实这次备份也可以理解为一次差量备份。
# ls /backup/
2017-04-08_13-36-11 2017-04-08_13-41-59
针对上一次增量或者差量做增量备份,因为如下命令中- -incremental-basedir选项指定的路径为上一次的增量(差量),所以,这次备份一定是增量备份。
# innobackupex -p123123 --incremental /backup --incremental-basedir=/backup/2017-04-08_13-41-59
# ls /backup
2017-04-08_13-36-11 2017-04-08_13-41-59 2017-04-08_14-01-16
当然,上述增量备份的次数由备份策略决定,此处用于示例,只进行两次增量。
恢复命令如下
为了不影响现在的服务运行,我们将备份还原到一台新的服务器上,先确保新机器已经安装了同样版本的mysql,并且安装了xtrabackup。讲所有备份拷贝至新的mysql服务器上。
#scp -r /backup/* 192.168.1.120:/testdir/
先对最开始的全量备份进行preoare(准备)工作,因为后面还有增量备份,所以此处的prepare时使用- -redo-only选项。此选项表示在进行准备(应用日志)工作时,只进行redo操作,因为在备份开始时,有的事务日志已经提交了,但是还没有完全应用到数据文件中,有的事务日志还没有提交,这些没有提交的事务需要进行回滚操作,在进行“准备”工作时,如果添加了- -redo-only选项,则只会重做已提交但是未应用的事务,而不会回滚未提交的事务。这里讲一下为什么全文的全量备份恢复的准备工作中,没有添加- -redo-only选项呢,那是因为全量备份还原工作,只有一个全量备份,全量备份之后没有任何其他备份需要合并,而此刻则不同,除去全量备份,后面还有对应的增量备份,那么全量备份中未提交的事务有可能在后面的增量备份中已经提交了,所以,在准备“最后一份备份”之前的“备份”时,都不用进行回滚操作,只在最后一次备份中进行回滚操作即可。
#innobackupex --apply-log --redo-only --use-memory=1G /testdir/2017-04-08_13-36-11/
现在准备增量备份,如果有多个增量备份,最后一个增量备份之前的所有增量都可以使用类似如下命令进行prepare(唯一需要改变的就是- -incremental-dir选项对应的增量目录),将当前增量prepare并合并到完全备份中,命令如下。
#innobackupex --apply-log --redo-only --use-memory=1G /testdir/2017-04-08_13-36-11/ --incremental-dir=/testdir/2017-04-08_13-41-59
准备最后一个增量备份,并且合并到全量备份中。
#innobackupex --apply-log --use-memory=1G /testdir/2017-04-08_13-36-11/ --incremental-dir=/testdir/2017-04-08_14-01-16
所有备份的准备(prepare)工作已经完成,完成准备工作后,确定新的mysql服务器上的mysql服务已经停止,确定对应的数据目录中没有任何文件,那么,我们删除对应的数据文件与日志。
#systemctl stop mysqld
#rm -rf /var/lib/mysql/*
完成上述工作后,将准备好的数据还原回对应的数据目录中,只还原最终准备好的全量备份即可
#innobackupex --datadir=/var/lib/mysql --copy-back /testdir/2017-04-08_13-36-11
数据还原拷贝完成之后,将对应数据目录中的文件的属主属组设置为mysql用户。
#chown -R mysql: /var/lib/mysql/
完成上述步骤之后,启动mysql服务,当然,实际还原时还需将对应的配置文件(列如my.cnf)也都还原了,所有数据还原后。在启动mysql服务。
systemctl start mysqld
完成上述步骤,即恢复完成。
这里还需要注意一点下面的问题:
xtrabackup版本升级到2.4后,相比之前的2.1有了比较大的变化:
innobackupex 功能全部集成到 xtrabackup 里面,只有一个 binary程序,另外为了兼容考虑,innobackupex作为 xtrabackup 的软链接,即xtrabackup现在支持非Innodb表备份,并且 Innobackupex 在下一版本中移除,建议通过xtrabackup替换innobackupex