对于当今的全球业务而言,保持24x7的高数据可用性至关重要。 IBM DB2 UDB的挂起的I / O功能提供了具有连续系统可用性的联机拆分镜像接口,可以满足这一关键需求。 本文定义并解释了拆分镜像和挂起的I / O的关键概念,并提供了针对几种不同方案的分步说明。
我假设您对DB2有基本的了解(类似于IBM认证的DB2数据库管理员可能具有的知识),以便利用本文的技术细节。
分割镜像是磁盘卷的相同,独立且即时的副本,可以将其附加到其他系统。 DB2 UDB数据库的拆分镜像是指一组相同,独立且瞬时的磁盘卷副本,这些副本包含其所有控制和数据文件,其中包括数据库目录的全部内容,所有表空间容器 , 本地数据库目录和活动日志目录 (如果它不在数据库目录中)。 仅需使用db2inidb命令的snapshot参数拆分活动日志目录才能创建克隆数据库。 其他两个参数, standby和mirror ,不需要拆分活动日志目录。
访问拆分镜像不涉及复制。 它取决于存储供应商的实施。 用户必须使用存储供应商的设施来访问拆分镜像。 不应以任何其他方式访问它。
以下是对DB2 UDB数据库的拆分镜像内容的详细说明:
数据库目录:创建数据库后,有关数据库的信息(包括默认信息)将存储在目录层次结构中。 分层目录结构是根据db2 create database命令中提供的信息在某个位置db2 create database 。 目录结构显示为“ <数据库路径> / <实例名称> / <节点名称> / SQLnnnnn /”。 在此结构中,名为SQLnnnnn的子目录称为数据库目录 。 该子目录的名称使用数据库令牌并表示数据库。 例如,SQL00001包含与第一个数据库关联的对象,而后继的数据库具有较高的编号:SQL00002,依此类推。
数据库目录包含数据库控制文件(SQLBP.1,SQLBP.2,SQLSPCS.1,SQLSPCS.2,SQLSGF.1,SQLSGF.2,SQLDBCON,DB2RHIST.ASC,DB2TSCHNG.HIS,SQLOGCTL.LFH,SQLOGMIR.LFH和SQLINSLK),操作数据库所需的默认SMS表空间SQLT *子目录,默认日志路径SQLOGDIR子目录,自动统计信息收集和重组功能的SYSTOOLSPACE子目录以及默认事件监视器的DB2EVENT子目录。
通过db2 list db directory on <database path>命令db2 list db directory on <database path>发出db2 list db directory on <database path>可以轻松确定与数据库相对应的数据库目录。
本地数据库目录:本地数据库目录位于定义数据库的每个路径(对于Windows,为“驱动器”)中。 目录结构显示为“ <数据库路径> / <实例名称> / <节点名称> / sqldbdir /”。 对于从该位置可访问的每个数据库,此目录包含一个条目。 使用拆分镜像解决方案时,建议在数据库路径中创建一个数据库,以便本地数据库目录(“ sqldbdir”)仅具有单个数据库的条目。
表空间容器:所有不属于数据库目录的表空间容器都必须是拆分镜像的一部分。 可以使用db2 list tablespaces和db2 list tablespace containers for <tablespace-id>命令找到有关表空间容器的信息。
活动日志目录:日志文件的路径应仅包含在克隆数据库的拆分镜像中。 可以使用db2 get db cfg for <database-alias>命令找到有关当前活动日志目录的信息。
拆分DB2 UDB数据库的镜像时,重要的是要确保在源数据库上不发生部分页面写入。 确保不进行部分页面写入的一种方法是使数据库脱机,这种状态在真正的24x7生产环境中绝对是不希望的。
为了在拆分镜像过程中提供连续的系统可用性,DB2 UDB提供了在源数据库上挂起I / O的功能,允许您在数据库仍处于联机状态时拆分镜像,而无需任何停机时间。
DB2 UDB的挂起的I / O功能通过挂起源数据库上的所有写活动,消除了部分页面写操作。 当数据库处于写挂起模式时,所有表空间都将置于“ 写挂起”状态(0x10000)。 但是,对数据库的所有操作均正常运行。
这是db2 list tablespaces命令的样本输出,显示了表空间状态:
需要磁盘I / O的事务(例如从缓冲池中清除脏页或从日志缓冲区中清除日志)可能会等待。 但是,一旦恢复了对源数据库的写操作,这些事务将正常进行。
使用挂起的I / O功能创建的拆分镜像将保持“写入挂起”状态,直到由DB2使用db2inidb命令对其进行初始化为止。 db2inidb命令提供了以三种不同方式(克隆,备用或镜像)初始化拆分镜像的选项,从而使用户可以满足其使用的各种目标。
使用挂起的I / O功能创建的DB2 UDB数据库的拆分镜像为用户提供了许多选项,使其适合于满足各种目标。 以下是可以使用拆分镜像的一些常用方法:
可以将DB2 UDB数据库的拆分镜像初始化为源数据库的快照,本质上是源数据库的即时克隆。 初始化后,拆分镜像将成为具有新日志链的功能完备的数据库,它可以用于填充测试系统,也可以用于生成报告,而不会影响生产系统。
DB2 UDB数据库的拆分镜像也可以初始化为热备份数据库,如果主数据库不可用,则提供快速的灾难恢复选项。
DB2 UDB允许您在备用数据库处于前滚暂挂状态时对其进行完整数据库备份(如果备用数据库仅包含DMS表空间)。 这减轻了在生产数据库上进行备份的开销。 DB2备份实用程序中有一个特殊情况的代码,以允许在带standby参数的db2inidb之后进行standby 。 拆分镜像后在源数据库上生成的日志文件可用于前滚恢复。 当前不支持包含SMS表空间的备用数据库的备份,这有两个主要原因:
为了备份SMS表空间,DB2必须查询系统目录以获取要包含在备份映像中的表的列表。 在拆分镜像上,目录将不一致(直到前滚完成)。 因此,DB2无法可靠地获取表列表。 拆分镜像系统上的备份将在拆分发生时捕获源系统上数据库容器的状态。 但是,拆分镜像系统此时将不了解数据库状态(这也将由前滚解决)。 因此,如果源系统上正在进行任何无法与备份同时进行的操作(或等效地,这将使备份在锁或其他同步原语上等待),则拆分镜像上的备份将必须以相同的方式被阻止。 但是,由于通常无法确定是否正在进行任何这些操作,因此拆分系统上的备份全盘被阻止。这些限制不适用于DMS容器,因为:
DB2不需要表列表来进行DMS表空间的备份,并且 有特定于DMS的锁可以防止在备份时同时发生不兼容的操作,并且这些操作也会在拆分时强制执行。初始化为镜像的拆分镜像可以用作系统级备份,从而允许管理员对数据库执行快速文件系统级恢复。
暂停的I / O功能与智能存储服务器的镜像功能(例如IBM Enterprise StorageServer®的FlashCopy®技术(ESS,称为Shark))或EMC Symmetrix远程数据工具(SRDF)的即时拆分功能相结合,可提供用于快速备份和恢复生产数据库的选项。
拆分镜像解决方案的实施包括以下关键阶段:
在源数据库上挂起I / O 分割源数据库的镜像 在源数据库上恢复I / O 根据需要初始化分割镜像可以使用db2 set write命令从CLP(命令行处理器)中挂起源数据库上的I / O写操作。 也可以通过使用输入值DB2_DB_SUSPEND_WRITE调用db2SetWriteForDB DB2 API来从应用程序挂起I / O。
拆分过程独立于DB2 UDB,并且完全取决于存储供应商的实现。 使用挂起的I / O功能来拆分DB2 UDB数据库的镜像没有硬件或软件特定的要求。
IBM建议使用智能存储服务器(例如IBM ESS或EMC Symmetrix)在其内部完全建立几乎即时的数据副本。 但是,使用操作系统命令,工具或任何其他实用程序创建拆分镜像没有任何限制。
重要的是要记住,在使用频繁的系统上,如果数据库长时间处于写入挂起状态,则最终所有应用程序都将挂起,同时尝试刷新日志缓冲区或缓冲池页面到磁盘。 不会发生崩溃,但是实例将停止运行,直到恢复I / O写操作为止。 避免这种情况(或至少减少这种情况发生的可能性)的一种方法是使缓冲池足够大。
如果要将镜像初始化为备用数据库或镜像数据库,则在拆分镜像之前,必须将数据库配置参数LOGRETAIN设置为RECOVERY。
拆分镜像的步骤如下:
连接到源数据库 在源数据库上挂起I / O(所有写活动) 分割镜像(使用用户选择的方法) 在源数据库上恢复I / O(所有写活动)可以使用db2 set write命令从CLP恢复对源数据库的I / O写操作。 如果用于挂起I / O写操作的连接丢失或挂起,并且所有随后的连接尝试也都挂起,则可以使用带有write resume选项的db2 restart database命令来恢复I / O。 在这种情况下,除非在数据库崩溃后发出此命令,否则不会执行崩溃恢复。 重要的是要记住, write resume选项只能应用于主数据库,而不能应用于镜像数据库。
也可以通过从应用程序中调用具有DB2_DB_RESUME_WRITE输入值的db2SetWriteForDB DB2 API来恢复源数据库上的I / O。 DB2 API db2DatabaseRestart还根据提供的输入值在源数据库上恢复I / O(除了执行崩溃恢复)。 有效输入值为DB2_DB_SUSPEND_NONE和DB2_DB_RESUME_WRITE 。
db2 set write resume for database要么
db2 restart database <database-alias> write resume使用挂起的I / O创建的DB2 UDB数据库的拆分镜像将保持“写入挂起”状态,直到将其初始化为可用状态为止。 因此,必须先初始化DB2 UDB数据库的拆分镜像,然后才能使用它。
db2inidb命令通过执行崩溃恢复或将其置于前滚暂挂状态来将拆分镜像初始化为功能状态。 db2inidb命令只能用于初始化使用挂起的I / O创建的拆分镜像。
根据db2inidb命令中使用的参数(快照,备用或镜像),可以将拆分镜像初始化为:
源数据库的克隆 热备用数据库 镜像数据库在分区环境中,必须在使用数据库之前初始化每个镜像分区。 可以独立地初始化每个镜像分区,或者可以使用db2_all在所有镜像分区上同时运行它。
在拆分镜像的初始化期间,甚至可以根据数据库名称,数据库目录路径,容器路径,日志路径以及与数据库关联的实例名称来重新定位数据库。
要重定位数据库,必须向db2inidb命令发出relocate参数以及一个包含原始配置文件和预期配置信息的配置文件。 relocate参数在后台调用db2relocatedb命令,因此允许在源数据库所在的同一系统上初始化拆分镜像。
重定位配置文件(文本文件)的格式如下:
通过使用db2inidb命令的snapshot参数初始化使用暂停的I / O功能创建的DB2 UDB数据库的拆分镜像,可以将其用作源数据库的克隆。
拆分镜像作为快照的初始化执行崩溃恢复,回滚所有未提交的事务,并使数据库可用于任何读取或写入操作。 必须使源数据库中所有在拆分时处于活动状态的日志文件都处于活动状态,以完成崩溃恢复。 拆分镜像数据库的活动日志目录中不得包含任何不属于拆分镜像的日志文件。
崩溃恢复完成后,将启动新的日志链。 因此,无法前滚源数据库中的任何日志。
可以在源数据库上还原对克隆数据库进行的数据库备份。 但是,无法应用拆分后从源数据库生成的任何日志。 因此,它将仅是版本级别的副本。
对拆分镜像发出带有snapshot参数的db2inidb命令后,无论它成功还是失败,在启动新的日志链时都不能使用standby或mirror参数。
这是目标系统上使用拆分镜像作为克隆数据库所需的步骤:
创建数据库实例(如果不存在)。 使用ON参数编目数据库(系统数据库目录): db2 catalog database <db-name> as <db-alias> on <db-path> 使拆分镜像可访问: 挂载数据库目录的拆分镜像副本。 挂载所有表空间容器的拆分镜像副本。 (如果容器位于多个目录中,那么必须安装所有容器目录。) 挂载本地数据库目录(sqldbdir)。 挂载日志目录的拆分镜像副本(如果日志文件位于源数据库上数据库目录以外的目录中)。 启动数据库管理器(确保设置了DB2注册表变量DB2INSTANCE): db2start 初始化分割镜像: db2inidb <target-database> as snapshot [relocate using <config_file>]通过使用db2inidb命令的standby参数对其进行初始化,可以使用备用I / O功能创建的DB2 UDB数据库的拆分镜像用作备用数据库。
初始化后,拆分镜像将作为备用数据库进入前滚暂挂状态。 数据库将保持连续的前滚暂挂状态,直到前滚已停止。
为了使备用数据库尽可能保持最新状态,源数据库中新的非活动日志文件在可用时应不断地应用到备用数据库中。 用户退出程序可用于自动从源数据库中连续检索非活动日志文件。 如果使用userexit,则必须使用相同的userexit程序配置源数据库和目标数据库。
这是目标系统上使用拆分镜像作为备用数据库所需的步骤:
创建数据库实例(如果不存在)。 使用ON参数编目数据库(系统数据库目录): db2 catalog database <db-name> as <db-alias> on <db-path> 使拆分镜像可访问: 挂载数据库目录的拆分镜像副本。 挂载所有表空间容器的拆分镜像副本。 (如果容器位于多个目录中,那么必须安装所有容器目录。) 挂载本地数据库目录(sqldbdir)。 启动数据库管理器(确保设置了DB2注册表变量DB2INSTANCE): db2start 初始化分割镜像: db2inidb <target-database> as standby [relocate using <config_file>] 连续复制或从源数据库检索不活动的日志文件,并将其在目标数据库上前滚: db2 rollforward db <target-database> to end of logs如果源数据库不可用(例如,如果崩溃),则可以激活目标系统上的备用数据库以供用户访问。 为了激活备用数据库,用户必须使备用数据库脱离前滚暂挂状态。 这可以通过发出带有stop或complete参数的db2 rollforward命令来使数据库进入一致状态来完成。 数据库处于一致状态后,用户可以切换到备用数据库以继续工作。 用户应用程序将必须与此激活的备用数据库建立新连接。 在备用数据库上生成的日志文件不能应用于源数据库。
使用挂起的I / O创建的拆分镜像可以用作镜像数据库,以进行系统级快速恢复,方法是将其复制到源数据库上,然后使用带有mirror参数的db2inidb命令对其进行初始化。
将拆分镜像初始化为镜像后,数据库将置于前滚暂挂状态。 现有的日志文件将用于源数据库上的前滚恢复。 没有启动崩溃恢复,并且数据库保持不一致,直到发出前滚到日志末尾和发出停止/完成操作为止。 重要的是要注意,分割镜像必须保持写入挂起状态,直到将其复制到源数据库顶部为止。
以下是在源系统上设置镜像数据库所需的操作:
关闭源数据库实例: db2stop 将拆分镜像复制到源数据库的顶部。 用数据库的镜像副本替换源数据库(活动日志目录除外)。 启动源数据库实例: db2start 在源数据库上初始化镜像副本: db2inidb <source-database> as mirror [relocate using <config_file>] 前滚至日志结尾并停止: db2 rollforward database <source-database> to end of logs and stop在多分区环境中,每个分区都被视为一个单独的数据库。 因此,在拆分镜像过程中,必须在每个分区上暂停I / O写操作。 同样,分割镜像后,必须在每个分区上恢复I / O写操作。 使用db2inidb命令初始化拆分镜像时,该方法同样适用,该命令必须在使用数据库之前在每个镜像分区上运行。
由于每个分区都被视为一个单独的数据库,因此I / O写入可以在每个数据分区上独立于所有其他分区而挂起。 因此,用户不需要发出db2_all来挂起所有分区上的I / O。 但是,如果每个分区都被独立挂起,则目录分区上的I / O写操作必须最后挂起。 在多分区数据库中,尝试挂起任何非目录分区上的I / O将需要连接到目录节点以进行授权。 如果目录分区已挂起,则连接尝试可能会挂起。
在分区数据库环境中,建议独立地挂起所有分区上的I / O写操作,最后挂起目录分区。 这意味着可以挂起I / O,而不会影响其他分区。
如果AIX上的分区数据库具有四个数据库分区(0、1、2、3),其中目录分区为0,那么可以按以下方式挂起和恢复I / O:
初始化拆分镜像时, db2inidb命令不需要与数据库的任何连接。 因此,可以在每个分区上独立运行此命令,或者可以发出db2_all在所有分区上同时运行db2inidb 。 唯一的要求就是要启动数据库管理器。
如果在某些分区上分割(分区数据库的)镜像时有一些不确定的事务,则带有snapshot参数的db2inidb在侧向恢复期间可能会失败。 这是预期的行为。 为了解决有疑问的交易,一个数据分区可能需要联系另一个数据分区。 如果正在联系的数据分区尚未运行db2inidb ,则该请求将被拒绝,因此将失败,并显示以下错误消息之一:
SQL20153N数据库的拆分映像处于挂起状态。 SQL1391N数据库管理器的另一个实例已在使用该数据库。仅当在每个数据分区上顺序发出db2inidb才会发生SQL20153N,而当在所有数据分区上并行运行db2inidb时,会发生SQL1391N。
在这种情况下,只需在出现故障的分区上重新发出重新启动数据库命令即可解决该问题。
因此,在多分区数据库中初始化DB2 UDB数据库的拆分镜像的建议是:
问题db2inidb上的所有数据分区同时使用db2_all ,或问题db2inidb在每个分区上分别以串联的方式。 在所有分区上发出db2 restart database命令(不带write resume选项),以确保启动侧向恢复以解决任何有疑问的事务(因为用户查找侧向恢复故障可能不方便也不容易)。请注意,以上内容仅在db2inidb命令中使用了snapshot参数时适用。 由于standby和mirror选项不执行崩溃恢复,因此这不适用于它们。
在拆分镜像方案中,始终涉及三组操作:
使用db2 set write命令挂起和恢复源数据库上的I / O。 镜子的分裂。 使用db2inidb命令初始化拆分镜像。在调试与挂起的I / O相关的问题时,IBM DB2技术支持团队将调查操作1和3。由于拆分过程完全在DB2 UDB之外进行,因此用户应请适当的存储供应商支持来调试有关的所有问题。他们使用的拆分过程。
收集并提供给IBM支持人员的一般数据集应包括:
源系统和目标系统的db2diag.log副本, db2level命令的输出,数据库管理器配置( db2 get dbm cfg )和数据库配置( db2 get db cfg for <database-alias> )。 发出db2 set write命令后立即复制SQLOGCTL.LFH文件(从源数据库) 在发出db2inidb命令之前和之后,从目标系统复制SQLOGCTL.LFH文件 用于(按顺序)拆分镜像的确切方法和第三方命令的完整详细信息在本文中,您了解了DB2 UDB数据库上下文中的分割镜像的概念,以及如何使用挂起的I / O功能来实现各种高可用性解决方案,以满足连续系统可用性的苛刻需求。 您还发现了有关如何挂起/恢复I / O,拆分镜像以及对其进行初始化以使其在分区和非分区环境中均可使用的详细过程。
本文档中提供的信息是按“原样”分发的,没有任何明示或暗示的保证,并且IBM或作者均不对使用该文件造成的任何后果负责。
翻译自: https://www.ibm.com/developerworks/data/library/techarticle/dm-0508quazi/index.html
相关资源:数据库的三种状态RESTRICT、QUIESCE和SUSPEND(三)