使用innobackex工具备份mysql数据
温馨提示:这篇文章已超过866天没有更新,请注意相关的内容是否还可用!
xtrbackup只能用于备份innodb引擎的数据库,而innobackex 既可以备份innodb引擎的数据库,也可以备份myisam引擎的数据库。备份时也可分为全量备份和增量备份
注:mysql只能5.5以上哦
一、安装innobackex
官网扩展源地址
https://www.percona.com/redir/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
自己的扩展源地址
http://d.ahaoyw.com/myrepo/centos/extension/percona-release-0.1-3.noarch.rpm
安装步骤
1.1、安装yum拓展源percona-release
# rpm -ivh http://d.ahaoyw.com/myrepo/centos/extension/percona-release-0.1-3.noarch.rpm
1.2、安装percona-xtrabackup
# yum install percona-xtrabackup -y
二、全量备份mysql
2.1、创建并授权备份用户
我们可以直接授权all权限,但是不符合安全原则
mysql> grant reload,lock tables,replication client on *.* to 'backupuser'@'localhost' identified by 'backupuser'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 权限为reload,lock tables,replication client。
2.2、创建备份保存目录
# mkdir /data/backup
2.3、备份mysql
innobackupex --defaults-file=/etc/my.cnf --user=backupuser --password='backupuser' -S /tmp/mysql.sock /data/backup 180517 17:20:23 Executing UNLOCK TABLES 180517 17:20:23 All tables unlocked 180517 17:20:23 Backup created in directory '/data/backup/2018-05-17_17-20-21/' MySQL binlog position: filename 'mysql-bin.000001', position '366' 180517 17:20:23 [00] Writing backup-my.cnf 180517 17:20:23 [00] ...done 180517 17:20:23 [00] Writing xtrabackup_info 180517 17:20:23 [00] ...done xtrabackup: Transaction log of lsn (1595675) to (1595675) was copied. 180517 17:20:23 completed OK!
结尾出现 completed OK!则表示备份成功
–defaults-file=/etc/my.cnf指定配置文件位置是为了获得datadir位置,当然可以设置为--datadir=数据库存放路径
备份完成后,会在指定的保存目录中生成一个时间戳目录,该时间戳目录名称也是恢复时的apply-log。
三、全量备份恢复
模拟故障,此时mysql的数据损毁。而之前我们已经全量备份
3.1、停止mysql服务
# /etc/init.d/mysqld stop
3.2、删除mysql原有数据
# mv /data/mysql /data/mysql.bak
# mkdir /data/mysql
3.3、恢复mysql
首先,需要初始化
innobackupex --use-memory=512M --apply-log /备份的时间戳目录/
■–use-memory=512M指定备份时使用的内存为512M,注意单位。默认为字节
# innobackupex --use-memory=512M --apply-log /data/backup/2018-05-17_12-57-18/ 180517 20:48:06 completed OK!
初始化完成后,进行恢复
# innobackupex --defaults-file=/etc/my.cnf --copy-back /备份的时间戳目录/
# innobackupex --defaults-file=/etc/my.cnf --datadir=/data/mysql --copy-back /data/backup/2018-05-17_17-20-21/ 180517 20:49:20 completed OK!
使用–copy-back参数恢复,如果my.cnf里面没有定义的话就要指定数据库存放路径
设置数据库存放目录权限
# chown -R mysql:mysql /data/mysql
四、增量备份
之前我们已经进行了全量备份,经过操作,一段时间后重新全量备份的话,需要耗费的资源较多,这时我们就可以使用增量备份了。
本次实验将执行一次全量备份,两次增量备份
注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备
4.1、进行一次全量备份
增量备份是基于全量备份的,所以在增量备份操作之前我们需要先进行全量备份
#innobackupex --defaults-file=/etc/my.cnf --datadir=/data/mysql --user=backupuser --password='backupuser' -S /tmp/mysql.sock /data/backup 180517 20:52:48 completed OK!
我们全量备份的时间戳目录/data/backup/2018-05-17_12-57-18/
4.2、进行增量备份
4.2.1、进行数据库操作
#创建测试库test1_backup mysql -uroot -p -e 'create database test1_backup;' #导入数据mysql -uroot -p test1_backup < /root/mysql.sql 模拟数据库数据发生改变,进行增量备份
4.2.2、进行第一次增量备份
# innobackupex --defaults-file=/etc/my.cnf --datadir=/data/mysql --user=backupuser --password='backupuser' -S /tmp/mysql.sock --incremental /data/backup --incremental-basedir=/data/backup/全量备份时间戳目录/
# innobackupex --defaults-file=/etc/my.cnf --datadir=/data/mysql --user=backupuser --password='backupuser' -S /tmp/mysql.sock --incremental /data/backup --incremental-basedir=/data/backup/2018-05-17_12-57-18/ 180517 13:02:11 completed OK!
–incremental表示增量备份,–incremental-basedir指定全量备份时间戳目录,因为本次增量备份是基于全量备份
本次增量备份的时间戳目录为/data/backup/2018-05-17_13-02-09/
4.2.3、进行数据库操作
#创建测试库test2_backup
mysql -uroot -p -e 'create database test2_backup;'
#导入数据
mysql -uroot -p test2_backup < /root/mysql.sql
4.2.4、进行第二次增量备份
innobackupex --defaults-file=/etc/my.cnf --datadir=/data/mysql --user=backupuser --password='backupuser' -S /tmp/mysql.sock --incremental /data/backup --incremental-basedir=/data/backup/第一次增量备份时间戳目录/
180517 13:09:10 completed OK!
本次增量备份的时间戳目录为/data/backup/2018-05-17_13-09-07/
经过以上操作,我们的增量备份就完成了
4.3、增量备份指定的INCREMENTAL-BASEDIR如何确定
在上面的实验中,我们进行增量操作时。第一次增量的incremental-basedir是全量备份时间戳目录,第二次增量的incremental-basedir是第一次增量备份的时间戳目录,这是为什么呢?
在每个备份的时间戳目录下面都有一个文件xtrabackup_checkpoints记录着备份信息,全备的信息如下:
from_lsn为起始检查点,to_lsn为终止检查点
全量备份的from_lsn为0,to_lsn为第一次增量备份的from_lsn,而第一次增量备份的to_lsn为第二次增量备份的from_lsn。刚好组成0-1863060。
如果上面的检查点不是依次连续的,那么在后面的增量恢复时容易出现错误。
如果每一次都是使用全量备份时间戳目录作为incremental-basedir,那么会出现以下情况
*第二次增量备份的to_lsn会覆盖第一次增量备份的to_lsn。
*如果是这样,那么我们在恢复时只需要初始化全量备份和第二次增量备份的时间戳目录
五、增量备份恢复
模拟故障,此时mysql的数据损毁。而之前我们已经进行全量和增量备份
5.1、停止mysql服务
#/etc/init.d/mysqld stop
5.2、删除mysql原有数据
# mv /data/mysql /data/mysql.bak
# mkdir /data/mysql
5.3、增量备份合并步骤
1、先初始化全量
innobackupex --apply-log --redo-only /data/backup/全量备份目录
# innobackupex --apply-log --redo-only /data/backup/2018-05-17_12-57-18 180517 13:21:19 completed OK!
2、初始化第一次增量
innobackupex --apply-log --redo-only /data/backup/全量备份目录 --incremental-dir=/data/backup/第一次增量备份目录
# innobackupex --apply-log --redo-only /data/backup/2018-05-17_12-57-18 --incremental-dir=/data/backup/2018-05-17_13-02-09 180517 13:21:42 completed OK!
3、innobackupex --apply-log /data/backup/全量备份目录 --incremental-dir=/data/backup/第二次增量备份目录
#innobackupex --apply-log /data/backup/2018-05-17_12-57-18 --incremental-dir=/data/backup/2018-05-17_13-09-07 180517 13:21:55 completed OK!
4、再初始化一次全量
innobackupex --apply-log /data/backup/2018-05-17_12-57-18 180517 13:22:14 completed OK!
–redo-only参数是增量备份必须的参数,第一步和最后一步初始化都是初始化全量备份,但是最后一步不需要–redo-only参数。(因为全部数据都在最后一步的全量目录中)
除了第一步和最后一步,其余步骤都是初始化增量备份,最后一次增量备份也不需要–redo-only参数
使用–use-memory可以设置执行时使用的内存大小
5.4、增量备份恢复
进行初始化,执行恢复时与全量备份恢复一样,都是指定全量备份目录
innobackupex --copy-back --datadir=/data/mysql /data/backup/全量备份目录
#innobackupex --copy-back --datadir=/data/mysql /data/backup/2018-05-17_12-57-18 180517 13:24:36 completed OK!
#为了避免权限问题,导致mysql无法启动,需要设置下权限
# chown -R mysql:mysql /data/mysql
增量备份恢复在本次实验的步骤如下
#停止mysql服务 /etc/init.d/mysqld stop #模拟数据库损毁 mv /data/mysql /data/mysql.bak mkdir /data/mysql chown mysql:mysql /data/mysql #初始化全局 innobackupex --apply-log --redo-only /data/backup/2018-05-17_12-57-18 #初始化第一次增量 innobackupex --apply-log /data/backup/2017-08-24_23-05-09 --incremental-dir=/data/backup/2018-05-17_13-02-09 #初始化第二次增量,这是最后一次增量,所以不需要--redo-only参数 innobackupex --apply-log /data/backup/2017-08-24_23-05-09 --incremental-dir=/data/backup/2018-05-17_13-09-07 #再初始化全量,不使用--redo-only innobackupex --apply-log /data/backup/2018-05-17_12-57-18 #恢复mysql innobackupex --copy-back /data/backup/2018-05-17_12-57-18 #设置权限,避免启动mysql出错 chown -R mysql:mysql /data/mysql
5.5、查看是否成功
启动test1_backup和test2_backup是做完全量备份才创建的测试库,说明恢复成功
ps:在进行增量备份时,每一次的–incremental-basedir都指定全量备份时间戳。那么在恢复时,只需要初始化全量备份时间戳目录和最后一次增量备份的时间戳目录 。
1、先初始化全量
innobackupex --apply-log --redo-only /data/backup/全量备份目录
2、初始化最后一次增量
innobackupex --apply-log /data/backup/全量备份目录 --incremental-dir=/data/backup/最后一次增量备份目录
3、再初始化一次全量,不需要--redo-only
innobackupex --apply-log /data/backup/全量备份目录
4、恢复
innobackupex --copy-back /data/backup/全量备份目录