一. 概述 DDL 相关的参数包括:DDL、DDLERROR、DDLOPTIONS、DDLSUBST、DDLTABLE、GGSCHEMA、 PURGEDDLHISTORY、PURGEMARKERHISTORY。 在 extract 里,默认是不支持 DDL 的抽取的,需要通过配置 DDL 参数来开启; 在 replicat 里,默认是支持 DDL 的抽取,并且会处理 trail 里存在的全部 DDL 操作,需要 使用 DDL 参数来忽略或者过滤掉某些 DDL 操作 二. 基本概念 先介绍几个非常重要的概念,然后针对每一个 DDL 参数作详细说明 1. DDL scopes DDL 操作的数据库对象被分成类别,叫做 scopes,一共三类 MAPPED 、UNMAPPED、 OTHER. MAPPED scope: 在 TABLE 和 MAP 语句中明确声明的对象,属于 MAPPED scope. 比如: Extract (source) Replicat (target) TABLE fin.expen; MAP fin.expen, TARGET fin2.expen2; TABLE hr.tab*; MAP hr.tab*, TARGET hrBackup.bak_*; 源端发出一个ddl语句如下 ALTER TABLE fin.expen ADD notes varchar2(100); 那么,由于此类对象属于MAPPED scope,所以按照map的规则,在目标端将转化为 如下语句: ALTER TABLE fin2.expen2 ADD notes varchar2(100); 源端如下语句 CREATE TABLE hr.tabPayables; 按照上面的map规则,目标端将转化为 CREATE TABLE hrBackup.bak_tabPayables; 如果某一个对象 在TABLE语句里,但是不在MAP语句里,那么这个对象的DDL语句 在源端属于MAPPED scope,在目标端属于UNMAPPED scope,分开按照各自的规则 处理 UNMAPPED scope: DDL 是 OGG 支持的,但是 DDL 所操作的基础表没有在 TABLE 和 MAP 语句中明确声 明的对象,属于 UNMAPPED scope 属于 UNMAPPED scope 的 DDL 语句,在 Replicat 进程中,按照如下规则处理: 1. alter session set current_schema=源DDL对象的schema 2. 使用那个用户执行 DDL. 3. 重新返回复制用户 OTHER scope: 没有办法 map 的 DDL 操作,属于 OTHER scope。 典型的几类: CREATE USER joe IDENTIFIED by joe; CREATE ROLE ggs_gguser_role IDENTIFIED GLOBALLY; ALTER TABLESPACE gg_user TABLESPACE GROUP gg_grp_user; 2. 过滤DDL复制(filter) 我们不想复制全部 ddl 语句,我们想选择其中某些种类的 DDL 进行复制,这个时候 我们就要过滤 DDL 操作,使得只有部分我们需要的 DDL 语句复制到目标端。 注意:DDL filter 不适用于 data‐pump extract 有两种方法, 1. 使用源端数据库的 DDL 触发器来过滤 DDL 实现方法: 在 OGG 安装目录里有一个文件 ddl_filter.sql,打开编辑这个文件,找到一个函 数叫做 filterDDL,按照自己的需求修改,然后在 sqlplus 里执行 @ddl_filter 2. 在 extract 和 replicat 参数文件里使用 DDL 参数(大多数环境足够用了) 通过 DDL 参数实现 DDL filter,主要基于以下几方面: ● scope ● operation type ● object name ● strings in the DDL command syntax or comments, or both DDL参数详细说明请参考下一章节<DDL参数说明> 3. derived object 以下面的创建 index 为例 CREATE INDEX hr.indexPayrollDate ON TABLE hr.tabPayroll (payDate); 其中 tabPayroll 是基础 object,而 indexPayrollDate 就是 derived object。 在进行 DDL 复制的时候,我们需要在 replicat 端配置 MAP 映射: 有几种情况: 第一:为基础对象指定 MAPPING 规则,derived 对象不指定 MAPPING OGG 默认将 derived 的属主设置为与基础表一致,以上面的为例,如果我们指 定 MAP hr.tab*, TARGET hrBackup.*; 那么上述语句在目标端转为为 CREATE INDEX hrBackup.indexPayrollDate ON TABLE hrBackup.tabPayroll (payDate); 第二:为基础表和 derived 对象同时指定 MAPPING 按照各自的 MAP 规则进行映射 第三:为 derived 对象指定了 MAP,对基础对象没有指定 MAP OGG 不作任何转换,直接将源端的语句在目标端执行。 RENAME 和 ALTER RENAME 语句涉及到的 derived 对象,MAP 中一律指定新表名 三. DDL处理流程 1. Extract 对DDL语句的处理流程: 1. Extract 抓取一个 DDL 操作 2. Extract 将 DDL 语句中的 comments 进行分离 3. Extract 查找 prm 参数文件中的 DDL 参数配置 4. Extract 查找 IGNOREREPLICATES 参数.如果参数存在,而且这个 DDL 是由 Replicat 进程产生 的,那么就忽略掉这个 DDL,继续查找新的 DDL 5. Extract 判断是否是一个 renmae 操作,如果是做标记,将语句转化为 ALTER TABLE RENAME 6. Extract 获取基础对象和 derived 对象信息 8. Extract 查找 DDLOPTIONS REMOVECOMMENTS BEFORE 参数设置了这个参数,那么 extract 将删除 comments,但是还是要首先判断 DDL INCLUDE 中的选项 INSTR,如果符合 INSTR 选 项,那么将保留 comments 9. Extract 判断 DDL 属于哪种类型的 scope: MAPPED, UNMAPPED or OTHER. 10. Extract 根据详细的 DDL INCLUDE 和 DDL EXCLUDE 来决定 DDL 的去留 11. Extract 根据参数 DDLSUBST 参数对 DDL 语句进行处理,DDLSUBST 可以有多个,按照 prm 文件中的顺序,挨个处理 12. DDLSUBT处理后,extrac查找REMOVECOMMENTS AFTER参数,如果存在,将删除comments 13. Extract 查找 DDLOPTIONS ADDTRANDATA ,如果操作是一个 CREATE TABLE, 那么 Extract 会执行 ALTER TABLE <name> ADD SUPPLEMENTAL LOG GROUP 命令. 14. 最后一步,Extract 将 DDL 语句写入 trail 文件 2. Replicat对DDL语句的处理流程 1. Replicat 从 trail 文件里读取到 DDL 语句 2. Replicat 分离 comments 3. Replicat 查找 DDLOPTIONS REMOVECOMMENTS BEFORE 如果存在,先删除 comments 4. Replicat 判断 DDL 属于哪种类型的 scope: MAPPED, UNMAPPED or OTHER 6. Replicat 根据 MAP 映射,替换表名等等. 7. 如果发现存在 derived 对象, Replicat 查找 DDLOPTIONS MAPDERIVED.如果存在,按照规则 替换 8. Replicat 根据详细的 DDL INCLUDE 和 DDL EXCLUDE 来决定 DDL 的去留. 9. Replicat 根据参数 DDLSUBST 参数对 DDL 语句进行处理,DDLSUBST 可以有多个,按照 prm 文件中的顺序,挨个处理. 10. DDLSUBT处理后,extrac查找REMOVECOMMENTS AFTER参数,如果存在,将删除comments 11. Replicat 在目标数据库上执行 DDL. 12. 没有错误,就继续下一个 DDL 的执行,如果有错误,要判断 DDLERROR 参数的设置 四. 支持DDL配置 配置 DDL 环境,需要在数据库里创建如下一系列的表: GRANT EXECUTE ON utl_file TO oggadm; ggsci EDIT PARAMS ./GLOBALS GGSCHEMA oggadm Sqlplus “/as sysdba” @marker_setup.sql 必须到这个脚本所在目录进入 sqlplus @ddl_setup.sql @role_setup.sql Grant GGS_GGSUSER_ROLE to oggadm; @ddl_enable.sql @? dbmsadmindbmspool.sql @ddl_pin oggadm; 五. DDL参数说明 1. DDL 语法结构: DDL [ {INCLUDE | EXCLUDE} [, MAPPED | UNMAPPED | OTHER | ALL] [, OPTYPE <type>] [, OBJTYPE ‘<type>’] [, OBJNAME “<name>“] [, INSTR ‘<string>’] [, INSTRCOMMENTS ‘<comment_string>’ ] 不使用任何选项,在参数文件里只声明 DDL,那么 extract 将抽取全部 DDL 写入 trail,replicat 将读取全部 DDL 并应用复制(在 replicat 里,这个动作和默认不写 DDL 语句一样) 参数说明: INCLUDE | EXCLUDE Include 包含准备实施 DDL 操作的数据库对象的过滤规则; Exclude 排除针对某些对象的 DDL 操作。 使用 exclude 子句,必须使用一个相应的 include 子句,比如单独指定下面的语句 DDL EXCLUDE OBJNAME “hr.*” 是不合法的,我们必须配合如下方法使用 include; DDL INCLUDE ALL, EXCLUDE OBJNAME “hr.*” DDL INCLUDE OBJNAME “fin.*” EXCLUDE “fin.ss” Exclude优先权高于include, 但是有一个方式可以不必指定include来配合,那就是DDL EXCLUDE ALL MAPPED | UNMAPPED | OTHER | ALL 指定MAPPED ,表示只处理属于MAPPED scope类型的对象对应的DDL语句,MAPPED 类型的优先级高于其他级别; 指定 UNMAPPED ,表示只处理属于 UNMAPPED scope 类型的对象对应的 DDL 语句 指定 OTHER,表示只处理属于 OTHER scope 类型的对象对应的 DDL 语句 指定 ALL ,表示处理所有的 DDL 语句 OPTYPE <type> 指定执行某些类型的 DDL 语句,比如 DDL INCLUDE OPTYPE ALTER 将处理那些 alter 语句 OBJTYPE ‘<type>’ 指定执行某些对象的 DDL 语句,比如 DDL INCLUDE OBJTYPE ‘INDEX’ DDL INCLUDE OBJTYPE ‘SNAPSHOT’ DDL INCLUDE OBJTYPE ‘SNAPSHOT LOG’ 将处理与index ,snapshot 和snapshot log有关的DDL语句 OBJNAME “<name>“ 根据对象名进行处理,比如 DDL INCLUDE OBJNAME “accounts.*” 注意 1 : OBJNAME 后面的值,对应的应该是 replicat 进程参数文件中的 MAP 语 句中的 target 子句的值,而不是源端的值。 比如:MAP fin.exp_*, TARGET fin2.*; 那么我们要声明 DDL INCLUDE OBJNAME “fin2.*”,这样的话,就可以处理下面的语句了 CREATE TABLE fin.exp_phone;(源端的语句) CREATE TABLE fin2.exp_phone;(转化到目标端的语句) 注意 2: 创建触发器,索引,同义词等等语句,我们要指定的 OBJNAME 是基表 的名字,而不是触发器或者索引的名字,比如要想处理源端的语句 CREATE TRIGGER hr.insert_trig ON hr.accounts; 我们需要如下指定:DDL INCLUDE OBJNAME “hr.accounts” , 而不应该指定为 hr.insert_trig INSTR ‘<string>’ 指定如何处理 DDL 语句中包含特定字符的 DDL 语句,与下面的选项 INSTRCOMMENTS 对应,也即是说,instr 选择的是 DDL 语句本身包含指定的字符,而 INSTRCOMMENTS 指定是 DDL 语句中的注释中包含的字符 DDL INCLUDE ALL EXCLUDE INSTR ‘CREATE INDEX’ INSTRCOMMENTS ‘<comment_string>’ 解释请参考 INSTR 选项 DDL INCLUDE ALL EXCLUDE INSTRCOMMENTS ‘SOURCE ONLY’ 它复制的是如下源端语句 CREATE USER john IDENTIFIED BY john /*source only*/; INSTRWORDS ‘<word list>’ ALTER TABLE INCLUDE INSTRWORDS ‘ALTER CONSTRAINT “ xyz” ’ 处理语句中包含 alter 或者 constraint 或者 _xyz 的 DDL 语句 INSTRCOMMENTSWORDS ‘<word list>’ 处理语句注释中包含 alter 或者 constraint 或者 _xyz 的 DDL 语句 多个选项混合配制,可以配置非常复杂的规则,比如: DDL & INCLUDE UNMAPPED & OPTYPE alter & OBJTYPE ‘table’ & OBJNAME “users.tab*” & INCLUDE MAPPED OBJNAME “*” & EXCLUDE MAPPED OBJNAME "temporary.tab*" 2. DDLERROR 适用于 Extract and Replicat,用来捕获复制过程中遇到 DDL 错误时进行的处理 Extract 进程中 DDLERROR 的选项 默认值: Abend 语法结构: DDLERROR [RESTARTSKIP <num skips>] [SKIPTRIGGERERROR <num errors>] 参数说明: RESTARTSKIP 在 EXTRACT 启动时,允许出现 n 次的错误,n 的取值范围:1—100000, 超过 n 次错误,进程 abend,错误信息输入到 report file 中。 SKIPTRIGGERERROR 在 EXTRACT 启动时,允许出现 n 次的 DDL trigger 的错误,n 的取值 范围:1—100000,这个值不计算在 RESTARTSKIP 内,互相独立。 Replicat 进程中 DDLERROR 的选项 默认值: Abend 语法结构: DDLERROR {<error> | DEFAULT} {<response>} {INCLUDE <inclusion clause> | EXCLUDE <exclusion clause>} [IGNOREMISSINGOBJECTS | ABENDONMISSINGOBJECTS] 参数说明: IGNOREMISSINGOBJECTS/ ABENDONMISSINGOBJECTS ,控制当DML的对象在目标端不存在时进 程是否abend,IGNOREMISSINGOBJECTS可以跳过在missing table上的DML操作。 3. DDLOPTIONS 适用于 Extract and Replicat,用来捕获复制过程中遇到 DDL 错误时进行的处理 语法结构: DDLOPTIONS [, ADDTRANDATA [ABEND | RETRYOP <RETRYDELAY <seconds> MAXRETRIES <retries>] [, DEFAULTUSERPASSWORD <password> [ENCRYPTKEY DEFAULT | ENCRYPTKEY <keyname>]] [, GETAPPLOPS | IGNOREAPPLOPS] [, GETREPLICATES | IGNOREREPLICATES] [, IGNOREMAPPING] [, MAPDERIVED | NOMAPDERIVED] [, MAPSCHEMAS] [, MAPSESSIONSCHEMA] <source_schema> TARGET <target_schema> [, NOCROSSRENAME] [, PASSWORD ENCRYPTKEY [DEFAULT | ENCRYPTKEY <keyname>] [, REMOVECOMMENTS {BEFORE | AFTER}] [, REPLICATEPASSWORD | NOREPLICATEPASSWORD] [, REPORT | NOREPORT] [, UPDATEMETADATA] [, USEOWNERFORSESSION] 参数说明: ADDTRANDATA 对新建的表自动添加 supplemental logging,而不需要在创建表之后,手工执行 ADD TRANDATA 命令,如果表有锁,可能导致自动添加 supplemental logging 失败,这个 参数有几个值,对失败后进行处理。 ABEND 失败后使得extract进程abend RETRYOP <RETRYDELAY <seconds> MAXRETRIES <retries>] 失败后根据重试时间 和重试次数两个选项的值,进行重新执行add trandata动作 IGNOREMAPPING 如果我们可以保证源端和目标端完全一致,不需要进行 DDL 表名或者用户名进行 转换的话,可以设置这个参数,可以加快 replicat 进程的速度,也就是说 replicat 不需 要去解析任何 MAPPING 参数,直接进行 DDL 的执行,所以速度会很快 4. DDLSUBST 可以处理一些与数据结构无关的字符转换,比如转换一个表空间的名字,转换一些 comment 中的文字等等。 注意: 1. 不要使用 ddlsubst 来修改列名或者列的数据类型,也不要修改表名和表的属主,这 些操作一定要使用 MAP 语句来实现 2. ddlsubst 总是在 ddl 语句之后执行,也就是说,先要 ddl include 的对象才可以进行 处理 3. 可以使用多个 ddlsubst 参数,按照顺序执行 4. ddloptions 参数里有一个选项叫做,REMOVECOMMENTS ,有两个值,一个 before,一 个是 after,具体参考 ddloptions 小节,如果我们想使用 ddlsubst 处理 comment,必须使用 REMOVECOMMENTS AFTER,表示当被 ddlsubst 处理过之后的 DDL 语句再删除 comments 语法结构: DDLSUBST ‘<search_string>’ WITH ‘<replace_string>’ [INCLUDE <inclusion clause> | EXCLUDE <exclusion clause>] 参数说明:望文生义,不多解释 示例: DDLSUBST ‘cust’ WITH ‘customers’ INCLUDE OBJNAME “sales.*”