发明内容
有鉴于此,本申请实施例提供了一种数据同步方法、装置、服务器及存储介质,以解决相关技术中对DDL事件处理时的时延长度较长,导致将主数据库中的数据同步至从数据库的效率不够高的问题。
本申请实施例的第一方面提供了一种数据同步方法,包括:
响应于检测到数据定义语言事件,在主数据库上执行数据定义语言事件所指示的操作,以及生成用于记录数据定义语言事件的操作的第一日志,将第一日志缓存至预先建立的第一缓存中;
若预先建立的第二缓存中缓存有用于记录数据操纵语言事件的操作的第二日志,则将第一缓存中的第一日志和第二缓存中的第二日志,以预设的分隔标识区分写入日志文件中;
根据分隔标识,将日志文件中的第一日志和第二日志分发至从数据库中的对应工作线程中处理,以便在从数据库上并行执行数据定义语言事件和数据操纵语言事件。
进一步地,方法还包括:
向操作系统请求分配两个内存空间,以及将所分配的两个内存空间建立为第一缓存和第二缓存,其中,第一缓存用于存储记录数据定义语言事件的操作的第一日志,第二缓存用于存储记录数据操纵语言事件的操作的第二日志。
进一步地,方法还包括:
响应于检测到数据操纵语言事件,在主数据库上执行数据操纵语言事件所指示的操作,以及生成用于记录数据操纵语言事件的操作的第二日志,将第二日志缓存至预先建立的第二缓存中。
进一步地,根据分隔标识,将日志文件中的第一日志和第二日志分发至从数据库中的对应工作线程中处理,包括:
将日志文件传递至从数据库的协作线程,使得协作线程在检测到日志文件中包括分隔标识时,将分隔标识两侧的第一日志和第二日志分配至处于空闲状态的对应工作线程中分别进行处理。
进一步地,若日志文件中的第二日志有多个,则将分隔标识两侧的第一日志和第二日志分配至处于空闲状态的对应工作线程中分别进行处理,包括:
将分隔标识一侧的第一日志分配至处于空闲状态的第一工作线程中处理,以及将分隔标识另一侧的多个第二日志分别分配至处于空闲状态的多个第二工作线程中处理。
进一步地,方法还包括:
针对每个工作线程,若工作线程对目标日志处理完成,则执行预设资源释放函数以释放分配给对目标日志处理完成的工作线程的处理资源,以及将对目标日志处理完成的工作线程的状态确定为空闲状态,其中,目标日志为第一日志或/及第二日志。
进一步地,方法还包括:
若未检测到数据定义语言事件且第二缓存满足预设转写条件,将第二缓存中的第二日志写入日志文件;
其中,预设转写条件包括以下至少一项:第二缓存的当前使用率大于预设使用率阈值、达到预设转存周期。
本申请实施例的第二方面提供了一种数据同步装置,包括:
第一执行单元,用于响应于检测到DDL事件,在主数据库上执行DDL事件所指示的操作,以及生成用于记录DDL事件的操作的第一日志,将第一日志缓存至预先建立的第一缓存中;
数据写入单元,用于若预先建立的第二缓存中缓存有用于记录数据操纵语言事件的操作的第二日志,则将第一缓存中的第一日志和第二缓存中的第二日志,以预设的分隔标识区分写入日志文件中;
第二执行单元,用于根据分隔标识,将日志文件中的第一日志和第二日志分发至从数据库中的对应工作线程中处理,以便在从数据库上并行执行DDL事件和DML事件。
本申请实施例的第三方面提供了一种服务器,包括存储器、处理器以及存储在存储器中并可在服务器上运行的计算机程序,处理器执行计算机程序时实现第一方面提供的数据同步方法的各步骤。
本申请实施例的第四方面提供了一种计算机可读存储介质,计算机可读存储介质存储有计算机程序,计算机程序被处理器执行时实现第一方面提供的数据同步方法的各步骤。
实施本申请实施例提供的一种数据同步方法、装置、服务器及存储介质具有以下有益效果:将DDL事件的日志和DML事件的日志缓存在不同的存储空间,将日志写入日志文件时,采用分隔标识将DDL事件的日志和DML事件的日志区分写入日志文件,便于对两种不同事件的日志进行准确区分,从而实现在从数据库上并行执行DDL事件和DML事件,有助于提高主数据库与从数据库之间进行数据同步的效率。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请实施例所涉及的数据同步方法,可以由控制服务器(以下称“服务器”)执行。数据同步方法由服务器执行时,执行主体为服务器。
请参阅图1,图1示出了本申请实施例提供的一种数据同步方法的实现流程图,包括:
步骤101,响应于检测到DDL事件,在主数据库上执行DDL事件所指示的操作,以及生成用于记录DDL事件的操作的第一日志,将第一日志缓存至预先建立的第一缓存中。
其中,DDL事件中可以包括一个操作,也可以包括多个操作,DDL事件中所包括的操作为DDL操作。上述第一日志通常是用于记录DDL事件的操作的日志。上述第一缓存通常是预先建立的内存空间。
这里,用户可以通过用户终端向服务器提交DDL事件。这样,服务器可以检测到该DDL事件,然后在服务器所管理的主数据库上执行该DDL事件所包括的DDL操作。在服务器执行DDL操作时,可以生成用于记录所执行的操作的第一日志。
步骤102,若预先建立的第二缓存中缓存有用于记录数据操纵语言事件的操作的第二日志,则将第一缓存中的第一日志和第二缓存中的第二日志,以预设的分隔标识区分写入日志文件中。
其中,第二缓存通常用于存储用于记录DML事件的操作的第二日志。第二缓存通常是预先建立的内存空间。需要指出的是,第一缓存与第二缓存为不相同的两个内存空间。第二日志通常是用于记录DML事件的操作的日志。DML事件所包括的操作通常为DML操作。DML事件中可以包括一个操作,也可以包括多个操作。
其中,上述分隔标识通常是预先设定的标识。作为示例,上述分隔标识可以为“Seperator_log_event”,也可以为其它标识。
这里,上述执行主体可以将第一日志和第二日志以分隔标识作为分隔,同时写入日志文件中。
实践中,第一日志中通常具有很多的日志数据,第二日志中也通常具有很多的日志数据。为了保障同一个事件的日志连续,上述执行主体可以将第一日志中的同一DDL事件下的所有日志数据一次性全部写入日志文件,以及将第二日志中的、同一DML事件下的所有日志数据一次性全部写入日志文件。
步骤103,根据分隔标识,将日志文件中的第一日志和第二日志分发至从数据库中的对应工作线程中处理,以便在从数据库上并行执行DDL事件和DML事件。
这里,上述执行主体可以将日志文件中的第一日志和第二日志分发至不同的工作线程进行处理。这样,多个线程同时对第一日志和第二日志进行处理,可以实现对第一日志和第二日志的并行处理,从而实现在从数据库上并行执行DDL事件和DML事件。
本实施例提供的数据同步方法,将DDL事件的日志和DML事件的日志缓存在不同的存储空间,将日志写入日志文件时,采用分隔标识将DDL事件的日志和DML事件的日志区分写入日志文件,便于对两种不同事件的日志进行准确区分,从而实现在从数据库上并行执行DDL事件和DML事件,有助于提高主数据库与从数据库之间进行数据同步的效率。
在本申请的各个实施例的可选的实现方式中,上述数据同步方法还可以包括:响应于检测到DML事件,在主数据库上执行DML事件所指示的操作,以及生成用于记录DML事件的操作的第二日志,将第二日志缓存至预先建立的第二缓存中。
这里,用户可以通过用户终端向服务器提交DML事件。这样,服务器可以检测到该DML事件,然后在服务器所管理的主数据库上执行该DML事件所包括的DML操作。在服务器执行DML操作时,可以生成用于记录所执行的操作的第二日志。以及,将所生成的第二日志缓存至预先建立的第二缓存中。
需要指出的是,针对一个DML事件可以有一个第二日志。第二缓存中可以存储有针对一个DML事件的一个第二日志,也可以同时存储有针对多个DML事件的多个第二日志。这样,所得到的日志文件中可以有一个第二日志,也可以有多个第二日志。在日志文件中有多个第二日志时,可以将多个第二日志分发至多个不同的工作线程中处理,以便在从数据库上并行执行多个DML事件。
举例来说,若第二缓存中存储有针对3个DML事件的3个第二日志,则所得到的日志文件中存在3个第二日志。此时,上述执行主体可以将该3个第二日志分发至3个不同的工作线程进行处理。这样,可以以便在从数据库上并行执行3个DML事件。
在本申请的各个实施例的可选的实现方式中,若未检测到DDL事件且第二缓存满足预设转写条件,将第二缓存中的第二日志写入日志文件。
其中,预设转写条件通常是预先设定的条件。实践中,预设转写条件可以包括但不限于以下至少一项:第二缓存的当前使用率大于预设使用率阈值,达到预设转存周期。实践中,预设转写条件还可以包括第二缓存中的第二日志的数目大于预设数值等。
上述预设使用率阈值通常是预先设定的数值,如,0.8。实践中,上述预设使用率阈值通常大于0且小于1。上述预设转存周期通常是预先设定的周期值,如,1秒。
这里,在没有检测到DDL事件的情况下,若第二缓存满足预设转写条件,则直接将第二缓存中的第二日志写入日志文件中,可以实现对整个数据库进行良好管理。
在本实施例的一些可选的实现方式中,根据分隔标识,将日志文件中的第一日志和第二日志分发至从数据库中的对应工作线程中处理,包括:
将日志文件传递至从数据库的协作线程,使得协作线程在检测到日志文件中包括分隔标识时,将分隔标识两侧的第一日志和第二日志分配至处于空闲状态的对应工作线程中分别进行处理。
其中,协作线程通常是用于对工作线程进行任务分配的线程。从数据库中可以具有一个用于分配任务的协作线程和多个用于执行任务的工作线程。
这里,上述执行主体可以通过从数据库的协作线程,将日志文件中的第一日志和第二日志分给处于空闲状态的不同的工作线程中处理。
实践中,上述执行主体可以将日志文件传递至从数据库的协作线程中。这样,协作线程可以将日志文件中的各日志分发至工作线程中进行处理。具体地,协作线程可以先检测日志文件中的分隔标识,若检测到,则可以以分隔标识作为分隔,将分隔标识一侧的第一日志分配至处于空闲状态的若干工作线程处理,以及将分隔标识另一侧的第二日志分配至处于空闲状态的另一些的若干工作线程处理。
需要指出的是,具体的日志分发任务由从数据库的协作线程执行,可以节约服务器的数据处理资源。
在一些可选的实现方式中,上述根据分隔标识,将日志文件中的第一日志和第二日志分发至从数据库中的对应工作线程中处理,也可以包括:
首先,将分隔标识一侧的第一日志分配至处于空闲状态的第一工作线程中解析,得到第一日志记录的DDL事件的操作的语句并执行。
然后,将分隔标识另一侧的第二日志分配至处于空闲状态的第二工作线程中解析,得到第二日志记录的DML事件的操作的语句并执行。
其中,第一工作线程和第二工作线程是不相同的两个工作线程。
这里,上述执行主体可以将分隔标识一侧的第一日志分发至第一工作线程中进行解析,以得到第一日志所记录的DDL事件的操作的语句。然后,第一工作线程执行该语句,实现第一工作线程执行该第一日志对应的DDL事件。同时,上述执行主体也将分隔标识另一侧的第二日志分发至第二工作线程中进行解析,以得到第二日志所记录的DML事件的操作的语句。然后,第二工作线程执行该语句,实现第二工作线程执行该第二日志对应的DML事件。
这里,上述执行主体可以将日志文件中的第一日志和第二日志分发至不同的工作线程进行处理。多个线程同时对第一日志和第二日志进行处理,可以实现对第一日志和第二日志的并行处理,从而实现在从数据库上并行执行DDL事件和DML事件。
在上述实现方式中,若日志文件中的第二日志有多个,则将分隔标识两侧的第一日志和第二日志分配至处于空闲状态的对应工作线程中分别进行处理,包括:
将分隔标识一侧的第一日志分配至处于空闲状态的第一工作线程中处理,以及将分隔标识另一侧的多个第二日志分别分配至处于空闲状态的多个第二工作线程中处理。
这里,在日志文件中存在多个第二日志时,可以将多个第二日志分发至不相同的多个第二工作线程中解析。可以实现在从数据库上并行执行多个DML事件,有助于进一步提高主数据库与从数据库之间进行数据同步的效率。
在本申请的各个实施例的一些可选的实现方式中,上述数据同步方法还可以包括如下步骤:
针对每个工作线程,若工作线程对目标日志处理完成,则执行预设资源释放函数以释放分配给对目标日志处理完成的工作线程的处理资源,以及将对目标日志处理完成的工作线程的状态确定为空闲状态。
其中,目标日志为第一日志或/及第二日志。
其中,上述预设资源释放函数通常是预先设定的用于释放处理资源的函数。
这里,在工作线程处理完整个DDL事件相关的日志时,才释放该工作线程的处理资源,也即是,处理完一个事件才释放一次处理资源。比及每处理完事件中的一个操作释放一次处理资源,用于执行资源释放的时间和次数明显要少很多,可以提高数据处理效率。
另外,在执行预设资源释放函数以释放分配给工作线程的处理资源之后,将工作线程的状态确定为空闲状态,可以便于后续对该工作线程分配任务,提高工作线程的可用性。
进一步参考图2,图2为本申请实施例提供的另一种数据同步方法的实现流程图。如图2所示地,数据同步方法可以包括以下步骤:
步骤201,向操作系统请求分配两个内存空间,以及将所分配的两个内存空间建立为第一缓存和第二缓存。
其中,第一缓存用于存储记录DDL事件的操作的第一日志,第二缓存用于存储记录DML事件的操作的第二日志。
实践中,通常是在用户终端与服务器建立通信连接时,请求分配两个内存空间,以得到第一缓存和第二缓存。
这里,上述执行主体可以向操作系统请求分配两个内存空间,然后将其中一个内存空间确定为第一缓存,以及将另一个内存空间确定为第二缓存。所建立的第一缓存用于存储记录DDL事件的操作的第一日志,以及所建立的第二缓存用于存储记录DML事件的操作的第二日志。
步骤202,响应于检测到DDL事件,在主数据库上执行DDL事件所指示的操作,以及生成用于记录DDL事件的操作的第一日志,将第一日志缓存至预先建立的第一缓存中。
步骤203,若预先建立的第二缓存中缓存有用于记录数据操纵语言事件的操作的第二日志,则将第一缓存中的第一日志和第二缓存中的第二日志,以预设的分隔标识区分写入日志文件中。
步骤204,根据分隔标识,将日志文件中的第一日志和第二日志分发至从数据库中的对应工作线程中处理,以便在从数据库上并行执行DDL事件和DML事件。
在本实施例中,步骤202-204的具体操作与图1所示的实施例中步骤101-103的操作基本相同,在此不再赘述。
需要指出的是,针对两种不同的事件分配不同的缓存,可以实现将DDL事件的日志和DML事件的日志缓存在不同的存储空间。
在本申请的所有实施例中,服务器可以在检测到DDL事件时,在主数据库上执行DDL事件所指示的操作,以及生成用于记录DDL事件的操作的第一日志,将第一日志缓存至预先建立的第一缓存中。然后,将第一缓存中的第一日志和第二缓存中的第二日志,以预设的分隔标识区分写入日志文件中,其中,第二缓存中存储有用于记录DML事件的操作的第二日志。最后,根据分隔标识,将日志文件中的第一日志和第二日志分发至从数据库中的对应工作线程中处理,以便在从数据库上并行执行DDL事件和DML事件。服务器可以将日志文件、日志文件中的第一日志及第一日志对应的工作线程的标识、日志文件中的第二日志及第二日志对应的工作线程的标识、分隔标识上传至区块链可保证其安全性和对用户的公正透明性。用户设备可以从区块链中下载得到该数据信息,以便查证数据信息是否被篡改。本示例所指区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链(Blockchain),本质上是一个去中心化的存储服务器,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。区块链可以包括区块链底层平台、平台产品服务层以及应用服务层等。
请参阅图3,图3是本申请实施例提供的一种数据同步装置300的结构框图。本实施例中该数据同步装置包括的各单元用于执行图1至图2对应的实施例中的各步骤。具体请参阅图1至图2以及图1至图2所对应的实施例中的相关描述。为了便于说明,仅示出了与本实施例相关的部分。参见图3,数据同步装置300包括:
第一执行单元301,用于响应于检测到DDL事件,在主数据库上执行DDL事件所指示的操作,以及生成用于记录DDL事件的操作的第一日志,将第一日志缓存至预先建立的第一缓存中;
数据写入单元302,用于若预先建立的第二缓存中缓存有用于记录数据操纵语言事件的操作的第二日志,则将第一缓存中的第一日志和第二缓存中的第二日志,以预设的分隔标识区分写入日志文件中;
第二执行单元303,用于根据分隔标识,将日志文件中的第一日志和第二日志分发至从数据库中的对应工作线程中处理,以便在从数据库上并行执行DDL事件和DML事件。
作为本申请一实施例,装置还可以包括缓存建立单元(图中未示出)。其中,缓存建立单元用于:向操作系统请求分配两个内存空间,以及将所分配的两个内存空间建立为第一缓存和第二缓存,其中,第一缓存用于存储记录DDL事件的操作的第一日志,第二缓存用于存储记录DML事件的操作的第二日志。
作为本申请一实施例,装置还可以包括数据缓存单元(图中未示出)。其中,数据缓存单元用于:响应于检测到数据操纵语言事件,在主数据库上执行数据操纵语言事件所指示的操作,以及生成用于记录数据操纵语言事件的操作的第二日志,将第二日志缓存至预先建立的第二缓存中。
作为本申请一实施例,第二执行单元303具体用于:将日志文件传递至从数据库的协作线程,使得协作线程在检测到日志文件中包括分隔标识时,将分隔标识两侧的第一日志和第二日志分配至处于空闲状态的对应工作线程中分别进行处理。
作为本申请一实施例,若日志文件中的第二日志有多个,则第二执行单元303具体还用于:将分隔标识一侧的第一日志分配至处于空闲状态的第一工作线程中处理,以及将分隔标识另一侧的多个第二日志分别分配至处于空闲状态的多个第二工作线程中处理。
作为本申请一实施例,装置还可以包括资源释放单元(图中未示出)。其中,资源释放单元可以用于:针对每个工作线程,若工作线程对目标日志处理完成,则执行预设资源释放函数以释放分配给对目标日志处理完成的工作线程的处理资源,以及将对目标日志处理完成的工作线程的状态确定为空闲状态,其中,目标日志为第一日志或/及第二日志。
作为本申请一实施例,装置还可以包括转写判断单元(图中未示出)。其中,转写判断单元可以用于:若未检测到数据定义语言事件且第二缓存满足预设转写条件,将第二缓存中的第二日志写入日志文件;
其中,预设转写条件包括以下至少一项:第二缓存的当前使用率大于预设使用率阈值、达到预设转存周期。
本实施例提供的装置,将DDL事件的日志和DML事件的日志缓存在不同的存储空间,将日志写入日志文件时,采用分隔标识将DDL事件的日志和DML事件的日志区分写入日志文件,便于对两种不同事件的日志进行准确区分,从而实现在从数据库上并行执行DDL事件和DML事件,有助于提高主数据库与从数据库之间进行数据同步的效率。
应当理解的是,图3示出的数据同步装置的结构框图中,各单元用于执行图1至图2对应的实施例中的各步骤,而对于图1至图2对应的实施例中的各步骤已在上述实施例中进行详细解释,具体请参阅图1至图2以及图1至图2所对应的实施例中的相关描述,此处不再赘述。
图4是本申请另一实施例提供的一种服务器的结构框图。如图4所示,该实施例的服务器400包括:处理器401、存储器402以及存储在存储器402中并可在处理器401上运行的计算机程序403,例如数据同步方法的程序。处理器401执行计算机程序403时实现上述各个数据同步方法各实施例中的步骤,例如图1所示的步骤101至步骤103,或图2所示的步骤201-步骤204。或者,处理器401执行计算机程序403时实现上述图3对应的实施例中各单元的功能,例如,图3所示的单元301至303的功能,具体请参阅图3对应的实施例中的相关描述,此处不赘述。
示例性的,计算机程序403可以被分割成一个或多个单元,一个或者多个单元被存储在存储器402中,并由处理器401执行,以完成本申请。一个或多个单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述计算机程序403在服务器400中的执行过程。例如,计算机程序403可以被分割成第一执行单元,数据写入单元,第二执行单元,各单元具体功能如上。
服务器可包括,但不仅限于,处理器401、存储器402。本领域技术人员可以理解,图4仅仅是服务器400的示例,并不构成对服务器400的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如转台设备还可以包括输入输出设备、网络接入设备、总线等。
所称处理器401可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
存储器402可以是服务器400的内部存储单元,例如服务器400的硬盘或内存。存储器402也可以是服务器400的外部存储设备,例如服务器400上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)等。进一步地,存储器402还可以既包括服务器400的内部存储单元也包括外部存储设备。存储器402用于存储计算机程序以及转台设备所需的其他程序和数据。存储器402还可以用于暂时地存储已经输出或者将要输出的数据。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
集成的模块如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读存储介质中。其中,计算机可读存储介质可以是非易失性的,也可以是易失性的。基于这样的理解,本申请实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,计算机程序包括计算机程序代码,计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。计算机可读存储介质可以包括:能够携带计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,计算机可读存储介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读存储介质不包括电载波信号和电信信号。
以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围,均应包含在本申请的保护范围之内。