作者简介:
mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能够接受的,如果数据库非常大,那再使用mysqldump备份就不太适合了。
Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上唯一一个开源的能够对innodb和xtradb数据库进行物理热备的工具。
2)备份过程不会打断正在执行的事务(不需要锁表)
3)能够给予压缩等功能节约磁盘空间和流量。
4)自动实现备份检验;
5)还原速度快;
6)可以进行流传出备份,备份到另外一台机器上。
1.innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力,
2.xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
事务说明:
事务是逻辑上的一组操作,组成这组操作的各个单元,要么全都成功要不全都失败,这个是事务的特性(innodb引擎,ACID特性)
如何使用:
1)在执行sql语句之前,我们要开启事务starttransation;
2)正常执行我们的sql语句
3)当sql语句执行完毕,存在两种情况:
1.全部都成功,我们要将sql语句对数据库造成的影响提交到数据库中 2.某些sql语句失败,我们执行rollback(回滚),将对数据库操作赶紧撤销
总结:我们可以把当前的事务分为两类
1.已经提交的 2.为提交的 在InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件。事务日志会存储每一个InnoDB表数据修改的记录。当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用(前滚)已经提交事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。
Innobackupex可以备份和恢复MYisam表及frm文件,并且对xtrabackup也做了很好的封装,所以可以使用Innobackupex来备份MYSQL数据库。Innobackupex备份MyiSAM表之前要对全库进行加READLOCK,阻塞写操作;备份是在主从同步进行的话会影响主从同步,造成延迟。对InnoDB表全备不会阻塞读写。
Xtrabackup和innobackupex这两个工具都提供了许多前文没有提到的功能特点。手册上有对各个功能都有详细的介绍。简单介绍下,这些工具提供了如流(streaming)备份,增量(incremental)备份等,通过复制数据文件,复制日志文件和提交日志到数据文件(前滚)实现了各种复合备份方式。
首先在logfile中找到最后一个checkpoint(lastcheckpointLSN)然后从LSN的位置开始拷贝InnoDB的loffile到xtrabackup_logfile;然后开始拷贝全部的数据文件".ibd";在拷贝全部数据文件结果之后,才停止拷贝logfile.
注意:在xtrabackup_logfile文件在并发写入很大的时也会变得很大,占用很多空间,当我们使用-stream=tar或者远程备份-remote-host默认使用/tmp但是最好先试参数-tpmdir指定,以免把/tmp目录占满影响备份以及系统其他正常服务。
logfile里面全部记录数据的全部修改情况,即使在备份时候数据文件被修改了恢复时仍然可以通过解析xtrabackup_logfile保持一致。
Xtrabackup的增量备份只能用于InnoDB,不能用于MyisaM表上。采用增量备份MySql数据库时xtrabackup会依照上次全备或者增量备份目录对InnoDB进行增量备份,对MyiSAM表会进行全表复制。
1)数据库太大没有足够的时间空间进行全备的,增量备份能有有效的节约空间,并且效率高。
2)支持热备份,备份过程不锁表(InnoDB而言)不阻塞数据库的读写。
3)每日备份只产生少量的数据,也可以采用远程备份,节约本地空间。
4)备份恢复基于文件操作,降低直接数据库操作的风险
5)备份效率更高,恢复效率更高。
流备份是指备份的数据通过标准输出STDOUT传输给tar程序进行归档,而不是单纯的将数据文件保存指定的备份目录中,参数-stream=tar表示开启流备份功能并打包。同时也可以利用流备份备份到远程服务器上。
例如:
innobackupex--stream=TAR${BACKUP_DIR}/base
gzip${BACKUP_DIR}/base.tar.gz
innobackupex--stream=TAR${BACKUP_DIR}/base
sshsomebackupaddr“cat${DIR}/base.tar”
当然如果使用了流备份,那么增量备份也就不能用了,因为增量备份需要参考此次备份情况,而上次备份却被打包或者压缩了。
首先在“准备prepare”的过程中,使用参数–export将表导出,这个导出会将每个InnoDB表创建一个以.exp结尾的文件,这些文件为之后的导入过程服务。
innobackupex--apply-log--export${BACKUP_DIR}/base
然后将你需要恢复的表的ibd和exp文件复制到目标机器,在目标机器上执行导入:
mysqlcreatetablet()engine=innodb;//此处需要DBA手动创建一个同结构的表或表已存在
mysqlALTERTABLEtDISCARDTABLESPACE;
$cpt.ibdt.exp${DATA_DIR}/${DB}/
mysqlALTERTABLEtIMPORTTABLESPACE;
这样的导出导入就可以保住恢复的表可以与数据库其他表保持一致性了。
Xtrabackup在备份时主要的工作是做数据文件复制,它每次只会读写1MB的数据(即64个page,不能修改),xtrabackup逐页访问1MB数据,使用innodb的buf_page_is_corrupted()函数检查此页的数据是否正常,如果数据不正常,就重新读取这一页,最多重新读取10次,如果还是失败,备份就失败了,退出。
在复制事务日志的时候,每次读写KB的数据,同样不可以配置
增量备份:自从任意类型的上次备份后有所修改做的备份。
差异备份:自上次全备份后有所改变的部分而做的备份。
1)全量备份与差异备份结合
以每周数据备份计划为例,我们可以在周一进行完全备份,在周二至周日进行差异备份。如果在周日数据被破坏了,则你只需要还原周一的全量备份和周六的差异备份。这种策略备份数据需要时间较多,但还原数据使用时间较少。
2)全量备份与增量备份结合
以每周数据备份计划为例,我们可以在周一进行完全备份,在周二至周日进行增量备份。如果在周日数据被破坏了,则你需要还原周一的全量备份和从周二至周六的所有增量备份。这种策略备份数据需要时间较少,但还原数据使用时间较多。且周二至周六任何一个增量数据损坏,所有备份不可用。
3)全量备份、增量备份和差异备份结合
以每周数据备份计划为例,我们可以在周一进行完全备份,在周二至周日进行差异备份,并且每天针对当天的差异备份每隔一段时间(比如半小时)进行增量备份。如果在周日某个时间点数据被破坏了,则你需要还原周一的全量备份和周六的差异备份,然后再还原周日所做的所有增量备份。这种策略操作最复杂,但是数据库最多损失半个小时的数据。
借用谁的一句话:只做备份,不做恢复演练,结果可能是一场空。
参考资料: