用于MySQL的快速回收回滚空间的方法和装置的制造方法
【技术领域】
[0001] 本申请涉及数据库回滚空间的回收技术,具体涉及一种用于MySQL的快速回收回 滚空间的方法。本申请同时涉及一种用于MySQL的快速回收回滚空间的装置。
【背景技术】
[0002] MyS化是一个关系型数据库管理系统,支持多种数据库引擎,其主流是支持事务机 制的InnoDB存储引擎,而回滚日志(undolog)则是InnoDB引擎中用于实现事务回滚的日 志,通常存储在InnoDB的系统表空间文件(例如;ibdatal文件)中。化dolog的工作原理 是该样的;在执行事务中的任何数据库操作之前,首先将与该操作相关的数据备份到undo log中,然后执行该数据库操作,如果后续需要撤销该操作或者获取执行该操作之前的数据 信息,系统可W利用undolog中的备份实现上述功能。
[0003]MySQLInnoDB使用undolog主要实现W下两个方面的用途;一方面,用于保证事 务的原子性,当数据库事务未能正确完成,或者在执行期间由于异常原因需要恢复到事务 开始的状态,该种情况下需要使用undolog进行回滚操作;另一方面,用于进行多版本并 发控制(MVCC),从而实现InnoDB事务间的缺省隔离级别:可重复读(r巧eat油le-read),该 隔离级别要求用户在事务持续期间看到的数据视图与事务开始前一致,当某个事务中的一 个数据库操作发现其要访问的数据的最新版本已经被修改(从本事务启动到当前的该段时 间内,该数据已被其他事务修改),该时就需要结合最新版本的undolog获取该数据未更新 前的值,即本事务本应看到的版本。当数据库事务结束后,InnoDB会判定并标记与该事务相 关的undolog可W被回收且重新利用,之后其他事务再次需要申请新的undolog时,就可 W从该些被标记为已回收且可重新利用的回滚空间(即;系统表空间文件中用于记录undo log的部分)中申请。
[0004] 虽然已经申请并且分配的回滚空间可W重复利用,但是InnoDB对上述可重复读 隔离级别的支持,可能会导致回滚空间的过度膨胀。如果系统启动了一个执行时间较长的 事务,例如selec巧化om&_namewhereid=x,为了能够维持该个事务始终能够看到开始 执行时的相同视图,那么在该个事务启动后的undolog都不能被InnoDB回收并重新利用, 该就导致当空闲undolog使用完成W后,必须向操作系统申请新的空间,从用户角度看,就 是系统表空间文件变大了。膨胀后的回滚空间虽然可W重复利用,但是却没有机会返回给 操作系统,因此回滚空间只可能越来越大,甚至可能出现接近100G的情况,那么包含该回 滚空间的系统表空间文件就会始终占据磁盘空间,造成磁盘浪费。
[0005] 针对上述MyS化回滚空间过大的问题,现有技术采用重建用户数据的方式回收回 滚空间,通常采用W下步骤:
[0006] 1)将待回收回滚空间的数据库的数据全部导出;
[0007] 2)删除待回收回滚空间的数据库实例;
[000引 3)重新创建一个空的数据库实例;
[0009] 4)将之前全部导出的数据导入新创建的空数据库实例中。
[0010] 上述现有技术方案虽然可W有效地回收回滚空间,使系统表空间文件的长度缩小 为系统配置文件中设置的初始值,例如200M,但是上述回收回滚空间的过程非常耗时,主要 是步骤1)和步骤4)的数据导出和导入操作,对于数据量大的、达到百G级别的实例来说, 通常需要一个甚至数个小时才能完成数据的导出和导入操作。而在具体的应用中,为了保 证服务的可用性,MyS化数据库系统通常采用主备服务器的架构,那么当其中一台服务器执 行上述耗时的回收回滚空间操作时,另一台作为主库工作的服务器就缺少实时备份实例, 该意味着在此期间若主库出现故障,系统无法提供直接可用的备机,从而直接影响数据库 服务的可用性。
【发明内容】
[0011] 本申请提供一种用于MyS化的快速回收回滚空间的方法,W解决现有技术回收 MyS化回滚空间耗时长的问题。本申请另外提供一种用于MyS化的快速回收回滚空间的装 置。
[0012] 本申请提供一种用于MySQL的快速回收回滚空间的方法,包括:
[0013] 采用在关闭过程中清除无效回滚数据的方式关闭MyS化数据库;
[0014]W待回收回滚空间的原始系统表空间文件为基础,生成一个不包含回滚空间的新 的系统表空间文件;
[0015] 用所述新的系统表空间文件替换所述原始系统表空间文件。
[0016] 可选的,在执行所述用所述新的系统表空间文件替换所述原始系统表空间文件的 步骤后,重新启动所述MyS化数据库。
[0017] 可选的,所述采用在关闭过程中清除无效回滚数据的方式关闭MyS化数据库的步 骤,包括:
[0018] 将所述MyS化数据库的关闭选项设置为,MyS化数据库系统预定义的在关闭过程 中包含清除无效回滚数据操作的特定值;
[0019] 关闭所述MyS化数据库。
[0020] 可选的,执行所述关闭MyS化数据库的步骤之前,执行下述操作:
[0021] 减少缓冲池中的未同步到磁盘的已修改数据页的数量,使其小于预先设定的值。
[0022] 可选的,所述减少缓冲池中的未同步到磁盘的已修改数据页的数量,使其小于预 先设定的值,包括:
[0023] 设置未同步到磁盘的已修改数据页在缓冲池中所占比例为0 ;
[0024] 监测缓冲池中的未同步到磁盘的已修改数据页的数量,直至所述数量小于预先设 定的值。
[00巧]可选的,所述W待回收回滚空间的原始系统表空间文件为基础,生成一个不包含 回滚空间的新的系统表空间文件,包括:
[0026] 创建一个新的系统表空间文件;
[0027] 按照系统表空间文件的格式,将所述原始系统表空间文件中包含的、且类型不是 回滚页的数据页写入所述新的系统表空间文件中;
[0028] 更新所述新的系统表空间文件中与回滚空间相关的统计信息的内容为,系统表空 间文件默认的代表当前无回滚空间的值;
[0029] 判断所述新的系统表空间文件的长度是否小于系统设定的系统表空间文件的初 始长度;若是,调整所述新的系统表空间文件的长度,使其大于或者等于系统设定的系统表 空间文件的初始长度。
[0030] 可选的,所述按照系统表空间文件的格式,将所述原始系统表空间文件中包含的、 且类型不是回滚页的数据页写入所述新的系统表空间文件中,包括:
[0031] W系统设定的数据页的长度为单位,依次读取所述原始系统表空间文件中的数据 页;
[0032] 判断当前所读数据页的类型是否为系统字典页或者二次写缓冲页;
[0033] 若是,将当前数据页的内容写入所述新的系统表空间文件;并更新该数据页在新 的系统表空间文件中的位置信息、W及该数据页与同类型的前一个数据页之间的相对位置 关系信息。
[0034] 重复执行上述步骤,直至将所述原始系统表空间文件中的系统字典页和二次写缓 冲页都写入所述新的系统表空间文件为止。
[0035] 可选的,所述调整所述新的系统表空间文件的长度,使其大于或者等于系统设定 的系统表空间文件的初始长度,包括:
[0036]W系统设定的数据页的长度为单位,向所述新的系统表空间文件的尾部追加一个 类型为空闲页的数据页;
[0037] 判断所述新的系统表空间文件的长度是否小于系统设定的系统表空间文件的初 始长度;若是,返回至W系统设定的数据页的长度为单位,向所述新的系统表空间文件的尾 部追加一个类型为空闲页的数据页的步骤。
[0038] 可选的,所述调整所述新的系统表空间文件的长度,使其大于或者等于系统设定 的系统表空间文件的初始长度,包括:
[0039]计算所述系统设定的系统表空间文件的初始长度与所述新的系统表空间文件长 度的差值;
[0040] 获取所述差值与系统设定的数据页长度的比值,W大于或者等于该比值的最小整 数作为需要追加的数据页的数目;
[0041] 向所述新的系统表空间文件的尾部追加相应数目的类型为空闲页的数据页。
[0042] 可选的,所述用所述新的系统表空间文件替换所述原始系统表空间文件,采用如 下方式实现:
[0043] 删除所述原始系统表空间文件,并使用所述原始系统表空间文件的文件名为所述 新的系统表空间文件重新命名。
[0044] 可选的,所述方法还包括:
[0045] 停止MyS化主数据库和备用数据库之间的同步;
[0046] 并且所述关闭数据库、生成不包含回滚空间的新系统表空间文件、W及替换原始 系统表空间文件的操作,都是针对上述停止了同步操作的备用数据库进行的。
[0047] 可选的,在停止MyS化主数据库和备用数据库之间的同步之后,执行下述操作:
[0048] 执行所述主数据库和所述备用数据库之间的切换;
[0049] 并且所述关闭数据库、W及生成不包含回滚空间的系统表空间文件并替换原始系 统表空间文件的操作,都是针对执行所述切换操作后的备用数据库进行的。
[0050] 本申请还提供一种用于MySQL的快速回收回滚空间的装置,包括:
[0051] 数据库关闭单元,用于采用在关闭过程中清除无效回滚数据的方式关闭MyS化数 据库;
[0052] 文件生成单元,用于W待回收回滚空间的原始系统表空间文件为基础,生成一个 不包含回滚空间的新的系统表空间文件;
[0053] 文件替换单元,用于用所述新的系统表空间文件替换所述原始系统表空间文件。
[0054] 可选的,所述装置包括:
[0055] 数据库启动单元,用于用所述新的系统表空间文件替换所述原始系统表空间文件 后,重新启动所述MyS化数据库。
[0056] 可选的,所述数据库关闭单元包括:
[0057] 关闭选项设置子单元,用于将所述MyS化数据库的关闭选项设置为,MyS化数据库 系统预定义的在关闭过程中包含清除无效回滚数据操作的特定值;
[005引关闭执行子单元,用于关闭所述MyS化数据库。
[0059] 可选的,所述装置还包括:
[0060] 未同步数据页减少单元,用于减少缓冲池中的未同步到磁盘的已修改数据页的数 量,使其小于预先设定的值。
[0061] 可选的,所述未同步数据页减少单元包括:
[0062] 比例设置子单元,用于设置未同步到磁盘的已修改数据页在缓冲池中所占比例为 0;
[0063] 数量监测子单元,
用于监测缓冲池中的未同步到磁盘的已修改数据页的数量,直 至所述数量小于预先设定的值。
[0064] 可选的,所述文件生成单元包括:
[0065] 文件创建子单元,用于创建一个新的系统表空间文件;
[0066] 数据页复制子单元,用于按照系统表空间文件的格式,将所述原始系统表空间文 件中包含的、且类型不是回滚页的数据页写入所述新的系统表空间文件中;
[0067] 统计信息更新子单元,用于更新所述新的系统表空间文件中与回滚空间相关的统 计信息的内容为,系统表空间文件默认的代表当前无回滚空间的值;
[0068] 长度调整子单元,用于判断所述新的系统表空间文件的长度是否小于系统设定的 系统表空间文件的初始长度;若是,调整所述新的系统表空间文件的长度,使其大于或者等 于系统设定的系统表空间文件的初始长度。
[0069] 可选的,所述数据页复制子单元包括:
[0070] 数据页读取子单元,用于W系统设定的数据页的长度为单位,依次读取所述原始 系统表空间文件中的数据页;
[0071] 类型判断子单元,用于判断当前所读数据页的类型是否为系统字典页或者二次写 缓冲页;
[0072] 数据页写入子单元,用于当所述类型判断子单元的输出为"是"时,将所述数据页 读取子单元读取的数据页的内容写入所述新的系统表空间文件,并更新该数据页在新的系 统表空间文件中的位置信息、W及该数据页与同类型的前一个数据页之间的相对位置关系 信息。
[0073] 控制子单元,用于调度上述H个子单元,直至将所述原始系统表空间文件中的系 统字典页和二次写缓冲页都写入所述新的系统表空间文件为止。
[0074] 可选的,所述长度调整子单元包括:
[0075] 长度判断子单元,用于判断所述新的系统表空间文件的长度是否小于系统设定的 系统表空间文件的初始长度;
[0076] 空闲页追加子单元,用于当所述长度判断子单元的输出为"是"时,W系统设定的 数据页的长度为单位,向所述新的系统表空间文件的尾部追加一个类型为空闲页的数据 页,并触发所述长度判断子单元。
[0077] 可选的,所述长度调整子单元包括:
[0078] 长度差值计算子单元,用于计算所述系统设定的系统表空间文件的初始长度与所 述新的系统表空间文件长度的差值;
[0079] 空闲页数量计算子单元,用于获取所述差值与系统设定的数据页长度的比值,W 大于或者等于该比值的最小整数作为需要追加的数据页的数目;
[0080] 空闲页批量追加子单元,用于向所述新的系统表空间文件的尾部追加相应数目的 类型为空闲页的数据页。
[0081] 可选的,所述文件替换单元具体用于,删除所述原始系统表空间文件,并使用所述 原始系统表空间文件的文件名为所述新的系统表空间文件重新命名。
[0082] 可选的,所述装置还包括:
[0083]同步停止单元,用于停止MyS化主数据库和备用数据库之间的同步;并且所述数 据库关闭单元、所述文件生成单元、W及所述文件替换单元部署在上述停止了同步操作的 备用数据库上实施。
[0084] 可选的,所述装置还包括:
[0085] 主备切换单元,用于在停止MyS化主数据库和备用数据库之间的同步之后,执行 所述主数据库和所述备用数据库之间的切换;并且所述数据库关闭单元、所述文件生成单 元、W及所述文件替换单元部署在上述执行切换操作后的备用数据库上实施。
[0086] 与现有技术相比,本申请具有W下优点:
[0087] 本申请提供的用于MySQL的快速回收回滚空间的方法,没有采用将全部数据库数 据导出并导入的方法,而是采用在关闭过程中清除无效回滚数据的方式关闭MyS化数据 库,并在关闭数据库后遵循系统表空间文件的组织结构,采用顺序读写的方式,W待回收回 滚空间的原始系统表空间文件为基础,生成一个不包含回滚空间的新的系统表空间文件, 并采用新的系统表空间文件替换原始系统表空间文件,从而实现了快速回收回滚空间的功 能,提高整个数据库系统的可用性。
[0088] 本申请的用于MySQL的快速回收回滚空间的方法,提供了一种优选实施方式,在 关闭MyS化数据库之前,通过降低未同步到磁盘的已修改数据页(即;脏页)在缓冲池中所 占比例,尽量减少位于缓冲池中的脏页的数量,并在所述脏页的数量小于预先设定的值后 再执行关闭MyS化数据库的操作,从而减少了MyS化在关闭过程中将脏页写入磁盘所需时 间,加快了MyS化数据库的关闭速度,在实现本申请技术方案的同时,进一步缩短了MySQL 数据库服务处于不可用状态的时间。
【附图说明】
[0089] 图1为本申请的一种用于MySQL的快速回收回滚空间的方法的实施例流程图;
[0090] 图2为本申请的生成不包含回滚空间的新的系统表空间文件的处理过程的实施 例流程图;
[0091] 图3为本申请的一种用于MySQL的快速回收回滚空间的装置的实施例示意图。
【具体实施方式】
[0092] 在下面的描述中阐述了很多具体细节W便于充分理解本申请。但是本申请能够W 很多不同于在此描述的其它方式来实施,本领域技术人员可W在不违背本申请内涵的情况 下做类似推广,因此本申请不受下面公开的具体实施的限制。
[009引在本申请中,分别提供了一种用于MySQL的快速回收回滚空间的方法、W及一种 用于MySQL的快速回收回滚空间的装置。在下面的实施例中逐一进行详细说明。
[0094] 请参考图1,其为本申请的一种用于MySQL的快速回收回滚空间的方法的实施例 流程图。所述方法包括如下步骤:
[0095] 步骤101;采用在关闭过程中清除无效回滚数据的方式关闭MyS化数据库。
[0096] 为了便于理解,在描述本申请技术方案的具体步骤前,先对MyS化的系统表空间 作简要说明。MyS化的InnoDB存储引擎将数据放在一个逻辑的表空间中,该个表空间就像 黑盒一样由InnoDB自身进行管理。InnoDB有两种管理表空间的方法;共享表空间、独立表 空间。使用共享表空间存储方式时,Inno化的所有数据保存在一个单独的表空间里面,而 该个表空间可W由很多个文件组成,一个表可W跨多个文件存在,其表空间的最大限制为 64TB。
[0097] 采用独立表空间存储方式(通过启用inno^_file_per_teble参数选项实现)时, 每个表的数据W-个单独的.i化文件来存放,与共享表空间无法确定每个表在表空间中 的位置不同,独立表空间可W做到每个表有自己的表空间,一方面表数据不必再和共享表 空间中的其他数据在一个文件中争用空间,另一方面也可W使每个表的数据分布在磁盘上 更为连续。
[0098] 不管采取哪种管理表空间的方式,InnoDB都需要共享表空间(通常是ibdatal文 件),为了便于表述,本申请文件中将两种方式下都需要的共享表空间文件化datal,称为系 统表空间文件。从包含的数据类型来看,如果采用主流应用的推荐配置,系统表空间文件 中主要包含四类数据:系统字典、插入缓冲(insertbuffer)、二次写缓冲(doublewrite buffer)、回滚日志(undolog)。其中,系统字典主要包括了表的定义、表空间文件序号(如 果启用inno^_file_per_teble),W及一些日志信息等,插入缓冲和二次写缓冲将在下面 的文字中陆续介绍,而回滚日志则是用来记录回滚数据的。本申请所述的回滚空间,就是指 系统表空间文件中用于存放回滚日志的部分。
[0099] 从系统表空间的组成单元来看,系统表空间包括;数据页(page)、区域(extent)、 段(segment)、回滚段(rol化acksegment)。系统表空间由默认1化大小的数据页组成, 数据页是组成系统表空间的最小单位;64个连续的数据页组成一个区域;多个区域和数 据页构成一个段;而回滚段则是一种特殊的段,一个回滚段通常包含了多个段(segment)。 InnoDB根据数据库操作的不同需求,在系统表空间内动态分配上述数据单元,并采用链表 的方式将空闲的、半满的、全满的数据单元分别组织在一起,从而可w采用不同的粒度实现 对系统表空间文件的分配、回收W及重复利用。
[0100] 前面对系统表空间、回滚空间的概念作了简要介绍,下面重点说明本申请的技术 方案是如何实现的。为了W待回收回滚空间的系统表空间文件为基础生成新的表空间文 件,必须先执行本步骤停止数据库服务,即关闭数据库。
[0101] 本申请提供的用于MyS化的快速回收回滚空间的方法,其基本思路是该样的:关 闭MyS化数据库,并且确保下次重启时不再需要用到任何undo log数据,该样在关闭数据 库后执行的删除系统表空间文件中的回滚空间操作,才不会导致MyS化在重新启动的过程 中因为读取不到所需的undo log而无法正常启动。
[0102] 如果采用系统默认的方式正常关闭MySQL(关闭选项innodb_fast_shutdown=l), 由于InnoDB采用write-址ead-logging模式管理undolog数据,意味着磁盘上的数据与 内存数据并非实时相同,因此MyS化在重新启动时,需要读取ibdatal中的undolog数据, 并与重做日志(redolog)配合,恢复成最新版本的undolog数据。也就是说,如果采用默 认方式关闭MyS化数据库,那么重新启动后,inno化还需要读取undolog数据。
[0103] 基于上述原因,本申请提供的快速回收回滚空间的方法,没有采用默认方式关闭 MyS化服务器,而是采用关闭选项inno^_fast_shutdown=0的方式关闭MyS化数据库。
[0104]inno^_fast_shutdown选项用于告知inno化在关闭数据库的时候应该执行哪些 操作。针对本申请技术方案所采用的inno^_fast_shutdown=0的设置,在关闭数据库时 inno化需要执行W下H个方面的操作:清除无效的undolog(化llpurge)、合并插入缓冲 (mergeinse;rtbuffer)、刷新脏页到磁盘(flushdirtypage)。
[0105] 其中,化11Purge操作主要是清除无用的undolog数据。inno化为了提供对MVCC (多版本并发控制)的支持,一方面,对于主键索引,每个行都有一个事务ID和一个undoID, 该个undoID指向了该行的先前版本的位置,对于非主键索引,也就是常说的secondary index,是通过先找主键索引再找到undo数据;另一方面,对于删除和更新操作,inncxlb也 采取了相应的特殊处理方式,对于删除操作并不是立刻删除当前行,而只是将要删除的那 一行标记为删除,而
对于更新操作,则是先标记为删除,然后再插入一个新的行,那么如果 有事务提出对该行的一致性读需求,就可W根据与该行相关的undoID信息,找到事务所需 的先前版本。
[0106] 在正常关闭MyS化数据库的时候,所有的数据库事务都已经执行完成,一方面没 有因为未执行完而需要回滚的操作,另一方面,也不存在还需要根据undolog数据获取本 事务开始时数据版本的事务,因此可W强制InnoDB执行化rge操作,一方面对之前被标记 为已删除的行执行真正的删除操作,释放物理页空间,另一方面,清除不再使用的、无效的 undo log数据。因为在数据库的关闭阶段执行上述清除操作,因而在数据库重新启动的过 程中就不会再执行读取undo log数据的操作,从而为采用本申请提供的方法回收回滚空间 做好了必要的准备。
[0107] 设置innodb_fast_shutdown=0后,系统在关闭MyS化服务时,还会执行合并插入 缓冲的操作。插入缓冲是InnoDB存储引擎的关键特性之一,插入缓冲虽然也可W缓存在 InnoDB的缓冲池中,但却是系统表空间的一个组成部分,也即;是物理页的一个组成部分。 每个InnoDB表只有一个聚集索引,同时还可能存在多个非聚集的且不是唯一索引的辅助 索引,InnoDB在设计时采用了按照聚集索引的顺序、将聚集索引和数据一起存放的方式,辅 助索引则仅仅包含聚集索引的信息,而不包含数据,因此执行依据辅助索引的查询时,需要 先找到聚集索引,然后利用聚集索引访问所需的数据,InnoDB的索引WB-tree的形式存到 各个叶子节点上。
[0108] 通过上面的介绍可W看出,插入聚集索引,是一个顺序10的过程,而对于辅助索 引来说,叶子节点的插入不再是顺序的了,而是一个离散的随机10过程,为了提高10操作 的执行效率,InnoDB先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入,否 则先放入一个插入缓冲中,然后再W-定的频率执行插入缓冲和非聚集索引叶子节点的合 并操作,该时可W将针对同一个索引页的多个插入操作合并为一个操作执行,也就是说将 多个随机10merge成为一个,从而大大减少随机10。
[0109] 在本步骤中,通过设置inno^_fast_shutdown=0,在数据库的关闭过程中,既清除 了无效的undo信息,同时也强制inno化执行了上述合并插入缓冲的操作,那么系统表空间 文件中的插入缓存中的信息都被合并到真正的索引文件中,该意味着关闭数据库之后,下 次重新启动时也不再需要插入缓冲中的内容,因此在后续生成新的系统表空间文件时,可 W不复制原始系统表空间文件中的插入缓冲页(insertbufferpage)。
[0110] 采用设置innodb_fast_shutdown=0的方式关闭MyS化数据库,InnoDB不仅执行 上述清除无效undo信息、合并插入缓冲的操作,还要执行刷新脏页到磁盘的操作,下面对 所述刷新操作、W及本申请针对该刷新操作所提出的一种优选实施方式进行说明。
[01U] 为了提高系统的处理效率,InnoDB采用通过缓冲池(bufferpool)来延缓写操 作的处理方式,InnoDB针对写操作的执行过程是该样的;先将写操作的改动写到缓冲池 中,再将该改动写入日志文件logfile中,然后就返回结果到客户端,由于不需要执行写 磁盘的操作,仅仅是执行了写缓冲池的内存操作,该样就提高了InnoDB的响应速度,也就 出现了位于缓冲池中的未同步到磁盘的已修改的数据页,也就是通常所说的"脏页(dirty page)"。针对该些脏页,InnoDB使用一个后台的线程执行刷新(flush)操作,将脏页刷新 到磁盘上,具体说;InnoDB会监测脏页占据缓冲池中的比例,当该比例达到系统设置的参 数inno^_max_dbty_pages_pct所指定的值时,InnoDB就会使用刷新线程将脏页数据写 到磁盘。
[0112] 无论是采用默认方式关闭数据库还是采用设置inno^_fast_shutdown=0的方式 关闭数据库,InnoDB都会执行上述刷新操作,由于可能存在大量的脏页,因此执行关闭操作 的时间可能很长,为了使整个关闭、重启的过程尽可能快,减少数据库服务处于不可用状态 的时间,本申请提供了一种优选实施方式,通过在关闭数据库之前预先减少脏页的数量,达 到快速关闭数据库的效果。具体采用如下方式实现:
[0113] 首先,设置inno^_max_dbty_pages_pct=0。正如上面介绍的,当脏页占据缓冲池 中所有数据页的比例达到该参数设定的值时,InnoDB会执行将脏页数据写到磁盘上的刷新 操作。如果将该参数设置为0,InnoDB自然会频繁地执行刷新操作,从而减少位于缓冲池中 的脏页的数量。
[0114] 然后,持续监测Inno^_buffer_pool_pages_di;rty变量的值,该变量记录的是位 于缓冲池中的脏页的数量,由于已经设置了inno^_max_didy_pages_pCt=0,可W看到该 变量的值逐渐变小,当该变量的值小于预先设定的值,例如;l〇〇时,就可W停止监测,并采 用设置inno^_fast_shutdown=0的方式关闭数据库,此时关闭数据库的操作很快就可W执行完毕,通常可能只需要几砂钟的时间。
[0115] 在本实施例的上述具体例子中,为了获得使MyS化数据库快速关闭的更为优化 的实施效果,采用了预先减少脏页数量的步骤,在采用本申请方法的其他实施方式中,可 W省略该步骤,同样可W实现对回滚空间的快速回收;在本实施例的一个具体例子中,为 了减少脏页,设置inno^_max_dbty_pages_pct参数为0,并且监测脏页的数量直至小于 预先设定的脏页数量100,在其他实施方式中,可W采用不同于上述具体例子的设置,只 要能够将脏页数量减少到预先定义的较少数量就可W了;至于监测脏页数量,可W采用查 看Inn〇(lb_buffe;r_pool_pages_di;rty变量的方式,也可W在命令行输入下述命令;/usr/ local/mysql/bin/mysqladmin-uroot-pext-ilOIgrepdi;rty,从而界面上将会实时显示 脏页的数量;上述该些不同的设置或者操作方式,都只是实施方式的变更,都不偏离本申请 的核也,因此都在本申请的保护范围之内。
[0116] 上面介绍了将脏页刷新到磁盘的过程,在该个过程中还会涉及二次写缓冲 (doublewritebuffer),由于doublewritebuffer也是系统表空间文件的一部分,在后 续生成新的系统表空间文件的过程中,也涉及到关于doublewritebuffer数据页的处理, 因此在该里作一个简要的说明。
[0117]InnoDB为了提高操作的性能,采用先将对数据页的更新写入缓冲池,再刷新到磁 盘的方式,那么在发生意外的情况下,例如:数据库服务器若机,则可能发生从缓冲池写入 磁盘的刷新操作被中断、而该刷新操作所涉及的某个数据页只写了一部分的情况,即;发生 了部分写失败的现象。为了解决该一问题,InnoDB采用了二次写的机制,实现二次写机制 需要两个数据区域;一部分是内存中的doublewritebuffer,大小为2MB;另一部分是物 理磁盘上的系统表空间文件中的中连续的128个doublewritebuffer数据页,即两个区 (extent),大小同样为2MB。
[0118] 当缓冲池的脏页刷新时,并不直接写磁盘,而是会通过memcpy函数将脏页先拷贝 到内存中的doublewritebuffer,之后通过doublewritebuffer再分两次,每次写入1MB 到共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘。在该个过程中,因为系 统表空间文件中的doublewritebuffer页是连续的,因此相关的写入过程是顺序执行的, 开销并不是很大。在完成doublewritebuffer页的写入后,再将doublewritebuffer 中的页写入各个表空间文件中,此时的写入则是离散的。如果发生部分写失败的现象,则可 W通过doublewritebuffer页中的信息还原发生写失败的数据页,并根据需要执行相关 的redo操作。
[0119] 由此可见,InnoDB在将数据从内存写入磁盘期间,通过在系统表空间文件的 doublewritebuffer中临时保存完整页面的方式,提供了数据可靠性保障。在本申请提供 的技术方案中,由于采用的是正常关闭数据库的方式,也就是说不会发生部分写失败的现 象,因此在系统表空间文件的doublewritebuffer中存放的临时数据在重启后都不需要 保留。但是由于doublewritebuffer是系统表空间文件的一个固定大小的组成部分,因 此在后续生成新的系统表空间文件的步骤中只需要直接复制即可。
[0120] 步骤102 待回收回滚空间的原始系统表空间文件为基础,生成一个不包含回 滚空间的新的系统表空间文件。
[0121] 本申请提供的用于MyS化的快速回收回滚空间的方法,其关键就在于,没有采用 现有的将全部数据库数据导出、重建数据库实例、再导入的方法,而是W顺序读写的方式, W待回收回滚空间的原始系统表空间文件为基础,生成一个不包含回滚空间的新的系统表 空间文件,并替换原始系统表空间文件,从而实现了对原始系统表空间文件所占用的磁盘 空间的快速回收。在本步骤中,主要涉及对系统表空间文件的读写操作,为了便于理解,首 先对系统表空间文件的组织结构作简要说明。
[0122] 系统表空间文件的组织结构比较复杂,下表简要描述了系统表空间文件的基本组 成。从该表中可W看出,系统表空间文件是W页为基本单位顺序组织的一个文件,其中, pages是一个类型为FIL_PAGE_TYPE_SYS系统页,记录与事务系统操作相关的信息,其中包 括undo log的统计信息,在本申请的技术方案中,除了在复制过程中要跳过回滚页,还要相 应更新该页中的undo log统计信息才能够正确完成对回滚空间的回收。
[0123] 表一,系统表空间基本结构不意
[0124]
[0125] 本步骤是快速回收回滚空间的关键步骤,主要包括创建新文件、复制文件、更新统 计信息、调整文件长度该样4个子步骤,请参见附图2,其为本申请的生成不包含回滚空间 的新的系统表空间文件的处理过程的实施例流程图,下面结合附图2对该4个子步骤逐一 加W说明。
[0126] 步骤102-1 ;创建一个新的系统表空间文件。
[0127] 创建一个新的系统表空间文件,该文件是一个空文件,其文件长度为0。可W使 用操作系统提供的接口或者工具新建一个文件,例如MyS化安装在windows操作系统平台 上,那么就可W使用windows资源管理器的新建功能,或者在命令行模式下采用copycon f
ilename的方式新建一个文件。创建新文件有很多种方式,具体采用何种方式,不是本申请 的核也,本申请不作限定。
[0128] 步骤102-2 ;按照系统表空间文件的格式,将所述原始系统表空间文件中包含的、 且类型不是回滚页的数据页写入所述新的系统表空间文件中。
[0129] 首先,W系统设定的数据页的长度为单位,读取所述原始系统表空间文件中的数 据页。InnoDB引擎设定数据页长度的缺省值为16KB,其定义是在源代码中,因此在系统安 装完毕之后是无法修改的。在系统安装之前,可W采用如下方式修改关于UNIV_PAGE_SIZE 的定义:
[0130]例如;在 storage/innobase/lncluce/univ. i中,采用如下定义:
[0131] #defineUNIV_PAGE_SIZE(1*8192)
[013引 #define ^1¥_口八66_5126_甜1尸1'13
[0133] 再编译对应的源代码,并进行安装,该样就将InnoDB数据页的长度修改为8邸了。 在本实施例的一个具体例子中,采用了InnoDB的默认设置,因此W16邸为单位,执行从原 始系统表空间文件化datal中读取数据页的操作。
[0134] 然后,判断当前所读数据页的类型是否为系统字典页或者二次写缓冲页。
[01巧]在步骤101中已经介绍过,如果采用主流应用的推荐配置,系统表空间文件中 主要包含四类数据;系统字典、插入缓冲(insertbuffer)、二次写缓冲(doublewrite buffer)、回滚日志(undolog),本申请的技术方案是为了快速回收回滚空间,因此从原理 上说,只要跳过回滚页(不将回滚页复制到新的系统表空间文件中)就实现了对回滚空间的 回收。但是由于在步骤101中关闭数据库的同时执行了合并插入缓冲的操作,插入缓冲中 的数据已经处理完毕,在下次启动时不会再使用该部分数据,因此在生成新的系统表空间 文件的过程中,也可W不复制插入缓冲页,因此本步骤的判断条件中没有包括插入缓冲页。
[0136] 对于二次写缓冲来说,在正常关闭数据库的情况下,因为内存数据已经全部成功 地同步到磁盘上,因此在重启的过程中,也不会使用二次写缓冲中的数据,但是通过表一可 W看到,二次写缓冲数据块在系统表空间文件中是一个固定的数据区域,因此不能采用与 插入缓冲页或者回滚页相同的跳过方式,而是需要执行复制操作,因此本步骤的判断条件 中包含了二次写缓冲页。
[0137] 本步骤判断中所述的系统字典页,是一个相对宽泛的概念,其中包括了与系统表 空间的整个系统相关的数据页,例如;系统页、索引页、插入缓冲位图页、数据字典页、事务 系统页等都是本申请所述的系统字典页。该些类型的数据页和二次写缓冲数据页都是本申 请技术方案需要复制的数据页。
[0138] 至于数据页类型,固定存放在每个数据页的头部的第25-26字节(从0开始计数 就是byte24-byte25),因此直接读取当前数据页的第25-26字节就可W获取当前数据页类 型。关于数据页头部的基本格式可W参见表二。
[0139] 最后,将类型为系统字典页或者二次写缓冲页的数据页写入所述新的系统表空间 文件;并更新该数据页在新的系统表空间文件中的位置信息、W及该数据页与同类型的前 一个数据页之间的相对位置关系信息。
[0140] 将类型符合要求的数据页复制到新的系统表空间文件中,只是实现了数据页的简 单搬移,但是作为系统表空间文件来说,仅有一系列数据页面的堆积是无法正常运作的, 还必须将类型相同的页面通过类似链表的方式有序地组织起来,该样InnoDB才能对系统 表空间文件实施正确有效的管理。每个数据页都是由数据页头(pageheader)、数据页体 (pagebody)、数据页尾(pagetrailer)H部分内容构成,其中数据页的头部包括38个字 节的内容,其格式如表二所示:
[0141] 表二;数据页头部的格式
[0142]
[0143] 每个数据页都有一个长度为4字节的数据页序号FIL_PAGE_OFFSET,通常也称为 偏移量,反应了该数据页从系统表空间头部开始的偏移量位置,W缺省16KB的页面大小为 例,pageO位于系统表空间的偏移量为0的位置,page 1则位于系统表空间的偏移量为16384 字节的位置;数据页类型FIL_PAGE_TY阳用于存放当前数据页的类型;上一个数据页FIL_ PAGE_PREV则用于存放与当前数据页类型相同的前一个数据页的序号,下一个数据页FIL_ PAGE_NEXT则用于存放与当前数据页类型相同的下一个数据页的序号。在功能上,通过对 FIL_PAGE_PREV和FIL_PAGE_NEXT字段的正确设置,实现了同类型的数据页的双向链表,便 于InnoDB进行快速地查找和定位。
[0144] 在本步骤中,由于复制过程中会跳过一些数据页(例如:插入缓冲页、回滚页),因 此必须对FIL_PAGE_OFFSET、FIL_PAGE_PREV、FIL_PAGE_WXT该H个字段的值进行修改,反 映当前数据页的正确位置,W及与同类型相邻数据页的正确位置关系。具体说,在复制完每 个数据页后,要执行下面H个操作:
[0145] 1)在上一个数据页序号的基础上计算当前数据页序号,并写入当前数据页的FIL_ PA(iE_0F!^SET字段中;
[0146] 2)在当前数据页的FIL_PAGE_PREV字段中写入与当前数据页的类型相同的前一 个数据页的页序号;
[0147] 3)在与当前数据页的类型相同的前一个数据页的FIL_PAGE_NEXT字段中写入当 前数据页的页序号。
[014引执行完上述H个修改操作,才算完成了当前数据页的复制,然后继续读取下一个 数据页,并执行上述判断数据页类型、数据页写入、w及修改数据页信息的步骤,重复执行 该过程,直到将原始系统表空间文件的全部系统字典页和二次写缓冲页都复制到新的系统 表空间文件中。
[0149] 步骤102-3;更新所述新的系统表空间文件中与回滚空间相关的统计信息的内容 为,系统表空间文件默认的代表当前无回滚空间的值。
[0150] 执行完步骤102-2后,由于原始系统表空间文件中的所有回滚页都被跳过了(没 有复制),因此新的系统表空间文件中就已经不包含回滚空间了,为了与当前状态相一致, 还需要修改新的系统表空间文件中与回滚空间相关的统计信息。
[0151] 请参见表一,系统表空间中的pages用于记录与事务系统操作相关的信息,该数 据页是一个类型为FIL_PAGE_TYPE_SYS的系统页,其中保存了回滚日志的统计信息。在系 统表空间中,整个回滚空间被分成128个回滚段(rol化acksegment),每个回滚段又是由多 个用于存放回滚日志的回滚区域和回滚页组成,其中每个回滚段的起始页序号都保存在上 述系统页中,因为新的系统表空间文件不包含回滚页,自然也没有回滚段,因此应该将上述 系统页中用于存放128个回滚段的起始页序号的字段,都设置为代表回滚段不存在的初始 值OxFFFFFFFF。
[0152] 在本实施例的一个具体例子中,采用了上述修改统计信息的方式,即;在完成数据 页的复制过程后,定位到类型为FIL_PAGE_TYPE_SYS的系统页并修改统计信息。在其他实 施方式中,也可W将本步骤与步骤102-2合并执行,也就说在步骤102-2执行复制数据页的 过程中,添加一个判断语句,判断当前数据页是否是类型为FIL_PAGE_TYPE_SYS的系统页, 若是,执行上述修改回滚空间相关统计信息的操作,采用该种方式在复制每个数据页的时 候都要多执行一次判断,但是同样可W实现本申请的技术方案。
[0153] 步骤102-4;判断所述新的系统表空间文件的长度是否小于系统设定的系统表空 间文件的初始长度;若是,调整所述新的系统表空间文件的长度,使其大于或者等于系统设 定的系统表空间文件的初始长度。
[0154] 在MyS化数据库的配置文件my.cnf中指定了系统表空间文件的初始长度,例 女口;1]1]1〇化_(1313_^16_931:11=比(13131:2001,该语句指定了系统表空间文件的初始长度为 200M,该值仅仅是示意性的,在实际应用中可W根据需要设置不同的初始长度值。如果通过 上述步骤生成的新的系统表空间文件的长度不满足该设置的要求,可能导致MyS化数据库 无法正常启动,或者启动后InnoDB无法实现对系统表空间的正确管理,因此要求新的系统 表空间文件的长度不能小于上述初始设置,因此在本步骤中需要进行相关的判断,并在不 满足要求的情况下采用如下两种方式调整新的系统表空间文件的长度:
[0155] 1)W系统设定的数据页的长度为单位,向所述新的系统表空间文件的尾部追加一 个类型为空闲页的数据页;然后判断当前新的系统表空间文件的长度是否满足初始设置的 要求,如果仍不满足,再执行追加、判断....,循环执行上述过程,直到新的系统表空间文件 的长度大于或者等于系统设定的初始长度;
[0156] 2)计算系统设定的系统表空间文件的初始长度与新的系统表空间文件长度的差 值,并计算该差值与系统设定的数据页长度的比值,W大于或者等于该比值的最小整数作 为需要追加的数据页的数目;然后一次性地向新的系统表空间文件的尾部追加相应数目的 类型为空闲页的数据页。
[0157]步骤103;用所述新的系统表空间文件替换所述原始系统表空间文件。
[015引执行完上述步骤102,已经生成了一个新的、不包含回滚空间的系统表空间文件, 为了实现本申请的快速回收回滚空间的目的,还需要用新的系统表空间文件替换掉原始系 统表空间文件,从而实现对原始系统表空间文件所占用的磁盘空间的释放。具体替换过程 可W采用多种方式实现,例如:删除原始系统表空间文件,并使用原始系统表空间文件的文 件名为新的系统表空间文件重新命名;也可W采用复制操作,用新的系统表空间文件覆盖 原始系统表空间文件。
[0159] 在本实施例的一个具体例子中,待回收回滚空间的系统表空间文件为ibdatal,生 成的新的系统表空间文件为ibdata_new,在本步骤中删除了ibdatal文件,并将ibdata_ new文件重新命名为ibdatal,从而将原始ibdatal文件占据的大量磁盘空间归还给操作系 统,同时重命名后的新ibdatal文件也是一个完整的系统表空间文件,因此保证了MyS化数 据库的正常启动和运行。
[0160] 至此,本申请提供的快速回收回滚空间的方法就执行完毕了,此时可W重新启动 MyS化数据库,MyS化数据库将基于新的系统表空间文件继续提供数据库服务器。由于在步 骤101中采用了预先将缓冲池中的脏页数量减少到一定数值然后再关闭数据库的方式,因
此关闭过程所耗时间很短,通常只需要数砂钟的时间,而步骤102中生成新的系统表空间 文件的过程,采用了W数据页为基本单位、从原始系统表空间文件中顺序读取、并顺序写入 新的系统表空间文件的方式,该读写操作的执行过程也是相对比较快的,对于一个大小为 100G左右的原始系统表空间文件来说,该过程耗时大约为几十砂,而重启过程也很快,因此 通常能够在1分钟之内完成上述整个过程,实现对回滚空间的快速回收。
[0161] 在本实施例的一个具体例子中,系统表空间文件只有一个ibdatal,在实际应用 中,系统表空间文件的名称W及数目都是可W修改的,例如:可W在my.cnf中按照如下所 述的方式设置Innodb_data_file_path参数:
[0162]Innodb_data_file_path=ibdatal: 500M;ibdata2:200M:autoextend
[0163] 上述设置方式表明,使用ibdatal和ibdata2两个文件来共同组成系统表空间。其 中ibdatal文件的初始大小为500M,ibdata2文件的初始大小为200M。若采用上述方法指 定位于不同磁盘上的两个或者多个文件,则可W通过负载均衡提高数据库的整体性能。在 上述配置方式下,可W采用本申请提供的快速回收回滚空间的方法,依次处理共同组成系 统表空间的一组系统表空间文件(例如;ibdatal和ibdata2等),从而实现对本系统内全部 系统表空间文件的回滚空间的回收。
[0164] 在具体的应用中,为了保证服务的可用性,MyS化数据库系统通常采用主备服务器 的架构,而主数据库和备用数据库都可能出现回滚空间膨胀的现象。针对该一问题,可W 在主数据库和备用数据库上依次使用本申请提供的快速回收回滚空间的方法,具体过程如 下:
[0165] 首先回收备用数据库的回滚空间:
[0166] 1)停止MyS化主数据库和备用数据库之间的同步;
[0167] 2)在备用数据库上实施本申请提供的方法,回收备用数据库的回滚空间;
[016引 3)重新启动备用数据库,主备恢复同步。
[0169] 然后回收主数据库的回滚空间:
[0170] 1)停止MyS化主数据库和备用数据库之间的同步;
[0171] 2)执行主数据库和备用数据库之间的切换;
[0172] 3)在切换后的备用数据库(即;原来的主数据库)上实施本申请提供的方法,回收 切换后的备用数据库的回滚空间;
[0173] 4)重新启动备用数据库,王备恢复问步。
[0174] 通过上述两个阶段,完成了对主数据库回滚空间和备用数据库回滚空间的回收。 由于本申请提供的用于MySQL的快速回收回滚空间的方法,采用在关闭过程中清除无效回 滚数据的方式关闭MyS化数据库,并在关闭数据库后采用顺序读写的方式,W待回收回滚 空间的原始系统表空间文件为基础,生成一个不包含回滚空间的新的系统表空间文件,并 采用新的系统表空间文件替换原始系统表空间文件,从而实现了快速回收回滚空间的功 能,大幅减少了MyS化数据库服务处于不可用状态的时间;在采用主备服务器架构的应用 场景下,显著缩短了作为主数据库工作的服务器缺少实时备份实例的时间,从而提高整个 数据库系统的可用性。
[0175] 在上述的实施例中,提供了一种用于MySQL的快速回收回滚空间的方法,与之相 对应的,本申请还提供一种用于MySQL的快速回收回滚空间的装置。
[0176] 请参看图3,其为本申请提供的一种用于MySQL的快速回收回滚空间的装置的实 施例示意图。由于装置实施例基本相似于方法实施例,所W描述得比较简单,相关的部分请 参见方法实施例的对应说明即可。下述描述的装置实施例仅仅是示意性的。
[0177] 本实施例的一种用于MySQL的快速回收回滚空间的装置,包括:数据库关闭单元 201,用于采用在关闭过程中清除无效回滚数据的方式关闭MyS化数据库;文件生成单元 202,用于W待回收回滚空间的原始系统表空间文件为基础,生成一个不包含回滚空间的新 的系统表空间文件;文件替换单元203,用于用所述新的系统表空间文件替换所述原始系 统表空间文件。
[0178] 可选的,所述装置包括:
[0179] 数据库启动单元,用于用所述新的系统表空间文件替换所述原始系统表空间文件 后,重新启动所述MyS化数据库。
[0180] 可选的,所述数据库关闭单元包括:
[0181] 关闭选项设置子单元,用于将所述MyS化数据库的关闭选项设置为,MyS化数据库 系统预定义的在关闭过程中包含清除无效回滚数据操作的特定值;
[0182] 关闭执行子单元,用于关闭所述MyS化数据库。
[0183] 可选的,所述装置还包括:
[0184] 未同步数据页减少单元,用于减少缓冲池中的未同步到磁盘的已修改数据页的数 量,使其小于预先设定的值。
[0185] 可选的,所述未同步数据页减少单元包括:
[0186] 比例设置子单元,用于设置未同步到磁盘的已修改数据页在缓冲池中所占比例为 0;
[0187] 数量监测子单元,用于监测缓冲池中的未同步到磁盘的已修改数据页的数量,直 至所述数量小于预先设定的值。
[0188] 可选的,所述文件生成单元包括:
[0189] 文件创建子单元,用于创建一个新的系统表空间文件;
[0190] 数据页复制子单元,用于按照系统表空间文件的格式,将所述原始系统表空间文 件中包含的、且类型不是回滚页的数据页写入所述新的系统表空间文件中;
[0191] 统计信息更新子单元,用于更新所述新的系统表空间文件中与回滚空间相关的统 计信息的内容为,系统表空间文件默认的代表当前无回滚空间的值;
[0192] 长度调整子单元,用于判断所述新的系统表空间文件的长度是否小于系统设定的 系统表空间文件的初始长度;若是,调整所述新的系统表空间文件的长度,使其大于或者等 于系统设定的系统表空间文件的初始长度。
[0193] 可选的,所述数据页复制子单元包括:
[0194] 数据页读取子单元,用于W系统设定的数据页的长度为单位,依次读取所述原始 系统表空间文件中的数据页;
[0195] 类型判断子单元,用于判断当前所读数据页的类型是否为系统字典页或者二次写 缓冲页;
[0196] 数据页写入子单元,用于当所述类型判断子单元的输出为"是"时,将所述数据页 读取子单元读取的数据页的内容写入所述新的系统表空间文件,并更新该数据页在新的系 统表空间文件中的位置信息、W及该数据页与同类型的前一个数据页之间的相对位置关系 信息。
[0197] 控制子单元,用于调度上述H个子单元,直至将所述原始系统表空间文件中的系 统字典页和二次写缓冲页都写入所述新的系统表空间文件为止。
[019引可选的,所述长度调整子单元包括:
[0199] 长度判断子单元,用于判断所述新的系统表空间文件的长度是否小于系统设定的 系统表空间文件的初始长度;
[0200] 空闲页追加子单元,用于当所述长度判断子单元的输出为"是"时,W系统设定的 数据页的长度为单位,向所述新的系统表空间文件的尾部追加一个类型为空闲页的数据 页,并触发所述长度判断子单元。
[0201] 可选的,所述长度调整子单元包括:
[0202] 长度差值计算子单元,用于计算所述系统设定的系统表空间文件的初始长度与所 述新的系统表空间文件长度的差值;
[0203] 空闲页数量计算子单元,用于获取所述差值与系统设定的数据页长度的比值,W 大于或者等于该比值的最小整数作为需要追加的数据页的数目;
[0204] 空闲页批量追加子单元,用于向所述新的系统表空间文件的尾部追加相应数目的 类型为空闲页的数据页。
[0205] 可选的,所述文件替换单元具体用于,删除所述原始系统表空间文件,并使用所述 原始系统表空间文件的文件名为所述新的系统表空间文件重新命名。
[0206] 可选的,所述装置还包括:
[0207] 同步停止单元,用于停止MyS化主数据库和备用数据库之间的同步;并且所述数 据库关闭单元、所述文件生成单元、W及所述文件替换单元部署在上述停止了同步操作的 备用数据库上实施。
[020引可选的,所述装置还包括:
[0209] 主备切换单元,用于在停止MyS化主数据库和备用数据库之间的同步之后,执行 所述主数据库和所述备用数据库之间的切换;并且所述数据库关闭单元、所述文件生成单 元、W及所述文件替换单元部署在上述执行切换操作后的备用数据库上实施。
[0210] 本申请虽然W较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技 术人员在不脱离本申请的精神和范围内,都可W做出可能的变动和修改,因此本申请的保 护范围应当W本申请权利要求所界定的范围为准。
[0211] 在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、 网络接口和内存。
[0212] 内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/ 或非易失性内存等形式,如只读存储器(ROM)或闪存(flashRAM)。内存是计算机可读介质 的示例。
[0213] 1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可W由任何 方法或技术来实现信息存储。信息可W是计算机可读指令、数据结构、程序的模块或其 他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储 器(SRAM)、动态随机存取存储器值RAM)、其他类型的随机存取存储器(RAM)、只读存储器 (ROM)、电可擦除可编程只读存储器巧EPROM)、快闪记忆体或其他内存技术、只读光盘只读 存储器(CD-ROM)、数字多功能光盘值VD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或 其他磁性存储设备或任何其他非传输介质,可用于存储可W被计算设备访问的信息。按照 本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitorymedia),如调制 的数据信号和载波。
[0214] 2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产 品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例 的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用 存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的 形式。
【主权项】
1. 一种用于MySQL的快速回收回滚空间的方法,其特征在于,包括: 采用在关闭过程中清除无效回滚数据的方式关闭MySQ
L数据库; 以待回收回滚空间的原始系统表空间文件为基础,生成一个不包含回滚空间的新的系 统表空间文件; 用所述新的系统表空间文件替换所述原始系统表空间文件。2. 根据权利要求1所述的用于MySQL的快速回收回滚空间的方法,其特征在于,在执 行所述用所述新的系统表空间文件替换所述原始系统表空间文件的步骤后,重新启动所述 MySQL数据库。3. 根据权利要求1所述的用于MySQL的快速回收回滚空间的方法,其特征在于,所述采 用在关闭过程中清除无效回滚数据的方式关闭MySQL数据库的步骤,包括: 将所述MySQL数据库的关闭选项设置为,MySQL数据库系统预定义的在关闭过程中包 含清除无效回滚数据操作的特定值; 关闭所述MySQL数据库。4. 根据权利要求1所述的用于MySQL的快速回收回滚空间的方法,其特征在于,执行所 述关闭MySQL数据库的步骤之前,执行下述操作: 减少缓冲池中的未同步到磁盘的已修改数据页的数量,使其小于预先设定的值。5. 根据权利要求4所述的用于MySQL的快速回收回滚空间的方法,其特征在于,所述减 少缓冲池中的未同步到磁盘的已修改数据页的数量,使其小于预先设定的值,包括: 设置未同步到磁盘的已修改数据页在缓冲池中所占比例为〇 ; 监测缓冲池中的未同步到磁盘的已修改数据页的数量,直至所述数量小于预先设定的 值。6. 根据权利要求1所述的用于MySQL的快速回收回滚空间的方法,其特征在于,所述以 待回收回滚空间的原始系统表空间文件为基础,生成一个不包含回滚空间的新的系统表空 间文件,包括: 创建一个新的系统表空间文件; 按照系统表空间文件的格式,将所述原始系统表空间文件中包含的、且类型不是回滚 页的数据页写入所述新的系统表空间文件中; 更新所述新的系统表空间文件中与回滚空间相关的统计信息的内容为,系统表空间文 件默认的代表当前无回滚空间的值; 判断所述新的系统表空间文件的长度是否小于系统设定的系统表空间文件的初始长 度;若是,调整所述新的系统表空间文件的长度,使其大于或者等于系统设定的系统表空间 文件的初始长度。7. 根据权利要求6所述的用于MySQL的快速回收回滚空间的方法,其特征在于,所述按 照系统表空间文件的格式,将所述原始系统表空间文件中包含的、且类型不是回滚页的数 据页写入所述新的系统表空间文件中,包括: 以系统设定的数据页的长度为单位,依次读取所述原始系统表空间文件中的数据页; 判断当前所读数据页的类型是否为系统字典页或者二次写缓冲页; 若是,将当前数据页的内容写入所述新的系统表空间文件;并更新该数据页在新的系 统表空间文件中的位置信息、以及该数据页与同类型的前一个数据页之间的相对位置关系 信息。 重复执行上述步骤,直至将所述原始系统表空间文件中的系统字典页和二次写缓冲页 都写入所述新的系统表空间文件为止。8. 根据权利要求6所述的用于MySQL的快速回收回滚空间的方法,其特征在于,所述调 整所述新的系统表空间文件的长度,使其大于或者等于系统设定的系统表空间文件的初始 长度,包括: 以系统设定的数据页的长度为单位,向所述新的系统表空间文件的尾部追加一个类型 为空闲页的数据页; 判断所述新的系统表空间文件的长度是否小于系统设定的系统表空间文件的初始长 度;若是,返回至以系统设定的数据页的长度为单位,向所述新的系统表空间文件的尾部追 加一个类型为空闲页的数据页的步骤。9. 根据权利要求6所述的用于MySQL的快速回收回滚空间的方法,其特征在于,所述调 整所述新的系统表空间文件的长度,使其大于或者等于系统设定的系统表空间文件的初始 长度,包括: 计算所述系统设定的系统表空间文件的初始长度与所述新的系统表空间文件长度的 差值; 获取所述差值与系统设定的数据页长度的比值,以大于或者等于该比值的最小整数作 为需要追加的数据页的数目; 向所述新的系统表空间文件的尾部追加相应数目的类型为空闲页的数据页。10. 根据权利要求1所述的用于MySQL的快速回收回滚空间的方法,其特征在于,所述 用所述新的系统表空间文件替换所述原始系统表空间文件,采用如下方式实现: 删除所述原始系统表空间文件,并使用所述原始系统表空间文件的文件名为所述新的 系统表空间文件重新命名。11. 根据权利要求1-10任意一项所述的用于MySQL的快速回收回滚空间的方法,其特 征在于,还包括: 停止MySQL主数据库和备用数据库之间的同步; 并且所述关闭数据库、生成不包含回滚空间的新系统表空间文件、以及替换原始系统 表空间文件的操作,都是针对上述停止了同步操作的备用数据库进行的。12. 根据权利要求11所述的用于MySQL的快速回收回滚空间的方法,其特征在于,在停 止MySQL主数据库和备用数据库之间的同步之后,执行下述操作: 执行所述主数据库和所述备用数据库之间的切换; 并且所述关闭数据库、以及生成不包含回滚空间的系统表空间文件并替换原始系统表 空间文件的操作,都是针对执行所述切换操作后的备用数据库进行的。13. -种用于MySQL的快速回收回滚空间的装置,其特征在于,所述装置包括: 数据库关闭单元,用于采用在关闭过程中清除无效回滚数据的方式关闭MySQL数据 库; 文件生成单元,用于以待回收回滚空间的原始系统表空间文件为基础,生成一个不包 含回滚空间的新的系统表空间文件; 文件替换单元,用于用所述新的系统表空间文件替换所述原始系统表空间文件。14. 根据权利要求13所述的用于MySQL的快速回收回滚空间的装置,其特征在于,所述 装置包括: 数据库启动单元,用于用所述新的系统表空间文件替换所述原始系统表空间文件后, 重新启动所述MySQL数据库。15. 根据权利要求13所述的用于MySQL的快速回收回滚空间的装置,其特征在于,所述 数据库关闭单元包括: 关闭选项设置子单元,用于将所述MySQL数据库的关闭选项设置为,MySQL数据库系统 预定义的在关闭过程中包含清除无效回滚数据操作的特定值; 关闭执行子单元,用于关闭所述MySQL数据库。16. 根据权利要求13所述的用于MySQL的快速回收回滚空间的装置,其特征在于,所述 装置还包括: 未同步数据页减少单元,用于减少缓冲池中的未同步到磁盘的已修改数据页的数量, 使其小于预先设定的值。17. 根据权利要求16所述的用于MySQL的快速回收回滚空间的装置,其特征在于,所述 未同步数据页减少单元包括: 比例设置子单元,用于设置未同步到磁盘的已修改数据页在缓冲池中所占比例为〇 ; 数量监测子单元,用于监测缓冲池中的未同步到磁盘的已修改数据页的数量,直至所 述数量小于预先设定的值。18. 根据权利要求13所述的用于MySQL的快速回收回滚空间的装置,其特征在于,所述 文件生成单元包括: 文件创建子单元,用于创建一个新的系统表空间文件; 数据页复制子单元,用于按照系统表空间文件的格式,将所述原始系统表空间文件中 包含的、且类型不是回滚页的数据页写入所述新的系统表空间文件中; 统计信息更新子单元,用于更新所述新的系统表空间文件中与回滚空间相关的统计信 息的内容为,系统表空间文件默认的代表当前无回滚空间的值; 长度调整子单元,用于判断所述新的系统表空间文件的长度是否小于系统设定的系统 表空间文件的初始长度;若是,调整所述新的系统表空间文件的长度,使其大于或者等于系 统设定的系统表空间文件的初始长度。19. 根据权利要求18所述的用于MySQL的快速回收回滚空间的装置,其特征在于,所述 数据页复制子单元包括: 数据页读取子单元,用于以系统设定的数据页的长度为单位,依次读取所述原始系统 表空间文件中的数据页; 类型判断子单元,用于判断当前所读数据页的类型是否为系统字典页或者二次写缓冲 页; 数据页写入子单元,用于当所述类型判断子单元的输出为"是"时,将所述数据页读取 子单元读取的数据页的内容写入所述新的系统表空间文件,并更新该数据页在新的系统表 空间文件中的位置信息、以及该数据页与同类型的前一个数据页之间的相对位置关系信 肩、。 控制子单元,用于调度上述三个子单元,直至将所述原始系统表空间文件中的系统字 典页和二次写缓冲页都写入所述新的系统表空间文件为止。20. 根据权利要求18所述的用于MySQL的快速回收回滚空间的装置,其特征在于,所述 长度调整子单元包括: 长度判断子单元,用于判断所述新的系统表空间文件的长度是否小于系统设定的系统 表空间文件的初始长度; 空闲页追加子单元,用于当所述长度判断子单元的输出为"是"时,以系统设定的数据 页的长度为单位,向所述新的系统表空间文件的尾部追加一个类型为空闲页的数据页,并 触发所述长度判断子单元。21. 根据权利要求18所述的用于MySQL的快速回收回滚空间的装置,其特征在于,所述 长度调整子单元包括: 长度差值计算子单元,用于计算所述系统设定的系统表空间文件的初始长度与所述新 的系统表空间文件长度的差值; 空闲页数量计算子单元,用于获取所述差值与系统设定的数据页长度的比值,以大于 或者等于该比值的最小整数作为需要追加的数据页的数目; 空闲页批量追加子单元,用于向所述新的系统表空间文件的尾部追加相应数目的类型 为空闲页的数据页。22. 根据权利要求13所述的用于MySQL的快速回收回滚空间的装置,其特征在于,所述 文件替换单元具体用于,删除所述原始系统表空间文件,并使用所述原始系统表空间文件 的文件名为所述新的系统表空间文件重新命名。23. 根据权利要求13-22任意一项所述的用于MySQL的快速回收回滚空间的装置,其特 征在于,还包括: 同步停止单元,用于停止MySQL主数据库和备用数据库之间的同步;并且所述数据库 关闭单元、所述文件生成单元、以及所述文件替换单元部署在上述停止了同步操作的备用 数据库上实施。24. 根据权利要求23所述的用于MySQL的快速回收回滚空间的方法,其特征在于,还包 括: 主备切换单元,用于在停止MySQL主数据库和备用数据库之间的同步之后,执行所述 主数据库和所述备用数据库之间的切换;并且所述数据库关闭单元、所述文件生成单元、以 及所述文件替换单元部署在上述执行切换操作后的备用数据库上实施。
【专利摘要】本申请公开了一种用于MySQL的快速回收回滚空间的方法,包括:采用在关闭过程中清除无效回滚数据的方式关闭MySQL数据库;以待回收回滚空间的原始系统表空间文件为基础,生成一个不包含回滚空间的新的系统表空间文件;用所述新的系统表空间文件替换所述原始系统表空间文件。本申请同时提供一种用于MySQL的快速回收回滚空间的装置。采用本申请提供的方法,可以快速回收MySQL的回滚空间,提高整个数据库系统的可用性。
【IPC分类】G06F11/14, G06F17/30
【公开号】CN104881418
【申请号】CN201410073832
【发明人】林晓斌
【申请人】阿里巴巴集团控股有限公司
【公开日】2015年9月2日
【申请日】2014年2月28日
转载请注明原文地址:https://www.famiwei.com/read-8138657.html