SharePlex安装配置、常用功能配置文档、常见故障处理文档

来源:这里教程网 时间:2026-03-03 14:50:29 作者:

SharePlex 安装配置部分

  端口:2100 SharePlex 默认端口。2501 start launcher 需要开启端口,可以使用copy 快速复制表,也可通过修改SP_OSY_PORT 参数修改copy 使用默认端口。

  安装前数据库操作 打开数据库最小附加日志:首先查看v$transaction 视图有没有大事务,尽量避免有大事务的时候执行,如果系统资源非常紧张会导致宕机, RAC 情况下各个节点都需要执行 alter database add supplemental log data (primary key,unique index) columns; 查询最小附加日志情况:select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI,SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL from v$database;

  源库需要打开归档。

解压安装

使用oracle 用户解压,安装。$ ./SharePlex-8.6.6-b64-oracle110-rh-40-amd64-m64.tpm

1.2 ora_setup 配置

-- 配置shareplex ,配置时如果需要自定义复制的源与目标端的ORACLE_SID ,则需要配置tnsnames.ora 别名,且/etc/oratab 中必须有对应于自定义的tnsnames 别名的ORACLE_SID

启动

[splex@localhost ~]export SP_SYS_HOST_NAME=cluster1vip  可以使用该参数指定shareplex 启动到指定的IP 上,可以使用netstat -an | grep <port_number>-- 启动  -u 可以启动shareplex 实例到指定端口,可以复制多个库。

1.4 sp_ctrl 控制台

SharePlex 日常操作都在sp_ctrl 控制台中进行,启动命令为:/<prodir>/bin/sp_ctrl, 一般启动之后首先进入控制台执行sp_ctrl > stop post ,停止。

配置文件

    Config 配置文件为复制链路需要复制对象以及链路映射文件。sp_ctrl> list configsp_ctrl> verify configsp_ctrl> activate config <file_name>sp_ctrl> activate config <filename> [threads -n ] [nolock] -- nolock 不锁表,如果在一定时间内获取锁失败,则继续往下进行activate 尽量执行两次,确保成功,可以同时tail -f <event_log> 查看执行情况。config 配置样例以及配置规则:datasource:o.wahaha#source tables      target tables          routing map#splex.demo_src     splex.demo_dest        target_system@o.target_sid --target_sid 为目标端的 sid 或别名。

Ø   splex.demo_src   -- 源库的用户名. 表名,可以使用% 通配符,全匹配半匹配等。priv%not(table_name) 排除表。

Ø   splex.demo_dest  -- 目标库的用户名. 表名

Ø   target_system@o.target_sid  -- 目标库的IP hosts 文件中映射名@ 为目标端的sid 或别名。

Ø   hr.test     hr.test    192.168.204.151:scott_tab@o.honor1 --IP 或主机名后加冒号,可以为该表复制单独起一个队列。

Ø   mary.cust2!key(c1,c2)     mary.cust2    proda@o.sid     -- 自定义pk

1.6 analyze config <config_name>

-- 可以分析config ,生成报表,分析数据库表操作频繁记录等。

SharePlex 常用操作

命令

命令说明 :会将目标先truncate 掉,然后再利用expdp constraint=y 参数导出再导入,如果你不想truncate 目标端的原有同步数据则你需要使用另一个命令append

copy 命令可实现单表或表分区的同步,不适合大批量表的同步。

使用要求:

  目标端启动launcher: sp_ctrl> start launcher              ――默认端口是2501

  同步的表出现在已激活的配置文件中。

  目标端的复制表所属用户需先建立,copy可以创建表结构,但要求表空间不变,所以建议先建好表结构再复制。

语法如下:

sp_ctrl> copy owner.tablename  [at target_host]

如果相同的对象复制到不同的主机,需加at target_host选项,源端和目标端的用户名或者表名不一致的话还需加入目标端的owner.tablename 。

检查源端的copy状态:

sp_ctrl> copy status all

copy status <jobid>   查看job细节

cancel <jobid>   可以取消job,一般针对长时间wait for的job

当日志积累多了不方便查看时,可清除日志:

源端清除日志:sp_ctrl> clear history all

目标端清除:cd vardir/log   ;    rm sync_clt*log

repair

如果发现或怀疑源端和目标端的表数据不一致,可以通过compare命令查看和修复。

但由于compare需要把比较的数据排序,然后逐条比较,大量数据的比较可能会导致资源的过量使用,所以不建议对大量数据的比较。 sp_ctrl> compare table owner.table to owner.table target target_host@o.targetsid [repair] 比较表分区: sp_ctrl> compare table owner.table@p1 to owner.table@p1 target target_host@o.targetsid [repair] 直接修复在后面加上repair,不加repair参数则将可用于修复的SQL语句生成在日志文件中。 查看比较进度: sp_ctrl> show compare  [detail] 取消比较: sp_ctrl> compare cancel id <id> 清除比较日志: sp_ctrl> remove log compare id <id>    或者 remove log compare all 可以指定compare使用其他端口,不指定则随机选端口: compare table owner.table@p1 to owner.table@p1 target target_host@o.targetsid [repair] port 2500

设置参数

sp_ctrl> list param all  -- 列出所有参数。sp_ctrl> set param   -- 设置参数sp_ctrl> list param modified  -- 查看被修改的参数shareplex 安装目录说明:/bin 包含可执行程序的符号连接/.app_modules 包含可执行程序/data 默认参数文件, 包含默认的参数设置/doc 空目录/install SharePlex 安装、license 管理等相关的脚本/lib SharePlex 应用到的库文件/util SharePlex 工具 SQL 脚本,监控脚本等

清除当前复制

sp_ctrl>shutdown$ env | grep SP_SYS_VARDIR    -- 一定要在清除之前确认清理的实例正确。 执行下条语句之前一定确认上述参数正确,防止清理掉正在使用的实例。$ ora_cleanup splex/splex

实用参数命令

export SP_SYS_VARDIR=/splex/vardir    -- 类似ORACLE_SID ,指定splex 使用指定的队列配置文件等等。export SP_SYS_HOST_NAME – 在启动sp_cop 之前设置,指定SharePlex 启动在指定的IP 上,在RAC 安装时需要注意此选项。sp_ctrl>set param SP_OPO_DISABLE_OBJECT_NUM < 源端object_ID>    -- 在目标端设置。抛弃指定表。sp_ctrl>r 20 2    -- 执行上条命令20 次,两秒一次。sp_ctrl>help targetsp_ctrl>target o.orcl set metadata time:sp_time.op:sp_op    -- 可以在目标端增加列,写入时间戳与DML 语句行为。sp_ctrl>help target set metadata time 

忽略大事务的操作

过大的事务复制可能会遇到问题,所以建议所有大于 1000 万数据 DML 操作事务,分成多批次 commit ,并建议不要对相同表做并行的大事物操作。

在有的场景下可能不希望源端的某些修改复制到目标端,比如源端清除历史数据而目标端需要保留等。

具体步骤如下:

源端,在数据库中以 shareplex 用户执行 util 目录下的 create_ignore.sql ,该脚本创建了 SHAREPLEX_IGNORE_TRANS  procedure ;只需执行一次。

在执行大的事务前先执行这个 procedure ,即可忽略对该事务 ( 从这个存储过程至下一个 commit 之间的所有 DML 操作 ) 的复制,如:

SQL> conn test/test

SQL> exec splex.shareplex_ignore_trans;

SQL> insert into tb1 values (100, 'aaa');

SQL> commit;

修改SharePlex 的数据库用户密码

SharePlex 数据库用户的密码还存在于 SharePlex 参数文件中,不能简单的在数据库中更改,需要执行 SharePlex 提供的脚本进行,具体步骤如下。 对每个环境都单独列出了详细步骤

a.         源端stop capture 进程,观察SharePlex 队列中数据都已应用到目标端;

b.     shutdown 源端和目标端的SharePlex

c.         执行prod/bin 目录下的ora_chpwd 命令来自动改变存储在数据库中和paramdb 文件中的密码。

l   生产环境:dcdb02:/oracle$ ora_chpwd This program allows you to change the password of theSharePlex user account needed to run Oracle replication. In response to prompts, a carriage return will choose thedefault given in brackets.  If there is no default, a reply must be entered. Please enter the SID where SharePlex is installed [ dl2] : empty response--try again : splex

注意:在此处不要使用本地的实例名,要输入 TNS 别名,然后回车; In order to change the password for the SharePlex user account,we must connect to the database as SYSTEM. Enter password for the SYSTEM account, which will not echo [MANAGER] : empty response--try again :

注意:此处输入 oracle 数据库 system 帐户的口令,但应当在口令的后面加上 @TNS_ALIAS, 然后回车;connecting--This may take a few seconds.Enter the current username for SharePlex user : empty response--try again : splexEnter new password for SharePlex user :  empty response--try again :Re-enter password for SharePlex user : empty response--try again : 

注意:此处输入 SharePlex 用户的口令,但应当在口令的后面加上 @TNS_ALIAS, 然后回车。Changing SharePlex parameter database . . .SharePlex password change completed successfully. 

l   管理环境:dcadm:/oracle$ ora_chpwdThis program allows you to change the password of theSharePlex user account needed to run Oracle replication. In response to prompts, a carriage return will choose thedefault given in brackets.  If there is no default, a reply must be entered. Please enter the SID where SharePlex is installed [ adm] : adm empty response--try again : In order to change the password for the SharePlex user account,we must connect to the database as SYSTEM.Enter password for the SYSTEM account, which will not echo [MANAGER] : empty response--try again :

注意:此处输入 oracle 数据库 system 帐户的口令,不需要后面加上 @TNS_ALIAS, 然后回车;connecting--This may take a few seconds.Enter the current username for SharePlex user : empty response--try again : splexEnter new password for SharePlex user : empty response--try again :Re-enter password for SharePlex user : empty response--try again :

注意:此处输入 SharePlex 用户的口令,不需要在口令的后面加上 @TNS_ALIAS, 然后回车。Changing SharePlex parameter database . . .SharePlex password change completed successfully.

d.        启动源端和目标端的SharePlex

e.          源端start capture 进程,观察SharePlex 是否复制正常。

新增复制表

u   如果需要对新建的表进行复制,则需要遵循以下步骤:(尽量在业务少的时候进行)

1 目标系统数据库建立相同的表,然后在 源系统的SharePlex控制台sp_ctrl下运行copy config命令将当前配置文件复制并生成一个新的配置文件。例如,当前处在激活状态的配置文件名为filename,则建立一个文件名为 newname的配置文件;

sp_ctrl(sysA)> copy config filename to newname

(2)通过 源系统的SharePlex控制台sp_ctrl运行edit config 命令编辑新建的配置文件newname

sp_ctrl(sysA)> edit config newname

3 )在文件里为新建的表增加一行信息,这行信息包括该表在源系统中的表名、该表在目标服务其中的表名和路由信息。例如,在源和目标服务器的APP 模式下新建了名为a 的表,则应该在文件里增加如下的信息:

APP.a      APP.a      sysB@o.TargetSID

4 )保存并退出配置文件;

5 )停止用户对新建表的任何操作,包括select, update insert delete 等操作;

6 )在 源系统SharePlex 控制台sp_ctrl 下运行activate config 命令激活修改后的新的配置文件,在激活的过程中原先处于激活状态的旧的配置文件会自动解除激活状态;

sp_ctrl(sysA)> activate config newname live

7 )此时,维护工作完成,用户可以对新建的表进行访问和操作。

 

 

u   如果需要对已有数据的表新增到链路中,则需要遵循如下步骤:

 

1 )首先在目标端停止将会新增的post queue

sp_ctrl (192.168.204.110:2400)> stop post regions01  >>regions01 增表单独新增的队列名称。

2 )在源端修改config ,新增复制表

sp_ctrl (11rac1:2400)> copy config old_config to new_config   >> 复制一份正在使用的 config

sp_ctrl (11rac1:2400)> edit config new_config   >> 编辑复制的 config ,新增复制表

datasource:o.source

#source tables      target tables           routing map

hr.jobs      scott.jobs         192.168.204.110:jobs01@o.tarsp

hr.regions   scott.regions      192.168.204.110:regions01@o.tarsp    >> 需要在 host 之后自定义队列名称

sp_ctrl (11rac1:2400)> verify config new_config    >> 验证 config

sp_ctrl (11rac1:2400)> activate config new_config nolock   >> 激活 config

注:在激活配置文件之后,目标端除新增表之外的其他复制队列已经可以激活。

3 expdp 利用flashback_scn 导出源端需要新增的表数据

[oracle@11rac1 expdp]$ expdp system/111111 directory=expdp dumpfile=regions.dmp tables=hr.regions flashback_scn=5597451

4 impdp 在目标端导入新增的表数据,并禁用表上的约束以及触发器

[oracle@11rac1 expdp]$ impdp system/111111 directory=expdp dumpfile=regions.dmp >> 如果用户相同,则不需要使用 remap_schema 参数

5 reconcile 队列数据到之前选取的scnsp_ctrl (192.168.204.110:2400)> qstatus Queues Statistics for 192.168.204.110   Name:  regions01 (o.source-o.tarsp) (Post queue)     Number of messages:          9 (Age      7404 min; Size          1 mb)     Backlog (messages):          9 (Age      7404 min)   Name:  jobs01 (o.source-o.tarsp) (Post queue)     Number of messages:          0 (Age         0 min; Size          1 mb)     Backlog (messages):          0 (Age         0 min)sp_ctrl (192.168.204.110:2400)> reconcile queue regions01 for o.source-o.tarsp scn 5597452    >> 一般 expdp 导出的需要在 reconcile 时加 1 ,使用 RMAN 基于 scn 恢复的则不需要加 1

6 )启动新增加的表对应的post 队列

sp_ctrl (192.168.204.110:2400)> start post queue regions01

8 )查看数据同步情况以及链路情况。

9 )可以在维护完成之后,将新增的表并入原有队列。

删除复制表

如果将要被删除的表在当前处在激活状态的SharePlex 配置文件中,则需要遵循以下步骤:(尽量在业务少的时候进行)

1 )通过源系统的SharePlex 控制台sp_ctrl 运行copy config 命令将当前配置文件复制并生成一个新的配置文件。例如,当前处在激活状态的配置文件名为filename ,则建立一个文件名为newname 的配置文件;

sp_ctrl(sysA)> copy config filename to newname

2 )通过源系统的SharePlex 控制台sp_ctrl 下运行edit config 命令编辑配置新建的配置文件

sp_ctrl(sysA)> edit config newname

3 )在文件中将该含有该表的信息行删除。

4 )保存并退出配置文件;

5 )通过源系统的SharePlex 控制台sp_ctrl 运行activate config 命令激活修改后的新的配置文件,在激活的过程中原先处于激活状态的旧的配置文件会自动解除激活状态;

sp_ctrl(sysA)> activate config newname live

6 )维护工作完成。

重命名表

如果被重命名的表在当前处在激活状态的SharePlex 配置文件中,则需要遵循以下步骤:(尽量在业务少的时候进行)

1 )停止用户对该表的任何操作,包括select, update insert delete 等操作;

2 )在源系统和目标系统数据库中上重命名该表;

3 )通过源系统的SharePlex 控制台sp_ctrl 运行copy config 命令将当前配置文件复制并生成一个新的配置文件。例如,当前处在激活状态的配置文件名为filename ,则建立一个文件名为newname 的配置文件;

sp_ctrl(sysA)> copy config filename to newname

4 )通过源系统的SharePlex 控制台sp_ctrl 运行edit config 命令编辑配置新建的配置文件

sp_ctrl(sysA)> edit config newname

5 )在文件里修改被重命名表所在的行信息,将该表在源系统中的表名、该表在目标服务其中的表名该为重命名后的表名。例如,在源和目标服务器的APP 模式下的表a 被重命名为表b ,则该表所在的行信息应该改为:

APP.b      APP.b      sysB@o.TargetSID

6 )保存并退出配置文件;

7 )通过源系统的SharePlex 控制台sp_ctrl 运行activate config 命令激活修改后的新的配置文件newname ,在激活的过程中原先处于激活状态的旧的配置文件会自动解除激活状态;

sp_ctrl(sysA)> activate config newname live

8 )维护工作完成,用户可以对重命名之后的表进行访问和操作。

新增LOB 列或者重命名列

 

对于alter table add a LOB column操作,如果被执行该操作的表在当前处在激活状态的SharePlex配置文件中,则必须遵循以下步骤保证复制环境两套数据库系统的一致性。(尽量在业务少的时候进行)

(1)停止用户对该表的任何操作,包括select, update,insert和delete等操作;

(2)通过源系统的SharePlex控制台sp_ctrl下运行copy config命令将当前配置文件复制并生成一个新的配置文件。例如,当前处在激活状态的配置文件名为filename,则建立一个文件名为 newname的配置文件;

sp_ctrl(sysA)> copy config filename to newname

(3)通过源系统的SharePlex控制台sp_ctrl下运行edit config 命令编辑配置新建的配置文件;

sp_ctrl(sysA)> edit config newname

(4)在文件中将要增加LOB字段(或重命名字段)的表的信息行删除。

(5)保存并退出配置文件;

(6)通过源系统的SharePlex控制台sp_ctrl运行activate config命令激活修改后的新的配置文件,在激活的过程中原先处于激活状态的旧的配置文件会自动解除激活状态;

sp_ctrl(sysA)> activate config newname live

(7)在源系统和目标系统数据库中对该表增加LOB字段(或重命名字段);

(8)通过源系统的SharePlex控制台sp_ctrl运行activate config命令激活原先的配置文件filename,在激活的过程中刚刚处于激活状态的配置文件newname会自动解除激活状态;

sp_ctrl(sysA)> activate config filename live

(9)维护工作完成,用户可以对该表进行访问和操作。

2.12 Alter table move a new tablespace

对于alter table move tablespace操作,如果被执行该操作的表在当前处在激活状态的SharePlex配置文件中,则必须遵循以下步骤保证复制环境两套数据库系统的一致性。(尽量在业务少的时候进行)

(1)停止用户对该表的任何操作,包括select, update,insert和delete等操作;

(2)通过 源系统的SharePlex控制台sp_ctrl下运行copy config命令将当前配置文件复制并生成一个新的配置文件。例如,当前处在激活状态的配置文件名为filename,则建立一个文件名为 newname的配置文件;

sp_ctrl(sysA)> copy config filename to newname

(3)通过 源系统的SharePlex控制台sp_ctrl下运行edit config 命令编辑配置新建的配置文件;

sp_ctrl(sysA)> edit config newname

(4)在文件中将要转移表空间的表的信息行删除。

(5)保存并退出配置文件;

(6)通过 源系统的SharePlex控制台sp_ctrl运行activate config命令激活修改后的新的配置文件,在激活的过程中原先处于激活状态的旧的配置文件会自动解除激活状态;

sp_ctrl(sysA)> activate config newname live

(7)在源系统和目标系统数据库中对移动该表到新的表空间;

(8)通过 源系统的SharePlex控制台sp_ctrl运行activate config命令激活原先的配置文件filename,在激活的过程中刚刚处于激活状态的配置文件newname会自动解除激活状态;

sp_ctrl(sysA)> activate config filename live

(9)维护工作完成,用户可以对该表进行访问和操作。

一个软件启动多个SP 实例

1 )分配端口号 需要给每一个sp_cop 分配一个唯一的端口号 2 )创建variable-data 目录 为每一个sp_cop 实例创建一个variable-data 目录。

l   按照SharePlex Instanllation Guide 安装SharePlex ,在安装最后,你需要一个product 目录以及一个variable-data 目录关联一个端口以及一个数据库账户,这是你的基础实例。

l   关闭正在运行的sp_cop 实例。

l   为每一个实例复制一个 vardir 目录。

cp -p -r /splex/vardir/splex2100 /splex/vardir/splex2101

cp -p -r /splex/vardir/splex2100 /splex/vardir/splex2102

  3 )定义端口号在SharePlex 环境中 a. 定义环境 variable-data 环境变量 ksh shell: export SP_SYS_VARDIR=/ full_path_of_variable-data_directory csh shell: setenv SP_SYS_VARDIR / full_path_of_variable-data_directory   b. 定义环境变量 SP_COP_TPORT and SP_COP_UPORT ksh shell: export SP_COP_TPORT= port export SP_COP_UPORT= port csh shell: setenv SP_COP_TPORT port setenv SP_COP_UPORT port   c. 启动 sp_cop 实例使用 -u 选项

$ /productdir/bin/sp_cop -uport&   d. 使用如下参数为环境变量中 variable-data 设置端口

sp_ctrl> set param SP_COP_TPORT port

sp_ctrl> set param SP_COP_UPORT port

 

e. 关闭实例

Shut down sp_cop.

 

f. variable-data 目录中的 rim 子目录中,删除 shstinfo.ipc 以及 shmaddr.loc 文件(如果之前安装的 SharePlex 从未启动过 sp_cop 这两个文件可能不存在)

 

h. 重复上述步骤为每一个实例

 

 

如果是为同一个数据库启动不同实例,则下面步骤可以省略。

  4 )如果针对不同数据库,则需要在完成上述步骤之后,为每一个数据库运行ora_setup a. 定义环境 variable-data 环境变量 ksh shell: export SP_SYS_VARDIR=/ full_path_of_variable-data_directory csh shell: setenv SP_SYS_VARDIR / full_path_of_variable-data_directory   b. 定义环境变量 SP_COP_TPORT and SP_COP_UPORT ksh shell: export SP_COP_TPORT= port export SP_COP_UPORT= port csh shell: setenv SP_COP_TPORT port setenv SP_COP_UPORT port   c./ora_setup, 根据交互界面提示,为每个 sp_cop 实例配置不同数据库设置。 

a. 使用前提 查看对应capture c ),export x ),post p )队列,需要停止对应的进程,才能正常读取队列信息。b. 使用顺序[oracle@11rac1 ~]$ export SP_SYS_VARDIR=<VARDIR>[oracle@11rac1 ~]$ qview –iqview > qinit      注:  qsetup                       - init command if sp_cop is not running  qinit                           - init command if sp_cop is runningqview > set outqview > set detail fullqview > open p r                     >> 打开post 队列,set 设置要在open 队列之前qview > oread 0 10000qview > exitd. 退出qview 之后,在执行qview 命令的目录下可以看到qview.out 文件,即队列消息详情

2.15 新增复制用户

u   如果需要为现有链路增加复制用户,则需要遵循以下步骤:(尽量在业务少的时候进行)

1 源系统的SharePlex控制台sp_ctrl下运行copy config命令将当前配置文件复制并生成一个新的配置文件。例如,当前处在激活状态的配置文件名为filename,则建立一个文件名为 newname的配置文件;

sp_ctrl(sysA)> copy config filename to newname

(2)通过 源系统的SharePlex控制台sp_ctrl运行edit config 命令编辑新建的配置文件newname

sp_ctrl(sysA)> edit config newname

3 )在文件里为新建的用户增加一行信息。例如,新增new_user 用户下所有表,并在目标端主机sysB 创建新队列new_q ,则应该在文件里增加如下的信息:

expand new_user.%      new_user.%      sysB:new_q@o.TargetSID

4 )保存并退出配置文件;

5 )在目标端预先停止新队列new_q

sp_ctrl sysB > stop post queue new_q

6 )在 源系统SharePlex 控制台sp_ctrl 下运行activate config 命令激活修改后的新的配置文件,在激活的过程中原先处于激活状态的旧的配置文件会自动解除激活状态;

sp_ctrl(sysA)> activate config newname nolock

7 )确认目标端新队列状态为stopped by user

sp_ctrl(sysB)> show

8 )源端数据库选取scn

SQL> select min(start_time) from gv$transaction;

# 此命令查询出来时间需要在第 6 步激活时间之后,确保 SharePlex 捕获数据库所有事务,如果有事务在第 6 步激活时间之前,则等待事务结束,再次查询,确保该命令查询时间在第 6 步激活时间之后,即可使用下面命令选取 scn

SQL> select to_char(current_scn) from v$database;

9 )源端数据库利用第8 步选取SCN 导出数据

expdp \'\/ as sysdba\' directory=dir_name dumpfile=splex_%U.dmp parallel=4 flashback_scn=< 8 步选取 scn> cluster=no schemas=< 用户名 >

10 )目标端数据库导入数据

impdp \'\/ as sysdba\' directory=dir_name dumpfile=splex_%U.dmp parallel=4

# 导入时,需要在目标端建立与源端相同表空间,如果不想建表空间,则需要 impdp 导入时使用 remap_tablespace 参数

11 )禁用目标端外键、触发器 SQL> select 'alter table "'||owner||'".'||table_name||' disable constraint "'||constraint_name||'";' from dba_constraints where constraint_type in ('R') and owner in('HR') order by status,owner; SQL> select 'alter trigger "'||owner||'"."'||trigger_name||'" disable;' from dba_triggers where owner in('HR') order by status,owner;

12 )目标端SharePlex reconcile 队列数据

sp_ctrl> qstatus

sp_ctrl> reconcile queue <new_q> for <o.src-o.tar> scn <scn_number>

# 上面尖括号中, new_q 为新队列名称, o.src-o.tar 为命令 qstatus 输出队列名称后一串字符, scn_number 为导出数据时选取的 scn

13 )目标端启动post

sp_ctrl> start post queue <new_q> 

SharePlex AA 复制实施

前言

  AA 复制即源端为oracle ,目标端也为oracle

  实施之前一定要备份源库,并保证备份的可用性,并制定完备的回退方案。

  SharePlex 可以用作容灾,报表分离,数据分发,数据迁移。

  使用SharePlex 进行数据迁移一般具有数据量大,源端与目标段为异构平台,停机时间短等特点,迁移完成之后,可以再次配置目标段到源端的复制,防止试运行阶段出现问题以便回切。

  使用SharePlex 进行异构容灾实施步骤大致与异构迁移相同,主要区别在于最后数据迁移完成之后目标段FK job trigger 的处理。

环境准备

  源库空间准备,中间库准备,目标端相关软件安装,RAC 安装时需要安装在共享磁盘上,并且将SharePlex 启动在可浮动的一个service IP 上。

  在源库与目标库安装同版本的ShanrePlex ,可以不同平台,但一定要保证版本一致。

  在源端编写config 文件,并在源端与目标端都停止Post 进程,然后verify analyze config ,然后再根据分析结果,修改优化config 文件。

数据初始化

  a. 有中间库时,可以使用DG 搭建与源库同平台的中间库环境,并配置好DG ,然后在源端激活上一步配置好的config 文件,开始capture 捕获,在v$transaction 视图中事务开始时间都晚于捕获时间之后,查询select to_char(current_scn) from v$database; 选取一个SCN ,然后在确保SCN 之前所有的数据都同步到中间库之后,可以将DG 断开。

(1)    如果是10g 之前的版本,如果数据量较大,则可以使用RMAN 在中间库不完全恢复到选取的SCN ,然后使用exp 人为分割大表启动多个exp 进程,启用并发加快导出数据速度。

(2)    10g 以后的版本使用expdp 配合FLASHBACK_SCN=<SCN_NUMBER> 将数据导出。

  b. 没有中间库时,在源端先开启捕获,保证v$transaction 视图中所有事务开始时间都在捕获时间之后,然后选取scn ,使用exp/expdp 进行基于该scn 导出,在目标端导入。 注:目标数据库 FK job trigger 的处理,正常的 job schedule job 必须都禁用掉,使用如下语句生成批量禁用语句,然后执行。 SQL> select 'alter table "'||owner||'".'||table_name||' disable constraint "'||constraint_name||'";' from dba_constraints where constraint_type in ('R') and owner in('HR') order by status,owner; SQL> select 'alter trigger "'||owner||'"."'||trigger_name||'" disable;' from dba_triggers where owner in('HR') order by status,owner; 禁用目标端 job SQL>alter system set job_processes=0 scope=both sid=’*’;

队列数据

  在目标端,使用sp_ctrl 控制台,reconcile 目标端post 队列中激活源端config 开启capture 到选取的SCN 之间的数据,以保证开启post 之后,SharePlex 可以将之后数据对接,保证数据一致性。

  sp_ctrl (cluster1vip:2100)>qstatus

  sp_ctrl (cluster1vip:2100)>help reconcile

  sp_ctrl (cluster1vip:2100)> reconcile queue datamove for o.wahaha-o.honor1 scn 698767

  sp_ctrl (cluster1vip:2100)>qstatus 注:数据泵导入导出的时候, reconcile scn 一般需要加 1 rman until scn 方式恢复的不需要加 1.

开启目标端post

  sp_ctrl (cluster1vip:2100)>start post

  sp_ctrl (cluster1vip:2100)>qstatus

  sp_ctrl (cluster1vip:2100)>show sync

  使用sqlplus 查看数据同步情况,同步完成之后,查看源端与目标端数据是否一致。

目标端FK job trigger 处理

  如果使用SharePlex 做容灾镜像复制,目标端FK job trigger 则禁止,禁止方法参考3.3 节,直到需要切换到灾备库时启用。

  如果使用SharePlex 做数据迁移,则需要在迁移完成之后启用FK job trigger

SharePlex 其他复制说明

复制

u   在级联复制中,DDL 复制只从源端到中间端,不包含中间段到目标段。

u   默认SharePlex 开启Truncate TABLE ALTER TABLE to ADD COLUMNS or DROP COLUMNS DDL 复制。 注:默认DDL 配置受参数SP_OCT_REPLICATE_DDL 参数影响,1 ALTER TABLE 2 TRUNCATE TABLE 3 ALTER TABLE TRUNCATE TABLE ,默认为3

u   默认SharePlex AUTO_ADD 特性会自动捕获在激活配置文件(前提是新建的对象在配置文件中使用通配符等方式匹配)之后创建的表与索引,并自动复制到目标端,将对象加入复制列表,维护对象以后的DDL DML 注:默认AUTO_ADD SP_OCT_AUTOADD_ENABLE 参数影响,默认为1 ,即ENABLE

u   如果需要开启TRIGGER SYNONYM GRANT 的复制,需要设置以下参数为1

DDL   command

Set   this parameter to 1

CREATE   / DROP TRIGGER

SP_OCT_REPLICATE_TRIGGER

CREATE   / DROP SYNONYM

SP_OCT_REPLICATE_SYNONYM

GRANT

SP_OCT_REPLICATE_GRANT

 

u   如果需要开启SEQUENCE,MATERIALIZED VIEW 复制,需要设置一下参数为1 前提:1. 保证SP_OCT_AUTOADD_ENABLE 参数设置为1.

DDL   to auto-add

Parameter   to set to 1

Additional   requirements

CREATE /   DROP SEQUENCE

 SP_OCT_AUTOADD_SEQ

Set the   SP_OCT_TARGET_COMPATIBILITY parameter to at least 8.6.3

CREATE /   DROP MATERIALIZED VIEW*

SP_OCT_AUTOADD_MV

Set the SP_OCT_TARGET_COMPATIBILITY   parameter to at least 8.6.3

 

u   SharePlex 可以复制不包含在激活的配置文件内的对象的DDL ,但是不会复制任何数据,因为没有激活的配置文件包含对象。

SP_OCT_REPLICATE_ALL_DDL 设置为1

异构复制map columns

环境:RedHat6  Oracle11.2.0.4 SharePlex9.0 注意事项: 1. 源库的所有列必须映射给目标端的列,名称可以不同,目标表的列数量可以多于源库表的列数量。 2. 在配置了列映射的表中使用 ALTER TABLE 增加列是不被支持的。 样例配置文件:sp_ctrl (11rac1:2300)> view config hr_20170708datasource:o.source#source tables      target tables           routing map#splex.demo_src      splex.demo_dest            target_system@o.target_sidhr.employees         hr.employees               192.168.204.112@o.targethr.test (id,name)  hr.coltest (nu,last_name)    192.168.204.112@o.target

级联复制

l   级联复制情境

1. 源库允许有超过1024 个复制路由,则可以通过发送到中间系统,通过广播的方式,分发给目标系统。

2. 源库由于防火墙限制或者其他因素导致无法直接建立与目标端的连接,则可以使用级联复制。 注:使用级联复制,即使源库无法连接目标端,源端也要能解析目标端的主机。

l   级联复制要求

1.     在所有系统中创建相同SharePlex 用户名用户。

2.     在目标端禁用影响DML 操作的触发器。

3.     排除SharePlex 用户的DML DDL 复制,配置文件中对象以外的表可以有DML DDL 操作,但不能影响复制队列。

4.     如果序列在目标端是不需要的,则不要复制序列,复制序列会造成复制迟缓。因为序列用来在插入操作时产生列的键值,而值会复制到目标端,所以序列可以不复制。

中间系统为数据库,有post 情况下级联复制

l   配置注意事项:

1.     在所有系统的数据库中,必须有相同名称的SharePlex 的用户。

2.     触发器必须在在中间库与目标库中禁用。

3.     SharePlex 不支持从中间库到目标库的DDL 复制,只支持源库到中间库的DDl 复制,所以在中间库需要禁用掉SP_OCT_REPLICATE_DDL SP_OCT_REPLICATE_ALL_DDL 两个参数。

4.     需要在源库与中间库创建两个配置文件。

5.     源库与中间库开启归档,防止在捕获完成之前联机重做日志被清除。 

l   配置样例:

Example on source system

Datasource:o.oraA

hr.emp                hr.emp2                 hostB@o.oraB

hr.sal                  hr.sal2                   hostB@o.oraB

cust.%                cust.%                  hostB@o.oraB

 

Example on intermediary system

Datasource:o.oraB

hr.emp                hr.emp2                 hostC@o.oraC

hr.sal                  hr.sal2                    hostD@o.oraD+hostE@r.mssE

cust.%                cust.%                    !cust_partitions

l   需要配置参数

如果中间库是Oracle ,需要设置参数SP_OCT_REPLICATE_POSTER 1 ,默认为0 ,参数设置为0 时,SharePlex capture 将忽略post 进程的活动。

中间系统为pass-through

l   配置前提

1.     Oracle 数据库下,创建Oracle 实例以及在/etc/oratab 或者windows 注册表中指定对应ORACLE_SID ,数据库可以为空。

2.     不支持DDL 复制

3.     只需要在源端创建一个配置文件即可。

                                             

高可用复制

配置双向复制,停止备机端的export 进程。

配置Change-History 复制

4.5.1Change-History

l   创建Change-History 配置文件

1)         确保系统符合SharePlex 要求以及已经按照规范安装了SharePlex 软件。

2)         在目标段创建与需要记录改变历史的源端表相同结构及表名的表,省略掉所有列上的所有约束。 注:目标记录改变历史表不能有主键约束,外键约束,唯一键,非空,检查约束,也不能在列上定义默认值。因为这个表记录的是改变历史,一行的值有可能有与其他行相同的键值。Post 在记录改变历史的目标端不能参照完整性约束。

3)         在目标端禁用触发器trigger

4)         在目标表禁止除了SharePlex 用户外所有用户的DML DDL 操作。

5)         在源端,使用如下语法创建config 文件。

  Datasource:o.SID 是源端Oracle 实例的ORACLE_SID

  Src_owner.table 是一个完整合法的源端对象(owner.object )或者使用通配符指定的对象。

  !cdc: 指定目标端表为change-history

  tgt.owner.table 是一个在目标段完整合法的change-history 表或者使用通配符指定的表。

  host 是指目标系统

  c.SID 指定目标端的Oracle 实例

6)         (可选步骤)在目标端运行product_dir/util/add_change_tracking_columns.sql 脚本,添加默认名称的列定义。Post 可以自动填入默认定义的列而不需要任何额外的配置,你也可以自定义脚本去匹配自己的要求。 注:

ü   上述脚本只添加默认名称的列。如果添加可选择的列或者改变列的名称,使用target 命令添加自定义的列名称到Post 配置。查看target 命令默认以及可选的列定义,可以参考SharePlex Reference Guide

ü   在一个change-history 配置中,配置文件中捕捉到的添加新表DDL 将自动添加默认change-history 列。

其他的change-history 配置选项

这部分内容描述如何自定义配置SharePlex 记录改变历史。

a) 使用自定义列明记录改变历史

在目标端可以使用target 命令自定义任何目标定义的列,target 详细用法可以参考SharePlex Reference Guide

b) 源端每一行改变都在目标端记录前镜像

可以通过在目标端设置SP_OPO_TRACK_PREIMAGE 参数为U 来在记录改变历史时记录改变的值同时新增一行记录前镜像值。这个参数将会使Post 在源端表每行发生改变时在目标端记录改变历史表中插入两行:一行是改变后的镜像另一行为改变前的镜像。前镜像由改变后的值与改变量构成,除非源端启用了SP_OCT_USE_SUPP_KEYS 参数。 当前镜像值被设置为保留,则默认列名为SHAREPLEX_SOURCE_OPERATION 的列值将会有两条记录:1. 更新前的值 2. 更新后的值 注:保留前镜像的行不包含任何类型为 log 的字段,因为 redo log 不会记录 log 的前镜像。 可以取消设置 SP_OPO_TRACK_PREIMAGE 参数,然后通过使用 target 命令 set cdc preimage 选项将全局设定改为表级别。

c) 在记录历史表中包含操作行的所有列值

在目标端记录改变历史的表中记录源端修改的行的所有列的值,而不仅仅包含修改的列值,需要进行如下操作:

ü   打开源端表基于所有列的最小附加日志。

示例语句:ALTER TABLE EMP ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

ü   在源端设置参数SP_OCT_USE_SUPP_KEYS 1.

ü   在源端设置参数SP_OCT_INCLUDE_UNCHANGED_COL 1. 注:当同时启用 SP_OCT_USE_SUPP_KEYS SP_OPO_TRACK_PREIMAGE 参数时,前镜像行将包含改变前行所有列值。

d) 在记录改变历史的复制中屏蔽掉操作类型

在目标端屏蔽掉源端DML 操作类型,设置SP_OPO_TRACK_OPERATIONS 参数为合适的值,使用斜杠/ 分开多个值。例如,维护改变历史表只记录insert update ,改变参数值为I/U 。默认值为I/U/D ,将记录所有的DML 操作。

e) 设置规则与过滤器

可以通过使用target 命令的set rule 选项去设置应用条件控制改变是否应用到目标记录改变历史表中。例如,你可以指定一个加入第一列与第三列改变了,然后应用操作并且丢弃在其他行上的任何改变,可以参考SharePlex Reference Guide

f) 包含提交操作

默认的,提交记录不包含在记录改变历史表中。可以通过配置Post 去插入每一次提交记录,设置SP_OPO_TRACK_COMMITS 参数为1.

Kafka 复制

概述

SharePlex Post 进程可以连接并写入到Kafka broker 中。数据被以XML 记录并包含数据定义、操作类型以及被修改的列值写入。数据被以在源端发生的操作的连续系列写入,这些数据可以被以连续的顺序发送到目标数据库或者被外部程序消费。

发送到Kafka 说明

u   SharePlex Post 进程扮演一个Kafka producer 角色。一个SharePlex Post 进程只能写一个broker 的默认partition 0 的单一topic 。想支持多个topics 或者多个broker ,需要使用命名Post 队列的方式配置多个SharePlex Post 进程。

u   SharePlex Post 进程不会创建topics ,必须在Kafka 平台创建topic

u   出于考虑性能的原因,Post 在发送到Kafka broker 之前将消息集合到一批。优化参数可用来控制批消息的大小。这可以用来平衡性能与延迟。 注: SharePlex Kafka 平台支持的平台,数据类型以及操作类型可以参考 SharePlex Release Notes 文档。

源端SharePlex 配置

当复制数据到Kafka 平台时,使用一下步骤配置源端数据库以及SharePlex

开启supplemental logging

在源端系统oracle 数据库中,启用PK/UK 最小附加日志。SharePlex 必须有Oracle 键信息在目标端创建合适键。

SQL>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA(PRIMARY KEY,UNIQUE) COLUMNS;

设置SP_OCT_USE_SUPP_KEYS 参数

在源端系统,设置SP_OCT_USE_SUPP_KEYS 参数为1, 。这个参数指导SharePlex 使用Oracle 最小附加日志列作为关键键值列当update 或者delete 一行数据时。当数据库supplemental logging 以及该参数都被设置之后,这保证了SharePlex 可以总是构建键以及SharePlex 键匹配Oracle 的键。 注:可以通过查看 Reference Guide 官方文档查看更多关于 SP_OCT_USE_SUPP_KEYS 参数的信息。

配置复制

在源端,创建SharePlex 配置文件指定Capture 的路由信息。配置文件的变化,需要根据定制的复制策略,以下显示为路由数据到Kafka 的语法要求。

   说明:

u   SID 为源端Oracle 数据库ORACLE_SID

u   Src_owner.table 为源端表的拥有者以及表名:tgt_owner.table 为可选项以及指定目标端表的拥有者以及名字。Use if either component is different from that of the source table. 允许!kafka :tgt_owner.table 之间没有空格。正确的关键字以及双引号中是大小写敏感,”MySchema”.”MyTable”

u   host 是目标系统的名字。 

  

目标端SharePlex 配置

以下部分介绍配置SharePlex Post 进程连接Kafka ,你必须有一个正在运行的Kafka broker 配置Post Kafka 1 )创建Kafka topic2 )启动sp_cop (不要激活源端配置文件)3 )运行sp_ctrl4 )使用target 命令配置posting Kafka broker topic 。示例如下:

sp_ctrl> target x.kafka set kafka broker =localhost:9092

sp_ctrl> target x.kafka set kafka topic =shareplex

See View and change Kafka settings for command explanations and options.

查看并且修改Kafka 设置

查看当前输出到Kafka 的设置,使用如下命令。sp_ctrl>target x.kafka show 修改设置,使用如下命令。sp_ctrl>target x.kafka [queue queuename] set kafka property=value 说明:

u   队列queuename post 队列的名字,如果需要多个post 进程,使用此选项

u   下表中有属性以及取值                 

设置恢复选项

如果Kafka 进程突然意外中止,或者机器意外中止,行变化有可能会在kafka topic 中写两次。消费者必须通过检测以及丢弃重复来管理这种情况。

在一个事务中对每一个行操作的记录都有相同的事务ID 并且通常使用sequence ID 标记。这个属性在XML 输出关键词txn 元素下分别使用关键词id 与关键词msgldx

事务ID 是事务提交时间的SCN sequence ID 是在事务中行变化的index 。在重写Kafka topic 的恢复情境中必须保证这两个值相同。

如果想要,可以使用target 命令配置Post 使每一个行改变记录包含附加的metadata 信息。

target x.kafka [ queue queuename] set metadata property[, property]     Example

target x.kafka set metadata time, userid, trans, size

To reset the metadata

target x.kafka [ queue queuename] reset metadata

To view the metadata target x.kafka [ queue queuename] show metadata  

.日常监控

启动/ 关闭SharePlex

启动SharePlex

oracle 用户登录

$ sp_cop &

$ ps -ef |grep sp_           检查进程运行情况

关闭SharePlex

$ sp_ctrl 

sp_ctrl> shutdown

 

登录控制台

SharePlex 的日常维护主要通过登录控制台执行

使用oracle 用户登录。

$ sp_ctrl

主要监控项目

A.     检查复制进程状态,应该为running 状态

sp_ctrl> show

B.     检查队列状态,正常业务压力下各队列中Backlog 数目不应过大,0 表示该队列中无数据积累。如果积累过多则需要关注(比如百万以上)。

sp_ctrl> qstatus

C.     (只在源端)检查Capture 进程详细状态,可以看到每个实例的当前Oracle Redo log 号(对应”Oracle Log” )和SharePlex 正在处理的Oracle Redo log 号(对应”Redo Log” )。如果发现”Redo Log” 滞后”Oracle Log” ,则需要关注。

sp_ctrl (yxzb:2200)> show capture detail

Host: yxzb

                                      Operations

Source     Status            Captured             Since

---------- --------------- ---------- ------------------

o.splex    Running           28687899         19-Jun-09 01:10:59

   Log reader threads:

Thread  Instance      Host    Oracle Log  Redo Log  Log Offset   Kbytes Read

   ------  ------------  ------------  ----------  --------  ------------  ------------

    1  dl1      dcdb01   22338   22338   218919904     118315716

    2  dl2      dcdb02   11378   11377   87642560      40060727

sp_ctrl>  /

重复执行该命令,”Log Offset” 的值应该是增长的。

管理归档文件时需注意,SharePlex 已经处理完的(Redo Log - 1 )归档可以删除。

D.    (只在目标端)检查POST 队列详细状态,可以查看处理到什么时间的数据了。如果发现“Transactions posted" 小于10 ,或者处理的很慢了,则需要关注。

sp_ctrl>  show post detail

sp_ctrl>  /

重复执行该命令,”Operations Posted” 的值应该是增长的。

E.     (只在目标端)查看不一致对象,如果发现不一致对象,可根据日志中的信息确认发生不一致的数据,找到产生原因。最后要针对该表进行同步(一般采用copy 方式)。

sp_ctrl> show sync

F.     查看status 库,关注error 信息

sp_ctrl> show statusdb

G.    问题解决后,可清除日志

sp_ctrl> clear status all

H.    查看队列剩余空间(以下目录根据实际环境查看)

生产库:/databackup

管理库:/databackup

I.      查看数据库归档空间剩余

生产库:/arch01   &    /arch02

查看日志

很多错误需要详细的日志信息帮助解决问题。

sp_ctrl> show log reverse

vardir log 目录下包含各进程的日志文件,最主要的是event_log 文件。show log 命令只是显示了event_log 文件的部分内容。

如果event_log 中的信息不足以帮助解决问题,还需要去log 目录下查找具体进程的日志。

 

生产库日志目录(根据自己实际目录查看):

/databackup/splex/vardir/log

管理库日志目录:

/databackup/splex/vardir/log

.一些性能诊断方案

针对capture too slow

Cpature trace   信息收集按计划执行: 1. 每个小时在源端执行一次,直至跑批业务结束,至少要覆盖业务高峰期。 sp_ctrl>trace capture

2. 每小时在源端执行,收集更详细的信息 sp_ctrl> set param SP_OCT_UTILIZATION_TIMERS 1 let it run for 15 mins, then turn off sp_ctrl> reset param SP_OCT_UTILIZATION_TIMERS   3. 收集更详细的信息: sp_ctrl> stop capture sp_ctrl> set param SP_OCT_UTILIZATION_TIMERS 2 sp_ctrl> start capture let it run for 15 mins, then turn off sp_ctrl> reset param SP_OCT_UTILIZATION_TIMERS sp_ctrl> stop capture sp_ctrl> start capture   所有生成的 *.csv 文件都需要收集。 

SharePlex 一些问题的解决方案

7.1 View events and error

l   show log event 查看event 日志,show statusdb 查看数据库配置状态。

l   post 检测到错误时,会记录100 sql 语句以及不同步的数据,可以在修复问题之后,使用该sql 语句在条件设置的不苛刻情况下修复不同步的数据,

l   进程日志,当进程出现问题,SharePlex 不仅仅在event 日志中记录,也会在相应进程日志中记录。

忽略一些SP 可以修复的报错

注意:1. 一些错误即使写入oramsglist post 也不会忽略这些错误。2. 忽略会造成一些隐藏的数据不同步情况,如果用户无法容忍post 产生间隙或者可以接受一些数据不同步,可以使用忽略,可以忽略的错误一般都是通过repair copy 这些SharePlex 内置命令可以解决或者数据重复的错误,可以在vardir log 目录下查看SID_errlog.sql 查看详细的忽略掉的错误情况。

l   忽略post 中的DML 错误操作步骤:

a)      在目标库, 进入SharePlex vardir 目录下的data 子目录。

b)      找到oramsglist 文件。

c)      如果复制没有激活,使用文本编辑器打开该文件,如果复制激活状态,则拷贝一份文件副本,然后使用文本编辑器打开副本。

d)      在文件的开始增加错误编号。[oracle@11rac2 data]$ vim oramsglist942

e)      在文件的末尾,添加每一个Oracle 或者SharePlex 错误号码,一个错误一行。

f)       保存并关闭文件。

g)      如果post 还在运行,则停止post

h)      如果你编辑了一个oramsglist 文件的镜像,则保存镜像文件名为原始的oramsglist

i)       修改SharePlex 参数SP_OPO_CONT_ON_ERR 1.

j)       启动post 附表: SP_OPO_CONT_ON_ERR 设置为 1 可以忽略的错误列表。

Ø   unique key violation

Ø   operation interrupted

Ø   no data found

Ø   no such table

Ø   invalid number

Ø   non-numeric in date

Ø   invalid rowid

Ø   invalid hex number

Ø   cannot update not-null to null

Ø   Year must be between -4713 and +9999

Ø   check constraint violated

Ø   packet writer failure*

Ø   sequence not found

Ø   Oracle internal error

7.3 insert null 复制到Kafka 不显示

问题描述

a. 表结构SQL> desc CONTACT_CLSLIST  Name                                   Null?         Type  ----------------------------------------- -------- ----------------------------  CUST_ID                             NOT NULL  NUMBER(10)  CONTACT_SEQ                     NOT NULL  NUMBER(4)  CONTACT_CLASS_SEQ          NOT NULL  NUMBER(4)  CONTACT_CLASS_CODE        NOT NULL  CHAR(1)  CONTACT_NO                       NOT NULL  VARCHAR2(680)  CONTACT_EXT                                      VARCHAR2(16) b. 源端插入以及目标段消费

  正常插入SQL> insert into contact_clslist values(666669,5,6,'d','zhang','san'); 1 row created. SQL> commit; 目标端情况,可以看到此时所有列值都有:{"meta":{"time":"2017-11-28T12:10:03","userid":84,"op":"ins","scn":"14594373997256","rowid":"AAAU5pAAJAAERkBAAo","trans":"21.2.107520","seq":1,"size":1,"table":"CL_CUST2.CONTACT_CLSLIST","idx":"1/1","posttime":"2017-08-11T11:05:47"},"data":{"CUST_ID":"666669","CONTACT_SEQ":"5","CONTACT_CLASS_SEQ":"6","CONTACT_CLASS_CODE":"d","CONTACT_NO":"zhang","CONTACT_EXT":"san"}}

  可以为空列插入null 值时SQL> insert into contact_clslist values(666670,6,7,'e','zhang',null);  1 row created. SQL> commit; 目标端情况,可以看到插入的null 值列已经没有了: {"meta":{"time":"2017-11-28T12:11:40","userid":84,"op":"ins","scn":"14594373998179","rowid":"AAAU5pAAJAAERkBAAq","trans":"22.7.31700","seq":1,"size":1,"table":"CL_CUST2.CONTACT_CLSLIST","idx":"1/1","posttime":"2017-08-11T11:07:24"},"data":{"CUST_ID":"666670","CONTACT_SEQ":"6","CONTACT_CLASS_SEQ":"7","CONTACT_CLASS_CODE":"e","CONTACT_NO":"zhang"}}

  可以为空列插入空值时SQL> insert into contact_clslist values(666671,7,8,'f','wang',''); 1 row created. SQL> commit; 查看目标端情况,可以看到此时为空列也没有了: {"meta":{"time":"2017-11-28T12:12:47","userid":84,"op":"ins","scn":"14594373998813","rowid":"AAAU5pAAJAAERkBAAu","trans":"3.26.157364","seq":1,"size":1,"table":"CL_CUST2.CONTACT_CLSLIST","idx":"1/1","posttime":"2017-08-11T11:08:31"},"data":{"CUST_ID":"666671","CONTACT_SEQ":"7","CONTACT_CLASS_SEQ":"8","CONTACT_CLASS_CODE":"f","CONTACT_NO":"wang"}}

因为针对插入时,如果值少于列值,针对未明确赋值的列oracle 会自动填入null 值,所以第三种现象也是null 值不显示的问题。

解决方案

在源端设置SP_OCT_INSERT_INCLUDE_NULLS为1然后重启capture进程,插入语句将包含null值。

sp_ctrl> set param SP_OCT_INSERT_INCLUDE_NULLS 1

sp_ctrl> stop capture

sp_ctrl> start capture

    关于此问题可参考: https://support.quest.com/shareplex/kb/229190

复制中Post 不处理问题

复制环境

环境

源端

目标端

Oracle 版本

11.2.0.4 RAC

11.2.0.4 RAC

SharePlex 版本

8.6.4

8.6.4

操作系统

AIX 6100

RHEL 5.8

问题描述

链路搭建完毕之后,对链路进行选取SCN ,使用expdp 进行数据初始化,数据初始化完成之后,在目标端reconcile 队列数据,启动post 之后,post 一致呈现下图的状态。

 

 

 

  

解决方案

(1)  sp_ctrl>stop post

(2)  sp_ctrl>show

确认post已经处于stopped by user状态

(3) 使用sqlplus登入SharePlex用户(如果你有多个SharePlex端口,确定你登录的是正确的用户)

(4)  truncate table <shareplex_user>.shareplex_trans

(5)  sp_ctrl> start post

复制中跳过复制对象问题

问题描述

oracle oracle 复制环境中,当源端创建一些比较大的临时表时,如果复制链路中配置了通配符,将这些并不需要的临时表加入到了复制对象中,需要在目标端post 队列中去掉这些对象时,此时源端已经将这些对象删除,无法查找object_id ,并使用参数SP_OPO_DISABLE_OBJECT_NUM 跳过。

解决方案

On target $ export SP_SYS_VARDIR=<vardir>$ ./sp_ctrlsp_ctrl> qstatus     >> 查看队列名称sp_ctrl> exit$ qview –iqview> qinitqview> open p r      >> 如果有多个队列,则根据提示选择自己的队列qview> set detail fullqview >set outqview > oread 0 100000      >> 输出队列消息的十万行qview> exit 然后查看当前目录输出的qview.out 文件,打开并查找需要跳过的对象表名,找到obj_id $ ./sp_ctrlsp_ctrl> set param SP_OPO_DISABLE_OBJECT_NUM <obj_id>sp_ctrl> qstatus 可以查看是否已经跳过临时对象。

复制中POST 异常退出日志未记录报错

问题描述

Post will not open more than 290 cursors

SR:4154302

2017 11 16

AA 复制链路中,之前由于post 进程报找不到object_id ,然后在队列中找到,object_id 对应的表,确认表之后,在目标端设置SP_OPO_DISABLE_OBJECT_NUM 参数,跳过了TDS 用户下的Q0 Q1 Q2 Q3 表,昨天客户需要将这四张表重新加入到队列中,具体做法如下:

1. 目标端停止post

2. 在源端编辑配置文件,在原队列spdx 中使用not ,排除掉Q0~Q3 这四张表,并在config 文件中增加一行,复制TDS Q0~Q3 这四张表队列名字取名spdx05 verify config activate config

3. 目标端reset param SP_OPO_DISABLE_OBJECT_NUM ,并将除spdx05 外的其他队列启动。

4. 在源端基于SCN 导出并在目标端导入四张表数据时,发现目标端spdx 队列post 进程due to error ,查看日志,日志中并未记录post 报错原因,event_log 记录如下:

Info 2017-11-15 17:25:55.711464 20118 2902460992 Poster exited with code=1, pid = 5822 (posting from spdx, queue spdx, to spdxtar)

Notice 2017-11-15 17:27:15.492659 3280 2928380048 User command: splex start post queue spdx (from eb-tardb01-vip)

Info 2017-11-15 17:27:15.493487 7635 2902460992 Poster launched, pid = 7635 (posting from spdx, queue spdx, to spdxtar)

Notice 2017-11-15 17:27:16.580345 7635 2916102000 Poster: SQL Cache disabled. (posting from spdx, queue spdx, to spdxtar) [module opo]

Info 2017-11-15 17:27:37.587999 20118 2902460992 Poster exited with code=1, pid = 7635 (posting from spdx, queue spdx, to spdxtar)

post 进程日志如下:

opo 2017-11-15 17:27:18.739051 7635 2916102000 src host/sid/queue=spclecsource:spdx:spdx

opo 2017-11-15 17:27:18.814391 7635 2916102000 call KillOpstModule(Post-10001-spdx-spdx)

opo 2017-11-15 17:27:18.823908 7635 2916102000 Post will not open more than 290 cursors per session (OPEN_CURSORS - 10)

opo 2017-11-15 17:27:18.823930 7635 2916102000 Max data segment: hard limit=NONE

opo 2017-11-15 17:27:18.823935 7635 2916102000 Max data segment: soft limit=NONE

opo 2017-11-15 17:27:18.823940 7635 2916102000 Max file descriptor: hard limit=1024

opo 2017-11-15 17:27:18.823945 7635 2916102000 Max file descriptor: soft limit=1024

opo 2017-11-15 17:27:18.835679 7635 2916102000 Oracle version 112 - Enterprise Edition #cpu = 24Sol

问题原因

操作系统使用非oracle 用户安装配置SharePlex ,但是并未在/etc/security/limits.conf 文件中配置该用户资源使用限制,所以该用户使用默认打开文件数1024

在分割队列时,启动新的queue ,在目标端有新的post 进程,打开文件数进一步上升超过1024 ,导致进程异常退出,但是event_log 日志中并未记录相关报错信息。

问题解决

From post log, it seems open files is set to 1024.  There are many sessions for post, you may need to increase open file descriptors.

 

Please do following to shutdown sp_cop

 

sp_ctrl> shutdown

 

ulimit -n 8192

ulimit -aS

it should show 8192 for open file descriptors

 

then start SharePlex

 

./sp_cop &

 

./sp_ctrl> start post

 

Please let me know if this resolves issue. If this still does not resolve the issue please set post debug and send me the *opo*.log file.

 

sp_ctrl> set param SP_OPO_DEBUG_FLAG 0x1f0001ff

sp_ctrl> start post

 

Once post is stopped, then turn off debug

sp_ctrl> reset param SP_OPO_DEBUG_FLAG

误操作ora_setup

问题描述

使用错误的vardir 进行了ora_setup ,更新了/vardir/data/connections.yaml 连接数据库用户,下次启动SharePlex 时,SharePlex 源端read 进程将无法正常工作。

问题原因

有多个vardir ,但是未指定SP_SYS_VARDIR 变量值,或者使用export SP_SYS_VARDIR 设置变量值由于某些原因,变量并未生效导致执行ora_setup 脚本时,误将正在工作的链路的SharePlex user 更换,导致链路下次启动将出现问题,丢失数据。

问题解决

    这个问题有两种解决办法,但是都会造成丢失数据的问题,所以一定要申请停机时间并且在数据库不处理批作业的时候,保持源端数据静止一段时间,进行如下步骤,需要的停机时间一个小时即可。

(1)    qview 中使用reset

这个方案不会将更新错的SharePlex User 更换回来,但是会解决掉SharePlex 重启将不复制的问题。

On the Source machine 1. shutdown shareplex qview -i qview> qsetup qview> reset x qview >exit On the Target machine

1. shutdown shareplex 2. qview -i qview>qsetup port# qview >reset p qview >exit If you have multiple post queues, reset the post queues that got corrupted. 3. sqlplus splex/splex truncate shareplex_trans 4. restart shareplex

(2)    ora_setup 更换用户

这个方案可以将用户更换回来,即设定正确的SP_SYS_VARDIR 变量,然后执行ora_cleansp ,再重新ora_setup 将用户更换回来,然后重新激活配置文件。

 

Change Data Capture ORA-00957

链路环境

 

环境

OS 版本

Oracle 版本

SharePlex 版本

备注

源端

RHEL

11.2.0.4

8.6.4.66

目标端

RHEL

11.2.0.4

8.6.4.66

 

问题描述

Info 2017-12-12 10:03:01.848729 45518 4121626464 Poster launched, pid = 45518 (posting from spsxamis, queue amis, to spamisspx)

Notice 2017-12-12 10:03:05.575921 45518 4056024832 s:4 Poster: ORA-00957: duplicate column name (posting from spsxamis, queue amis, to spamisspx) [module osp]

Error 2017-12-12 10:03:05.576356 45518 4056024832 s:4 Poster: que/seq = 4/ 52512916960 seqno/offset = 24501/399051096 Unexpected Oracle error: ORA-00957: duplicate column name (object name: "SXAMIS"."T03_POLICYPERDAY") (posting from spsxamis, queue amis, to spamisspx) [module opo]

Notice 2017-12-12 10:03:05.832031 45518 4056024832 s:4 Poster: No locks found (posting from spsxamis, queue amis, to spamisspx) [module osp]

Info 2017-12-12 10:03:05.840860 60482 4121626464 Poster exited with code=1, pid = 45518 (posting from spsxamis, queue amis, to spamisspx)

 

问题原因

SPO-10270 may address the duplicate column issue as well. 

The bug is related to rollback as well and in this case the customer is getting duplicate column on a rollback transaction.

The fix is to make sure the main thread doesn't use the global message in the SQLclass, it is reserved for the SQL thread. This caused unpredictable behavior especially if there is a rollback. In some cases, you may get ORA-1008 as well.

CR111353 is addressing the missing key issue for CDC in after update image.

The root cause for this incident is Shareplex version 8.6.4.66 ran into multi-bugs(CR111353-SPO-10270), which were already fixed in the later version.

 

解决方案

1 SP_OPO_DEBUG_FLAG

目标端:

sp_ctrl > set param sp_opo_debug_flag queue spfocusts07 ox1f0021ff

