逐步实现“user-copy”复制的方法
Mika Nikolopoulou
数据管理技术销售专家, IBM Corporation
2004 年 8 月
复制是允许你在需要数据的场合获得数据的一种方式。本文使用来自实际客户站点的例子,解释了复制可以为您完成的工作,并逐步展示了如何设置它。作者给出了一些提示和技巧来帮助你在复制过程中确保成功。
简介
对于确保随需应变业务环境中的数据可用性,数据复制是一项重要的技术。它是一个异步的、基于日志的过程,允许您将数据从一个位置复制到另一个位置,同时使第二个位置的数据和第一个位置的相同。要进行数据复制的原因有很多,但最常见的情况是用于查询负载平衡和故障恢复,以减少等待时间并使用户更接近数据,或者是为了合并多个数据源的数据。因为它以数据库日志为基础,所以与其他移动数据的方法相比效率很高。
在 DB2® Universal Database™ (UDB) 中,SQL 复制功能已经被包含在基本产品中了。用户可以从 Control Center 访问 Replication Center,即用于设置复制的图形界面。此外,还有一个用于复制的脚本语言,名为 asnclp,它允许您创建脚本以自动设置复制。
本文描述了关于如何使用 Replication Center 来设置数据复制的具体例子。此外,还将学习如何设置和使用 asnclp。这篇文章中的信息以一个客户站点的实际复制实现为基础。
请注意我描述的案例是 UNIX® 服务器和 Windows® 服务器之间复制的具体实现,并且用于满足一个客户的需求。这个配置和设置不一定应用于所有情形,但这些概念和步骤对于所有案例都是相同的。通过使用您自己的数据库名称、服务器名称、别名、路径等等,可以修改这个场景。
复制例子的体系结构
在这个实现中我们使用两台服务器:
Sun 服务器将是捕获(Capture)服务器,而 Windows 服务器将是应用(Apply)服务器。 Replication Center 是用于设置复制的图形用户界面(GUI),下面您将看到如何使用 DB2 的 Replication Center 设置复制环境。在这个例子中,我们将从 Windows 服务器运行 Replication Center,Windows 服务器将是复制的控制服务器以及应用服务器。
User copy 复制是设置复制的一个选项。User copy 是目标表的默认类型。它是只读的目标表,只包括定义在订阅集成员(它是复制集的定义)中的列。User-copy 表拥有的结构可以与源表相同,也可以拥有源列的子集,带有或不带有前映像(before image)或计算列。
图 1展示这个复制场景的体系结构。
图 1. 该复制场景的体系结构
为复制进行设置
在本节,我们将逐步学习如何为复制进行设置。
步骤 1 - 在源数据库上编目一个新别名
在我们的案例中,在服务器 DAISY 上有一个名为 PPMT_DB 的数据库。为了在远程 Windows 服务器上利用别名 DAISY_DB 来正确地使用这个数据库,我们需要在 DAISY 服务器上编目一个别名 DAISY_DB ,这样捕获过程将不会与名称 PPMT_DB 发生冲突。
在 Sun 服务器上,使用命令:
catalog database PPMT_DB as DAISY_DB on /ppmt/db2ppmt
|
注意,该命令的语法是: catalog database dbname as aliasname on path 。有关这个命令的详细信息,请参阅 DB2 UDB Command Reference。
如果向这台捕获服务器添加别名失败,那么复制也许不能正常工作。添加别名将确保捕获服务器和应用服务器都知道别名 DAISY_DB。使用 catalog local node 命令编目本地服务器,然后使用 catalog database 命令为 PPMT_DB 指定别名。
请注意,如果您不想为目标服务器上的源数据库使用不同的名称,就不必要添加别名。换而言之,如果不想在目标服务器上为源 PPMT_DB 数据库提供别名 PPMT_DB,就不必在源服务器上创建本地别名。我们推荐这两台服务器上的源数据库使用相同的名称。
步骤 2 - 从 DB2 Control Center 编目源服务器
- 在 Windows 系统上使用 DB2 Control Center,注册这个远程(源)数据库,这样 Windows 服务器就可以本地访问该数据库。在 Control Center 中,右击 All Cataloged Systems并添加一个新系统;在我们的案例中它是 DAISY。
- 只要在 Control Center 中看到新的 DAISY 系统,就右击 Instances并选择 Add,以便添加新数据库。在出现的窗口中,为源数据库系统输入正确的信息,包括端口号(默认值为 50000)、实例名称等等。利用 Discover 选项,DB2 应该向您提供远程服务器上可用的数据库列表。选择您想要从本地环境中访问的数据库,并将它添加到该系统。现在您已经编目了一个系统(节点)和一个数据库。在 Control Center,现在应该看到系统 DAISY,并且在 Instances 下,还应该看到节点 DAISYNOD(我们为该“节点”提供的名称总是和远程系统相同,在这个案例中,我们提供的名称为 DAISYNOD,而底层的实例名称是 db2ppmt)。然后在 DAISYNOD 下面,单击 Databases,应该看到本地数据库的名称/远程数据库 DAISY_DB 的别名是 DAISY_DB。
步骤 3 - 注册一个源服务器
- 从 Replication Center,展开 Replication Definitions,并右击 Capture Control Servers,然后选择 Add。在 Add Capture Control Servers 窗口,添加想要作为源服务器的服务器。Replication 环境中的术语 capture server 指的是捕获数据库。选中 DAISY_DB 旁边的复选框,以便利用别名 DAISY_DB 来使用远程的 Sun 服务器数据库作为您的捕获数据库。
图 2. 注册源数据库
- 单击 OK。 现在您的捕获控制服务器应该拥有一个新的名为 DAISY_DB 的服务器。
步骤 4 - 配置捕获控制表的配置文件
在创建 Capture Control Table 之前,我们需要配置该环境,以便可以用想要的方式来设计它。在我们的环境中,我们希望所有捕获控制表都存储在单个表空间中,而不是与默认的情况一样位于单独的表空间。 此外,我们还希望更改捕获控制表的模式名称。
- 右击 DAISY_DB Replication源名称,并选择 Manage Source Object Profiles。
- 在出现的窗口中,选项卡 CD Tables下面,选择 Specific schema而不是 Use the same schema作为源表,输入模式名称 ASN1。一定要选中 Allow full refresh for target table。
- 定位到选项卡 CD-Table Spaces。选择 Put all CD tables in the same table space。为表空间提供一个名称。在我们的案例中它将是 TSCD。
- 还要选择默认的缓冲池 IBMEFAULTBP 并选择页面大小为 4。取决于您的数据库,您可能想要不同的页面大小,它与您的源表页面大小一致。在这个案例中我们选择默认值。
- 定位到 CD-Table Indexes 选项卡。CD Indexes 拥有的模式和表空间可以与 CD 表一样。在 Index Name 中,选择“Source table name”。这对避免 CD 索引的名称冲突有利,因为还存在一个将被修正的限制。
这里要小心,因为索引名称长度最大为 18 个字符,并且 DB2 复制功能会将所有 CD 索引截取为 18 个字符。注意,这只是当前的一个限制并且将被修正,因为通常情况下对于 DB2 索引它不是合法限制。正常的限制是 128 个字符。
- 在 Truncation Rules选项卡中,保留默认值,这样如果名称太长,Capture 程序将从右截取索引名称。
一般来说,从 Replication Center 生成 SQL 时(这将创建 CD 表和索引),要注意索引的名称冲突。应该检查每个索引名称,以查看它是否与在运行生成的 SQL 之前的任何索引名称发生冲突。Replication Center 在运行 SQL 之前不进行这项检查,如果有错误,SQL 脚本将运行到这个冲突,并返回一条错误消息。为了避免这个问题,应该在运行一些 SQL 脚本(创建注册(CD)表和索引)之前进行这项检查。
图 3、 图 4和 图 5展示了配置源数据库的屏幕。
图 3. 配置源数据库的 stage table
图 4. 为源配置 stage table
图 5. 为源数据库配置 stage table
步骤 5 - 为捕获程序创建复制控制表
- 右击 Capture Control Servers并选择 Create Capture Control Tables,然后选择 Custom。选择数据库名称,在我们的案例中是 DAISY_DB,并单击 OK。
- 在下一个窗口中,即 Create Capture Control Tables,为 Capture 控制表定义表空间和表。在默认情况下,您应该看到模式名称 ASN1,因为它是我们在配置文件中定义的模式名称。如果没有出现这个名称,那么为该模式输入 ASN1。
- 对于表空间 TSASN1CA 和 TSASN1UOW,将大小更改为 512 MB,以替代默认值(即 10 MB)。为 bufferpool 选择 IBMDEFAULTBP。
- 单击 OK。出现一个消息窗口,它包含关于创建表的信息。滚屏到末尾以查看是否存在任何错误。
- 如果没有错误,那么单击 OK。应该看到一个 SQL 命令脚本,它将为捕获控制服务器生成表。
- 您可以选择现在运行它,也可以选择将它保存到一个脚本或文件中以后再运行。如果选择现在运行,则单击 Apply或 OK。现在 Registration 控制表的创建应该完成了。
步骤 6 - 启用复制
- 为了使数据库能够进行复制,首先确保在数据库配置中关于捕获服务器的参数 LOGRETAIN 设置为 RETAIN。通过从 SUN 服务器(DAISY)上的 DB2 命令行处理器发出以下命令,可以检查这个参数:
db2 connect to DAISY_DB
db2 get db cfg
|
- 如果 LOGRETAIN 没有被设置为 RETAIN,则可以使用以下命令设置它:
db2 update db cfg using LOGRETAIN RETAIN
|
- 然后需要使用 BACKUP 命令备份数据库。如果将 LOGRETAIN 值更改为 RETAIN,数据库就处于备份暂挂状态。RETAIN 意味着日志记录不再是循环的,而是归档的,因此需要在继续设置之前进行一次初始备份。
可能需要停止并启动数据库服务器,以便配置更改生效。发出命令 db2 force applications all 之后再发出 db2stop 。然后发出 db2start ,更改就应该生效了。
- 然后在 Replication Center 中展开 Capture Control Servers 文件夹,右击 DAISY_DB 数据库,并选择 Enable Database for Replication。在出现的窗口中单击 OK。如果需要备份数据库,那么可以通过单击 Backup now,从 Replication Center 进行备份,也可以通过 Control Center 进行备份。
步骤 7 - 注册表
下一步是在捕获服务器上注册想要复制的表,在我们的案例中,想要复制 141 个表,并且我们不会选择任何列或使用任何 WHERE 子句来限制复制集。对于您想要注册的每个表,都会创建一个更改数据(CD)表和 CD 索引。与配置文件中定义的一样,所有这些表将存储在同一表空间中。该表空间应该拥有足够空间以容纳所有 141 个 CD 表。这些表将包含对源表的所有更改,因此小心地留出足够空间以容纳这些更改。
- 右击 Registered Tables并选择 Register Tables。
- 在 Add Register Tables 窗口,使用搜索条件,搜索想要注册以便复制的表。在我们的案例中,因为我们使用 PPMT_DB 数据库中的所有表,所以在 SCHEMA 列旁边放置 PPMT 值,比较关系应该是“=”。
- 然后单击 Retrieve,就应该获得一个列表,它包含带有 PPMT 模式名称的所有表。
- 通过按下 Shift 键并从列表的顶部滚动鼠标直到末尾,选择所有表。然后松开 Shift 键。所有表都应该是被选中和突出显示状态。然后单击 OK。
- 出现的下一个窗口有一个表列表。保留这个窗口中的默认值,并单击 OK。在消息弹出窗口中,查看是否存在任何错误消息,如果没有,则单击 OK。
- 现在检查该脚本。这个脚本包含为正在注册的表创建所有 CD 表和索引的 SQL 语句。它还更新捕获控制表。
- 在运行该脚本之前,检查索引名称是否存在任何冲突。确保在该脚本中不存在名称相同的索引;否则该脚本将返回错误。通过首先使用 Save to a File单选项并单击 OK,将该脚本保存到一个文件中,就可以进行检查。如果做了任何更改,则将它们转移到该脚本并从任务中心、命令中心或从相同的复制窗口运行它。
- 运行该脚本之后,应该能够在 Replication Center 中 Capture Control Servers 下的 DAISY_DB 中的 Registered Tables 路径下看到所有已注册的表。通过定位到 DAISY_DB 数据库并查看新的 CD 表,可以在 Control Center 进行检查。
步骤 8 - 为 Apply 程序创建复制控制表
- 右击 Apply Control Servers并选择 Create Apply Control Tables,Custom。
- 选择目标数据库,在这个案例中是 KEEL_DB。单击 OK。
- 在出现的关于 Create Apply Control Tables 的窗口中,保留默认值并按下 OK。应用表不需要很多空间,因此 10MB 空间就足够了。如果需要,可以添加更多空间。
- 如果没有错误,则关闭消息窗口,然后使用 Run Now 选项来运行该脚本。单击 OK。在成功地运行该脚本之后,展开 Apply Control Servers 文件夹。该文件夹下应该显示 KEEL_DB 数据库。这个脚本更新了捕获控制表,并创建了应用控制表。
步骤 9 - 创建目标数据库
在目标系统上创建一个新的数据库,在我们的案例中是 KEEL。将这个数据库命名为 KEEL_DB。使用默认设置。可以使用以下 DB2 命令:
或从 Control Center 中使用 Create Database Wizard,并使用所有默认设置。
步骤 10 - 创建订阅集
展开 Apply Control Servers文件夹,展开 KEEL_DB文件夹并右击 Subscription Sets文件夹。选择 Create。在 Set Information 选项卡中:
- 选择 KEEL_DB 作为应用控制服务器别名。
- 使用您首选的集名称,在我们的案例中是 PPMT_TARGET。
- 使用您首选的限定词,在我们的案例中是 QUAL。
- 选择捕获控制服务器别名,在我们的案例中是 DAISY_DB。
- 这里的捕获模式是 ASN1。选中 Activate the subscription set复选框并选中 Make active indefinitely单选按钮,如 图 6 所示。
图 6. 为源数据库配置 stage table
- 定位到 Source-to-Target Mapping选项卡并单击 Add向订阅集添加成员。
- 在下一个窗口中单击 Retrieve All,以检索数据库中的所有表,或根据窗口顶端定义的条件进行一次选择。
- 选择想要添加到订阅集中的表。在我们的案例中添加了 3 个表。
- 右击每个表并单击 Change。在这个窗口中,您将发现列的映射,并且如果需要,可以使用 WHERE 子句或者行过滤器来限制要复制的数据。
- 还可以定义表空间和目标 Load 选项。在我们的案例中,保留默认值,然后单击 OK。
- 单击 OK来创建订阅集,关闭消息窗口并运行脚本。
如果展开应用控制服务器,将能够看到新的 Subscription 集及其成员。
步骤 11 - 为捕获和应用创建口令文件
对于每个应用服务器,都需要一个口令文件。对于每个数据库,口令文件中都需要有一项,该项包含用于访问这个数据库的 id 和口令。在我们的案例中,我们只有一个应用服务器(即 KEEL_DB),并且我们有两个数据库,DAISY_DB 和 KEEL_DB;因此必须拥有一个口令文件,它有两个关于 KEEL_DB 服务器的项。
- 在 Windows 服务器上,在 SQLLIB 下创建目录 repl,然后从命令行窗口输入以下命令:
asnpwd init using “c:\Program File\SQLLIB\repl\asnpwd.aut”
|
- 然后使用以下命令利用关于这两个数据库的项填充口令文件:
asnpwd add alias DAISY_DB id db2ppmt password db2ppmt using
“c:\Program File\SQLLIB\repl\asnpwd.aut”
asnpwd add alias KEEL_DB id db2admin password db4admin using
“c:\Program File\SQLLIB\repl\asnpwd.aut”
|
启动 Capture 和 Apply 程序
在测试期间从命令行启动捕获和应用程序更可取。利用简单的命令就可以实现,并且您有机会立即查看启动捕获和应用是否成功。一旦测试完成,应该使用 asnscrt 命令将捕获和应用设置为 Windows 服务器,在 DB2 V8 Replication Guide and Reference中有关于该命令的文档说明。
- 第一次想要启动捕获时,在 DAISY 服务器上,从 UNIX 命令提示符,键入以下命令:
asncap CAPTURE_SERVER=DAISY_DB CAPTURE_SCHEMA=ASN1
CAPTURE_PATH=/ppmt/db2ppmt/db2ppmt startmode=COLD
|
- 第一次启动复制并且当数据库为空时,您想要利用 COLD 选项启动。原因是这样将进行一次完全刷新(full refresh),并且应用过程使用 INSERTS 而不是使用复制表来自动填充空表。这个方法是快速填充表的首选方法。对于非常大的表,应该使用 ASNLOAD 选项。
- 在其他所有时间,使用以下命令:
Asncap CAPTURE_SERVER=DAISY_DB CAPTURE_SCHEMA=ASN1
CAPTURE_PATH=/ppmt/db2ppmt/db2ppmt/ startmode=WARMSI
|
然后就出现一条消息,并且服务器应该启动了。
- 要启动应用过程,在 Windows 中定位到一个命令窗口,并发出:
asnapply CONTROL_SERVER=KEEL_DB APPLY_QUAL=QUAL
APPLY_PATH=”c:\Program Files\SQLLIB\repl”
|
您必须指定 APPLY_PATH,因为必须从口令文件的位置运行应用程序,或指定口令文件的位置,否则连接到数据库将失败。
- 如果需要故障检测(troubleshoot),一个好的方法就是利用以下选项发出 Apply 命令:
asnapply CONTROL_SERVER=KEEL_DB APPLY_QUAL=QUAL
APPLY_PATH=”c:\Program Files\SQLLIB\repl” trcflow copyonce > filename.out
|
这样,将生成一个跟踪文件,并且由于 copyonce 选项,该命令只运行一个周期就会停止。检查 filename.out 文件,以查看是否有关于故障检测问题的任何消息。
停止捕获和应用
- 要停止捕获,从 Sun 服务器发出以下命令:
asnccmd CAPTURE_SERVER=DAISY_DB CAPTURE_SCHEMA=ASN1 STOP
|
- 要停止应用,在 Windows 服务器发出以下命令:
asnacmd CONTROL_SERVER=KEEL_DB APPLY_QUAL=QUAL STOP
|
检查复制
- 要验证复制正在运作,从 Sun 服务器命令提示符使用 INSERT 命令向其中一个源表添加两个新行:
DB2 INSERT INTO tablename VALUES (‘xxx’, ‘yyy’)
|
- 在源表中检查是否正确地插入了新行。然后等待下一个复制周期,并检查目标表。由于新行命令,目标表应该已经得到更新。
如何使用 asnclp 设置复制
步骤 1 - 设置 asnclp 命令行
为了在 Windows 中设置这个命令行,系统环境路径应该包含有关 Java 的正确参数。
定位到 Start,Programs,Settings,Control Panel,然后 System。在 System 中找到 Advanced 选项卡,并选择 Environment Variables。
CLASSPATH 变量应该如下所示:
.;C:\PROGRA~1\IBM\SQLLIB\java\db2java.zip;C:\PROGRA~1\IBM\SQLLIB\java\db2jcc.jar;
C:\PROGRA~1\IBM\SQLLIB\java\sqlj.zip;C:\PROGRA~1\IBM\SQLLIB\bin;C:\PROGRA~1\IB
M\SQLLIB\java\Common.jar;C:\PROGRA~1\IBM\SQLLIB\tools\db2replapis.jar;C:\PROGRA
~1\IBM\SQLLIB\tools\db2cmn.jar;C:\PROGRA~1\IBM\SQLLIB\tools\jt400.jar;C:\PROGRA~
1\IBM\SQLLIB\java\jdk\bin;
|
PATH 变量应该如下所示:
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;
C:\Program Files\IBM\Trace Facility;C:\Program Files\Personal Communications;
C:\Notes;C:\Utilities;C:\PROGRA~1\IBM\SQLLIB\BIN;C:\PROGRA~1\IBM\SQLLIB FUNCTION;C:\PROGRA~1\IBM\SQLLIB\SAMPLES\REPL;C:\PROGRA~1\IBM\SQL
LIB\java\;C:\PROGRA~1\IBM\SQLLIB\java\jdk\bin;
|
如果做了任何更改,则重新启动机器,以便这些更改生效。
步骤 2 - 启动 asnclp
在 Windows 服务器上,从 DB2 菜单打开一个 DB2 Command Line Processor 窗口( Start,Programs,IBM DB2,Command Line Tools,Command Window),然后键入 asnclp 并回车。应该获得提示符: Repl>
现在可以开始键入 asnclp 命令。以下命令将向现有订阅集添加成员。这将加速订阅集的创建过程,特别是如果您拥有许多成员和许多服务器。
SET RUN SCRIPT NOW STOP ON SQL ERROR ON;
SET CAPTURE SCHEMA SOURCE "ASN1";
*** Comment: (this is required because we have chosen to use a different schema than ***
*** the default schema which is ASN)***
SET SERVER CAPTURE TO DB DAISY_DB DBNAME DAISY_DB ID
db2ppmt PASSWORD db2ppmt;
SET SERVER CONTROL TO DB KEEL_DB ID db2admin PASSWORD "db4admin" ;
SET SERVER TARGET TO DB KEEL_DB ID db2admin PASSWORD "db4admin" ;
SET OUTPUT CAPTURE SCRIPT "C:\SQLLIB\repl\CAP.LOG" ;
SET OUTPUT CONTROL SCRIPT "C:\SQLLIB\repl\CNTL.LOG" ;
SET OUTPUT TARGET SCRIPT "C:\SQLLIB\repl\TAREGT.LOG" ;
CREATE MEMBER IN SETNAME PPMT_TARGET APPLYQUAL QUAL SOURCE
PPMT.BAD_PAIR_FIXED TARGET NAME PPMT.TGBAD_PAIR_FIXED DEFINITION
IN TGTSPPMT TYPE USERCOPY COLS ALL REGISTERED;
|
根据必须在每个订阅集中添加的成员数目,可以多次重复上一个命令,即 CREATE MEMBER。
结束语
我已经向您展示了设置复制的基本步骤。插入您自己的服务器和数据库名称以尝试在自己的环境中进行复制,很快您就可以利用 DB2 Universal Database 中的复制功能,使得您的数据在请求它的位置和时刻随需而用。 |