hooboor
作者hooboor·2011-03-24 09:26
其它·未知

DB2 SCHEMA复制

字数 3153阅读 3264评论 2赞 0
从一个已有的schema 创建一个结构完全相同的schema。

DB2的一个存储过程,可以帮我们实现这样的功能,它就是SYSPROC.ADMIN_COPY_SCHEMA, 它的定义结构如下:
  1. ADMIN_COPY_SCHEMA(  
  2.     VARCHAR(128) sourceschema,  
  3.     VARCHAR(128) targetschema,  
  4.     VARCHAR(128) copymode,  
  5.     VARCHAR(128) objectowner,  
  6.     CLOB(2M) sourcetbsp,  
  7.     CLOB(2M) targettbsp,  
  8.     VARCHAR(128) errortabschema,  
  9.     VARCHAR(128) errortab  
  10. );  
ADMIN_COPY_SCHEMA( VARCHAR(128) sourceschema, VARCHAR(128) targetschema, VARCHAR(128) copymode, VARCHAR(128) objectowner, CLOB(2M) sourcetbsp, CLOB(2M) targettbsp, VARCHAR(128) errortabschema, VARCHAR(128) errortab );

参数的详细解释:
  • sourceschema
  •      要copy的源schema
  • targetschema
  •      目标schema, 无需已经存在
  • copymode
  •     copy的方式,主要有三种,
            DDL, 只拷贝对象的定义
            COPY, 对象会在新的schema中创建,然后会load(NONRECOVERABLE MODE)数据到新的schema下的对象中。因此在执行完存储过程后需要做一次备份,否则新表无法访问。
            COPYNO, 在新的schema创建,然后load(COPYNO MODE)数据到新的schema
  • objectowner
  •      新创建对象的owner, 如果为NULL,那么执行COPY的用户将是owner
  • sourcetbsp
  •      用于映射新的表空间,这个参数是以逗号隔开的表空间名。如果为NULL,那么所有新的对象都与原有的对象创建于同一个表空间。
  • targettbsp
  •      以逗号隔开的列表,当源对象来自sourcetbsp中的一个表空间是,新的copy对象将会创建在targettbsp列表中相应次序的表空间中。 如果为NULL, 与源对象在同一表空间创建。如果为SYS_ANY, 则会用默认的表空间选择算法来选择表空间。
  • errortabschema
  •      这是一个[IN OUT]参数,当有对象不能被成功copy时,需要将这些信息存于一张表中作为日志。 这个参数是log表的schema的名称,在SYSTOOLSPACE表空间中。 如果没有这样的记录,作为OUT,这个参数将返回NULL。
  • errortab
  •      [IN OUT]参数,log表的名称。 这个表不能创建或已存在,那么存储过程调用将失败,且返回出错信息。表的具体定义见下图:



Sample:
  1. CALL SYSPROC.ADMIN_COPY_SCHEMA('SOURCE_SCHEMA''TARGET_SCHEMA',   
  2.    'COPY', NULL, 'SOURCETS1 , SOURCETS2', 'TARGETTS1, TARGETTS2,   
  3.    SYS_ANY', 'ERRORSCHEMA', 'ERRORNAME')   
CALL SYSPROC.ADMIN_COPY_SCHEMA('SOURCE_SCHEMA', 'TARGET_SCHEMA', 'COPY', NULL, 'SOURCETS1 , SOURCETS2', 'TARGETTS1, TARGETTS2, SYS_ANY', 'ERRORSCHEMA', 'ERRORNAME')
  1. DB2 CALL SYSPROC.ADMIN_COPY_SCHEMA('HUANG','JAY','DDL',NULL,NULL,NULL,'ERRORSCHEMA','ERRORNAME'


下面是测试过程
1、给用户赋予存储过程执行权限。如果赋予完成后,执行CALL语句还是报错,则需要把数据库重启一下。
  • CONNECT TO SAMPLE;
  • GRANT EXECUTE ON PROCEDURE SYSPROC.ADMIN_COPY_SCHEMA(VARCHAR(),VARCHAR(),VARCHAR(),VARCHAR(),CLOB(),CLOB(),VARCHAR(),VARCHAR()) TO USER ADMIN WITH GRANT OPTION;
  • CONNECT RESET;
撤消用以下语句:
  • CONNECT TO SAMPLE;
  • REVOKE EXECUTE ON PROCEDURE SYSPROC.ADMIN_COPY_SCHEMA(VARCHAR(),VARCHAR(),VARCHAR(),VARCHAR(),CLOB(),CLOB(),VARCHAR(),VARCHAR()) FROM USER ADMIN RESTRICT;
  • CONNECT RESET;
2、执行复制命令
  • DB2 CALL SYSPROC.ADMIN_COPY_SCHEMA('ADMIN','DB2INST1','COPY',NULL,NULL,NULL,'ERRORSCHEMA','ERRORNAME')
3、复制完成后需要将数据库一次,否则新表无法访问


如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论2 条评论

dezai1223dezai1223系统运维工程师浪潮
2015-08-24 12:59
讲的非常清楚,谢谢。
qingduo04qingduo04系统架构师华为
2011-03-24 20:32
好资料!!!
Ctrl+Enter 发表

作者其他文章

  • DB2 基础系列文章
    评论 0 · 赞 0
  • windows下创建第二个实例过程
    评论 0 · 赞 0
  • 开首语
    评论 1 · 赞 0
  • db2问题诊断工具db2top
    评论 5 · 赞 0
  • X社区推广