通过反复设定上述参数,可以缓解发生这个问题,链路可以正常处理之后,reset 该参数,观察链路,如果报错,则继续设置该参数,再次reset ,观察。

经验证,上述方法是有效的,可以解决报错。

 

2 )以下补丁未验证是否解决ORA-00957 问题

由于在补丁发送过来之前,通过方法1 ,链路已经恢复正常,所以并未验证以下补丁是否彻底解决ORA-00957 问题。

需要对8.6.4.66 打以下补丁。

 

ONEOFF LOCATION:

System:  ftpamer.quest.com

user/password: shareplex_support/quest2017

/Download/CaseID/4170689

File:    sp_opst_mt-SPO-10144b-CR111353-SPO-10270

Cksum:    65576619 5884202 sp_opst_mt-SPO-10144b-CR111353-SPO-10270

 

BUILT FOR:

SPO:     8.6.4.66

OS:      Linux x86_64

Oracle:  11g

 

This oneoff includes the fix CR111353 and SPO-10270 for the duplicate column issue and it also includes a previous fix for a post core dump issue related to rollback SPO-10144.

 

Please stop post and go to prod dir/.app-modules and replace sp_opst_mt with the oneoff and rename it then start post.

 

 

 

 

参数不起作用

SP_OPO_DISABLE_OBJECT_NUM 参数说明:这个参数阻止 POST 处理基于源端表的 object_id 对象相关的 DDL DML 。这是一个立即生效参数。当队列由于某一张或者多张表数据不一致导致链路中断,你希望跳过 post 队列中这张或者这几张表,使链路先正常复制其他表,可以使用该参数。你也可以同时在源端 config 文件中,使用 not 通配符, not 掉这一张或者几张表,随后可以通过另起队列,单独重新初始化这几张表数据,完成表修复。

问题描述

在电商链路 spfocusts07 队列中,有一张 "TMS_SX"."OB_CLEANING_CUST_LIST_TMP" 表,由于表非常大,且未有合适索引,导致目标端post处理数据非常缓慢,经与电商沟通,此表已不需要再进行复制,所以决定通过设置 SP_OPO_DISABLE_OBJECT_NUM 参数来屏蔽掉 post 处理队列中含有该对象的 DDL DML 消息,但是通过在源端数据库中查询之后, object_id 18876 ,设置 SP_OPO_DISABLE_OBJECT_NUM 参数为 18876 之后,发现 post 并未跳过该表,还继续处理该表数据。

问题原因

该表应该是被重建过,导致 object_id post 队列中 object_id 不一致,导致设置的 SP_OPO_DISABLE_OBJECT_NUM 参数并非是真实队列中的 object_id

解决方案

通过查看post 日志,有记录 "TMS_SX"."OB_CLEANING_CUST_LIST_TMP" 的object_id为178873,通过使用qview命令查看post队列,确认该对象在队列消息中的object_id确实为178873,qview使用如下:[oracle@11rac1 ~]$ export SP_SYS_VARDIR=<VARDIR>[oracle@11rac1 ~] ./sp_ctrlsp_ctrl > stop post queue focusts07   >> 在使用 qview 打开队列时,需要停止对应队列的 post ,防止 open 队列时报错 queue is already open. [oracle@11rac1 ~]$ qview –iqview > qinit      注:  qsetup                       - init command if sp_cop is not running  qinit                           - init command if sp_cop is runningqview > set outqview > set detail fullqview > open p r                    qview > oread 0 10000qview > exit

d. 退出qview 之后,在执行qview 命令的目录下可以看到qview.out 文件,即队列消息详情,在输出文件中搜索 "TMS_SX"."OB_CLEANING_CUST_LIST_TMP" 表,找到对应的object_id。

最后设置参数SP_OPO_DISABLE_OBJECT_NUM 为正确的object_id 178873 ,队列正常跳过该表。

删除大回滚事务

问题描述

oracle-oracle 复制中,SharePlex 在事务开始时即开始捕获,源端回滚,目标端同步回滚,所以当源端有特别大的事务回滚时,目标端将耗费大量的系统资源回滚可能造成SharePlex 链路进度非常缓慢,所以如果遇到大事务回滚重复处理数据时,我们可以人为干预,删除大事务回滚。

操作步骤

1 show post sessions detail queue 队列名,记录Session Number

 

例:

sp_ctrl (spclectarget:10001)> show post sessions detail queue spdx

 

Session Session Pending Operations Number of RB Ops SID/Serial Thread ID

Number Status Messages Done Transactions Skipped

------- -------- -------- ---------- ------------ ------- ---------- ---------

3 Active 1999 7088076 0 0 1619/16715 2

4 Waiting 0 12 0 0 500/34749 3

 

需要记录的Session Number号为3

 

2 abort service post queue 队列名,将队列post 进程停下来

 

例:

sp_ctrl (spclectarget:10001)> abort service post queue spdx

 

sp_ctrl (spclectarget:10001)> status

 

Brief Status for spclectarget

Process State PID Running Since

--------------- ------------------------------ -------- --------------------

Cop Running 32354 19-Sep-16 19:39:38

Import Running 1767 19-Sep-16 19:43:00

Post Aborting 10165 30-Nov-16 09:53:07

Post Running 17063 04-Nov-16 20:39:32

Post Running 17061 04-Nov-16 20:39:32

Post Running 17058 04-Nov-16 20:39:32

Post Running 17057 04-Nov-16 20:39:32

Cmd & Ctrl Running 14669 22-Nov-16 12:47:53

Cmd & Ctrl Running 20465 25-Nov-16 11:27:17

Cmd & Ctrl Running 3234 30-Nov-16 10:41:37

There are no active configuration files

 

sp_ctrl (spclectarget:10001)> show

 

Process Source Target State PID

---------- ------------------------------------ ------------ -------------------- ------

Import spclecsource eb-tardb01-v Running 1767

Post o.spdx-spdx o.spdxtar Stopped by user

Post o.spdx-spdx01 o.spdxtar Running 17063

Post o.spdx-spdx02 o.spdxtar Running 17061

Post o.spdx-spdx03 o.spdxtar Running 17058

Post o.spdx-spdx04 o.spdxtar Running 17057

 

3 )通过qview 查找大回滚事务号

 

例:

[splex@eb-tardb01 ~]$ qview -i

qview> qinit

qview> open p r // 打开队列

Queue spdx+P+o.spdx-o.spdxtar (y/n) <n>? y // 确认队列名

Current queue spdx+P+o.spdx-o.spdxtar user +PP+spdx+sp_opst_mt+o.spdx-o.spdxtar

qview> oseek 3 0 // 查找会话号对应的事务号,格式为oseek Session_Number号 0

 

Read until next COMMIT from subqueue 3

 

Total messages read: 16397926

Nulled operations: 1

Commits/transactions: 1

Forward data operations: 8198956

Insert 0

Update 2500186

Delete 5698770

Other data 0

Backward data operations: 8198956

Insert 5698770

Update 2500186

Delete 0

Other data 0

 

Sque 3, mtime 11/23/16 03:33:10, qseq 197615070998, 11/23/16 03:20:55, 225229/2682332, ROLLBACK COMMIT, //0wAAAD0AAHUcPAAA , SCN 15689630758, forward = 0

 

4 )从队列中删除大回滚事务会话

 

例:

qview> rrls 3 197615070998 // 删除大事务会话,格式为rrls Session_Number号 qseq号

qview> exit

 

5 )到目标端数据库中查看大回滚事务,并确认其是否在回滚,可将其删除,也可等待其回滚完毕

 

select ADDR,USED_UBLK from gv$transaction;

 

ADDR USED_UBLK

---------------- ----------

0000000CF3936E48 43

0000000CF393A098 161948

0000000C962A6E28 3

0000000CA3DD0900 37

0000000CF39FF3D8 1

0000000CF3A659D8 1

 

6 rows selected.

 

SQL> /

 

ADDR USED_UBLK

---------------- ----------

0000000CA3D37000 3

0000000CF3935A28 2

0000000CF3936E48 43

0000000CF393A098 155290

0000000C962A6E28 3

0000000CA3DD0900 37

0000000CA3E013C0 1

0000000CF39FF3D8 1

0000000CA3E37910 1

0000000CA3E65180

丢失归档链路恢复post 不动

问题描述

源端由于丢失归档导致链路异常,当恢复出需要的归档文件之后,启动链路,发现目标端post 进程处理到一定数量的数据之后卡住不动,此时日志进程状态均正常,只有post 进程operations posted 一直保持不变。

问题原因

其实该状态与丢失归档并没有直接关系,造成该状态的主要原因为有事务在进行回滚,所以造成operations posted 一直保持不变,且total backlog 一直在增加,日志中大量报如下图错误:

  进程日志中报如下错误:    

解决方案

可以通过以下命令查看post session 状态,确认是否在处理回滚的事务。sp_ctrl > show post session detail queue {queue name}

查看session 状态,如果数量一直在处理,等待回滚处理完,链路自动恢复正常。

相关推荐