CN116700763B - Clickhouse数据库的版本升级方法及装置 - Google Patents
Clickhouse数据库的版本升级方法及装置 Download PDFInfo
- Publication number
- CN116700763B CN116700763B CN202310979681.XA CN202310979681A CN116700763B CN 116700763 B CN116700763 B CN 116700763B CN 202310979681 A CN202310979681 A CN 202310979681A CN 116700763 B CN116700763 B CN 116700763B
- Authority
- CN
- China
- Prior art keywords
- atomic
- execution
- sql statement
- sql
- successfully executed
- 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
- 238000000034 method Methods 0.000 title claims abstract description 47
- 238000013515 script Methods 0.000 claims abstract description 172
- 238000004590 computer program Methods 0.000 claims description 11
- 230000002159 abnormal effect Effects 0.000 claims description 10
- 230000007246 mechanism Effects 0.000 claims description 9
- 238000003780 insertion Methods 0.000 claims description 7
- 230000037431 insertion Effects 0.000 claims description 7
- 239000000758 substrate Substances 0.000 claims 1
- 230000008569 process Effects 0.000 abstract description 14
- 230000005856 abnormality Effects 0.000 abstract description 3
- 238000012545 processing Methods 0.000 abstract description 3
- 230000006870 function Effects 0.000 description 6
- 230000008859 change Effects 0.000 description 5
- 238000010586 diagram Methods 0.000 description 5
- 230000009471 action Effects 0.000 description 3
- 238000000605 extraction Methods 0.000 description 3
- 230000000694 effects Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 238000005096 rolling process Methods 0.000 description 2
- 238000004891 communication Methods 0.000 description 1
- 238000012937 correction Methods 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 238000011835 investigation Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000004088 simulation Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/28—Databases characterised by their database models, e.g. relational or object models
- G06F16/284—Relational databases
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- Mathematical Physics (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及数据库处理技术领域,尤其涉及一种Clickhouse数据库的版本升级方法及装置,包括:将当前升级脚本拆分成原子sql语句,按照原子sql语句在脚本中的执行顺序依次插入至执行计划表;并按照原子sql语句的排列顺序依次提取未被成功执行的原子sql语句,以对数据库进行升级,若该原子sql语句未被成功执行,则停止执行该原子sql语句之后的原子sql语句,并获取修正后的升级脚本,将修正后的升级脚本作为当前升级脚本继续执行本方案,直到执行计划表中的原子sql语句全部被成功执行。本方案,能够保证Clickhouse数据库在升级过程中即使发生sql语句执行异常,也能够降低对系统性能产生的影响。
Description
技术领域
本发明实施例涉及数据库处理技术领域,特别涉及一种Clickhouse数据库的版本升级方法及装置。
背景技术
Clickhouse数据库是一种欠缺事务机制的列式存储的数据库,因此当Clickhouse数据库在升级过程中发生sql语句执行异常时,解决方案均是采用模拟sql回滚机制来解决sql语句执行异常的情况。但是,回滚操作需要占用较多存储空间,消耗较多的CPU和内存资源,会对系统性能产生影响。
发明内容
本发明实施例提供了一种Clickhouse数据库的版本升级方法及装置,能够保证Clickhouse数据库在升级过程中即使发生sql语句执行异常,也能够降低对系统性能产生的影响。
第一方面,本发明实施例提供了一种Clickhouse数据库的版本升级方法,包括:
100、获取待升级Clickhouse数据库的升级脚本;
102、将当前升级脚本拆分成原子sql语句,并基于拆分得到的原子sql语句和关系型数据库中创建的执行计划表,确定当前升级脚本中未被成功执行的原子sql语句;
104、将未被成功执行的原子sql语句按照在当前升级脚本中的执行顺序依次插入至所述执行计划表中;所述执行计划表用于存储每一个原子sql语句的执行条目;
106、从所述执行计划表中按照原子sql语句的排列顺序依次提取未被成功执行的原子sql语句,将提取的该原子sql语句在所述Clickhouse数据库中执行以对所述Clickhouse数据库进行升级,并确定该原子sql语句是否被成功执行;若未被成功执行,则停止执行该原子sql语句之后的原子sql语句,并获取修正后的升级脚本,将修正后的升级脚本作为当前升级脚本执行102,直到所述执行计划表中的原子sql语句全部被成功执行。
第二方面,本发明实施例还提供了一种Clickhouse数据库的版本升级装置,包括:
获取单元,用于获取待升级Clickhouse数据库的升级脚本;
拆分确定单元,用于将当前升级脚本拆分成原子sql语句,并基于拆分得到的原子sql语句和关系型数据库中创建的执行计划表,确定当前升级脚本中未被成功执行的原子sql语句;
插入单元,用于将未被成功执行的原子sql语句按照在当前升级脚本中的执行顺序依次插入至所述执行计划表中;所述执行计划表用于存储每一个原子sql语句的执行条目;
升级执行单元,用于从所述执行计划表中按照原子sql语句的排列顺序依次提取未被成功执行的原子sql语句,将提取的该原子sql语句在所述Clickhouse数据库中执行以对所述Clickhouse数据库进行升级,并确定该原子sql语句是否被成功执行;若未被成功执行,则停止执行该原子sql语句之后的原子sql语句,并获取修正后的升级脚本,将修正后的升级脚本作为当前升级脚本触发所述拆分确定单元执行相应操作,直到所述执行计划表中的原子sql语句全部被成功执行。
第三方面,本发明实施例还提供了一种电子设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序时,实现本说明书任一实施例所述的方法。
第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行本说明书任一实施例所述的方法。
本发明实施例提供了一种Clickhouse数据库的版本升级方法及装置,通过在关系型数据库中创建执行计划表,以存储升级脚本中每一个原子sql语句的执行条目,在对Clickhouse数据库进行升级时,从执行计划表中按顺序提取未被成功执行的原子sql语句在Clickhouse数据库中执行,若原子sql语句未被成功执行时,则表明执行异常,需要对升级脚本进行修正,此时停止执行后续原子sql语句,当升级脚本修正完成后,可以将修正后的升级脚本拆分为原子sql语句,并将当前升级脚本中未被成功执行的原子sql语句插入至执行计划表中,且再次执行计划表中的原子sql语句时依然是从未被成功执行的原子sql语句开始执行的,因此,已经成功执行的原子sql语句不在被重复执行,而是直接定位到上次执行异常的原子sql语句,接着上次升级中断的位置开始继续执行修正的脚本。可见,本方案在Clickhouse数据库在升级过程中发生sql语句执行异常时,避免了回滚操作,从而降低了对系统性能产生的影响。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明一实施例提供的一种Clickhouse数据库的版本升级方法流程图;
图2是本发明一实施例提供的为发生执行异常时执行计划表的部分示意图;
图3是本发明一实施例提供的一种电子设备的硬件架构图;
图4是本发明一实施例提供的一种Clickhouse数据库的版本升级装置结构图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
Clickhouse数据库在进行升级时,其自身提供一些模拟sql回滚机制来解决sql执行异常的回滚问题。比如,使用MergeTree引擎的数据版本控制功能,用于记录每一个数据块的变更历史,通过在查询时指定查询版本,以实现类似于sql回滚的效果;但是该方式由于需要记录每一个数据块的变更历史,因此需要占用大量存储空间。再比如,使用日志表和MergeTree引擎的快照功能,在数据表中创建一个日志表,并将变更操作写入日志表,在sql执行异常回滚时,使用日志表中的变更记录回复数据表的快照;但是该方式每个变更操作均需要写入日志表中,需要占用更多的存储空间和写入性能。因此,目前的Clickhouse数据库的升级方案均需要通过sql回滚来实现升级。
本发明的发明构思在于,Clickhouse数据库在进行升级时若发生非原子sql脚本的执行异常时,若能够避免sql回滚,则能够降低回滚操作对系统性能的影响;而Clickhouse数据库不具备事务机制,因此可以借助具备事务机制的关系型数据库来记录原子sql语句的执行状态,以当原子sql语句执行异常时能够定位异常点,并在脚本修正后能够继续接着执行中断的执行点继续执行,以确保Clickhouse数据库的正常升级。
下面描述以上构思的具体实现方式。
请参考图1,本发明实施例提供了一种Clickhouse数据库的版本升级方法,该方法包括:
步骤100,获取待升级Clickhouse数据库的升级脚本;
步骤102,将当前升级脚本拆分成原子sql语句,并基于拆分得到的原子sql语句和关系型数据库中创建的执行计划表,确定当前升级脚本中未被成功执行的原子sql语句;
步骤104,将未被成功执行的原子sql语句按照在当前升级脚本中的执行顺序依次插入至所述执行计划表中;所述执行计划表用于存储每一个原子sql语句的执行条目;
步骤106,从所述执行计划表中按照原子sql语句的排列顺序依次提取未被成功执行的原子sql语句,将提取的该原子sql语句在所述Clickhouse数据库中执行以对所述Clickhouse数据库进行升级,并确定该原子sql语句是否被成功执行;若未被成功执行,则停止执行该原子sql语句之后的原子sql语句,并获取修正后的升级脚本,将修正后的升级脚本作为当前升级脚本执行102,直到所述执行计划表中的原子sql语句全部被成功执行。
本发明实施例中,通过在关系型数据库中创建执行计划表,以存储升级脚本中每一个原子sql语句的执行条目,在对Clickhouse数据库进行升级时,从执行计划表中按顺序提取未被成功执行的原子sql语句在Clickhouse数据库中执行,若原子sql语句未被成功执行时,则表明执行异常,需要对升级脚本进行修正,此时停止执行后续原子sql语句,当升级脚本修正完成后,可以将修正后的升级脚本拆分为原子sql语句,并将当前升级脚本中未被成功执行的原子sql语句插入至执行计划表中,且再次执行计划表中的原子sql语句时依然是从未被成功执行的原子sql语句开始执行的,因此,已经成功执行的原子sql语句不在被重复执行,而是直接定位到上次执行异常的原子sql语句,接着上次升级中断的位置开始继续执行修正的脚本。可见,本方案在Clickhouse数据库在升级过程中发生sql语句执行异常时,避免了回滚操作,从而降低了对系统性能产生的影响。
下面描述图1所示的各个步骤的执行方式。
首先,针对步骤100,获取待升级Clickhouse数据库的升级脚本。
Clickhouse数据库进行版本升级时,其升级脚本是非原子性sql脚本。为了保证Clickhouse数据库版本升级的自动性,可以将待升级Clickhouse数据库的升级脚本存储在指定资源路径下,如此可以在该指定资源路径下获取待升级Clickhouse数据库的升级脚本。
然后,针对步骤102“将当前升级脚本拆分成原子sql语句,并基于拆分得到的原子sql语句和关系型数据库中创建的执行计划表,确定当前升级脚本中未被成功执行的原子sql语句”和步骤104“将未被成功执行的原子sql语句按照在当前升级脚本中的执行顺序依次插入至所述执行计划表中;所述执行计划表用于存储每一个原子sql语句的执行条目”同时进行说明。
在获取到升级脚本后,需要将当前升级脚本拆分成原子sql语句,其中,原子sql语句是指一条单独的sql语句,拆分方式为:对当前升级脚本进行逐行识别,每当识别到一条单独的sql语句,则将该sql语句作为原子sql语句拆分出来。
本发明实施例中,为了能够对升级脚本执行过程中的异常进行定位以及能够避免sql回滚,需要预先在关系型数据库中创建用于存储每一个原子sql语句的执行条目的执行计划表,比如该执行计划表的名称为“schema_version_ck”。其中,该关系型数据库可以是mysql数据库、oracle数据库等。
其中,该执行计划表的表结构至少包括执行条目的原子sql语句和执行状态。其中,原子sql语句为从当前升级脚本中拆分出来的,执行状态为对应原子sql语句的执行结果,该执行状态可以包括:成功执行、未执行和执行异常。
更具体地,该执行计划表的表结构还可以包括执行条目的主键ID、来源脚本编号、执行主体、执行时间和执行耗时中的一种或多种。其中,主键ID为执行计划表中执行条目的编号,该编号是具有顺序性和唯一性的;来源脚本编号是指原子sql语句是从哪个脚本中拆分得来的,当前升级脚本可以是一个,也可以是多个,每一个升级脚本均对应有其脚本编号;执行主体是指用于执行原子sql语句的程序,比如执行主体为root;执行时间为执行该原子sql语句的开始时间;执行耗时为执行该原子sql语句所使用的时长。
当表结构包括执行条目的原子sql语句、执行状态、主键ID、来源脚本编号、执行主体、执行时间和执行耗时时,该表结构的编码定义如下:
CREATE TABLE IF NOT EXISTS `schema_version_ck` (
`id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
`version` VARCHAR(50) NOT NULL COMMENT '来源脚本编号',
`script` VARCHAR(1000) NOT NULL COMMENT '原子sql语句',
`installed_by` VARCHAR(100) NOT NULL COMMENT '执行主体',
`installed_on` TIMESTAMP NOT NULL COMMENT '执行时间',
`execution_time` INT NOT NULL COMMENT '执行耗时',
`success` BOOL NOT NULL COMMENT '执行状态'
) ENGINE=InnoDB;
需要说明的是,在初次创建执行计划表时,执行计划表为空表,此时在确定当前升级脚本中未被成功执行的原子sql语句时,当前升级脚本中拆分出的全部原子sql语句均为未被成功执行的原子sql语句。
另外,若本次升级不是初次升级,则可能执行计划表中记录有上次升级时的原子sql语句或者本次已正常执行的部分原子sql语句,此时,在确定当前升级脚本中未被成功执行的原子sql语句时,可以基于执行计划表中每一个执行条目的执行状态来确定,具体地,该方法可以包括如下步骤S1-S3:
S1、确定所述执行计划表中是否已经记录有执行状态为成功执行的原子sql语句;若是,则执行S2;若否,则执行S3。
其中,本步骤S1中,可以基于执行计划表中记录的执行条目的执行状态来确定是否已经记录有执行状态为成功执行的原子sql语句。其中,三种执行状态可以通过相应的标识来表征。比如,执行状态为未执行,则该执行条目在执行状态这一栏为空;执行状态为成功执行,则该执行条目在执行状态这一栏为数字1;执行状态为执行异常,则该执行条目在执行状态这一栏为数字0。如此,若执行计划表中已经记录有执行状态为1的执行条目,则确定执行计划表中已经记录有执行状态为成功执行的原子sql语句。
S2、确定拆分得到的原子sql语句中是否存在位于前端的连续的若干个原子sql语句,与执行计划表中已经记录的执行状态为成功执行且位于末端的连续的若干个原子sql语句一一对应相同;若存在,则将拆分得到的原子sql语句中除去该一一对应相同的位于前端的连续的若干个原子sql语句之外的原子sql语句,确定为当前升级脚本中未被成功执行的原子sql语句;若不存在,则根据拆分得到的原子sql语句进一步确定当前升级脚本中未被成功执行的原子sql语句。
在本步骤S2中,执行计划表中存在已经记录的执行状态为成功执行的原子sql语句,则表明对应如下三种情况:
第一种情况:执行计划表中存在的已经记录的执行状态为成功执行的原子sql语句为上次版本升级时的脚本拆分出来的。
第二种情况:执行计划表中存在的已经记录的执行状态为成功执行的原子sql语句为本次版本升级时已经成功执行了的部分sql语句。
第三种情况:执行计划表中存在的已经记录的执行状态为成功执行的原子sql语句为:上次版本升级时的脚本拆分出来的,和,本次版本升级时已经成功执行了的部分sql语句。
对上次版本升级和本次版本升级进行举例,比如,上次版本升级是版本1,本次版本升级为版本2。
本发明实施例中,为了能够减少比较数量,可以在执行计划表中的执行条目包括来源脚本编号时,直接定位执行计划表中本次版本升级的升级脚本。比如,上次版本升级的升级脚本的来源脚本编号为1,本次版本升级的升级脚本的来源脚本编号为2,那么可以直接在步骤S1中确定执行计划表中是否已经记录有设定来源脚本编号(比如为2)且执行状态为成功执行的原子sql语句。若存在,则对应第二种情况,如此,可以将第一种情况和第三种情况排除。
无论上述哪一种情况,在确定拆分得到的原子sql语句中存在位于前端的连续的若干个原子sql语句,与执行计划表中已经记录的执行状态为成功执行且位于末端的连续的若干个原子sql语句一一对应相同时,则可以直接将拆分得到的原子sql语句中除去该一一对应相同的位于前端的连续的若干个原子sql语句之外的原子sql语句,确定为当前升级脚本中未被成功执行的原子sql语句。举例来说,执行计划表中成功执行的执行条目其主键ID为1-20,当前升级脚本拆分得到的原子sql语句为50条,拆分得到的前10条原子sql语句与执行计划表中位于末端的连续的主键ID为11-20的原子sql语句一一对应相同,则可以直接将拆分得到的后40条原子sql语句确定为当前升级脚本中未被成功执行的原子sql语句。
进一步地,考虑到当前升级脚本为用于本次版本升级的修订后升级脚本时,升级脚本在修订过程中可能会对已经成功执行的部分原子sql语句进行修改,因此,若确定拆分得到的原子sql语句中不存在位于前端的连续的若干个原子sql语句,与执行计划表中已经记录的执行状态为成功执行且位于末端的连续的若干个原子sql语句一一对应相同时,则根据拆分得到的原子sql语句进一步确定当前升级脚本中未被成功执行的原子sql语句。
具体地,本发明一个实施例中,在执行条目还包括来源脚本编号时,可以利用如下方式根据拆分得到的原子sql语句进一步确定当前升级脚本中未被成功执行的原子sql语句:
基于当前升级脚本的目标来源脚本编号,确定所述执行计划表中已经记录的位于末端的执行状态为成功执行的第一原子sql语句,是否对应所述目标来源脚本编号;
若是,则确定所述第一原子sql语句中包括位于前端的连续的部分第二原子sql语句是否与拆分得到的原子sql语句中位于前端的连续的部分第三原子sql语句一一对应相同,若是,则将所述执行计划表中位于末端的除所述第二原子sql语句以外的执行条目删除,并将拆分得到的原子sql语句中除所述第三原子sql语句以外的原子sql语句确定为当前升级脚本中未被成功执行的原子sql语句。
继续上述举例,执行计划表中成功执行的执行条目其主键ID为1-20,其中主键ID为11-20的原子sql语句对应目标来源脚本编号(比如,目标来源脚本编号为2),当前升级脚本拆分得到的原子sql语句为50条,拆分得到的前8条原子sql语句与执行计划表中位于末端的连续的主键ID为11-18的原子sql语句一一对应相同;拆分得到的第9-10条原子sql语句与执行计划表中位于末端的连续的主键ID为19-20的原子sql语句不相同,或者,拆分得到的第9条原子sql语句与执行计划表中位于末端的连续的主键ID为19的原子sql语句不相同,而拆分得到的第10条原子sql语句与执行计划表中位于末端的连续的主键ID为20的原子sql语句相同。则可以将执行计划表中主键ID为19-20的执行条目删除,将当前升级脚本拆分得到的第9-50条原子sql语句确定为当前升级脚本中未被成功执行的原子sql语句。
S3、将拆分得到的原子sql语句均确定为当前升级脚本中未被成功执行的原子sql语句。
由于执行计划表中不存在已经记录有执行状态为成功执行的原子sql语句,因此可以将拆分得到的原子sql语句均确定为当前升级脚本中未被成功执行的原子sql语句。
以上在确定当前升级脚本中未被成功执行的原子sql语句之后,需要将当前升级脚本中未被成功执行的原子sql语句插入至执行计划表中。此时新插入的执行条目仅包括主键ID、来源脚本编号和原子sql语句,由于原子sql语句尚未执行,因此对于执行条目中的执行主体、执行时间、执行耗时、执行状态均为空白状态。
进一步地,在将原子sql语句插入至执行计划表时,可能存在拆入失败的情况,为了防止插入失败造成的混乱,本发明一个实施例中,还可以包括:在将未被成功执行的原子sql语句按照在当前升级脚本中的执行顺序依次插入至所述执行计划表中发生插入失败时,则触发所述关系型数据库的回滚机制,将本次插入至所述执行计划表中的原子sql语句删除。
最后针对步骤106,从所述执行计划表中按照原子sql语句的排列顺序依次提取未被成功执行的原子sql语句,将提取的该原子sql语句在所述Clickhouse数据库中执行以对所述Clickhouse数据库进行升级,并确定该原子sql语句是否被成功执行;若未被成功执行,则停止执行该原子sql语句之后的原子sql语句,并获取修正后的升级脚本,将修正后的升级脚本作为当前升级脚本执行102,直到所述执行计划表中的原子sql语句全部被成功执行。
其中,未被成功执行的原子sql语句为执行计划表中除执行状态为成功执行以外的状态的原子sql语句。
比如,执行计划表中所有执行条目的执行状态均为未执行状态,则在执行计划表的第一条执行条目包括的原子sql语句开始,逐个依次提取原子sql语句,每提取一个原子sql语句则在Clickhouse数据库中执行以对Clickhouse数据库进行升级,并确定提取的该原子sql语句是否被成功执行。若被成功执行,则进行下一个原子sql语句的提取和执行;若未被成功执行,则表明升级过程出现执行异常,此时需要停止提取和执行该原子sql语句之后的原子sql语句,需要对当前升级脚本进行修正。请参考图2,为发生执行异常时执行计划表的部分示意图。
进一步地,在确定该原子sql语句是否被成功执行之后,无论是否被成功执行,还需要将该原子sql语句的执行状态写入至所述执行计划表中。
因此,在对当前升级脚本进行修正时,可以基于执行计划表定位执行异常的执行条目,由此对当前升级脚本中的sql语句进行修正。修正后的升级脚本可以作为当前升级脚本返回执行步骤102,以进一步执行原子sql语句的插入、提取和执行过程。
由于当前升级脚本已经成功执行了部分原子sql语句,为了保证在步骤102中针对修正后的当前升级脚本确定当前升级脚本中未被成功执行的原子sql语句时的比较过程的数据量,可以在将修正后的升级脚本作为当前升级脚本执行102之前,将所述执行计划表中执行状态为执行异常和未执行的执行条目删除。
本发明实施例相比之前的在Clickhouse数据库中模拟回滚方案,这种借助关系型数据库实现Clickhouse数据库的原子性操作的方案具备以下效果:
1、实现方式更加简单,不需要额外的代码实现,只需要利用关系型数据库的事务特性即可。
2、更加稳定可靠,利用关系型数据库的事务特性可以保证在执行过程中出现错误时数据的完整性和一致性,相比之前的模拟回滚方案更加稳定可靠。
3、自动化程度更高,本实施例可以通过自动比较执行计划表和指定资源路径下的当前升级脚本,自动实现未被成功执行过的原子sql语句的插入和执行,实现自动化操作。
4、数据追溯更加方便,本实施例可以记录每个原子sql语句的执行情况,便于后续的问题排查和数据追溯。
5、可扩展性更强,由于借助关系型数据库实现,可以轻松地与其他关系型数据库集成,实现更加灵活的操作。
总结而言,这种借助关系型数据库实现Clickhouse数据库的原子性操作的方案相比之前的模拟回滚方案具备更加简单、稳定可靠、自动化程度更高、数据追溯更加方便和可扩展性更强等优点。
如图3、图4所示,本发明实施例提供了一种Clickhouse数据库的版本升级装置。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。从硬件层面而言,如图3所示,为本发明实施例提供的一种Clickhouse数据库的版本升级装置所在电子设备的一种硬件架构图,除了图3所示的处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的电子设备通常还可以包括其他硬件,如负责处理报文的转发芯片等等。以软件实现为例,如图4所示,作为一个逻辑意义上的装置,是通过其所在电子设备的CPU将非易失性存储器中对应的计算机程序读取到内存中运行形成的。本实施例提供的一种Clickhouse数据库的版本升级装置,包括:
获取单元400,用于获取待升级Clickhouse数据库的升级脚本;
拆分确定单元402,用于将当前升级脚本拆分成原子sql语句,并基于拆分得到的原子sql语句和关系型数据库中创建的执行计划表,确定当前升级脚本中未被成功执行的原子sql语句;
插入单元404,用于将未被成功执行的原子sql语句按照在当前升级脚本中的执行顺序依次插入至所述执行计划表中;所述执行计划表用于存储每一个原子sql语句的执行条目;
升级执行单元406,用于从所述执行计划表中按照原子sql语句的排列顺序依次提取未被成功执行的原子sql语句,将提取的该原子sql语句在所述Clickhouse数据库中执行以对所述Clickhouse数据库进行升级,并确定该原子sql语句是否被成功执行;若未被成功执行,则停止执行该原子sql语句之后的原子sql语句,并获取修正后的升级脚本,将修正后的升级脚本作为当前升级脚本触发所述拆分确定单元执行相应操作,直到所述执行计划表中的原子sql语句全部被成功执行。
在本发明一个实施例中,所述执行条目至少包括原子sql语句和执行状态;所述执行状态包括:成功执行、未执行和执行异常;
所述拆分确定单元在执行基于拆分得到的原子sql语句和关系型数据库中创建的执行计划表,确定当前升级脚本中未被成功执行的原子sql语句时,具体包括:
确定所述执行计划表中是否已经记录有执行状态为成功执行的原子sql语句;若是,则比较拆分得到的原子sql语句和所述执行计划表中已经记录的执行状态为成功执行的原子sql语句,确定拆分得到的原子sql语句中是否存在位于前端的连续的若干个原子sql语句,与执行计划表中已经记录的执行状态为成功执行且位于末端的连续的若干个原子sql语句一一对应相同;若存在,则将拆分得到的原子sql语句中除去该一一对应相同的位于前端的连续的若干个原子sql语句之外的原子sql语句,确定为当前升级脚本中未被成功执行的原子sql语句;若不存在,则根据拆分得到的原子sql语句进一步确定当前升级脚本中未被成功执行的原子sql语句;若否,则将拆分得到的原子sql语句均确定为当前升级脚本中未被成功执行的原子sql语句。
在本发明一个实施例中,所述执行条目还包括来源脚本编号;
所述拆分确定单元在根据拆分得到的原子sql语句进一步确定当前升级脚本中未被成功执行的原子sql语句时,具体包括:
基于当前升级脚本的目标来源脚本编号,确定所述执行计划表中已经记录的位于末端的执行状态为成功执行的第一原子sql语句,是否对应所述目标来源脚本编号;若是,则确定所述第一原子sql语句中包括位于前端的连续的部分第二原子sql语句是否与拆分得到的原子sql语句中位于前端的连续的部分第三原子sql语句一一对应相同,若是,则将所述执行计划表中位于末端的除所述第二原子sql语句以外的执行条目删除,并将拆分得到的原子sql语句中除所述第三原子sql语句以外的原子sql语句确定为当前升级脚本中未被成功执行的原子sql语句。
在本发明一个实施例中,所述插入单元还用于在将未被成功执行的原子sql语句按照在当前升级脚本中的执行顺序依次插入至所述执行计划表中发生插入失败时,则触发所述关系型数据库的回滚机制,将本次插入至所述执行计划表中的原子sql语句删除。
在本发明一个实施例中,所述升级执行单元在在确定该原子sql语句是否被成功执行之后,还用于将该原子sql语句的执行状态写入至所述执行计划表中;
所述升级执行单元在将修正后的升级脚本作为当前升级脚本触发所述拆分确定单元执行相应操作之前,还用于将所述执行计划表中执行状态为执行异常和未执行的执行条目删除。
在本发明一个实施例中,所述执行条目还包括:主键ID、执行主体、执行时间和执行耗时中的一种或多种。
可以理解的是,本发明实施例示意的结构并不构成对一种Clickhouse数据库的版本升级装置的具体限定。在本发明的另一些实施例中,一种Clickhouse数据库的版本升级装置可以包括比图示更多或者更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件、软件或者软件和硬件的组合来实现。
上述装置内的各模块之间的信息交互、执行过程等内容,由于与本发明方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本发明实施例还提供了一种电子设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序时,实现本发明任一实施例中的一种Clickhouse数据库的版本升级方法。
本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序在被处理器执行时,使所述处理器执行本发明任一实施例中的一种Clickhouse数据库的版本升级方法。
具体地,可以提供配有存储介质的系统或者装置,在该存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机(或CPU或MPU)读出并执行存储在存储介质中的程序代码。
在这种情况下,从存储介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此程序代码和存储程序代码的存储介质构成了本发明的一部分。
用于提供程序代码的存储介质实施例包括软盘、硬盘、磁光盘、光盘(如CD-ROM、CD-R、CD-RW、DVD-ROM、DVD-RAM、DVD-RW、DVD+RW)、磁带、非易失性存储卡和ROM。可选择地,可以由通信网络从服务器计算机上下载程序代码。
此外,应该清楚的是,不仅可以通过执行计算机所读出的程序代码,而且可以通过基于程序代码的指令使计算机上操作的操作系统等来完成部分或者全部的实际操作,从而实现上述实施例中任意一项实施例的功能。
此外,可以理解的是,将由存储介质读出的程序代码写到插入计算机内的扩展板中所设置的存储器中或者写到与计算机相连接的扩展模块中设置的存储器中,随后基于程序代码的指令使安装在扩展板或者扩展模块上的CPU等来执行部分和全部实际操作,从而实现上述实施例中任一实施例的功能。
需要说明的是,在本文中,诸如第一和第二之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个…”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同因素。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储在计算机可读取的存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质中。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (12)
1.一种Clickhouse数据库的版本升级方法,其特征在于,包括:
100、获取待升级Clickhouse数据库的升级脚本;
102、将当前升级脚本拆分成原子sql语句,并基于拆分得到的原子sql语句和关系型数据库中创建的执行计划表,确定当前升级脚本中未被成功执行的原子sql语句;
104、将未被成功执行的原子sql语句按照在当前升级脚本中的执行顺序依次插入至所述执行计划表中;所述执行计划表用于存储每一个原子sql语句的执行条目;
106、从所述执行计划表中按照原子sql语句的排列顺序依次提取未被成功执行的原子sql语句,将提取的该原子sql语句在所述Clickhouse数据库中执行以对所述Clickhouse数据库进行升级,并确定该原子sql语句是否被成功执行;若未被成功执行,则停止执行该原子sql语句之后的原子sql语句,并获取修正后的升级脚本,将修正后的升级脚本作为当前升级脚本执行102,直到所述执行计划表中的原子sql语句全部被成功执行;
所述执行条目至少包括原子sql语句和执行状态;所述执行状态包括:成功执行、未执行和执行异常;
所述基于拆分得到的原子sql语句和关系型数据库中创建的执行计划表,确定当前升级脚本中未被成功执行的原子sql语句,包括:
确定所述执行计划表中是否已经记录有执行状态为成功执行的原子sql语句;
若是,则比较拆分得到的原子sql语句和所述执行计划表中已经记录的执行状态为成功执行的原子sql语句,确定拆分得到的原子sql语句中是否存在位于前端的连续的若干个原子sql语句,与执行计划表中已经记录的执行状态为成功执行且位于末端的连续的若干个原子sql语句一一对应相同;若存在,则将拆分得到的原子sql语句中除去该一一对应相同的位于前端的连续的若干个原子sql语句之外的原子sql语句,确定为当前升级脚本中未被成功执行的原子sql语句;若不存在,则根据拆分得到的原子sql语句进一步确定当前升级脚本中未被成功执行的原子sql语句;
若否,则将拆分得到的原子sql语句均确定为当前升级脚本中未被成功执行的原子sql语句。
2.根据权利要求1所述的方法,其特征在于,所述执行条目还包括来源脚本编号;
所述根据拆分得到的原子sql语句进一步确定当前升级脚本中未被成功执行的原子sql语句,包括:
基于当前升级脚本的目标来源脚本编号,确定所述执行计划表中已经记录的位于末端的执行状态为成功执行的第一原子sql语句,是否对应所述目标来源脚本编号;
若是,则确定所述第一原子sql语句中包括位于前端的连续的部分第二原子sql语句是否与拆分得到的原子sql语句中位于前端的连续的部分第三原子sql语句一一对应相同,若是,则将所述执行计划表中位于末端的除所述第二原子sql语句以外的执行条目删除,并将拆分得到的原子sql语句中除所述第三原子sql语句以外的原子sql语句确定为当前升级脚本中未被成功执行的原子sql语句。
3.根据权利要求1所述的方法,其特征在于,还包括:在将未被成功执行的原子sql语句按照在当前升级脚本中的执行顺序依次插入至所述执行计划表中发生插入失败时,则触发所述关系型数据库的回滚机制,将本次插入至所述执行计划表中的原子sql语句删除。
4.根据权利要求1所述的方法,其特征在于,
在确定该原子sql语句是否被成功执行之后,还包括:将该原子sql语句的执行状态写入至所述执行计划表中;
在将修正后的升级脚本作为当前升级脚本执行102之前,还包括:将所述执行计划表中执行状态为执行异常和未执行的执行条目删除。
5.根据权利要求1-4中任一所述的方法,其特征在于,所述执行条目还包括:主键ID、执行主体、执行时间和执行耗时中的一种或多种。
6.一种Clickhouse数据库的版本升级装置,其特征在于,包括:
获取单元,用于获取待升级Clickhouse数据库的升级脚本;
拆分确定单元,用于将当前升级脚本拆分成原子sql语句,并基于拆分得到的原子sql语句和关系型数据库中创建的执行计划表,确定当前升级脚本中未被成功执行的原子sql语句;
插入单元,用于将未被成功执行的原子sql语句按照在当前升级脚本中的执行顺序依次插入至所述执行计划表中;所述执行计划表用于存储每一个原子sql语句的执行条目;
升级执行单元,用于从所述执行计划表中按照原子sql语句的排列顺序依次提取未被成功执行的原子sql语句,将提取的该原子sql语句在所述Clickhouse数据库中执行以对所述Clickhouse数据库进行升级,并确定该原子sql语句是否被成功执行;若未被成功执行,则停止执行该原子sql语句之后的原子sql语句,并获取修正后的升级脚本,将修正后的升级脚本作为当前升级脚本触发所述拆分确定单元执行相应操作,直到所述执行计划表中的原子sql语句全部被成功执行;
所述执行条目至少包括原子sql语句和执行状态;所述执行状态包括:成功执行、未执行和执行异常;
所述拆分确定单元在执行基于拆分得到的原子sql语句和关系型数据库中创建的执行计划表,确定当前升级脚本中未被成功执行的原子sql语句时,具体包括:
确定所述执行计划表中是否已经记录有执行状态为成功执行的原子sql语句;若是,则比较拆分得到的原子sql语句和所述执行计划表中已经记录的执行状态为成功执行的原子sql语句,确定拆分得到的原子sql语句中是否存在位于前端的连续的若干个原子sql语句,与执行计划表中已经记录的执行状态为成功执行且位于末端的连续的若干个原子sql语句一一对应相同;若存在,则将拆分得到的原子sql语句中除去该一一对应相同的位于前端的连续的若干个原子sql语句之外的原子sql语句,确定为当前升级脚本中未被成功执行的原子sql语句;若不存在,则根据拆分得到的原子sql语句进一步确定当前升级脚本中未被成功执行的原子sql语句;若否,则将拆分得到的原子sql语句均确定为当前升级脚本中未被成功执行的原子sql语句。
7.根据权利要求6所述的装置,其特征在于,所述执行条目还包括来源脚本编号;
所述拆分确定单元在根据拆分得到的原子sql语句进一步确定当前升级脚本中未被成功执行的原子sql语句时,具体包括:
基于当前升级脚本的目标来源脚本编号,确定所述执行计划表中已经记录的位于末端的执行状态为成功执行的第一原子sql语句,是否对应所述目标来源脚本编号;若是,则确定所述第一原子sql语句中包括位于前端的连续的部分第二原子sql语句是否与拆分得到的原子sql语句中位于前端的连续的部分第三原子sql语句一一对应相同,若是,则将所述执行计划表中位于末端的除所述第二原子sql语句以外的执行条目删除,并将拆分得到的原子sql语句中除所述第三原子sql语句以外的原子sql语句确定为当前升级脚本中未被成功执行的原子sql语句。
8.根据权利要求6所述的装置,其特征在于,所述插入单元还用于在将未被成功执行的原子sql语句按照在当前升级脚本中的执行顺序依次插入至所述执行计划表中发生插入失败时,则触发所述关系型数据库的回滚机制,将本次插入至所述执行计划表中的原子sql语句删除。
9.根据权利要求6所述的装置,其特征在于,所述升级执行单元在在确定该原子sql语句是否被成功执行之后,还用于将该原子sql语句的执行状态写入至所述执行计划表中;
所述升级执行单元在将修正后的升级脚本作为当前升级脚本触发所述拆分确定单元执行相应操作之前,还用于将所述执行计划表中执行状态为执行异常和未执行的执行条目删除。
10.根据权利要求6-9中任一所述的装置,其特征在于,所述执行条目还包括:主键ID、执行主体、执行时间和执行耗时中的一种或多种。
11.一种电子设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序时,实现如权利要求1-5中任一项所述的方法。
12.一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行权利要求1-5中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310979681.XA CN116700763B (zh) | 2023-08-07 | 2023-08-07 | Clickhouse数据库的版本升级方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310979681.XA CN116700763B (zh) | 2023-08-07 | 2023-08-07 | Clickhouse数据库的版本升级方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116700763A CN116700763A (zh) | 2023-09-05 |
CN116700763B true CN116700763B (zh) | 2023-10-27 |
Family
ID=87841764
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310979681.XA Active CN116700763B (zh) | 2023-08-07 | 2023-08-07 | Clickhouse数据库的版本升级方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116700763B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2016206361A1 (zh) * | 2015-06-24 | 2016-12-29 | 中兴通讯股份有限公司 | 数据库软件升级检测方法及装置 |
CN107357907A (zh) * | 2017-07-17 | 2017-11-17 | 郑州云海信息技术有限公司 | 一种支持跨版本的数据库升级方法及装置 |
CN110865829A (zh) * | 2018-08-28 | 2020-03-06 | 北京京东金融科技控股有限公司 | 数据库升级方法、系统、设备及存储介质 |
CN111736865A (zh) * | 2020-05-28 | 2020-10-02 | 苏州浪潮智能科技有限公司 | 一种数据库升级方法及系统 |
CN113721948A (zh) * | 2021-07-21 | 2021-11-30 | 北京中科江南信息技术股份有限公司 | 一种数据库升级方法、系统及存储介质 |
-
2023
- 2023-08-07 CN CN202310979681.XA patent/CN116700763B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2016206361A1 (zh) * | 2015-06-24 | 2016-12-29 | 中兴通讯股份有限公司 | 数据库软件升级检测方法及装置 |
CN107357907A (zh) * | 2017-07-17 | 2017-11-17 | 郑州云海信息技术有限公司 | 一种支持跨版本的数据库升级方法及装置 |
CN110865829A (zh) * | 2018-08-28 | 2020-03-06 | 北京京东金融科技控股有限公司 | 数据库升级方法、系统、设备及存储介质 |
CN111736865A (zh) * | 2020-05-28 | 2020-10-02 | 苏州浪潮智能科技有限公司 | 一种数据库升级方法及系统 |
CN113721948A (zh) * | 2021-07-21 | 2021-11-30 | 北京中科江南信息技术股份有限公司 | 一种数据库升级方法、系统及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN116700763A (zh) | 2023-09-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9996341B2 (en) | Infrastructure for the automation of the assembly of schema maintenance scripts | |
US7739547B2 (en) | Failure recovery and error correction techniques for data loading in information warehouses | |
US7774772B2 (en) | Method and apparatus to perform an application software migration | |
US8612722B2 (en) | Determining an end of valid log in a log of write records | |
KR100655124B1 (ko) | 주문 제작 컴퓨터시스템을 위한 소프트웨어 설치 및 테스트를촉진하는 데이타베이스 | |
KR19990023212A (ko) | 주문 제작 컴퓨터시스템을 위한 소프트웨어 설치 및 테스트방법 및 시스템 | |
CN109471634B (zh) | 源代码格式的检查方法及设备 | |
CN111694612A (zh) | 配置检查方法、装置、计算机系统及存储介质 | |
CN112100194A (zh) | 一种数据库版本管理方法及系统 | |
CN111078481A (zh) | 获取配置检查清单的方法、装置、电子设备及存储介质 | |
CN111459764A (zh) | 一种日志管理方法及终端 | |
US6240529B1 (en) | Debugging method and debugging apparatus for microcomputer system and recording medium on which debug program is recorded | |
CN116700763B (zh) | Clickhouse数据库的版本升级方法及装置 | |
CN111241064B (zh) | 一种数据库配置文件的处理方法、装置及存储介质 | |
US8904348B2 (en) | Method and system for handling errors during script execution | |
US11070377B1 (en) | Blended virtual machine approach for flexible production delivery of intelligent business workflow rules | |
CN112612773A (zh) | 数据库同步测试方法、装置、计算机设备及存储介质 | |
CN113778997B (zh) | 一种数据库版本管理方法、系统及设备 | |
CN113297220B (zh) | 数据的恢复方法、装置、计算机可读存储介质以及处理器 | |
CN118034777B (zh) | 基于fttr的日志管理与版本控制方法、装置、设备及介质 | |
CN115857834B (zh) | 一种用于检查针对存储器的读写一致性的方法和装置 | |
US20080127075A1 (en) | Method and system for enforcing version control | |
CN116931963A (zh) | 服务器端多部件软件可回退发布部署方法 | |
CN118779383A (zh) | 海量数据同步系统、方法及电子设备 | |
CN115357562A (zh) | 数据库迁移的方法、系统、设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |