目前大多企业 DB2 生产环境都要求高可用,不能承担片刻停机带来的损失。当 DBA 希望将表从一个表空间移动到另一个表空间中,在 DB2 V9.7 以前的版本中要实现这个目标比较复杂,总有一段时间表对外是不可用的。DB2 V9.7 提供了存储过程 ADMIN_MOVE_TABLE 帮助 DBA 快速的实现表数据移动,并且保持高可用性。
简介
目前大多企业 DB2 生产环境都要求高可用,不能承担片刻停机带来的损失。当 DBA 希望将表从一个表空间移动到另一个表空间中,在 DB2 V9.7 以前的版本中要实现这个目标比较复杂,总有一段时间表对外是不可用的。DB2 V9.7 提供了 ADMIN_MOVE_TABLE 存储过程将表中的数据移至名称相同的新表对象,而新表是存放在不同的表空间上具有不同的存储特征,同时数据保持联机可供访问。我们还可以在表移动时为表生成新的优化压缩字典。
DB2 V9.7 通过自动将表数据移至新表对象并同时允许数据保持联机以进行查询、插入、更新和删除访问,降低了企业的总体拥有成本(TCO)和复杂性。
在表数据移动过程中我们还可以使用 ADMIN_MOVE_TABLE 存储过程修改表的定义,如增加删除列、修改列数据类型等。
在线数据移动过程
ADMIN_MOVE_TABLE 过程涉及三个表:
源表。源表是指数据将被移动走的表,通过参数形式传递给 ADMIN_MOVE_TABLE 存储 过程。
目标表。目标表由 ADMIN_MOVE_TABLE 根据传递入的参数定义新创建的表,所有源表中的数据将复制到目标表中,并且最后被命名成与源表相同的表名。
登台表。由 ADMIN_MOVE_TABLE 存储 过程创建,在表移动过程中用于临时保持对源表的所有 Update、Insert、Delete 操作。当移动完成后,该表将被删除。
数据移动过程还涉及一个表被成为协议表(protocol table),这个表将用于保存数据移动的过程数据和配置信息,如数据移动使用的参数、COPY 开始的时间、结束时间、COPY 使用的选项等。此表定义如下:
清单 1. 协议表的定义
C:>db2 describe table systools.ADMIN_MOVE_TABLE
数据类型 列
列名 模式 数据类型名称 长 小数位 NULL
————— ——— ——————- ———- —– –
—–
TABSCHEMA SYSIBM VARCHAR 128 0 否
TABNAME SYSIBM VARCHAR 128 0 否
KEY SYSIBM VARCHAR 32 0 否
VALUE SYSIBM CLOB 10485760 0 是
其中关键字(KEY)都有特定含义,当我们对表数据移动进行问题诊断、调整性能时都会使用到该表。
ADMIN_MOVE_TABLE 过程将首先创建源表的影子副本。在复制阶段,DB2 将使用触发器捕获对源表的插入、更新和删除操作并将其放入到登台表中。完成复制阶段后,DB2 在登台表中捕获的数据更改操作将在影子副本中重现。最后 DB2 使用 ADMIN_MOVE_TABLE 过程将使表短暂脱机以交换对象名。ADMIN_MOVE_TABLE 默认情况下使用 INSERT Cursor 的方式将数据从源表复制到目标表,也可以指定选项使用 LOAD 方式复制数据以提高性能。
从过程上看,表数据移动大致分为以下几个阶段:
INIT 阶段。本阶段验证数据移动是否可以发生,并且初始化后继数据移动所需要的各种数据,如目标表、登台表、源表触发器。
COPY 阶段。本阶段将源表中的所有数据复制到 INIT阶段创建的目标表中,如果在此时有用户对源表执行 DML语句,则 INIT阶段创建的触发器将会捕获到这些语句,并且将任何更新、删除、插入操作保存到登台表中。在复制阶段结束后,如果我们没有使用 COPY_WITH_INDEXES选项,则目标表上将会建立新的索引。而且如果需要的话,源表、目标表上将会建立辅助索引帮助提高 REPLAY阶段的性能。COPY阶段只能在 INIT阶段完成后开始。
REPLAY 阶段。在 COPY阶段保存到登记表的所有数据将在本阶段被 Replay到目标表。REPLAY阶段只能在 COPY阶段完成后开始。
VERIFY 阶段。本阶段是可选的,用于检查目标表和源表是否在内容上等同。检查过程首先在源表、目标表上获取 S锁,然后 Replay源表上的所有变化,然后与目标表进行比较。如果表拥有唯一索引,则会比较两个表中都存在的列的所有值,如果没有唯一索引将不比较 LONG、LOB、XNML列的值。.验证工作是一个成本很高的操作,我们在使用时必须要判断是否真的需要这么做。VERIFY阶段只能在 COPY阶段或者 REPLAY阶段完成后开始。
SWAP 阶段。在 Replay阶段完成后或者达到协议表中保存的 REPLAY_THRESHOLD值设置时,源表将被脱机,然后 DB2交互源表和目标表的名字,重新把表联机。SWAP阶段可以在 COPY完成后启动,最好时在 REPLAY调用完成后启动。
CLEANUP 阶段。本阶段将会删除在 INIT阶段创建的登台表,触发器。如果调用过程中没有使用 KEEP选项,源表也将会被删除。CLEANUP阶段可以在 SWAP阶段之后被调用。
我们需要注意的是 ADMIN_MOVE_TABLE 可以将源表上定义的触发器、视图也同时移动到目标表,但是当前它并不能支持将外键关系复制到目标表,无论源表是外键的父表还是子表。因此如果源表上有外键关系存在,我们首先需要捕获这些外键定义,然后在移动完成后在目标表上重新创建。
ADMIN_MOVE_TABLE 语法
DB2 中存在两种合法的 ADMIN_MOVE_TABLE 语法形式。第一种方法用于我们修改在目标表上修改指定的部分的定义,如我们有一个定义很长的表,而我们希望做的仅仅时修改表存放的表空间,用第一种语法我们就不需要重新创建表而直接使用 ADMIN_MOVE_TABLE 修改。我们需要做的仅仅是在参数中指定 data_tbsp、index_tbsp、和 lob_tbsp,而把其他可选参数设置为空即可。
DB2 提供的第二种语法让我们更加灵活、方便的控制目标表的创建,而不使用存储过程创建目标表。这让我们能够在第一种方法没有办法创建目标表的情况下手工创建目标表。
清单 2. 方法 1 语法
>>-ADMIN_MOVE_TABLE–(–tabschema–,–tabname–,—————->
>–data_tbsp–,–index_tbsp–,–lob_tbsp–,–mdc_cols–,——–>
.-,——-.
V |
>–partkey_cols–,–data_part–,–coldef–,—-options-+–,—–>
>–operation–)————————————————><
清单 2. 方法 2 语法
存储过程中使用的参数含义如下:
tabschema ,源表模式。
tabname,源表名称
data_tbsp,指定目标表的新数据存放表空间。如果此参数有值,则 index_tbsp and lob_tbsp 参数需要存在。如果该值未提供,则源表数据表空间用来保持目标表的数据。
index_tbsp,指定目标表的新索引表空间。如果该值被提供,则 data _tbsp and lob_tbsp 参数需要存在。如果该值未被提供,则源表索引表空间被用来保存目标表的索引。
lob_tbsp, 指定目标表的大对象表空间,如果该值被提供,则 data _tbsp and index_tbsp 参数需要存在。如果该参数未指定值,则源表大对象表空间被用来保存目标表的大对象。
mdc_cols,指定目标表的多维列(MDC),多列之间使用逗号隔开。如果值为 NULL 或者’ – ‘,目标表将不会使用 ORGANIZE BY DIMENSIONS 子句创建 MDC 表。如果值为空串或者’ – ‘,DB2 将检查源表上是否指定了 MDC,如果存在则使用源表的 MDC。
partkey_cols,指定目标表的分区键列,多列之间使用逗号隔开。如果值未 NULL 或者’ – ‘,目标表将不会 PARTITIONING KEY 子句创建目标表。如果值为空串或者’ – ‘,DB2 将检查源表上是否指定了分区键,,如果存在则使用源表的分区键。
data_part,本参数提供目标表的数据分区详细规格。本语句定义了如何将表根据表的一个或多个列的值存放在多个存储目标上。如果值未 NULL 或者’ – ‘,目标表将不会 PARTITIONING RANGE 子句。如果值为空串或者’ – ‘,DB2 将检查源表上是否指定了分区模式,如果存在则使用源表的分区模式。
coldef,指定目标表的列定义,方便我们将列的修改为兼容的数据类型,不过列名必须相同。该参数提供了增加新列、删除存在的列功能,只有存在唯一索引或主键索引的表中才能删除列,同时列不能是主键或者唯一键的一部分。
target_tabname ,指定目标表名称,在完成数据移动后该名称将作为新表的名字。当我们指定,目标表的名字时,我们我们可以对目标表进行以下变化:
数据、索引、LOB 表空间可以改变
可以增加或变化多维列(MDC)规格。
可以增加或者变化分区键列规格。
可以增加或者变化数据分区规格。
可以启动或者停止数据压缩。
可以增加新列。
当指定目标表的名字时,存在以下约束:
源表与目标表的模式必须相同
如果目标表已经存在,则目标表必须为空
不能为类型表、物化查询表、登台表、远程表、或者聚集表
选项。多个选项可以使用逗号隔开:
KEEP。该选项将会使源表保存为另外一个名字的 COPY。如源表名为 T1,在数据移动完成后,源表将被命名为 T1AAAAVxo。我们可以在协议表中的 ORIGINAL 关键字下找到源表的新名字。
COPY_USE_LOAD。该选项使用不可恢复的 db2Load API 从源表复制数据到目标表。如果使用该选项,则 FORCE 选项需要被包含。
COPY_WITH_INDEXES。此选项指定在 COPY 源表之前创建索引。默认情况下 DB2 时在源表 COPY 后创建索引的。使用该选项的好处是在 COPY 后不在需要每创建一个索引进行一次表扫描,索引创建受需要活动日志的事务控制;缺点是会使得 COPY 的性能下降,因为需要在目标表上维护索引,同时索引上有很多伪删除的键。
FORCE。如果指定此选项 SWAP 阶段将不会检查源表是否修改了其定义。
NO_STATS。该选项指定不启动对目标表的 Runstats 命令或者复制统计信息。
COPY_STATS。该选项指定在 SWAP 阶段之前从源表中复制统计信息到目标表。
NO_AUTO_REVAL。该选项防止自动进行表的 Revalid 操作,而是直接重新创建所有索引、视图。
REORG。该选项指定在 SWAP 之前对目标表进行脱机重组,可以用于重构数据字典。
Operation。该选项指定期望进行的操作,一般为 MOVE。我们也可以手工把 MOVE 拆分开,依次手工执行 INIT、COPY、REPLAY、VERIFY、SWAP、CLEANUP。当移动到某个阶段,我们想取消移动时,可以使用 CANCEL 操作。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
Notre Dame对云端SQL Server性能基准的探索实践
确立SQL Server的性能基准,对于云端迁移来说是至关重要的第一步,一位来自于University of Notre Dame 的DBA表示,他正在试图通过数据库监控软件,找出SQL server的性能基准。
-
DBA必须掌握的数据库恢复管理技术
如果没有备份副本,数据库管理员就无法还原数据库,所以DBA在恢复之前倾向于考虑备份是合乎逻辑的。 但是,对我来说,这种逻辑一直是错误的。
-
TT百科:存储过程
存储的过程可以访问或修改数据库中的数据,但并不绑定到特定的数据库或对象,这提供了许多优点。
-
DBA也要和领导抢饭碗?
数据库架构师Ziaul Mannan 认为,DBA有成为高管的潜在可能,而这种潜力在过去往往被忽视,他还将证明DBA技能到领导力的转变是可行的。