本发明属于数据库应用
技术领域:
,具体涉及一种mysql数据库主从同步数据去重方法。
背景技术:
saas架构通过将应用直接剥离出去,将平台留下来,做平台的始终做平台,而做云计算资源的人就专心做好自身的调度和服务。这种方式使做saas的人可以专注于自己所熟悉的业务,为别人提供软件和服务的应用。mysql数据库是一种非常流行的开源数据库管理系统,应用非常广泛。mysql数据库管理系统的主数据库与从数据库同步技术在国内外使用得都非常的频繁。但是mysql数据库在实现主从同步的时候容易出现数据重复的问题,这是个非常令人头痛的问题,需要采取技术措施来检查并删除重复的数据。目前的解决方法主要有两类,一类是mysql官方推荐的表级加锁方法,另一类是大部分企业使用的联合主键和多个唯一键的方法,也称为传统解决方法。这两类方法都存在缺陷。下面分别予以阐述。一、mysql官方解决方法使用表级锁,每次同步前先对主库中的表进行加锁,其次把主库中的表数据备份并导出,再次拷贝导出后的mysql主库数据到mysql从库当中,按照binlog进行同步数据,最后解除主库的表级锁。这种方法存在的问题是:数据操作程序只能使用单线程,只能单个系统使用数据库,如果其他系统同时使用该数据库,则会被锁表。这不能满足现在分布式系统的并行数据库访问需求。二、传统解决方法使用联合主键和唯一键,但是每次对数据进行insert,update操作的时候都要逻辑验证每个主键字段和唯一键字段的唯一性,性能开销巨大。数据库服务器的主要用途是存储数据,不应该在逻辑处理上产生过多的开销,这种方式造成了数据库服务器性能的浪费。技术实现要素:为了解决现有的mysql数据库主从同步数据去重方法存在的性能开销大、只能提供单线程访问等问题,本发明提供一种mysql数据库主从同步数据去重方法,所述方法采取分布操作,在每次数据同步后,扫描本次同步的数据,检测从库中重复的数据并进行删除。所述方法无需对数据库表执行加锁操作,不影响数据库对外提供的并行服务功能,同时也不会引入过大的性能开销,因此在数据库操作并行性和性能开销方面优于现有的解决方法。为实现上述目标,本发明采用以下技术方案:一种mysql数据库主从同步数据去重方法,所述方法将数据库同步操作与数据去重操作区分开来,作为两个连续的操作步骤来执行,即在完成数据同步操作后,通过将本次同步的数据与同步日志中的数据进行比对,找到重复数据,并将从库中的重复数据删除。一种mysql数据库主从同步数据去重方法,所述方法包括以下步骤:1)把待同步的主数据库中的数据保存在服务器的临时文件当中;2)执行主数据库与从数据库的数据同步操作;3)调用mysql触发器,在主从同步日志表中记录同步操作完成的日志信息,但是记录中的“去重表级字段”记录为“未去重”;4)saas架构程序定期扫描主从同步日志表;5)如果发现有新的已完成同步但没有去重的批次数据,则将这些已完成同步但尚未去重的数据与所述步骤1)中存储的临时文件中的数据进行比对;如果扫描未发现有新的已完成同步但没有去重的批次数据,则跳转步骤9);6)如果比对后未发现有重复数据,则将主从同步日志中的去重状态更新为“无须去重”,跳转到所述步骤9);7)如果经比对发现有重复的数据,则删除此批同步在从库中的数据,并将保存在临时文件中的数据插入到从库中;8)将主从同步日志中的去重状态更新为“完成”;9)删除所述步骤1)中存储的临时文件。优选的,所述步骤4)中的定期扫描为每隔5秒扫描一次。优选的,所属步骤6)中的数据比对方式为逐条循环比对。本发明的优点和有益效果为:将数据同步操作与数据去重区分为两个操作步骤,使得数据同步操作进程加快,不会影响其他进程对数据库的并行访问操作;通过数据比对查找重复数据,处理逻辑简单清晰,引入的开销较小,与现有技术相比,性能提升显著。附图说明附图1是本发明所述的mysql数据库主从同步数据去重方法的工作流程图。具体实施方式下面结合实施例对本发明作进一步说明。实施例1参见附图1。一种mysql数据库主从同步数据去重方法,按以下步骤执行:1)把待同步的主数据库中的数据保存在服务器的临时文件当中;2)执行主数据库与从数据库的数据同步操作;3)调用mysql触发器,在主从同步日志表中记录同步操作完成的日志信息,但是记录中的“去重表级字段”记录为“未去重”;4)saas架构程序每隔5秒扫描主从同步日志表;5)扫描未发现有新的已完成同步但没有去重的批次数据,删除所述步骤1)中存储的临时文件。实施例2参见附图1。一种mysql数据库主从同步数据去重方法,按以下步骤执行:1)把待同步的主数据库中的数据保存在服务器的临时文件当中;2)执行主数据库与从数据库的数据同步操作;3)调用mysql触发器,在主从同步日志表中记录同步操作完成的日志信息,但是记录中的“去重表级字段”记录为“未去重”;4)saas架构程序每隔5秒扫描主从同步日志表;5)发现有新的已完成同步但没有去重的批次数据,将这些已完成同步但尚未去重的数据与所述步骤1)中存储的临时文件中的数据进行比对;6)比对后未发现有重复数据,删除所述步骤1)中存储的临时文件。实施例3参见附图1。一种mysql数据库主从同步数据去重方法,按以下步骤执行:1)把待同步的主数据库中的数据保存在服务器的临时文件当中;2)执行主数据库与从数据库的数据同步操作;3)调用mysql触发器,在主从同步日志表中记录同步操作完成的日志信息,但是记录中的“去重表级字段”记录为“未去重”;4)saas架构程序每隔5秒扫描主从同步日志表;5)发现有新的已完成同步但没有去重的批次数据,将这些已完成同步但尚未去重的数据与所述步骤1)中存储的临时文件中的数据进行比对;6)经比对发现有重复的数据,删除此批同步在从库中的数据,并将保存在临时文件中的数据插入到从库中;7)将主从同步日志中的去重状态更新为“完成”;8)删除所述步骤1)中存储的临时文件。性能对比例为了说明本发明所述方法在性能方面的优势,我们将mysql官方提供的同步数据去重方法与本发明所述方法在引入系统开销方面进行了对比,结果如表1、表2所示。表1mysql主数据库服务器性能测试报表服务器型号处理器型号级数量内存网速数据量(条)mysql官方方法的性能消耗cpu/内存本发明所述方法的性能消耗cpu/内存eg520ms-g10intel®xeon®e5-2600v3/v42个32gbddr4recc千兆1000000025%/8gb25%/8gb表2mysql从数据库服务器性能测试报表服务器型号处理器型号级数量内存网速数据量(条)mysql官方方法的性能消耗cpu/内存本发明所述方法的性能消耗cpu/内存eg520ms-g10intel®xeon®e5-2600v3/v42个32gbddr4recc千兆1000000028%/12gb25%/8gb从表2可以看出,在同样条件下,本发明所述方法比mysql官方采用的同步数据去重方法,节省了3%的cpu性能开销,节省了4gb内存开销。最后应说明的是:显然,上述实施例仅仅是为清楚地说明本发明所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引伸出的显而易见的变化或变动仍处于本发明的保护范围之中。当前第1页12