CN105447014B - 基于binlog的元数据管理方法和用于提供元数据的方法及装置 - Google Patents
基于binlog的元数据管理方法和用于提供元数据的方法及装置 Download PDFInfo
- Publication number
- CN105447014B CN105447014B CN201410403789.5A CN201410403789A CN105447014B CN 105447014 B CN105447014 B CN 105447014B CN 201410403789 A CN201410403789 A CN 201410403789A CN 105447014 B CN105447014 B CN 105447014B
- Authority
- CN
- China
- Prior art keywords
- metadata
- mysql
- ddl
- database
- benchmark
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Abstract
本申请公开了一种基于binlog的元数据管理方法和装置,以及一种用于提供元数据的方法和装置。其中,所述基于binlog的元数据管理方法包括:从MySQL主数据库获取元数据,作为基准元数据;以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制日志binlog数据;在上述获取binlog数据的过程中,针对所述binlog数据中的每个日志事件执行下述操作:判断所述日志事件记录的是否为DDL操作;若是,存储与所述DDL操作相关的信息。采用本申请提供的方法,实现了对MySQL主数据库在各个时间点的元数据的自主管理,从而可以提供从自主管理的起始时间到当前时间之间的任意一个时间点的元数据信息,增强了binlog解析功能的容错性和可运维性。
Description
技术领域
本申请涉及MySQL数据库技术,具体涉及一种基于binlog的元数据管理方法和装置。本申请同时提供一种用于提供元数据的方法和装置。
背景技术
MySQL是一个开放源码的关系型数据库管理系统,通常采用主从同步的架构方式,即:一台主服务器负责处理写入操作和少量的读操作,一台或者多台从服务器(或称备用服务器)负责处理读操作,从而实现负载均衡,缩短对用户访问请求的响应时间。针对上述主从同步的架构方式,MySQL数据库通常采用二进制日志文件binlog来实现主、从数据库之间的数据复制功能。
随着数据库技术以及数据库业务的发展,上述主从复制功能已无法满足多变的用户需求,例如,有的数据库业务只需要同步部分库或者表中的数据;有的业务则需要把MySQL中的数据,同步到其他关系数据库,甚至nosql数据库中去。基于这些需求,有些公司开发了基于binlog的数据同步产品,在MySQL系统的外部实现数据解析和同步功能,具体说:将从MySQL主库拉取的binlog数据解析成和数据库无关的结构数据,然后将所述结构数据按照目标数据库的需求导入到所述目标数据库中,从而实现所需的数据同步功能。
在上述数据同步的过程中,为了完整地将binlog中的数据解析成和数据库无关的结构数据,通常需要获知MySQL数据库的完整元数据(meta数据,即:记录数据库和表结构的数据),然而由于binlog自身无法提供这部分数据,因此现有技术通常采用以下三种方式获取:
1)直接向MySQL主数据库查询所需的元数据;
2)搭建独立的MySQL数据库,每从binlog数据里获取一个DDL,都在该MySQL数据库中执行,需要元数据时从该MySQL数据库中获取;
3)搭建meta中心,定期从MySQL主数据库抓取元数据并保存,如果在数据同步过程中因为故障要重新执行部分同步操作、需要获取过去的某个指定时间点的元数据时,则从已抓取的元数据中选择一个版本,并从该版本对应的时间点重新拉取并解析binlog数据。
上述三种方式,在具体的应用过程中分别存在以下缺陷:
采用方式一,由于解析binlog数据需要与binlog数据的时间戳对应的元数据信息,而MySQL主数据库的元数据是实时变化的,因此通过直接连接主库查询的方式获得当前时间点的元数据信息,可能出现与解析binlog所需元数据不一致的情况;
采用方式二,只能提供与当前解析的binlog数据的时间戳对应的元数据,无法提供之前的其他时间点的元数据。
采用方式三,每隔一段时间就要从MySQL主数据库查询一次元数据,增加了主数据库的负担;而且在需要获取过去的某个指定时间点的元数据时,只能从定期抓取的元数据中,选取其抓取时间点早于所述指定时间点的元数据版本,并从该版本对应的时间点开始拉取binlog数据,通常会拉取重复的数据,影响整个数据同步过程的效率。
发明内容
本申请提供一种基于binlog的元数据管理方法和装置,以解决现有技术无法根据指定时间点提供元数据的问题。本申请另外提供一种用于提供元数据的方法和装置。
本申请提供一种基于binlog的元数据管理方法,包括:
从MySQL主数据库获取元数据,作为基准元数据;
以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制日志binlog数据;在上述获取binlog数据的过程中,针对所述binlog数据中的每个日志事件执行下述操作:
判断所述日志事件记录的是否为DDL操作;
若是,存储与所述DDL操作相关的信息。
可选的,与所述DDL操作相关的信息包括:所述DDL操作对应的DDL语句,以及所述DDL操作在所述binlog数据中对应的时间戳信息。
可选的,所述方法包括:
压缩所述基准元数据,并将压缩后的基准元数据以文件的形式存储在本地文件系统中。
可选的,在执行所述压缩所述基准元数据的步骤前,执行下述操作:
将已获取的基准元数据导入本地MySQL数据库中;
相应的,如果所述判断所述日志事件记录的是否为DDL操作的结果为“是”,则在存储与所述DDL操作相关的信息之前,执行下述操作:
在本地MySQL数据库中执行所述DDL操作。
可选的,所述存储与DDL操作相关的信息是指,将与DDL操作相关的DDL语句和时间戳信息存储在本地MySQL数据库中的一个用于存储元数据相关信息的特定数据表中;
相应的,所述方法还包括:
将所述获取基准元数据的时间点和存储基准元数据所使用的文件名称,存储在本地MySQL数据库中的所述特定数据表中。
可选的,所述方法包括:
按照预先设定的时间间隔,定期执行下述操作:
从本地MySQL数据库获取对应于MySQL主数据库的元数据;
压缩所述元数据,并将压缩后的元数据以文件的形式存储在本地文件系统中,作为与本次执行获取操作的时间点对应的基准元数据;
将获取上述基准元数据的时间点和存储所述基准元数据的文件名称,存储在本地MySQL数据库中的所述特定数据表中。
可选的,所述方法包括:
按照预先设定的时间间隔,从本地文件系统中删除存储时间超过预先设定期限的基准元数据文件,并从本地MySQL数据库中删除与被删除的文件对应的DDL操作的相关信息。
相应的,本申请还提供一种基于binlog的元数据管理装置,包括:
基准元数据获取单元,用于从MySQL主数据库获取元数据,作为基准元数据;
DDL操作信息获取单元,用于以上述获取基准元数据的时间点为起点,获取并存储MySQL主数据库执行的DDL操作信息;
所述DDL操作信息获取单元包括:
binlog数据获取子单元,用于以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制日志binlog数据;
DDL信息处理子单元,用于针对binlog数据中的每个日志事件,判断该日志事件记录的是否为DDL操作;若是,存储与所述DDL操作相关的信息。
可选的,所述DDL操作信息获取单元存储的DDL信息包括:所述DDL操作对应的DDL语句,以及所述DDL操作在所述binlog数据中对应的时间戳信息。
可选的,所述装置包括:
数据压缩单元,用于压缩所述基准元数据,并将压缩后的基准元数据以文件的形式存储在本地文件系统中。
可选的,所述装置包括:
基准元数据导入单元,用于在压缩所述基准元数据之前,将已获取的基准元数据导入本地MySQL数据库中;
相应的,所述DDL信息处理子单元具体用于,针对binlog数据中的每个日志事件,判断该日志事件记录的是否为DDL操作;若是,在本地MySQL数据库中执行存储所述DDL操作并存储相关信息;
所述DDL信息处理子单元包括:
DDL判断子单元,用于针对binlog数据中的每个日志事件,判断该日志事件记录的是否为DDL操作;
DDL执行子单元,用于当所述判断子单元的输出为“是”时,在本地MySQL数据库中执行所述DDL操作,并触发DDL存储子单元工作;
DDL存储子单元,用于存储所述DDL操作的相关信息。
可选的,所述DDL存储子单元,具体用于,将与DDL操作相关的DDL语句和时间戳信息存储在本地MySQL数据库中的一个用于存储元数据相关信息的特定数据表中;
相应的,所述装置还包括:
基准元数据信息存储单元,用于将所述获取基准元数据的时间点和存储基准元数据所使用的文件名称,存储在本地MySQL数据库中的所述特定数据表中。
可选的,所述装置还包括:
基准元数据定期生成单元,用于按照预先设定的时间间隔生成基准元数据;
所述基准元数据定期生成单元包括:
定时控制子单元,用于根据预先设定的时间间隔定时触发下述本地元数据获取子单元、基准元数据压缩子单元和基准元数据信息存储子单元工作;
本地元数据获取子单元,用于从本地MySQL数据库获取对应于MySQL主数据库的元数据;
基准元数据压缩子单元,用于压缩所述元数据,并将压缩后的元数据以文件的形式存储在本地文件系统中,作为与本次执行获取操作的时间点对应的基准元数据;
基准元数据信息存储子单元,用于将获取上述基准元数据的时间点和存储所述基准元数据的文件名称,存储在本地MySQL数据库中的所述特定数据表中。
可选的,所述装置还包括:
基准元数据清理单元,用于按照预先设定的时间间隔,从本地文件系统中删除存储时间超过预先设定期限的基准元数据文件,并从所述本地MySQL数据库中删除与被删除的文件对应的DDL操作的相关信息。
此外,本申请还提供一种用于提供元数据的方法,包括:
接收获取与指定时间点对应的MySQL主数据库元数据的请求;
根据预先存储的所述MySQL主数据库的基准元数据和DDL操作信息,生成本地MySQL数据库,该数据库与所述MySQL主数据库在所述指定时间点上的元数据一致;
获取本地MySQL数据库中对应于MySQL主数据库的元数据,并返回给所述请求的发起方。
可选的,所述MySQL主数据库的基准元数据和DDL操作信息,是通过以下步骤生成的:
从所述MySQL主数据库获取元数据并存储,作为与执行所述获取操作的时间点相对应的基准元数据;
以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制binlog数据,并存储所述binlog数据中与DDL操作相关的信息;所述与DDL操作相关的信息包括:所述DDL操作对应的DDL语句及其在binlog数据中的时间戳。
可选的,所述生成所述MySQL主数据库元数据的基准数据和DDL操作信息的步骤,还包括:
将从所述MySQL主数据库获取的基准元数据导入本地MySQL数据库中;并且,每次存储所述binlog数据中与DDL操作相关的信息之前,在本地MySQL数据库中执行所述DDL操作;
按照预先设定的时间间隔,定期获取本地MySQL数据库的元数据并存储,作为与执行所述获取操作的时间点对应的基准元数据。
可选的,所述根据预先存储的所述MySQL主数据库的基准元数据和DDL操作信息,生成本地MySQL数据库,包括:
从预先存储的所述MySQL主数据库的基准元数据中,选取其时间点早于并且临近所述指定时间点的基准元数据;
从预先存储的DDL操作信息中,选择其时间戳晚于所选基准元数据对应的时间点、并且早于所述指定时间点的DDL操作信息;
将选取的基准元数据导入本地MySQL数据库中;
在执行了上述导入操作的本地MySQL数据库中依次执行所选的DDL操作。
可选的,在执行所述将选取的基准数据导入本地MySQL数据库的步骤之前,执行下述操作:
判断本地MySQL数据库是否已有与MySQL主数据库对应的元数据;
若是,通过执行删除操作清除本地MySQL数据库中的所述元数据。
可选的,在执行了导入操作的本地MySQL数据库中依次执行所选的DDL操作之前,执行下述操作:
从所选的DDL操作信息中,剔除从整体上对本地MySQL数据库的元数据不产生影响的DDL操作信息;
相应的,所述在本地MySQL数据库中依次执行所选的DDL操作是指,在本地MySQL数据库中依次执行完成上述剔除操作后的DDL语句。
相应的,本申请还提供一种用于提供元数据的装置,包括:
请求接收单元,用于接收获取与指定时间点对应的MySQL主数据库元数据的请求;
数据库生成单元,用于根据预先存储的所述MySQL主数据库的基准元数据和DDL操作信息,生成本地MySQL数据库,该数据库与所述MySQL主数据库在所述指定时间点上的元数据一致;
数据返回单元,用于获取本地MySQL数据库中对应于MySQL主数据库的元数据,并返回给所述请求的发起方。
可选的,所述装置还包括基准元数据生成单元,用于预先生成并存储所述MySQL主数据库的基准元数据和DDL操作信息;
所述基准元数据生成单元包括:
基准元数据获取子单元,用于从所述MySQL主数据库获取元数据并存储,作为与执行所述获取操作的时间点相对应的基准元数据;
DDL操作信息获取子单元,用于以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制binlog数据,并存储所述binlog数据中与DDL操作相关的信息。
可选的,所述基准元数据生成单元还包括:
基准元数据导入子单元,用于将从所述MySQL主数据库获取的基准元数据导入本地MySQL数据库中;
相应的,所述DDL操作信息获取子单元具体用于,以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制binlog数据,并在本地MySQL数据库中执行所述binlog数据中的DDL操作,并存储相关信息。
所述基准元数据生成单元还包括:
基准元数据定期生成子单元,用于按照预先设定的时间间隔,定期获取本地MySQL数据库的元数据并存储,作为与执行所述获取操作的时间点对应的基准元数据。
可选的,所述数据库生成单元包括:
基准元数据选择子单元,用于从预先存储的所述MySQL主数据库的基准元数据中,选取其时间点早于并且临近所述指定时间点的基准元数据;
DDL操作信息选择子单元,用于从预先存储的DDL操作信息中,选择其时间戳晚于所选基准元数据对应的时间点、并且早于所述指定时间点的DDL操作信息;
基准元数据导入子单元,用于将所述基准元数据选择子单元选取的基准元数据导入本地MySQL数据库中;
DDL操作执行子单元,用于在执行了上述导入操作的本地MySQL数据库中,依次执行所述DDL操作信息选择子单元所选的DDL操作。
可选的,所述数据库生成单元还包括:
元数据清除子单元,用于在将选取的基准数据导入本地MySQL数据库之前,判断本地MySQL数据库是否已有与MySQL主数据库对应的元数据,若是,通过执行删除操作清除本地MySQL数据库中的所述元数据。
可选的,所述数据库生成单元还包括:
DDL操作剔除子单元,用于在本地MySQL数据库中依次执行所选的DDL操作之前,从所选的DDL操作信息中,剔除从整体上对本地MySQL数据库的元数据不产生影响的DDL操作信息;
相应的,所述DDL操作执行子单元具体用于,在本地MySQL数据库中依次执行完成上述剔除操作后的DDL语句。
与现有技术相比,本申请具有以下优点:
本申请提供的一种基于binlog的元数据管理方法,通过从MySQL主数据库获取基准元数据,并将在拉取binlog过程中提取的DDL操作信息进行集中管理,提供了对MySQL主数据库在各个时间点的元数据进行自主管理的一种方法,从而为生成从自主管理的起始时间点到当前时间点之间的任意时间点的元数据提供了可靠的依据。
本申请提供的一种用于提供元数据的方法,接收获取与指定时间点对应的MySQL主数据库元数据的请求后,根据预先存储的所述MySQL主数据库的基准元数据和DDL操作信息,生成与所述MySQL主数据库在所述指定时间点上的元数据一致的本地MySQL数据库,并将该数据库的元数据返回给所述请求的发起方。采用本方法,在不增加MySQL主数据库额外负担的情况下,不仅能够提供当前解析binlog所需的准确元数据信息,而且可以提供从自主管理的起始时间到当前时间之间的任意一个时间点的元数据信息,从而增强了binlog解析功能的容错性和可运维性,为MySQL数据库业务的批量运维、数据过滤、异构数据库同步、细粒度的并行同步等功能的实现提供了便利。
附图说明
图1是本申请的一种基于binlog的元数据管理方法的实施例的流程图;
图2是本申请实施例提供的获取DDL操作信息的处理过程的流程图;
图3是本申请的一种基于binlog的元数据管理装置的实施例的示意图;
图4是本申请的一种用于提供元数据的方法实施例的流程图;
图5是本申请实施例提供的生成本地MySQL数据库的处理流程图;
图6是本申请的一种用于提供元数据的装置实施例的示意图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
在本申请中,分别提供了一种基于binlog的元数据管理方法和装置、一种用于提供元数据的方法和装置,在下面的实施例中逐一进行详细说明。
请参考图1,其为本申请的一种基于binlog的元数据管理方法的实施例的流程图。所述方法包括如下步骤:
步骤101:从MySQL主数据库获取元数据,作为基准元数据。
所谓数据库的元数据,是指数据的数据,通常用于存储数据库及表的结构信息,包括:数据库名、表名、列名、数据类型、长度、主键、外键、索引、索引组合方式、编码方式等信息。数据库及表的结构并不是自创建后就一成不变的,可能会因为执行DDL(DataDefinition Language-数据定义语言)操作,使得数据库的元数据发生变化,本实施例技术方案通过从MySQL主数据库获取全量元数据作为基准元数据(获取该数据的时间点称为起始时间点),并在从MySQL主数据库拉取binlog的过程中,存储MySQL主数据库曾经执行的各个DDL操作,即:记录了元数据所发生的增量变化,从而为生成起始时间点与当前时间点之间的任意时间点的元数据提供了可靠的依据,实现了对MySQL主数据库的元数据的自主管理。
从MySQL主数据库获取基准元数据,可以先与MySQL主数据库建立数据连接,然后在该数据连接的基础上,向MySQL主数据库发送与获取元数据有关的命令,例如:“showcreate database db_name”以及“show create table tb_name”等,然后接收从MySQL主数据库返回的信息。
例如,“show create table t”命令,MySQL主数据库返回如下所示的信息:
CREATE TABLE t(
id INT(11)default NULL auto_increment,
s char(60)default NULL,
PRIMARY KEY(id))
上述信息实际上就是一个创建Table t的DDL语句,包含了与数据表t相关的元数据,例如列名、数据类型、长度以及主键等信息。当然上面列举的仅仅是一个示意性的例子,在具体的实施中,MySQL主数据库针对上述show命令返回的信息可能更为复杂。与“showcreate table tb_name”类似,“show create database db_name”命令的返回信息中会包含create database DDL语句。
由于通过上述“show create table”和“show create database”返回的DDL语句反映了数据库和表的结构信息,通过执行这些DDL语句就可以得到相应结构的数据库和表,因此这些通过show命令返回的DDL语句就组成了本实施例所述的元数据。
元数据可能随时间变化,因此本步骤从MySQL主数据库获取的元数据是与所述起始时间点对应的,而且由于该元数据是全量数据,可以作为生成其他时间点元数据的基准,因此称为与起始时间点对应的基准元数据。
如果要获取元数据的数据库和表的名称都是已知的,可以采用上述方式依次获取即可。但是如果不知道MySQL主数据库中具体包含哪些数据库和表,或者为了实现程序代码的复用,可以通过向MySQL主库发送下列命令的方式来获取MySQL主数据库的元数据。
1)发送“show database”命令,获取MySQL主库上的所有数据库的名称;
2)针对每个数据库,执行“show create databse db_name”命令,获取名称为db_name的数据库相关的元数据;
3)针对每个数据库,执行“show tables from db_name”命令,获取名称为db_name的数据库中的所有表的名称;
4)针对每个数据表,执行“show create table tb_name”,获取名称为tb_name的数据表的元数据。
通过上述方式获取MySQL主库在所述起始时间点的基准元数据后,可以存储在内存中,也可以存储在本地文件系统或者其他存储介质中。如果所述基准元数据的数据量比较大,例如达到了上百兆甚至超过了一个G,那么为了节省对存储空间的占用,通常可以压缩所述基准元数据,并将压缩后的基准元数据以文件的形式存储在本地文件系统或者其他存储介质中。在本实施例的一个具体例子中,采用的是the DEFLATE compression无损压缩算法执行的上述压缩操作。
需要说明的是,在本实施例的一个具体例子中,通过“show create table”和“show create database”命令获取与数据库和表相关的常规元数据,然而在实际应用中,可能还需要进一步获取其他一些元数据,例如与索引、枚举、约束、列字符集、编码方式等相关的元数据,在这种情况下可以采用类似的方法从MySQL主数据库的系统表中获取所需的元数据。
步骤102:将已获取的基准元数据导入本地MySQL数据库中。
之所以要将已获取的基准元数据导入本地MySQL数据库中,是为了生成一个与MySQL主数据库在起始时间点的元数据状态一致的本地MySQL数据库,并通过在后续步骤103中执行从binlog中获取的DDL语句,使得本地MySQL数据库与MySQL主数据库的元数据状态基本保持一致,从而在步骤104中能够定期地根据本地MySQL生成不同时间点的基准元数据,而不会对MySQL主库造成不必要的负担。
在本步骤中,如果本地尚未启动MySQL数据库服务,则可以执行下述操作:
1)用“mysql_install_db”命令初始化数据目录;
2)用“mysqld_safe”命令启动本地MySQL数据库服务。
通过在本地MySQL数据库中执行步骤101中获取的基准元数据包含的各个DDL语句,就可以将已获取的MySQL主数据库的基准元数据导入本地MySQL数据库中。具体说,可以先执行基准元数据中的“create database db_name”语句在本地创建名称为db_name的数据库,通过“use db_name”将创建的名称为db_name的数据库作为当前数据库,然后执行该数据库包含的各个表所对应的“create table tb_name”DDL语句,从而完成该数据库中表结构的创建。采用上述方式,执行所述基准元数据中的所有DDL语句,就可以完成本步骤的导入操作。
在具体实现时,可以通过链接libmysqlclient.so库,并调用C API访问本地MySQL数据库,也可以使用通用SQL接口访问本地MySQL数据库。
步骤103:以上述获取基准元数据的时间点为起点,从所述MySQL主数据库拉取二进制日志binlog数据,在本地MySQL数据中执行binlog数据中的DDL操作并存储相关信息。
为了获取MySQL主数据库在所述起始时间点之后的各个时间点的元数据变化情况,需要持续地从MySQL主数据库拉取binlog数据,并在该过程中,在本地MySQL数据库中执行binlog数据中每个DDL语句并存储相关信息。请参见附图2,为了便于描述,将该处理过程分为两个步骤进行说明。
步骤103-1:以所述起始时间点为起点,从MySQL主数据库拉取binlog数据。
为了便于理解,在此先对binlog作简要说明。binlog是MySQL以二进制形式存储的日志,其中记录了对MySQL数据库所作的更改操作,MySQL主数据库通常有一个或者多个二进制日志文件,不同的二进制日志文件通过文件扩展名采用不同的数字编号形式加以区分,例如:mysql-bin.00001,mysql-bin.00002等。
每个binlog文件头部都是4个字节的标记,随后就是一系列的LOG_EVENT,即:本申请所述的日志事件,正常情况下binlog按照逐LOG_EVENT的形式增长。LOG_EVENT的事件类型有很多种,其中用于记录数据库更改操作的LOG_EVENT的事件类型为查询事件(queryevent)。LOG_EVENT头部的第0-3字节记录执行数据库更改操作的主机时间,即为本申请所述的时间戳信息,例如:时间戳1390467118对应的就是Thu Jan 2316:51:58CST 2014这个时间点;LOG_EVENT头部的第13-16字节,记录了该LOG_EVENT的偏移量,即:在二进制日志文件中的位置;LOG_EVENT的事件体部分记录了具体的事件内容,例如:具体的DDL语句或者DML(Data Manipulation Language)语句等。
为了从MySQL主数据库拉取binlog数据,需要按照MySQL提供的原生命令COM_BINLOG_DUMP的接口要求,提供要获取的binlog数据的位点信息,即:希望获取的数据所在的binlog文件的文件名及其在该文件中的偏移量。而在本步骤中,需要拉取从所述起始时间点开始的binlog数据,因此需要将所述起始时间点转换为COM_BINLOG_DUMP接口需要的位点信息,下面对该转换过程作进一步说明。
首先,获取二进制日志文件列表。例如,可以向MySQL主数据库发送“show masterlogs”命令,然后接收MySQL主数据库返回的其本地二进制日志文件列表,例如,在本实施例的一个具体例子中,MySQL主数据库返回的列表中包含7个二进制日志文件文件,mysql-bin.000001、mysql-bin.000002、......mysql-bin.000007。
然后,在已获取的二进制日志文件列表所包含的二进制日志文件中,获取与所述起始时间点对应的二进制日志文件及偏移量信息。通过前面对binlog文件格式的介绍可以知道,binlog文件就像一个流文件,按照时间顺序记录了对MySQL数据库所做的更改。基于binlog文件格式的这种特点,可以采用二分查找法,查找其包含的第一个日志事件的时间戳不晚于所述起始时间点的最后一个文件,并从该文件的第一个日志事件开始执行遍历操作,找到其时间戳不早于所述起始时间点的第一个日志事件,读取该日志事件头部的第13-16字节就获取了该日志事件在当前二进制日志文件中的偏移量,从而找到了与所述起始时间对应的二进制日志文件以及偏移量信息。
获取上述信息后,就可以向MySQL主数据库发送MySQL的原生命令COM_BINLOG_DUMP,并根据该命令的格式要求,携带希望获取日志数据的位点信息,即:上述已获取的二进制日志文件的名称以及偏移量信息。随后就可以接收到MySQL主数据库返回的binlog数据,即:位于上述位点信息之后的新的增量日志数据。
步骤103-2:针对获取的binlog数据中的每一个日志事件,判断其记录的是否为DDL操作,若是,在本地MySQL数据库中执行该DDL操作并存储相关信息。
每次接收的binlog数据中可能包含多个日志事件(LOG_EVENT),根据binlog数据文件的格式,逐一提取其中的每个日志事件,如果该日志事件的事件类型不是Query event(事件类型信息记录在LOG_EVENT头部的第4个字节中),则继续提取下一个LOG_EVENT进行处理。
如果该日志事件为Query event,则进一步判断其事件体中记录的数据库更改操作是否为DDL操作,对于采用row方式进行记录更新的binlog文件,Queryevent包含的通常是DDL操作;而对于采用statement方式进行记录更新的binlog文件,Query event可能包含DML操作或DDL操作。因此,可以对Query event事件体中记录的数据库更改操作语句进行语法解析,如果包含的是DDL语句(例如常用的Create、Drop等语句)则执行下述两项操作,否则采用上述方式继续处理下一个LOG_EVENT,直至将本次获取的binlog数据中的LOG_EVENT处理完毕。
1)在本地MySQL数据库中执行所述DDL操作。
在本地MySQL数据库中执行从binlog数据中获取的DDL操作,即:使本地MySQL数据库也发生与MySQL主数据库相同的数据库或表结构的变更。
在具体实现时,可以通过链接libmysqlclient.so库,并调用C API访问本地MySQL数据库,也可以使用通用SQL接口访问本地MySQL数据库,例如使用通用SQL接口执行Createtable DDL语句等。
2)存储所述DDL操作的相关信息。
在步骤101中已经获取了MySQL主数据库在起始时间点的基准元数据(即:起始时间点的全量元数据),在本步骤中,再将从起始时间点拉取的binlog数据中的DDL操作信息存储下来,也就获取了在基准元数据基础上的MySQL主数据库的结构变更的增量信息。获取并存储了上述两类数据,就能够灵活地提供MySQL主数据库在起始时间点之后的任意一个时间点的元数据,从而为需要该信息的其他数据库应用或者业务提供服务。
在本步骤中,存储从binlog数据中获取的DDL操作的相关信息,所述DDL操作的相关信息包括:与DDL操作相关的DDL语句、该DDL操作在binlog数据中的时间戳信息。在具体实现中,可以将上述信息存储在内存中,也可以存储在本地文件系统或者数据库中。在本实施例的一个具体例子中,在本地MySQL数据库中单独创建了一个用于存储元数据相关信息的表,并将上述DDL操作的相关信息存储在该表中。
上面描述了从MySQL主数据库拉取binlog数据并存储其中的DDL操作信息的处理过程。需要说明的是,上述拉取过程和对DDL操作的处理过程并不是一次性完成的,为了持续获取MySQL主数据库的元数据变化情况,需要反复执行上述操作,即:每次接收到MySQL数据库返回的增量binlog数据并处理后,都需要设置新的位点信息,并且再次发送COM_BINLOG_DUMP命令,获取下一次的增量binlog数据并进行同样的处理。
步骤104:按照预先设定的时间间隔,定期生成基准元数据。
从理论上说,存储了MySQL主数据库在起始时间点的基准元数据,以及之后MySQL主数据库执行的DDL操作信息后,对外提供元数据服务的应用或者模块就可以依据上述数据,通过在本地数据库加载基准元数据并执行起始时间点和指定时间点之间的DDL操作,生成所述起始时间点之后的任意一个指定时间点的元数据。
在起始时间点和指定时间点之间的DDL操作数量比较多的情况下,上述生成元数据的过程因为要逐一执行DDL操作,会比较耗时,影响对外提供元数据据的应用或者模块的整体性能。考虑到上述情况,本实施例的技术方案采用了一种优选实施方式进行元数据的管理,即:按照预先设定的时间间隔,定期生成不同时间点的基准元数据(也称为元数据的基备份)。采用这种元数据管理方式,便于对外提供元数据的模块或应用选择与指定时间点最近的基准元数据,从而有助于提高其整体性能。
要生成不同时间点的基准元数据,并且不增加MySQL主数据库的负担,本实施例的技术方案维护了一个本地MySQL数据库(参见步骤102和步骤103中的说明)。并按照预先设定的时间间隔,定期执行下述操作:
首先,从本地MySQL数据库获取对应于MySQL主数据库的元数据。可以采用在步骤101中描述的类似方式,即:通过“show create table”、“show create database”等命令,获取本地MySQL数据库的元数据。需要说明的是,如果在前面的步骤103中,在本地MySQL数据库中单独创建了一个用于存储元数据相关信息的表,那么在本步骤中不获取该表的元数据。
然后,采用步骤101所述的无损压缩算法对上述获取的元数据进行压缩,并将压缩后的元数据以文件的形式存储在本地文件系统中,作为与本次执行获取操作的时间点对应的基准元数据;
最后,存储获取上述基准元数据的时间点和存储所述基准元数据的文件名称。如果在步骤103中,在本地MySQL数据库中已经创建了一个用于存储元数据相关信息的表(DDL操作信息存储在该表中),为了便于查询,在本步骤中可以将定期生成的基准元数据的文件名和对应的时间点也存储在该表中。步骤101中在起始时间点获取的MySQL主数据库的基准元数据文件及所述起始时间点也可以一并存放在该表中。对外提供元数据的应用或者模块,通过对该表的查询,就可以获取与特定时间点对应的基准元数据以及在特定时间范围内的DDL操作信息。
需要说明的是,本实施例从MySQL主数据库拉取binlog数据并在本地MySQL数据库中执行其中的DDL操作,即:在MySQL主数据库上执行的DDL操作,也会在本地MySQL数据库上执行,然而两者之间可能存在一定的时延,也就是说当前时间点从MySQL本地数据库中获取的基准元数据,可能与MySQL主数据库在当前时间点的元数据不完全一致。但是,因为在本地存储的DDL操作信息的时间戳记录了该操作在MySQL主数据库中的执行时间点,因此根据本步骤生成的基准元数据以及DDL操作信息,可以获取起始时间点与当前时间点之间的某个历史时间点(例如:当前解析的binlog数据中的时间戳对应的时间点)对应的MySQL主数据库的准确元数据。从这个角度上考虑,可以认为本步骤中定期生成的基准元数据,同样起到了在获取MySQL主数据库元数据过程中的基准作用,因此可以用该数据作为MySQL主数据库的基准元数据。
在实际实施中,由于定期生成的基准元数据会占据越来越多的存储空间,因此可以根据获取元数据的实际需求,以及本地存储空间的限制,采用一定的策略定期进行基准元数据的清理。例如,可以每隔一段时间进行一次检查,从本地文件系统中删除存储时间超过预先设定期限的基准元数据文件(例如:删除存储时间超过7天的基准元数据文件);删除基准元数据文件的同时,也应该从本地MySQL数据库中的用于存储元数据相关信息的表中,删除与该文件相关的信息,以及与该文件对应的DDL操作信息,即:时间戳位于该基准元数据的时间点和与其临近的基准元数据时间点之间的所有DDL操作的相关信息。
上述步骤给出的是本申请技术方案的一种优选实施方式,对于实现本申请的技术方案来说,上述步骤并非都是必需的。例如,在从MySQL主数据库获取了基准元数据后,只要记录了后续从binlog中获取的DDL操作信息,就可以依据这些信息提供MySQL主数据库在起始时间点之后的各时间点的元数据,实现了本申请对元数据进行自主管理的目的,也就是说,可以不执行步骤102、以及步骤103中关于在本地执行DDL操作的部分、以及步骤104,同样可以实现本申请的技术方案。
综上所述,本申请提供的一种基于binlog的元数据管理方法,通过从MySQL主数据库获取基准元数据,并将在拉取binlog过程中提取的DDL操作信息进行集中管理,提供了对MySQL主数据库在各个时间点的元数据进行自主管理的一种方法,从而为生成从起始时间点到当前时间点之间的任意时间点的元数据提供了可靠的依据。
在上述的实施例中,提供了一种基于binlog的元数据管理方法,与之相对应的,本申请还提供一种基于binlog的元数据管理装置。请参看图3,其为本申请的一种基于binlog的元数据管理装置的实施例示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。
本实施例的一种基于binlog的元数据管理装置,包括:基准元数据获取单元301,用于从MySQL主数据库获取元数据,作为基准元数据;基准元数据导入单元302,用于在压缩所述基准元数据之前,将已获取的基准元数据导入本地MySQL数据库中;DDL操作信息获取单元303,用于以上述获取基准元数据的时间点为起点,从所述MySQL主数据库拉取二进制日志binlog数据,在本地MySQL数据中执行binlog数据中的DDL操作并存储相关信息;基准元数据定期生成单元304,用于按照预先设定的时间间隔生成基准元数据。
可选的,所述DDL操作信息获取单元包括:
binlog数据获取子单元,用于以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制日志binlog数据;
DDL信息处理子单元,用于针对binlog数据中的每个日志事件,判断该日志事件记录的是否为DDL操作;若是,在本地MySQL数据库中执行存储所述DDL操作并存储相关信息。
可选的,所述DDL操作信息获取单元存储的DDL信息包括:所述DDL操作对应的DDL语句,以及所述DDL操作在所述binlog数据中对应的时间戳信息。
可选的,所述装置包括:
数据压缩单元,用于压缩所述基准元数据,并将压缩后的基准元数据以文件的形式存储在本地文件系统中。
可选的,所述DDL信息处理子单元包括:
DDL判断子单元,用于针对binlog数据中的每个日志事件,判断该日志事件记录的是否为DDL操作;
DDL执行子单元,用于当所述判断子单元的输出为“是”时,在本地MySQL数据库中执行所述DDL操作,并触发DDL存储子单元工作;
DDL存储子单元,用于存储所述DDL操作的相关信息。
可选的,所述DDL存储子单元,具体用于,将与DDL操作相关的DDL语句和时间戳信息存储在本地MySQL数据库中的一个用于存储元数据相关信息的特定数据表中;
相应的,所述装置还包括:
基准元数据存储单元,用于将所述获取基准元数据的时间点和存储基准元数据所使用的文件名称,存储在本地MySQL数据库中的所述特定数据表中。
可选的,所述基准元数据定期生成单元包括:
定时控制子单元,用于根据预先设定的时间间隔定时触发下列子单元工作;
本地元数据获取子单元,用于从本地MySQL数据库获取对应于MySQL主数据库的元数据;
基准元数据压缩子单元,用于压缩所述元数据,并将压缩后的元数据以文件的形式存储在本地文件系统中,作为与本次执行获取操作的时间点对应的基准元数据;
基准元数据信息存储子单元,用于将获取上述基准元数据的时间点和存储所述基准元数据的文件名称,存储在本地MySQL数据库中的所述特定数据表中。
可选的,所述装置还包括:
基准元数据清理单元,用于按照预先设定的时间间隔,从本地文件系统中删除存储时间超过预先设定期限的基准元数据文件,并从所述本地MySQL数据库中删除与被删除的文件对应的DDL操作的相关信息。
与上述的一种基于binlog的元数据管理方法相对应的,本申请还提供一种用于提供元数据的方法。请参考图4,其为本申请提供的一种用于提供元数据的方法实施例的流程图,本实施例与第一实施例步骤相同的部分不再赘述,下面重点描述不同之处。本申请提供的一种用于提供元数据的方法包括:
步骤401:生成并存储MySQL主数据库的基准元数据和DDL操作信息。
本步骤通过以下方式生成MySQL主数据库的基准元数据和DDL操作信息:从所述MySQL主数据库获取元数据并存储,作为与执行所述获取操作的起始时间点相对应的基准元数据;以上述起始时间点为起点,从所述MySQL主数据库获取二进制binlog数据,并存储所述binlog数据中与DDL操作相关的信息;所述与DDL操作相关的信息包括:所述DDL操作对应的DDL语句及其在binlog数据中的时间戳。
通过上述方式生成了MySQL主数据库在起始时间点的基准元数据并存储了随后的DDL操作信息,在本步骤中还可以在上述基础上采用如下方式生成在多个时间点的基准元数据:将从所述MySQL主数据库获取的基准元数据导入本地MySQL数据库中;并且,每次存储所述binlog数据中与DDL操作相关的信息之前,在本地MySQL数据库中执行所述DDL操作;按照预先设定的时间间隔,定期获取本地MySQL数据库的元数据并存储,作为与执行所述获取操作的时间点对应的基准元数据。关于上述处理过程的详细描述,请参见第一实施例中的相关说明。
定期生成的基准元数据,可以作为MySQL主数据库的基准元数据,与已存储的DDL操作信息相配合,得到MySQL主数据库在起始时间点之后的任一时间点的元数据。具体说明请参见下面的步骤402-404。
步骤402:接收获取与指定时间点对应的MySQL主数据库元数据的请求。
在MySQL数据库业务中,经常会有这样的需求,即:将MySQL主数据库中的数据同步到其他关系型数据库,或者是nosql数据库中。在同步过程中,由于某些原因,对拉取的binlog数据进行解析所使用的元数据信息已经发生错误了,即:已经与被解析数据不相匹配了,然而同步过程并没有终止,而是在这种不一致的状态下继续进行。当同步过程抛出错误信息或者通过人为干预发现这一问题时,需要回退到同步过程最初发生错误的时间点重新拉取binlog数据,在这种情况下,该同步任务就会向负责提供元数据的模块或应用发送获取MySQL主数据库元数据的请求,该请求中携带了重新拉取binlog的位点信息,即:binlog数据中的时间戳(即本步骤所述的指定时间点)。负责提供元数据的模块或应用自然就会接收到该请求。
步骤403:根据预先存储的所述MySQL主数据库的基准元数据和DDL操作信息,生成本地MySQL数据库,该数据库与所述MySQL主数据库在所述指定时间点上的元数据一致。
生成与MySQL主数据库在指定时间点上的元数据一致的本地MySQL数据库的过程,包括步骤403-1至步骤403-4,下面结合附图5对各个步骤作进一步的说明。
步骤403-1:从预先存储的所述MySQL主数据库的基准元数据中,选取其时间点早于并且临近所述指定时间点的基准元数据。
如果预先存储的MySQL主数据库的基准元数据只有一个,即:在起始时间点从MySQL主数据库获取的基准元数据,那么在本步骤中直接选择该基准元数据;如果预先存储了多个与不同时间点对应的MySQL主数据库的基准元数据,则从中选择其时间点早于并且临近所述指定时间点的基准元数据,例如:有四个基准元数据,其时间点分别为1日零时、11日零时、21日零时、31日零时,而指定的时间戳对应15目的某个时间点,与该时间点临近的基准元数据为11日零时和21日零时的,其中时间点早于指定时间点的是11日零时的基准元数据,因此在本步骤选择11日零时的基准元数据。
步骤403-2:从预先存储的DDL操作信息中,选择其时间戳晚于所选基准元数据对应的时间点、并且早于所述指定时间点的DDL操作信息。
在步骤403-1中根据指定时间点选择了一个基准元数据,即:选取了一个全量的元数据,在本步骤中选择其时间戳晚于所选基准元数据对应的时间点、并且早于指定时间点的DDL操作信息,即:在上述全量元数据的基础上进一步选取了所述指定时间点之前的增量DDL操作,由这两部分数据就可以确定与所述指定时间点对应的MySQL主数据库的元数据。
步骤403-3:将选取的基准元数据导入本地MySQL数据库中。
将步骤403-2中选取的基准元数据导入本地MySQL数据库之前,需要先判断所述基准元数据是否经过压缩处理,若是,则执行解压缩处理,恢复原始的基准元数据,然后再执行本步骤所述的导入操作。具体的导入处理过程与第一实施例中的步骤102中的描述类似,请参见该部分的相关说明,此处不再赘述。
需要说明的是,在执行上述导入操作之前,需要先判断本地MySQL数据库中是否已有与MySQL主数据库对应的元数据,如果有,该元数据与当前所需的与指定时间点对应的元数据通常是不一致的,因此需要先清除本地MySQL数据库中的元数据,具体说,针对本地MySQL数据库中与MySQL主数据库对应的每个表和数据库,通过执行“Drop table tb_name”命令和“Drop database db_name”命令删除对应的元数据。
步骤403-4:在执行了上述导入操作的本地MySQL数据库中依次执行所选的DDL操作。
在本地MySQL数据库中导入了步骤403-1所选的基准元数据后,依次执行在步骤403-2中选取的DDL操作,那么本地MySQL数据库的元数据就与所述指定时间点上的MySQL主数据库的元数据保持一致。关于在本地MySQL数据库中执行DDL操作的说明请参见第一实施例步骤103-2中的相关部分。
在本地MySQL数据库中依次执行所选的DDL操作之前,可以先对待执行的DDL操作进行筛选,从中剔除从整体上对本地MySQL数据库的元数据不产生影响的DDL操作信息。例如,在待执行的DDL操作中有这样的情况,存在一个较早时间点的DDL操作为“create tableX”,一个较晚时间点的DDL操作为“drop table X”,那么在这两个时间点之间(包括这两个时间点)的DDL语句都可以剔除(标记为不执行),因为这些DDL语句的执行最终不会对本地MySQL数据库的元数据产生影响。然后再在本地MySQL数据库执行筛选出的、未剔除的那些DDL操作,从而可以减少执行DDL操作的时间,提高处理效率。
通过上述步骤403-1至403-4,就生成了与MySQL主数据库在所述指定时间点上元数据一致的本地MySQL数据库,在步骤404中就可以获取本地MySQL数据库中的元数据并返回给所述请求的发起方。
在具体实施过程中可能存在这样一种情况,步骤401从MySQL主数据库拉取的binlog数据可以同时提供给其他进行数据同步的模块,该模块在进行当前binlog数据解析的过程中,如果需要获取与当前binlog数据的时间戳对应的元数据信息,也可能会向负责提供元数据的模块或应用发送获取元数据的请求,该请求中携带当前处理的binlog数据的时间戳信息(即:指定的时间点)。
在这种情况下,负责提供元数据的模块或应用如果在步骤101中根据拉取的binlog数据已经维护了本地MySQL数据库,并且请求中指定的时间戳大于已经存储的DDL操作信息中最近一个DDL操作的时间戳,则说明当前本地MySQL数据库的元数据就是解析当前binlog数据所需的元数据(与指定时间点对应的元数据),因此可以不执行本步骤403的操作,而是直接执行步骤404的操作,从本地MySQL数据库中获取元数据并返回给所述请求的发起方。
步骤404:获取本地MySQL数据库中对应于MySQL主数据库的元数据,并返回给所述请求的发起方。
通过C API或者通用SQL接口访问本地MySQL数据库,针对本地MySQL数据库中对应于MySQL主数据库的每个数据库和表,执行“show create table tb_name”或“show createdatabase db_name”等命令,可以获取本地MySQL数据库的元数据。
通过上述方式获取的元数据与MySQL主数据库在指定时间点的元数据是一致的,本步骤可以直接将该数据返回给所述请求的发起方,也可以对该数据重新进行组织,按照与所述请求方预先约定好的数据格式返回给所述请求方。所述请求方接收该元数据后,就可以根据该元数据对所述指定时间点的binlog数据进行解析,从而实现数据同步等功能。
至此,就完成了根据指定的时间点提供元数据的功能。需要说明的是,步骤401并不是每次都要执行的,而是预先生成好的,当有需求需要获取指定时间点的元数据时,直接执行步骤402-404即可获取所需元数据,并对外提供服务。另外在具体的实施过程中,步骤401所述的基准元数据和DDL操作信息也可以由专门负责进行MySQL元数据管理的应用或者模块提供,在这种情况下,负责提供元数据的模块或应用就不用执行步骤401,而是直接执行步骤402-步骤404,根据需求提供指定时间点的元数据。
综上所述,采用本申请提供的一种用于提供元数据的方法,在不增加MySQL主数据库额外负担的情况下,不仅能够提供当前解析binlog所需的准确元数据信息,而且可以提供从起始时间到当前时间之间的任意一个时间点的元数据,从而增强了binlog解析功能的容错性和可运维性,为MySQL数据库业务的批量运维、数据过滤、异构数据库同步、细粒度的并行同步等功能的实现提供了便利。
在上述的实施例中,提供了一种用于提供元数据的方法,与之相对应的,本申请还提供一种用于提供元数据的装置。请参看图6,其为本申请的一种用于提供元数据的装置的实施例示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。
本实施例的一种用于提供元数据的装置,包括:基准元数据生成单元601,用于预先生成并存储所述MySQL主数据库的基准元数据和DDL操作信息;请求接收单元602,用于接收获取与指定时间点对应的MySQL主数据库元数据的请求;数据库生成单元603,用于根据预先存储的所述MySQL主数据库的基准元数据和DDL操作信息,生成本地MySQL数据库,该数据库与所述MySQL主数据库在所述指定时间点上的元数据一致;数据返回单元604,用于获取本地MySQL数据库中对应于MySQL主数据库的元数据,并返回给所述请求的发起方。
可选的,所述基准元数据生成单元包括:
基准元数据获取子单元,用于从所述MySQL主数据库获取元数据并存储,作为与执行所述获取操作的时间点相对应的基准元数据;
DDL操作信息获取子单元,用于以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制binlog数据,并存储所述binlog数据中与DDL操作相关的信息。
可选的,所述基准元数据生成单元还包括:
基准元数据导入子单元,用于将从所述MySQL主数据库获取的基准元数据导入本地MySQL数据库中;
相应的,所述DDL操作信息获取子单元具体用于,以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制binlog数据,并在本地MySQL数据库中执行所述binlog数据中的DDL操作,并存储相关信息。
所述基准元数据生成单元还包括:
基准元数据定期生成子单元,用于按照预先设定的时间间隔,定期获取本地MySQL数据库的元数据并存储,作为与执行所述获取操作的时间点对应的基准元数据。
可选的,所述数据库生成单元包括:
基准元数据选择子单元,用于从预先存储的所述MySQL主数据库的基准元数据中,选取其时间点早于并且临近所述指定时间点的基准元数据;
DDL操作信息选择子单元,用于从预先存储的DDL操作信息中,选择其时间戳晚于所选基准元数据对应的时间点、并且早于所述指定时间点的DDL操作信息:
基准元数据导入子单元,用于将所述基准元数据选择子单元选取的基准元数据导入本地MySQL数据库中;
DDL操作执行子单元,用于在执行了上述导入操作的本地MySQL数据库中,依次执行所述DDL操作信息选择子单元所选的DDL操作。
可选的,所述数据库生成单元还包括:
元数据清除子单元,用于在将选取的基准数据导入本地MySQL数据库之前,判断本地MySQL数据库是否已有与MySQL主数据库对应的元数据,若是,通过执行删除操作清除本地MySQL数据库中的所述元数据。
可选的,所述数据库生成单元还包括:
DDL操作剔除子单元,用于在本地MySQL数据库中依次执行所选的DDL操作之前,从所选的DDL操作信息中,剔除从整体上对本地MySQL数据库的元数据不产生影响的DDL操作信息;
相应的,所述DDL操作执行子单元具体用于,在本地MySQL数据库中依次执行完成上述剔除操作后的DDL语句。
本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
Claims (26)
1.一种基于binlog的元数据管理方法,其特征在于,包括:
从MySQL主数据库获取元数据,作为基准元数据;
以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制日志binlog数据;在上述获取binlog数据的过程中,针对所述binlog数据中的每个日志事件执行下述操作:
判断所述日志事件记录的是否为DDL操作;
若是,存储与所述DDL操作相关的信息。
2.根据权利要求1所述的基于binlog的元数据管理方法,其特征在于,与所述DDL操作相关的信息包括:所述DDL操作对应的DDL语句,以及所述DDL操作在所述binlog数据中对应的时间戳信息。
3.根据权利要求2所述的基于binlog的元数据管理方法,其特征在于,包括:
压缩所述基准元数据,并将压缩后的基准元数据以文件的形式存储在本地文件系统中。
4.根据权利要求3所述的基于binlog的元数据管理方法,其特征在于,在执行所述压缩所述基准元数据的步骤前,执行下述操作:
将已获取的基准元数据导入本地MySQL数据库中;
相应的,如果所述判断所述日志事件记录的是否为DDL操作的结果为“是”,则在存储与所述DDL操作相关的信息之前,执行下述操作:
在本地MySQL数据库中执行所述DDL操作。
5.根据权利要求4所述的基于binlog的元数据管理方法,其特征在于,所述存储与DDL操作相关的信息是指,将与DDL操作相关的DDL语句和时间戳信息存储在本地MySQL数据库中的一个用于存储元数据相关信息的特定数据表中;
相应的,所述方法还包括:
将所述获取基准元数据的时间点和存储基准元数据所使用的文件名称,存储在本地MySQL数据库中的所述特定数据表中。
6.根据权利要求5所述的基于binlog的元数据管理方法,其特征在于,包括:
按照预先设定的时间间隔,定期执行下述操作:
从本地MySQL数据库获取对应于MySQL主数据库的元数据;
压缩所述元数据,并将压缩后的元数据以文件的形式存储在本地文件系统中,作为与本次执行获取操作的时间点对应的基准元数据;
将获取上述基准元数据的时间点和存储所述基准元数据的文件名称,存储在本地MySQL数据库中的所述特定数据表中。
7.根据权利要求6所述的基于binlog的元数据管理方法,其特征在于,包括:
按照预先设定的时间间隔,从本地文件系统中删除存储时间超过预先设定期限的基准元数据文件,并从本地MySQL数据库中删除与被删除的文件对应的DDL操作的相关信息。
8.一种基于binlog的元数据管理装置,其特征在于,包括:
基准元数据获取单元,用于从MySQL主数据库获取元数据,作为基准元数据;
DDL操作信息获取单元,用于以上述获取基准元数据的时间点为起点,获取并存储MySQL主数据库执行的DDL操作信息;
所述DDL操作信息获取单元包括:
binlog数据获取子单元,用于以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制日志binlog数据;
DDL信息处理子单元,用于针对binlog数据中的每个日志事件,判断该日志事件记录的是否为DDL操作;若是,存储与所述DDL操作相关的信息。
9.根据权利要求8所述的基于binlog的元数据管理装置,其特征在于,所述DDL操作信息获取单元存储的DDL信息包括:所述DDL操作对应的DDL语句,以及所述DDL操作在所述binlog数据中对应的时间戳信息。
10.根据权利要求9所述的基于binlog的元数据管理装置,其特征在于,包括:
数据压缩单元,用于压缩所述基准元数据,并将压缩后的基准元数据以文件的形式存储在本地文件系统中。
11.根据权利要求10所述的基于binlog的元数据管理装置,其特征在于,包括:
基准元数据导入单元,用于在压缩所述基准元数据之前,将已获取的基准元数据导入本地MySQL数据库中;
相应的,所述DDL信息处理子单元具体用于,针对binlog数据中的每个日志事件,判断该日志事件记录的是否为DDL操作;若是,在本地MySQL数据库中执行存储所述DDL操作并存储相关信息;
所述DDL信息处理子单元包括:
DDL判断子单元,用于针对binlog数据中的每个日志事件,判断该日志事件记录的是否为DDL操作;
DDL执行子单元,用于当所述判断子单元的输出为“是”时,在本地MySQL数据库中执行所述DDL操作,并触发DDL存储子单元工作;
DDL存储子单元,用于存储所述DDL操作的相关信息。
12.根据权利要求11所述的基于binlog的元数据管理装置,其特征在于,所述DDL存储子单元,具体用于,将与DDL操作相关的DDL语句和时间戳信息存储在本地MySQL数据库中的一个用于存储元数据相关信息的特定数据表中;
相应的,所述装置还包括:
基准元数据信息存储单元,用于将所述获取基准元数据的时间点和存储基准元数据所使用的文件名称,存储在本地MySQL数据库中的所述特定数据表中。
13.根据权利要求12所述的基于binlog的元数据管理装置,其特征在于,所述装置还包括:
基准元数据定期生成单元,用于按照预先设定的时间间隔生成基准元数据;
所述基准元数据定期生成单元包括:
定时控制子单元,用于根据预先设定的时间间隔定时触发下述本地元数据获取子单元、基准元数据压缩子单元和基准元数据信息存储子单元工作;
本地元数据获取子单元,用于从本地MySQL数据库获取对应于MySQL主数据库的元数据;
基准元数据压缩子单元,用于压缩所述元数据,并将压缩后的元数据以文件的形式存储在本地文件系统中,作为与本次执行获取操作的时间点对应的基准元数据;
基准元数据信息存储子单元,用于将获取上述基准元数据的时间点和存储所述基准元数据的文件名称,存储在本地MySQL数据库中的所述特定数据表中。
14.根据权利要求13所述的基于binlog的元数据管理装置,其特征在于,所述装置还包括:
基准元数据清理单元,用于按照预先设定的时间间隔,从本地文件系统中删除存储时间超过预先设定期限的基准元数据文件,并从所述本地MySQL数据库中删除与被删除的文件对应的DDL操作的相关信息。
15.一种用于提供元数据的方法,其特征在于,包括:
接收获取与指定时间点对应的MySQL主数据库元数据的请求;
根据预先存储的所述MySQL主数据库的基准元数据和DDL操作信息,生成本地MySQL数据库,该数据库与所述MySQL主数据库在所述指定时间点上的元数据一致;
获取本地MySQL数据库中对应于MySQL主数据库的元数据,并返回给所述请求的发起方。
16.根据权利要求15所述的用于提供元数据的方法,其特征在于,所述MySQL主数据库的基准元数据和DDL操作信息,是通过以下步骤生成的:
从所述MySQL主数据库获取元数据并存储,作为与执行所述获取操作的时间点相对应的基准元数据;
以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制binlog数据,并存储所述binlog数据中与DDL操作相关的信息;所述与DDL操作相关的信息包括:所述DDL操作对应的DDL语句及其在binlog数据中的时间戳。
17.根据权利要求16所述的用于提供元数据的方法,其特征在于,所述生成所述MySQL主数据库的基准元数据和DDL操作信息的步骤,还包括:
将从所述MySQL主数据库获取的基准元数据导入本地MySQL数据库中;并且,每次存储所述binlog数据中与DDL操作相关的信息之前,在本地MySQL数据库中执行所述DDL操作;
按照预先设定的时间间隔,定期获取本地MySQL数据库的元数据并存储,作为与执行所述获取操作的时间点对应的基准元数据。
18.根据权利要求15-17任一所述的用于提供元数据的方法,其特征在于,所述根据预先存储的所述MySQL主数据库的基准元数据和DDL操作信息,生成本地MySQL数据库,包括:
从预先存储的所述MySQL主数据库的基准元数据中,选取其时间点早于并且临近所述指定时间点的基准元数据;
从预先存储的DDL操作信息中,选择其时间戳晚于所选基准元数据对应的时间点、并且早于所述指定时间点的DDL操作信息;
将选取的基准元数据导入本地MySQL数据库中;
在执行了上述导入操作的本地MySQL数据库中依次执行所选的DDL操作。
19.根据权利要求18所述的用于提供元数据的方法,其特征在于,在执行所述将选取的基准数据导入本地MySQL数据库的步骤之前,执行下述操作:
判断本地MySQL数据库是否已有与MySQL主数据库对应的元数据;
若是,通过执行删除操作清除本地MySQL数据库中的所述元数据。
20.根据权利要求18所述的用于提供元数据的方法,其特征在于,在执行了导入操作的本地MySQL数据库中依次执行所选的DDL操作之前,执行下述操作:
从所选的DDL操作信息中,剔除从整体上对本地MySQL数据库的元数据不产生影响的DDL操作信息;
相应的,所述在本地MySQL数据库中依次执行所选的DDL操作是指,在本地MySQL数据库中依次执行完成上述剔除操作后的DDL语句。
21.一种用于提供元数据的装置,其特征在于,包括:
请求接收单元,用于接收获取与指定时间点对应的MySQL主数据库元数据的请求;
数据库生成单元,用于根据预先存储的所述MySQL主数据库的基准元数据和DDL操作信息,生成本地MySQL数据库,该数据库与所述MySQL主数据库在所述指定时间点上的元数据一致;
数据返回单元,用于获取本地MySQL数据库中对应于MySQL主数据库的元数据,并返回给所述请求的发起方。
22.根据权利要求21所述的用于提供元数据的装置,其特征在于,所述装置还包括基准元数据生成单元,用于预先生成并存储所述MySQL主数据库的基准元数据和DDL操作信息;
所述基准元数据生成单元包括:
基准元数据获取子单元,用于从所述MySQL主数据库获取元数据并存储,作为与执行所述获取操作的时间点相对应的基准元数据;
DDL操作信息获取子单元,用于以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制binlog数据,并存储所述binlog数据中与DDL操作相关的信息。
23.根据权利要求22所述的用于提供元数据的装置,其特征在于,所述基准元数据生成单元还包括:
基准元数据导入子单元,用于将从所述MySQL主数据库获取的基准元数据导入本地MySQL数据库中;
相应的,所述DDL操作信息获取子单元具体用于,以上述获取基准元数据的时间点为起点,从所述MySQL主数据库获取二进制binlog数据,并在本地MySQL数据库中执行所述binlog数据中的DDL操作,并存储相关信息;
所述基准元数据生成单元还包括:
基准元数据定期生成子单元,用于按照预先设定的时间间隔,定期获取本地MySQL数据库的元数据并存储,作为与执行所述获取操作的时间点对应的基准元数据。
24.根据权利要求21-23任一所述的用于提供元数据的装置,其特征在于,所述数据库生成单元包括:
基准元数据选择子单元,用于从预先存储的所述MySQL主数据库的基准元数据中,选取其时间点早于并且临近所述指定时间点的基准元数据;
DDL操作信息选择子单元,用于从预先存储的DDL操作信息中,选择其时间戳晚于所选基准元数据对应的时间点、并且早于所述指定时间点的DDL操作信息;
基准元数据导入子单元,用于将所述基准元数据选择子单元选取的基准元数据导入本地MySQL数据库中;
DDL操作执行子单元,用于在执行了上述导入操作的本地MySQL数据库中,依次执行所述DDL操作信息选择子单元所选的DDL操作。
25.根据权利要求24所述的用于提供元数据的装置,其特征在于,所述数据库生成单元还包括:
元数据清除子单元,用于在将选取的基准数据导入本地MySQL数据库之前,判断本地MySQL数据库是否已有与MySQL主数据库对应的元数据,若是,通过执行删除操作清除本地MySQL数据库中的所述元数据。
26.根据权利要求24所述的用于提供元数据的装置,其特征在于,所述数据库生成单元还包括:
DDL操作剔除子单元,用于在本地MySQL数据库中依次执行所选的DDL操作之前,从所选的DDL操作信息中,剔除从整体上对本地MySQL数据库的元数据不产生影响的DDL操作信息;
相应的,所述DDL操作执行子单元具体用于,在本地MySQL数据库中依次执行完成上述剔除操作后的DDL语句。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410403789.5A CN105447014B (zh) | 2014-08-15 | 2014-08-15 | 基于binlog的元数据管理方法和用于提供元数据的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410403789.5A CN105447014B (zh) | 2014-08-15 | 2014-08-15 | 基于binlog的元数据管理方法和用于提供元数据的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105447014A CN105447014A (zh) | 2016-03-30 |
CN105447014B true CN105447014B (zh) | 2019-03-15 |
Family
ID=55557209
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410403789.5A Active CN105447014B (zh) | 2014-08-15 | 2014-08-15 | 基于binlog的元数据管理方法和用于提供元数据的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105447014B (zh) |
Families Citing this family (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105915386A (zh) * | 2016-05-31 | 2016-08-31 | 努比亚技术有限公司 | 一种控制方法及控制器、监听设备 |
CN106021593A (zh) * | 2016-06-07 | 2016-10-12 | 浪潮电子信息产业股份有限公司 | 一种第一数据库与第二数据库接管过程中的复制处理方法 |
CN107861958B (zh) * | 2016-09-22 | 2021-10-01 | 腾讯科技(深圳)有限公司 | 一种元数据同步方法及装置 |
CN106446239A (zh) * | 2016-10-11 | 2017-02-22 | 北京集奥聚合科技有限公司 | 一种基于binlog的数据实时处理方法及系统 |
CN107103041A (zh) * | 2017-03-28 | 2017-08-29 | 广东网金控股股份有限公司 | 一种sql server数据库更新的存储方法和存储系统 |
CN107491558B (zh) * | 2017-09-08 | 2020-09-15 | 北京奇艺世纪科技有限公司 | 元数据更新方法及装置 |
CN108345684A (zh) * | 2018-03-06 | 2018-07-31 | 弘成科技发展有限公司 | 基于多维度多指标体系的智能分析系统及分析方法 |
CN109145060B (zh) * | 2018-07-20 | 2020-09-04 | 腾讯科技(深圳)有限公司 | 数据处理方法及装置 |
CN109491834B (zh) * | 2018-10-23 | 2021-02-26 | 网宿科技股份有限公司 | 一种应用于数据库的数据恢复方法及装置 |
CN109783504A (zh) * | 2019-01-23 | 2019-05-21 | 广州华多网络科技有限公司 | 数据同步方法、装置、计算机设备及存储介质 |
CN110674151A (zh) * | 2019-09-23 | 2020-01-10 | 四川长虹电器股份有限公司 | 一种支持MySQL快速回滚数据的方法 |
CN112988701A (zh) * | 2019-12-13 | 2021-06-18 | 中国电信股份有限公司 | 数据库管理方法、装置、系统和存储介质 |
CN111240897B (zh) * | 2020-01-07 | 2023-04-14 | 腾讯科技(深圳)有限公司 | 一种数据处理方法及相关设备 |
CN113010506B (zh) * | 2021-03-11 | 2023-08-29 | 江苏省生态环境监控中心(江苏省环境信息中心) | 一种多源异构水环境大数据管理系统 |
CN112966025B (zh) * | 2021-03-17 | 2022-07-19 | 焦点科技股份有限公司 | 一种binlog日志挖掘字典实现方法 |
CN116561138A (zh) * | 2022-01-28 | 2023-08-08 | 马上消费金融股份有限公司 | 数据处理方法和装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8041679B1 (en) * | 2008-06-04 | 2011-10-18 | Symantec Operating Corporation | Synthetic differential backups creation for a database using binary log conversion |
CN102279886A (zh) * | 2011-08-16 | 2011-12-14 | 中国民生银行股份有限公司 | 元数据处理方法及设备 |
CN103221949A (zh) * | 2010-07-27 | 2013-07-24 | 甲骨文国际公司 | Mysql数据库的异构的基于日志的复制 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7610317B2 (en) * | 2005-02-22 | 2009-10-27 | Microsoft Corporation | Synchronization with derived metadata |
KR100912870B1 (ko) * | 2007-06-12 | 2009-08-19 | 삼성전자주식회사 | 컨텐츠 및 메타데이터의 무결성 보장 시스템 및 방법 |
-
2014
- 2014-08-15 CN CN201410403789.5A patent/CN105447014B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8041679B1 (en) * | 2008-06-04 | 2011-10-18 | Symantec Operating Corporation | Synthetic differential backups creation for a database using binary log conversion |
CN103221949A (zh) * | 2010-07-27 | 2013-07-24 | 甲骨文国际公司 | Mysql数据库的异构的基于日志的复制 |
CN102279886A (zh) * | 2011-08-16 | 2011-12-14 | 中国民生银行股份有限公司 | 元数据处理方法及设备 |
Non-Patent Citations (4)
Title |
---|
Mysql Binlog;xiaobaoqiu;《http://xiaobaoqiu.github.io/blog/2014/05/19/mysql-binlog/》;20140519;第1-11页 |
MySQL数据库的事务一致性研究;梁勇 等;《2009通信理论与技术新发展——第十四届全国青年通信学术会议》;20091231;第122-127页 |
元仓库与源数据库的元数据同步策略的研究与设计;叶国权 等;《现代电子技术》;20101231(第17期);第146-149页 |
阿里巴巴开源项目:基于mysql数据库binlog的增量订阅&消费;agapple;《http://agapple.iteye.com/blog/1796633》;20130206;第1-11页 |
Also Published As
Publication number | Publication date |
---|---|
CN105447014A (zh) | 2016-03-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105447014B (zh) | 基于binlog的元数据管理方法和用于提供元数据的方法及装置 | |
CN105550293B (zh) | 一种基于Spark‑SQL大数据处理平台的后台刷新方法 | |
US11934356B2 (en) | Synchronization of metadata in a distributed storage system | |
CN105243067B (zh) | 一种实现实时增量同步数据的方法及装置 | |
WO2015062181A1 (zh) | 用于实现多源异构数据资源自动同步的方法 | |
CN102402596B (zh) | 一种主从分离数据库的读写方法和系统 | |
CN107229721B (zh) | 一种变更数据抽取的方法及装置 | |
WO2021169113A1 (zh) | 数据管理方法、装置、计算机设备和存储介质 | |
CN107122355A (zh) | 数据迁移系统和方法 | |
US20120150797A1 (en) | Method and system for safely transporting legacy data to an object semantic form data grid | |
CN107122360A (zh) | 数据迁移系统和方法 | |
CN107122361A (zh) | 数据迁移系统和方法 | |
CN105518641B (zh) | 点对点数据复制方法、设备和系统以及主节点切换方法、设备和系统 | |
CN102542007A (zh) | 关系型数据库之间的同步方法及系统 | |
CN101640587B (zh) | 数据同步方法及装置 | |
CN103631924B (zh) | 一种分布式数据库平台的应用方法和系统 | |
CN107844343A (zh) | 一种复杂服务端应用系统的升级系统及方法 | |
CN105608126A (zh) | 一种建立海量数据库二级索引的方法和装置 | |
KR102038529B1 (ko) | 인-메모리 데이터베이스의 실시간 데이터 변경 처리 시스템 | |
CN105718592B (zh) | 基于Redis的数据调用方法及其系统 | |
CN103106200B (zh) | 非关系型数据库同步系统及双写同步方法 | |
CN104820625B (zh) | 一种面向信息管理系统的数据记录、备份及恢复方法 | |
CN110209731A (zh) | 数据同步方法、装置、及存储介质、电子装置 | |
CN109947801A (zh) | 数据库数据同步系统、方法及装置 | |
CN105404653B (zh) | 一种全分布式文件索引及协作编辑机制的实现方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |