一种数据库系统的故障处理方法和装置
技术领域
本发明涉及数据库,更具体地,涉及一种数据库系统的故障处理方法和装置。
背景技术
数据库系统是数据库管理系统的简称,典型的产品如Oracle、MySQL等。数据库对象指数据库系统中的逻辑实体,例如表、索引、存储过程等。在大型互联网公司、云计算等数据中心环境中,数据库安装的实例数以万计,因此数据库中的对象出现故障的数量也会较多。例如,在MySQL等数据库产品中,常常会因为各种原因导致部分数据库对象的故障,从而影响业务的正常运行。典型的例子如某个辅助索引损坏而导致查询报错。
相关技术中,数据库系统内的故障对象检测有两种方式,一种是数据库内部实现的。数据库产品(例如MySQL)在执行查询时会访问数据库对象,会对其中的系统数据或用户数据做不同程度的一致性检查,如果发现数据库对象故障(典型的情况包括系统数据或用户数据损坏等),系统会给出一个错误信息,以通知应用程序。但是系统并不会对故障对象做隔离,也不会主动尝试修复。在下次访问到该故障对象时,系统还是会报错,这种处理方式对系统管理员以及应用程序非常不友好。
另一种故障对象检测的方法是在数据库外部实现的,通过数据库系统之外的模块如高可用模块在外部检测数据库是否提供服务,并做出主备切换以及数据库的重做。它在云计算以及大型互联网公司的大规模部署环境中都有应用。但是,由于故障的检测是数据库外做的,不能及时发现故障,也不具备故障隔离能力。另外,故障的修复粒度很粗,只能重做整个数据库,消耗的时间和系统资源都比较多。
某些系统也会提供检查数据库对象是否故障的命令,例如MySQL的CHECK TABLE命令。但这类命令需要人工或由应用程序来调度执行,执行这些命令的时机不容易选择,不能够及时发现故障。并且,命令检查的越详细,所需的资源就越多,还会影响到并发执行的查询。因此,多数情况下,这些命令会被调度到系统的低峰期执行,以减少对业务的影响。
现有技术中,故障修复是由系统管理员通过专门的命令来处理,典型的办法是删除并重建对象,这会造成数据库对象在修复期间不可使用。
发明内容
有鉴于此,本发明实施例提供一种数据库系统的故障处理方法,包括:
在数据库系统执行查询处理时,对数据库对象进行在线检测,发现所述数据库对象存在故障;
自动对所述数据库对象执行隔离处理。
本发明实施例还提供一种数据库系统的故障处理装置,包括在线检测模块和自动隔离模块,其中:
所述在线检测模块设置为:在执行查询处理时对数据库对象进行在线检测,发现所述数据库对象存在故障时通知所述自动隔离模块;
所述自动隔离模块设置为:收到所述在线检测模块的所述通知后,自动对所述数据库对象执行隔离处理。
本发明实施例还提供一种数据库系统的故障处理装置,包括存储器和处理器,其中:
所述存储器设置为:保存程序代码;
所述处理器设置为:读取所述存储器保存的程序代码以执行以下处理:
在数据库系统执行查询处理时,对数据库对象进行在线检测,发现所述数据库对象存在故障时,自动对所述数据库对象执行隔离处理。
上述方案通过自动故障检测和隔离,可以减轻运维的代价并降低对应用程序的影响。
附图说明
图1是本发明实施例一故障处理方法的流程图;
图2是本发明实施例一故障处理装置的模块图;
图3是本发明实施例二数据库语句执行过程的流程图;
图4是本发明实施例二中一个示例性的故障处理方法的流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,下文中将结合附图对本发明的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。
实施例一
本实施例提供一种数据库系统的故障处理方法,如图1所示,包括:
步骤110,在数据库系统执行查询处理时,对数据库对象进行在线检测,发现所述数据库对象存在故障;
数据库系统中访问数据的主要操作包括:增加(INSERT)、删除(DELETE)、修改(UPDATE)和查询(SELECT),简称增删改查。SELECT对应于通用计算机领域中的读操作,增、删、改对应于写操作。除查询操作外,增删改也会触发系统内部的查询处理。例如:假设表上带有主键索引,INSERT一条记录时为了确保主键索引的唯一性,需要通过内部的查询操作确保主键的取值是唯一的。DELETE和UPDATE时,必须要通过内部的查询操作找出符合条件的记录,才能对它们做删除或更新。
数据库中最主要的两类对象是表和索引,还可以是存储过程对象。数据库系统进行在线检测时,根据运行上下文环境以及操作的数据库对象类型随时进行检查。例如,对于数据库中的表对象,要在打开表时检查它的元信息(例如表名、列的个数、类类型等)是否通过一致性检查,在读取数据页面时检查数据页面的循环冗余校验(Cyclic RedundancyCheck,CRC)信息、元信息、记录内容等是否通过一致性检查。如果一致性检查不通过,则发现所述数据库对象存在故障。
本实施例中,在发现所述数据库对象存在故障之后,还包括:
如果所述数据库对象的故障属于所述数据库系统定义的需尝试在线修复的故障,先尝试在线修复所述故障,修复成功继续执行查询,修复失败再执行步骤120;
如果所述数据库对象的故障不属于所述数据库系统定义的需尝试在线修复的故障,则不再进行故障修复,直接执行步骤120。
也就是说,在线修复指发现到故障后马上进行修复,修复成功继续原来的业务流程,修复失败再进行相应的故障处理。
本实施例中,需尝试在线修复的故障是数据库系统事先定义的,包括读取所述数据库对象的数据页面时发现的部分故障,如循环冗余校验CRC错误。数据库对象的每一页面上可以有自己的CRC信息,可用于检查和修复该页面的信息。有些故障类型,如打开数据库对象时发现表的元信息错误,读取数据库对象的数据页面时发现页面的元信息错误,不能在线修复,则在隔离之后再进行自动修复。
步骤120,对所述数据库对象执行隔离处理;
本实施例中,发现数据库对象故障后,数据库系统除可以给应用报错,显示相应的错误号和错误信息,记录故障审计日志等处理外,还可以对所述数据库对象执行隔离处理,包括:将所述数据库对象以及所述数据库系统内存中引用所述数据库对象的数据结构标记为失效。在标记时,以记录表的元信息的系统表INFORMATION_SCHEMA.TABLES为例,可以在其中增加一列TABLE_STATUS来标记对象状态为正常或故障,还可以再增加一列STATUS_COMMENT记录故障原因。
步骤130,对所述数据库对象的故障进行自动修复处理。
本实施例中,所述自动修复处理包括:在所述数据库系统内部对所述数据库对象的故障进行自动修复;或者,将所述数据库对象的故障记录在系统状态中,触发所述数据库系统之外的模块进行自动修复。需说明的是,本实施例隔离前的在线修复和隔离后的自动修复处理的数据粒度不同。隔离前的在线修复是对数据页面等细粒度的数据对象进行修复,而隔离后的自动修复是对整个表、索引等粗粒度的数据对象进行修复。
在数据库系统内部进行自动修复处理时,可以先判断发现故障的数据库对象的类型,对不同类型采取不同的修复方式。例如,针对数据库中的索引对象,先创建一个同样定义的索引,但赋予一个由系统自动产生的唯一的新名字,在新索引创建成功并可用后,将新旧索引的名字互换。旧的对象定义以及对应的数据默认都保留下来,以便做事后的故障分析。系统管理员也可以根据故障原因配置是否删除旧的对象,以节省磁盘空间等系统资源。对于数据表,如果是发现数据表的统计信息(表中记录的条数、最大值、最小值等)有错误,可以尝试在系统内部通过重新生成这些统计信息,来实现该故障的自动修复。
本实施例对不能在线修复的故障是先隔离再修复。先隔离可以尽快给后续的访问报错或选择别的执行方法,而且隔离的处理比较简单、快速,修复的时间一般比较长。进行隔离处理后,新的查询在访问这些对象前就会发现它已经失效,因而可以更早地给应用程序返回错误信息,减少系统的资源消耗。例如,某个表发生故障被隔离后,后续查询若涉及该表,则立即会报错。某个索引发生故障被隔离后,后续查询若涉及该索引所在的表,则会选择全表扫描(不用索引)或使用其他的索引。
在另一实施例中,在执行隔离之后,也可以不再进行自动修复,而是由系统管理员通过专门的命令来处理。同样可以通过故障隔离达到减轻运维的代价并降低对应用程序的影响等效果。
本实施例还提供了一种数据库系统的故障处理装置,如图2所示,包括在线检测模块10和自动隔离模块20,其中:
所述在线检测模块10设置为:在执行查询处理时对数据库对象进行在线检测,发现所述数据库对象存在故障时通知所述自动隔离模块。本实施例中,在线检测模块在执行查询处理时根据运行上下文环境以及操作的数据库对象类型随时进行检查,对发现的故障,不仅报错并提供错误号和错误信息、记录故障审计日志,而且要通知自动隔离模块去做故障隔离处理。
所述自动隔离模块20设置为:收到所述在线检测模块的所述通知后,对所述数据库对象执行隔离处理。
本实施例中,所述在线检测装置发现所述数据库对象存在故障之后,还包括:
如果所述数据库对象的故障属于所述数据库系统定义的需尝试在线修复的故障,先尝试在线修复所述故障,修复成功继续执行查询,修复失败再通知所述自动隔离模块;
如果所述数据库对象的故障不属于所述数据库系统定义的需尝试在线修复的故障,则直接通知所述自动隔离模块。
本实施例中,所述需尝试在线修复的故障包括所述数据库对象的数据页面CRC校验错误。
本实施例中,所述自动隔离模块执行的隔离处理包括:将所述数据库对象以及所述数据库系统内存中引用所述数据库对象的数据结构标记为失效。
本实施例中,所述故障处理装置还包括自动修复模块;
所述自动隔离模块对所述数据库对象执行隔离处理后,还通知所述自动修复模块;
所述自动修复模块设置为:收到所述自动隔离模块的所述通知后,对所述数据库对象进行自动修复处理。
本实施例中,所述自动修复模块对所述数据库对象进行自动修复处理,包括:在所述数据库系统内部对所述数据库对象的故障进行自动修复;或者,将所述数据库对象的故障记录在系统状态中,触发所述数据库系统之外的模块进行自动修复。
上述模块的功能用于实现本实施例故障处理方法中的相应处理。需说明的是,也可以采用其他的模块划分方式来实现这些功能,这些模块划分方式应视为是等同的。
本实施例还提供了一种数据库系统的故障处理装置,包括存储器和处理器,其中:
所述存储器设置为:保存程序代码;
所述处理器设置为:读取所述存储器保存的程序代码以执行以下处理:
在数据库系统执行查询处理时,对数据库对象进行在线检测,发现所述数据库对象存在故障时,自动对所述数据库对象执行隔离处理。
本实施例中,所述处理器发现所述数据库对象存在故障之后,还执行以下处理:
如果所述数据库对象的故障属于所述数据库系统定义的需尝试在线修复的故障,先尝试在线修复所述故障,修复成功继续执行查询,修复失败则自动对所述数据库对象执行隔离处理;
如果所述数据库对象的故障不属于所述数据库系统定义的需尝试在线修复的故障,则自动对所述数据库对象执行隔离处理。
本实施例中,所述需尝试在线修复的故障包括读取所述数据库对象的数据页面时发现的部分故障,所述部分故障包括循环冗余校验CRC错误。
本实施例中,所述处理器执行的隔离处理包括:将所述数据库对象以及所述数据库系统内存中引用所述数据库对象的数据结构标记为失效。
本实施例中,所述处理器自动对所述数据库对象执行隔离处理之后,还对所述数据库对象的故障进行自动修复处理。
本实施例中,所述处理器执行的自动修复处理包括:在所述数据库系统内部对所述数据库对象的故障进行自动修复;或者,将所述数据库对象的故障记录在系统状态中,触发所述数据库系统之外的模块进行自动修复。
本实施例可以具有如下优点:1、在数据库系统内部实现,可以及时发现故障。2、具备故障隔离能力。3、具备自动修复故障的能力,而且修复的粒度较小,可以到具体的数据库对象。4,在自动修复时,可以与上述第二种现有技术方案集成。若检测装置检测可自修复,则直接本地修复。若检测装置判定为不可修复,则将该信息记录到系统状态中。高可用模块通过查询该信息,并发起切换。切换完成后,对新的备库(也就是老的主库)执行数据重做等修复操作。
实施例二
本实施例给出数据库系统故障处理的一些具体应用中的示例。
本实施例以MySQL数据库系统为例,先说明以下数据库系统对SQL语句的处理,故障处理是在执行SQL语句时进行的。
如图3所示,数据库系统是对SQL语句的处理流程,包括:
步骤210,接收应用程序发送来的SQL语句;
步骤220,对SQL语句进行词法与语法分析,形成一棵语法树;
步骤230,对语法树进行语义检查,检查表、列是否存在等;
步骤240,行查询优化,产生查询执行计划树;
步骤250,按照查询计划树,执行查询处理并返回结果。
上述SQL语句可以是查询语句(SELECT),也可以是增加(INSERT)、删除(DELETE)和修改语句(UPDATE)。在上述过程中也可以做一些辅助的操作,例如权限的检查等。
本实施例数据库系统故障处理的在线检测、自动隔离等操作主要处于查询处理阶段即上述的步骤250。
在第一个示例中,以对数据表执行查询处理时的故障处理为例,如图4所示,相应流程包括:
步骤310,数据库系统执行对数据表的查询处理,打开所述数据表,对所述数据表的元数据进行检查;
步骤320,判断所述数据表是否存在故障(如元数据不正确、数据表对应的物理文件不存在等),如是,执行步骤330,否则,执行步骤380;
步骤330,读取所述数据表的数据页面;
步骤340,如所述数据页面不存在故障,执行步骤350,否则,执行步骤360;
读取数据页面后,可以对数据页面进行CRC校验,及对数据页面的元信息、记录内容进行一致性检查,如CRC检验或一致性检查不通过,则认为页面存在故障。
步骤350,继续后续的查询处理,结束;
步骤360,如果所述数据页面存在需尝试在线修复的故障如CRC错误,执行步骤370,否则,执行步骤380;
步骤370,尝试在线修复所述数据页面需尝试在线修复的故障,如果修复成功,执行步骤350,如修复失败,执行步骤380;
本示例中,如果对同一个数据表尝试修复的数据页面个数超过设定阈值(例如100个),则判定属于表故障而不仅是数据页面故障,执行隔离处理,不再尝试修复。
步骤380,对所述数据表进行隔离处理,将所述数据表以及内存中引用所述数据表的数据结构标记为失效;
对所述数据表的每一数据页面均执行步骤330~步骤380的处理,为了表述简单,这里不再用循环的方式表述。
步骤390,对所述数据表的故障进行自动修复。
在另一示例中,数据库对象是索引,在查询处理时,打开索引、读取索引的数据页面的操作与打开数据表、读取数据表的数据页面的操作是类似的,对数据页面的检查和在线修复操作、隔离也是类似的。但是表和索引在隔离之后的修复方法是不同的。索引是附属与表的,只要表没有出故障,则索引的修复可以在系统内部进行。表的故障多数情况下需要系统外部的模块进行处理。如果系统支持表的快照等机制,表的故障恢复也可以在系统内部进行(MySQL不支持)。
某些数据库系统中,存储过程对象不仅保存了原始定义,还保存了编译后的二进制数据。查询处理时,对存储过程对象的故障处理也是类似的。如果对编译后的二进制数据增加了CRC等校验机制,也可以检查出错误并尝试纠错。如果没有CRC等校验机制,则可以做一些简单的格式和值域检查,发现错误后就进行隔离,带离后进行自动修复。修复时可以重新从原始定义再编译产生二进制数据,也可以依赖外部的修复机制。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。