发明内容
本申请实施例提供一种清理数据库历史数据的方法和系统,用于提高数据清理的效率;
进一步,实现了异常自动恢复和个性化指定清理,解决了现有技术中清理失败时不能进行异常自动恢复清理及不能支持特殊需求的清理的问题。
本发明通过一个或多个实施例提供的一种清理数据库历史数据的方法,该方法具体包括如下步骤:
从为数据库的子数据库建立的数据清理任务队列中,获取数据清理任务,该数据清理任务中包括需要清理的历史数据索引信息,该数据库被划分为至少两个子数据库,且至少两个子数据中的每一个子数据库对应每一个子数据库建立的数据清理任务队列;
根据获取的数据清理任务中的历史数据索引信息,清理子数据库中需要清理的历史数据。
可选的,从为数据库的子数据库建立的数据清理任务队列中,获取数据清理任务,具体包括:
从为数据库的子数据库建立的数据清理任务队列中,获取任务状态为未完成状态的数据清理任务;以及
根据未完成状态的数据清理任务的历史数据索引信息,成功清理子数据库中未完成状态的数据清理任务的历史数据后,将数据清理任务状态设置为清理成功状态。
可选的,未完成状态的数据清理任务中至少包括以下一种具体状态的任务,具体为:
初始状态的任务、异常中止状态的任务或清理失败状态的任务。
其中,所述初始状态的任务为,从未清理过的任务;
所述异常中止状态的任务为,上一次清理所述未完成状态的数据清理任务过程中,由于其历史数据的非数据性错误而造成清理过程异常中止时,设置数据清理任务状态为异常中止状态的任务;
所述清理失败状态的任务为,上一次清理所述未完成状态的数据清理任务过程中,由于其历史数据本身的数据性错误而导致清理失败时,设置数据清理任务状态为清理失败状态的任务。
进一步的,根据获取的数据清理任务中的历史数据索引信息,清理子数据库中需要清理的历史数据后,还包括:更新记录在数据库表中的清理日志,该清理日志包括数据清理任务状态和清理时间。
可选的,所述获取任务状态为未完成状态的数据清理任务,具体包括:
根据如下两种未完成的数据清理任务的具体状态的优先级顺序,优先获取具体状态的排列顺序靠前的数据清理任务,并不再执行清理失败状态的任务:异常中止状态的任务、初始状态的任务。
可选的,在从为数据库的子数据库建立的数据清理任务队列中,获取数据清理任务之前,具体还包括:
确认当前时间符合限定的执行清理任务的时间。
进一步的,可以将该数据清理任务划分为至少包括如下一种任务:
查询子数据库的备数据库的历史数据索引信息,并当查询到满足限定条件的需要清理的历史数据时建立的第一种历史数据清理任务;
根据用户在子数据库的备数据库中的历史数据索引信息指定要清理的历史数据建立的第二种历史数据清理任务;
该历史数据索引信息为历史数据在备数据库的数据字典中的索引信息。
进一步的,当数据清理任务同时包括第一种历史数据清理任务和第二种历史数据清理任务时,所述获取数据清理任务,具体为:优先获取第二种历史数据清理任务。
可选的,根据所述数据清理任务,清理子数据库中需要清理的历史数据时,可以为:
根据任务队列中的历史数据索引信息,以及子数据库和其备数据库的数据字典中的数据索引信息之间的对应关系,确定历史数据在所述子数据库中的索引信息;并
根据确定的索引信息,查询并清理所述子数据库中的历史数据。
本发明通过实施例提供一种清理数据库历史数据的系统,该系统具体包括:
获取单元,用于从为数据库的子数据库建立的数据清理任务队列中,获取数据清理任务,该数据清理任务中包括需要清理的历史数据索引信息,该数据库被划分为至少两个子数据库,且所述至少两个子数据中的每一个子数据库对应每一个子数据库建立的数据清理任务队列;
清理单元,用于根据数据清理任务的历史数据索引信息,清理子数据库中需要清理的历史数据。
可选的,在获取单元之前,还可以包括:
确认单元,用于确认当前时间符合限定的执行清理任务的时间。
上述技术方案中的一个或多个技术方案,具有如下技术效果或优点之一:
1、利用任务队列,实现对数据库历史数据的清理,解决了现有技术中由于人工操作导致的效率不高,容易遗漏清理任务的问题;
2、进一步的,由于使用了数据库表来记录任务,在清理任务的各阶段,不仅根据具体情况修改了任务的状态,并且将任务清理日期及任务状态记录到数据库日志表中,所以在非数据错误的情况下清理失败时,可以自动选择上次清理过程中因非数据性错误而清理失败的任务,实现了异常自动恢复和个性化指定清理,解决了现有技术中清理失败时不能进行异常自动恢复清理及不能支持特殊需求的清理的问题。
3、因为在清理之前限定了可以执行数据清理的时间段,所以在利用任务队列来实现历史数据的清理时,用户可以根据自己的需求,对清理时间窗口作更好的控制,尽量避免在主数据库工作时间进行数据清理,从而减少了对主数据库工作状态的影响;
4、对数据清理任务中的任务进行分类,对各类任务中的每一个任务设置任务状态,且对分类的任务和任务状态设置优先级,能够提高数据清理的效率,节省时间;
5、由于是根据子数据库的备数据库中的历史数据索引信息确定历史数据在所述子数据库中的索引信息,并根据确定的索引信息,查询并清理所述子数据库中的历史数据,对子数据库只有写操作,对子数据库中正在工作的业务影响很小;
6、由于任务队列中的历史数据索引信息是历史数据在备数据库的数据字典中的索引信息,所以在拆分子数据库后,数据字典信息也自动发生改变,清理任务可以继续进行,更不需要担心因为修改业务逻辑而对维护造成困难的问题。
具体实施方式
本申请实施例提供一种清理数据库历史数据的方法和系统,利用任务队列,实现对数据库历史数据的清理,解决了现有技术中由于人工操作导致的效率不高,容易遗漏清理任务的问题;
进一步,实现了异常自动恢复和个性化指定清理,解决了现有技术中清理失败时不能进行异常自动恢复清理及不能支持特殊需求的清理的问题。
下面结合各个附图对本申请实施例技术方案的主要实现原理、具体实施方式及其对应能够达到的有益效果进行详细地阐述。
请参考图1,本申请实施例一,提供一种清理数据库历史数据的方法,具体步骤如下:
步骤10,从为数据库的子数据库建立的数据清理任务队列中,获取数据清理任务,该数据清理任务中包括需要清理的历史数据索引信息,该数据库被划分为至少两个子数据库,且每一个子数据库对应每一个子数据库建立的数据清理任务队列;
步骤20,根据获取的数据清理任务中的历史数据索引信息,清理子数据库中需要清理的历史数据。
本申请实施例一提供的方法中,每一个子数据库的历史数据清理工作可以用两个相互独立的进程init进程和delete进程来实现,其中:
init进程负责根据设定的数据清理条件,从数据库的子数据库中提取出需要清理的历史数据索引信息,每次同批清理的历史数据形成一个数据清理任务,并将数据清理任务初始化到为数据库的子数据库建立的数据清理任务队列中;
delete进程负责从清理任务队列中逐个获取数据清理任务,根据数据清理任务中的历史数据索引信息,清理子数据库中需要清理的历史数据。
为保证数据清理任务的延续,本申请实施例中进一步将数据清理任务分为两种状态,一种是清理成功状态,另一种是未完成状态,对于在数据清理过程中,无论什么原因发生中断导致数据清理未完成时,将数据清理任务的状态设置为未完成状态,从而在下次启动数据清理后可以优先处理,以实现数据清理任务的自动恢复。因此,从为数据库的子数据库建立的数据清理任务队列中,获取数据清理任务时,根据为每一个数据清理任务设置的状态,具体操作包括:
delete进程从为数据库的子数据库建立的数据清理任务队列中,获取任务状态为未完成状态的数据清理任务;以及
根据所述未完成的数据清理任务的历史数据索引信息,成功清理子数据库中所述未完成状态的数据清理任务的历史数据后,将数据清理任务状态设置为清理成功状态(success)。
由于未完成状态的数据清理任务可能不同原因导致的,例如初始未执行过的任务、执行过程中异常中止的任务,以及最终无法完成的任务等,本申请实施例中再进一步将未完成的数据清理任务分为如下三种具体状态:
初始状态的任务(init)、异常中止状态的任务(updating)和清理失败状态的任务(fail)。
其中,初始状态的任务为,利用init进程将产生的任务初始化到数据清理任务队列中从未清理过的任务;
异常中止状态的任务为,上一次清理所述未完成状态的数据清理任务过程中,由于其历史数据的非数据性错误而造成清理过程异常中止时,设置数据清理任务状态为异常中止状态的任务;
清理失败状态的任务为,上一次清理所述未完成状态的数据清理任务过程中,由于其历史数据本身的数据性错误而导致清理失败时,设置数据清理任务状态为清理失败状态的任务。
如图2所示,为delete进程清理任务中发生程序异常中止的流程示意图,例如,delete进程启动时,选择数据清理任务中一个未完成状态的任务进行清理,当任务正在执行时,处理过程中若发生系统异常,如断电,down机,网络异常等因非数据型错误而导致程序异常中止,将该任务的未完成状态设置成updating状态,且updating状态是该任务的最终状态。
如图3所示,为delete进程清理任务过程中清理失败的流程图,例如,delete进程启动时,选择数据清理任务中一个未完成状态的任务进行清理,如果因为数据本身的原因而导致处理失败,将该任务的未完成状态设置成fail状态,由于fail状态的数据清理任务可能永远无法成功执行,因此也可以是在尝试设定次数,例如三次或四次后再将任务的未完成状态设置成fal状态。
本申请实施例中,可以将设置的数据清理任务状态和清理时间记录到数据库日志表中。例如,将任务状态为updating状态以及清理时间为2011-07-2310:38:49,fail状态以及清理时间为2011-07-2310:38:50记录到数据库日志表中,在下次清理开始时,重新获取记录在数据库日志表中的任务进行清理。
综上实施例一所述的多种方法,由于使用了数据库表来记录任务,在清理任务的各阶段,不仅根据具体情况修改了任务的状态,并且将任务清理日期及任务状态记录到数据库日志表中,所以在非数据错误的情况下清理失败时,在下次delete进程启动时,可以自动选择上次清理过程中因非数据性错误而清理失败的任务,自动恢复清理。
本申请实施例二,为了能够更好的控制清理的时间,减少对工作时间的影响,可以为数据清理任务设定特定的执行时间,例如夜间。因此从为数据库的子数据库建立的数据清理任务队列中,获取数据清理任务之前,具体还包括:确认当前时间符合限定的执行清理任务的时间,该限定的执行清理任务的时间可以是系统默认的清理时间,也可以是根据用户自己实际清理需要而设置的清理时间。例如,当前时间为2011-07-2822:35,用户限定的清理时间为2011-07-2822:30到2011-07-2823:00,可以看出当前时间在限定的清理时间范围内,那么就可以从为数据库的子数据库建立的数据清理任务队列中,获取数据清理任务,并根据获取的数据清理任务中的历史数据索引信息,清理子数据库中需要清理的历史数据。
从本发明实施例二提供的方法可以知道,因为在清理之前确认了当前时间是否符合了限定的执行清理任务的时间,所以在利用任务队列来实现历史数据的清理时,用户可以根据自己的需求,对清理时间窗口作更好的控制。
本申请实施例三,根据前述三种状态,为进一步提高历史数据的清理效率,按照三种状态的如下排序,优先获取状态排序在前的任务:异常中止状态和初始状态,不再处理fail状态的任务,从而优先恢复处理异常中止的任务。
例如,当数据清理任务中有异常中止状态的任务(updating)和初始状态的任务(init)时,delete进程优先获取具体状态为异常中止状态的任务(updating)进行清理,直到清理完成所有具体状态为异常中止状态(updating)的任务,再获取具体状态为初始状态(init)的任务进行清理,对于已经设定为清理失败状态(fail)的任务,不再进行清理。
如图4所示,为实施例三中delete进程执行流程图,直到获取的任务都清理完成或者当前时间不符合限定的执行清理任务的时间,那么delete进程才结束。
由本申请实施例三可以看出,对未完成状态的任务又划分为三种
状态的任务并对这三种状态的任务设置优先级,可以提高数据清理的工作效率,具体理由如下:
异常中止状态的任务是在上一次清理过程中由于系统异常,如断电等情况导致任务清理失败,所以在delete进程再次启动时,优先去获取该状态的任务并重新清理,这样不会遗漏掉上次没有清理成功的任务;
而清理失败的任务是在上一次清理过程中由于数据本身的原因而导致任务清理失败,可以知道该状态的任务很难清理成功,所以最后选择该状态的任务进行清理,以免浪费时间清理却没有清理成功。
而为了能够使数据清理任务的设定更加多元化,本申请实施例四将数据清理任务还可以包括根据设定条件自动生成的任务,和指定的任务,一般可以对这两种类型的任务设定优先级,例如优先处理指定任务等,具体的:
查询子数据库的备数据库的历史数据索引信息,并当查询到满足限定条件的需要清理的历史数据时建立的第一种历史数据清理任务;
根据用户在子数据库的备数据库中的历史数据索引信息指定要清理的历史数据建立的第二种历史数据清理任务;
该历史数据索引信息为历史数据在备数据库的数据字典中的索引信息;
其中,当数据清理任务同时包括第一种历史数据清理任务和第二种历史数据清理任务时,优先获取第二种历史数据清理任务。
为减少对主数据库的访问,可以利用备数据库生成数据清理任务,这样在根据获得的数据清理任务,清理子数据库中需要清理的历史数据时,是首先根据任务队列中的历史数据索引信息,以及子数据库和其备数据库的数据字典中的数据索引信息之间的对应关系,确定历史数据在所述子数据库中的索引信息;并根据确定的索引信息,查询并清理所述子数据库中的历史数据。
在实际应用中,综上所述的一个或多个实施例还可以得到以下有益技术效果:
由于是根据子数据库的备数据库中的历史数据索引信息确定历史数据在子数据库中的索引信息,并根据确定的索引信息,查询并清理子数据库中的历史数据,对子数据库只有写操作,对子数据库中正在工作的业务影响很小;
由于任务队列中的历史数据索引信息是历史数据在备数据库的数据字典中的索引信息,所以在拆分子数据库后,数据字典信息也自动发生改变,清理任务可以继续进行,进而不需要担心因为修改业务逻辑而对维护造成困难的问题。所述历史数据索引信息可以通过很多种形式来呈现,如:表,纯文字等。例如,如原子数据库A中包含了TEST_00,TEST01...TEST_19共20份表,则子数据库A的备数据库A'的数据字典中保存了以下信息:
TEST_00
TEST_01
TEST_19
将子数据库A拆分为2个子数据库:A1和A2,则备数据库A1的数据字典中包含:
TEST_00
TEST_01
……
TEST_09
备数据库A2的数据字典中包含:
TEST_10
TEST_11
……
TEST_19,
其对应关系并不会因为拆分而导致数据字典信息发生改变,所以不需要修改业务逻辑,不会影响后期维护;
因为使用了数据库表来记录任务,清理任务从数据字典中收集,所以可以用户指定清理,可以执行任意需求的清理工作,灵活性上得到更大的提升。
例如,默认需要清理实施例四中子数据库A2库中的:
TEST_00
TEST_01
TEST_09
共9个库默认一年前的数据,当用户需要清理TEST_02库最近2011年6,7月的数据时,可以手工的插入两条记录:
TEST_022011-06
TEST_022011-07
这两个月的数据即可进行清理。
如图5所示,为本发明清理数据库历史数据的第一实施例系统框架图,本申请提供一种清理数据库历史数据的系统,具体包括:
获取单元501,用于从为数据库的子数据库建立的数据清理任务队列中,获取数据清理任务,所述数据清理任务中包括需要清理的历史数据索引信息,所述数据库被划分为至少两个子数据库,且所述至少两个子数据中的每一个子数据库对应每一个子数据库建立的数据清理任务队列;
清理单元502,用于根据所述数据清理任务的历史数据索引信息,清理子数据库中需要清理的历史数据。
如图6所示,为本发明清理数据库历史数据的第二实施例系统框架图,本基于第一实施例的清理数据库历史数据的系统,为了能够更好的控制清理时间,在获取单元502之前,还可以包括:
确认单元601,用于确认当前时间符合限定的执行清理任务的时间。
本发明所设计的方法,可以使用任何计算机语言实现,且对于软件与硬件没有特殊要求。尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。