1.安装percona-xtrabackup
下载地址为http://www.percona.com/downloads/XtraBackup/
1)服务器搭建本地yum源;
2)yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
3)rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
4)rpm -ivh percona-xtrabackup-24-2.4.7-1.el6.x86_64.rpm
5)rpm -ivh percona-xtrabackup-24-debuginfo-2.4.7-1.el6.x86_64.rpm
6)rpm -ivh percona-xtrabackup-test-24-2.4.7-1.el6.x86_64.rpm
安装完成,包含以下两大模块:
xtrabackup:支持innodb存储引擎表,xtradb存储引擎表;
innobackupex:支持innodb存储引擎表、xtradb存储引擎表、myisam存储引擎表; 常用的是innobackupex,可以使用innobackupex –help查看更详细的参数。
2.增量备份示意图
3.percona-xtrabackup实现增量备份及恢复原理
1)与mysqldump的比较:
Mysqldump是mysql自带的备份工具,目录在bin目录下面:/usr/local/mysql/bin/mysqldump,支持基于innodb的热备份。但是由于是逻辑备份,所以速度不是很快,适合备份数据比较小的场景。Mysqldump完全备份+二进制日志可以实现基于时间点的恢复。
对myisam存储引擎的表,只能使用温备份,这个时候要防止数据的写入,所以先加上读锁。这个时候也可以进入数据库手动加读锁,不过这样比较麻烦,可以在mysqldump工具中直接有一个加锁的选择,就是 --lock-all-tables ,例如mysqldump --databases test --lock-all-tables --flush-logs > /tmp/backuptestdate+%F-%H-%M
.sql。
如果是备份单张表,直接在库名字test后面加上表名字即可。
对于innodb存储引擎表,可以热备,不必对数据库进行加锁的操作,加一个选项可以进行热备份,--single-transaction,例如:
mysqldump --databases test --single-transaction --flush-logs--master-data=2> /tmp/backup_test_`date +%F-%H-%M`.sql
PS:注意点,恢复的时候记得关闭二进制日志:
mysql> set sql_log_bin=0;
因为这是基于逻辑备份方式,所以执行sql会插入数据,会记录到二进制日志里面去,因为这事恢复,所以插入的二进制日志基本没有啥意思,可以关闭掉,缩短恢复时间。
2)percona-xtrabackup的优势
支持innodb的物理热备份,支持完全备份,增量备份,而且速度非常快,支持innodb存储引起的数据在不同数据库之间迁移,支持复制模式下的从机备份恢复备份恢复,为了让xtrabackup支持更多的功能扩展,可以设立独立表空间,打开 innodb_file_per_table功能,启用之后可以支持单独的表备份。
3)基本原理
数据库首先,使用percona-xtrabackup工具对进行全备,然后再每次数据库 的数据更新后对数据进行增量备份,每次增量备份均在上一次备份的基础上。恢复时依次把每次增量备份的数据恢复到全备中,最后使用合并的数据进行数据恢复。
4.percona-xtrabackup实现增量备份及恢复过程
1)全量备份
首先创建备份目录,执行:
mkdir –p /home/xtrabackup/
innobackupex --user=root --password=root /home/xtrabackup/
出现“completed”提示时说明备份成功:
150318 19:32:49 innobackupex: Connection to database serverclosed
150318 19:32:49 innobackupex: completed
2)增量备份
执行命令:
innobackupex --user=root --password=root --incremental /home/xtrabackup/ --incremental-basedir=/home/xtrabackup/2017-06-29_16-04-29/
其中--incremental-basedir是刚刚生成的全量备份目录;
同样出现“complete”提示是备份成功。
3)对全量备份数据进行检查
innobackupex --apply-log --redo-only 2017-06-29_16-04-29
出现下述提示,说明数据没有问题可以用作恢复:
130910 22:23:35 InnoDB: Starting shutdown...
130910 22:23:36 InnoDB: Shutdown completed; log sequence number 2098700
130910 22:23:36 innobackupex: completed OK!
4)合并增量备份和全量备份
innobackupex --apply-log --redo-only --incremental /home/xtrabackup/2017-06-29_16-04-29/ --incremental-dir=/home/xtrabackup/2017-06-29_16-15-18
同样出现complet提示后合并完成。
5)数据恢复
假如存在数据丢失、误删数据库等问题,需要数据恢复时,首先确认上述全量数据库可以使用,然后执行:
/etc/init.d/mysql stop #关闭数据库
mv /var/lib/mysql /var/lib/mysql_bak #备份数据库目录
mkdir –p /var/lib/mysql #创建新的数据库目录
innobackupex --datadir=/var/lib/mysql --copy-back 2017-06-29_16-04-29 #恢复数据库
chown –R mysql:mysql /var/lib/mysql #赋予数据库目录用户权限
/etc/init.d/mysql restart #启动数据库
执行完成没有错误即恢复完成,可以检查数据库已经成功恢复。 亲测25G的数据库恢复过程只需7min。 而如果采用mysqldump备份的数据库恢复同样大小的数据需要5~6小时。
5.一些重要参数
--defaults-file
同xtrabackup的--defaults-file参数
--apply-log
对xtrabackup的--prepare参数的封装
--copy-back
做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir;
--remote-host=HOSTNAME
通过ssh将备份数据存储到进程服务器上;
--stream=[tar]
备份文件输出格式, tar时使用tar4ibd , 该文件可在XtarBackup binary文件中获得.如果备份时有指定--stream=tar, 则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩, 在XtraBackup的binary包中可获得该文件)。
在使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。 --tmpdir=DIRECTORY 当有指定--remote-host or --stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir --redo-only--apply-log组, 强制备份日志时只redo ,跳过rollback。这在做增量备份时非常必要。 --use-memory=# 该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量,用来取代my.cnf中的buffer_pool_size值,如果你是独立服务器,而且内存足够大的话,为了加快备份恢复的效率,你可以调大--use-memory这个参数值
--throttle=IOS
同xtrabackup的--throttle参数
--sleep=
是给ibbackup使用的,指定每备份1M数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看ibbackup的手册;
--compress[=LEVEL]
对备份数据迚行压缩,仅支持ibbackup,xtrabackup还没有实现;
--include=REGEXP
对 xtrabackup参数--tables的封装,也支持ibbackup。备份包含的库表,例如:--include="test.",意思是要备份 test库中所有的表。如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:test1和test2,则写成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test"。
--databases=LIST
列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份;
--uncompress
解压备份的数据文件,支持ibbackup,xtrabackup还没有实现该功能;
--slave-info
备份从库, 加上--slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET
指定mysql.sock所在位置,以便备份进程登录mysql.
--safe-slave-backup
则会暂停Slave的SQL线程,等待到没有打开的临时表的时候开始备份.备份结束后SQL线程会自动启动,这样就可以确保一致性的复制状态.