Mysql实时备份实现方法?
数据备份是数据容灾的最后一道防线。即使是两地三中心的架构,备份依然重要。如果备份出现问题,备份过程中交易业务会受到影响,备份数据无法恢复,这也是企业无法承受的。因此,选择合适的备份工具尤为重要。
每个企业数据库都有自己的备份工具。MEB(MySQL企业备份)是MySQL企业版中最重要的工具之一,是面向企业客户的数据备份方案。
Xtrabackup一直作为MEB的开源备胎存在,从MySQL8.0开始情况可能会有所不同。
由于MySQL8.0的新功能,如备份锁、重做日志归档和页面跟踪,MEB备份/恢复体验将会更好。目前xtrabackup还不支持这些功能。
MySQL企业版还有哪些功能?
功能1:备份锁
在8.0之前,xtrabackup或MEB用于物理备份。为了确保备份期间InnoDB引擎表与其他引擎数据文件和binlog日志的一致性,我们设置了一个全局读锁,然后复制非InnoDB文件。在此期间,MySQL将变为只读,数据无法写入。桌子越多,花费的时间就越长。如果在没有rsync参数的情况下使用xtrabackup,frm文件会被一个一个的复制,加锁时间会更长,对业务影响很大。
我曾经遇到过在一个虚拟机中部署超过12,000个表的情况。当时用的是xtrabackup,备份脚本被锁了十几分钟,但是MEB没有这样的问题。
MySQL8.0支持轻量级备份锁lock实例进行备份,数据字典由InnoDB重构存储。如果没有创建非InnoDB表,MEB会默认使用备份锁获取binlog日志的一致性位置,阻止DDL操作,但不会影响DML操作。
只有InnoDB表,只有备份锁。
如果有一个非InnoDB表,请将其全局锁定。
功能2:重做日志归档
MEB可以做在线热备,备份时不影响数据库读写。这样使用InnoDB事务日志在备份过程中持续监控重做日志的变化,读取增量变化,写入ibbackup_logfile,这样就不需要锁定,保证备份的一致性。(非InnoDB文件需要读锁定副本)
如果备份时数据库写负载特别重,而ibbackup_logfile写速度慢,重做日志大小不大,就很有可能出现。ibbackup_logfilecan跟不上重做日志记录的生成速度。如果重做日志空间不足,则需要覆盖日志文件,因此可以t写入ibbackup_logfile将丢失,这将导致备份失败。
MEB4.1对此进行了优化,将重做日志的处理线程拆分成多线程进行协作,提高了处理重做日志的效率,降低了重做日志覆盖导致备份失败的概率。但是添加重做日志的速度和ibbackup_logfile的写入速度差距太大,问题还是会出现。
MySQL8.0.17支持重做日志归档,彻底解决了这个问题。备份前,设置innodb_redo_log_archive_dirs,并指定重做日志归档目录。备份MEB时,会自动启动日志归档,检查点时会将旧记录归档到该目录,然后从归档文件中读取重做日志记录,从而避免可能因覆盖而导致的重做记录丢失。
注意:innodb_redo_log_archive_dirs不能在数据目录中,目录权限要求是700。
功能3:页面跟踪
页面跟踪是为了优化增量备份的效率,减少不必要的数据页面扫描。
增量备份目前有三种扫描模式:
Page-track:使用LSN来精确地跟踪自上次备份以来修改过的页面,并且只复制这些页面,这是最快的。
Optimal:扫描自上次备份以来修改过的InnoDB数据文件,找出并复制修改过的页面。根据系统时间的不同,使用时会有一些限制。
全扫描:扫描所有InnoDB数据文件,找出并复制自上次备份以来修改过的页面是最慢的。
1.使用页面跟踪增量备份,您需要首先安装备份组件。
2.在完全准备好之前打开页面跟踪。
3.完全备份后,进行增量备份时,指定如果满足页面跟踪条件,则默认使用page-track模式,否则使用全扫描模式,也可以指定-incrementalpage-track。
增量基础有三个选项。
Last_backup:在之前备份的基础上,之前的备份可以是附加备份,也可以是完全备份。这样所有的备份之间可能会有多次添加,每次的增量可能都比较小,但是恢复的时候需要一次一次的合并。
Last_full_backup:基于之前的完整备份,添加的。这样以后备份会更大,但恢复时只需要合并最后一次增量备份。
Dir:基于以前的备份目录。之前的备份可以是附加备份,也可以是完整备份。
与全扫描和页跟踪相比,当改变的页数小于总页数的50%时,备份效率至少可以提高一倍。
Page-track模式磁盘读写平衡,表示读写都是修改页面。
全扫描模式磁盘读写差别很大,表示读取了很多未修改的页面。
mysql是用什么实现的主从复制,如何解决的读写分离mycat?
改变我的猫从日志模式切换到调试模式。执行sql后,通过查看日志中被执行节点的ip,就知道是不是自己设置的读节点。