安装前数据库操作
打开数据库最小附加日志:首先查看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用户解压,安装。
[splex@localhost ~]export SP_SYS_HOST_NAME=cluster1vip可以使用该参数指定shareplex启动到指定的IP上,可以使用netstat -an | grep <port_number>
--启动 -u可以启动shareplex实例到指定端口,可以复制多个库。
SharePlex日常操作都在sp_ctrl控制台中进行,启动命令为:/<prodir>/bin/sp_ctrl,一般启动之后首先进入控制台执行sp_ctrl > stop post,停止。
Config配置文件为复制链路需要复制对象以及链路映射文件。
sp_ctrl> list config
sp_ctrl> verify config
sp_ctrl> activate config <file_name>
sp_ctrl> activate config <filename> [threads -n ] [nolock] --加nolock不锁表,如果在一定时间内获取锁失败,则继续往下进行
activate尽量执行两次,确保成功,可以同时tail -f <event_log>查看执行情况。
config配置样例以及配置规则:
#source tables target tables routing map
--target_sid为目标端的sid或别名。
--可以分析config,生成报表,分析数据库表操作频繁记录等。
命令说明:会将目标先truncate掉,然后再利用expdp加constraint=y参数导出再导入,如果你不想truncate目标端的原有同步数据则你需要使用另一个命令append
copy命令可实现单表或表分区的同步,不适合大批量表的同步。
使用要求:
目标端启动launcher: sp_ctrl> start launcher ――默认端口是2501
同步的表出现在已激活的配置文件中。
目标端的复制表所属用户需先建立,copy可以创建表结构,但要求表空间不变,所以建议先建好表结构再复制。
语法如下:
检查源端的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
如果发现或怀疑源端和目标端的表数据不一致,可以通过compare命令查看和修复。
但由于compare需要把比较的数据排序,然后逐条比较,大量数据的比较可能会导致资源的过量使用,所以不建议对大量数据的比较。
比较表分区:
直接修复在后面加上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使用其他端口,不指定则随机选端口:
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 target
sp_ctrl>help target set metadata time
过大的事务复制可能会遇到问题,所以建议所有大于1000万数据DML操作事务,分成多批次commit,并建议不要对相同表做并行的大事物操作。
在有的场景下可能不希望源端的某些修改复制到目标端,比如源端清除历史数据而目标端需要保留等。
具体步骤如下:
在执行大的事务前先执行这个procedure,即可忽略对该事务(从这个存储过程至下一个commit之间的所有DML操作)的复制,如:
SQL> conn test/test
SQL> insert into tb1 values (100, 'aaa');
SQL> commit;
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 the
SharePlex user account needed to run Oracle replication.
In response to prompts, a carriage return will choose the
default 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 : splex
Enter 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_chpwd
This program allows you to change the password of the
SharePlex user account needed to run Oracle replication.
In response to prompts, a carriage return will choose the
default 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 : splex
Enter 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 configfilename tonewname
(2)通过源系统的SharePlex控制台sp_ctrl运行edit config 命令编辑新建的配置文件newname
sp_ctrl(sysA)> edit confignewname
(3)在文件里为新建的表增加一行信息,这行信息包括该表在源系统中的表名、该表在目标服务其中的表名和路由信息。例如,在源和目标服务器的APP模式下新建了名为a的表,则应该在文件里增加如下的信息:
(4)保存并退出配置文件;
(5)停止用户对新建表的任何操作,包括select, update,insert和delete等操作;
(6)在源系统的SharePlex控制台sp_ctrl下运行activate config命令激活修改后的新的配置文件,在激活的过程中原先处于激活状态的旧的配置文件会自动解除激活状态;
sp_ctrl(sysA)> activate confignewnamelive
(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,新增复制表
#source tables target tables routing map
sp_ctrl (11rac1:2400)> verify config new_config>>验证config
sp_ctrl (11rac1:2400)> activate config new_config nolock>>激活config
注:在激活配置文件之后,目标端除新增表之外的其他复制队列已经可以激活。
(3)expdp利用flashback_scn导出源端需要新增的表数据
(4)impdp在目标端导入新增的表数据,并禁用表上的约束以及触发器
(5)reconcile队列数据到之前选取的scn
sp_ctrl (192.168.204.110:2400)> qstatus
Queues Statistics for 192.168.204.110
Number of messages: 9 (Age 7404 min; Size 1 mb)
Backlog (messages): 9 (Age 7404 min)
Number of messages: 0 (Age 0 min; Size 1 mb)
Backlog (messages): 0 (Age 0 min)
(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,则该表所在的行信息应该改为:
(6)保存并退出配置文件;
(7)通过源系统的SharePlex控制台sp_ctrl运行activate config命令激活修改后的新的配置文件newname,在激活的过程中原先处于激活状态的旧的配置文件会自动解除激活状态;
sp_ctrl(sysA)> activate config newname live
(8)维护工作完成,用户可以对重命名之后的表进行访问和操作。
对于alter table add a LOB column操作,如果被执行该操作的表在当前处在激活状态的SharePlex配置文件中,则必须遵循以下步骤保证复制环境两套数据库系统的一致性。(尽量在业务少的时候进行)
(1)停止用户对该表的任何操作,包括select, update,insert和delete等操作;
(2)通过源系统的SharePlex控制台sp_ctrl下运行copy config命令将当前配置文件复制并生成一个新的配置文件。例如,当前处在激活状态的配置文件名为filename,则建立一个文件名为newname的配置文件;
sp_ctrl(sysA)> copy configfilename tonewname
(3)通过源系统的SharePlex控制台sp_ctrl下运行edit config 命令编辑配置新建的配置文件;
sp_ctrl(sysA)> edit confignewname
(4)在文件中将要增加LOB字段(或重命名字段)的表的信息行删除。
(5)保存并退出配置文件;
(6)通过源系统的SharePlex控制台sp_ctrl运行activate config命令激活修改后的新的配置文件,在激活的过程中原先处于激活状态的旧的配置文件会自动解除激活状态;
sp_ctrl(sysA)> activate confignewname live
(7)在源系统和目标系统数据库中对该表增加LOB字段(或重命名字段);
(8)通过源系统的SharePlex控制台sp_ctrl运行activate config命令激活原先的配置文件filename,在激活的过程中刚刚处于激活状态的配置文件newname会自动解除激活状态;
sp_ctrl(sysA)> activate configfilename live
(9)维护工作完成,用户可以对该表进行访问和操作。
对于alter table move tablespace操作,如果被执行该操作的表在当前处在激活状态的SharePlex配置文件中,则必须遵循以下步骤保证复制环境两套数据库系统的一致性。(尽量在业务少的时候进行)
(1)停止用户对该表的任何操作,包括select, update,insert和delete等操作;
(2)通过源系统的SharePlex控制台sp_ctrl下运行copy config命令将当前配置文件复制并生成一个新的配置文件。例如,当前处在激活状态的配置文件名为filename,则建立一个文件名为newname的配置文件;
sp_ctrl(sysA)> copy configfilename tonewname
(3)通过源系统的SharePlex控制台sp_ctrl下运行edit config 命令编辑配置新建的配置文件;
sp_ctrl(sysA)> edit confignewname
(4)在文件中将要转移表空间的表的信息行删除。
(5)保存并退出配置文件;
(6)通过源系统的SharePlex控制台sp_ctrl运行activate config命令激活修改后的新的配置文件,在激活的过程中原先处于激活状态的旧的配置文件会自动解除激活状态;
sp_ctrl(sysA)> activate confignewname live
(7)在源系统和目标系统数据库中对移动该表到新的表空间;
(8)通过源系统的SharePlex控制台sp_ctrl运行activate config命令激活原先的配置文件filename,在激活的过程中刚刚处于激活状态的配置文件newname会自动解除激活状态;
sp_ctrl(sysA)> activate configfilename live
(9)维护工作完成,用户可以对该表进行访问和操作。
(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_TPORTport
setenv SP_COP_UPORTport
c.启动sp_cop实例使用-u选项
$ /productdir/bin/sp_cop -uport&
d.使用如下参数为环境变量中variable-data设置端口
sp_ctrl>set param SP_COP_TPORTport
sp_ctrl>set param SP_COP_UPORTport
e.关闭实例
Shut downsp_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_TPORTport
setenv SP_COP_UPORTport
c./ora_setup,根据交互界面提示,为每个sp_cop实例配置不同数据库设置。
a.使用前提
查看对应capture(c),export(x),post(p)队列,需要停止对应的进程,才能正常读取队列信息。
b.使用顺序
[oracle@11rac1 ~]$ export SP_SYS_VARDIR=<VARDIR>
[oracle@11rac1 ~]$ qview –i
qview > qinit
注:
qsetup - init command if sp_cop is not running
qinit - init command if sp_cop is running
qview > set out
qview > set detail full
qview > open p r >>打开post队列,set设置要在open队列之前
qview > oread 0 10000
qview > exit
u如果需要为现有链路增加复制用户,则需要遵循以下步骤:(尽量在业务少的时候进行)
(1)在源系统的SharePlex控制台sp_ctrl下运行copy config命令将当前配置文件复制并生成一个新的配置文件。例如,当前处在激活状态的配置文件名为filename,则建立一个文件名为newname的配置文件;
sp_ctrl(sysA)> copy configfilename tonewname
(2)通过源系统的SharePlex控制台sp_ctrl运行edit config 命令编辑新建的配置文件newname
sp_ctrl(sysA)> edit confignewname
(3)在文件里为新建的用户增加一行信息。例如,新增new_user用户下所有表,并在目标端主机sysB创建新队列new_q,则应该在文件里增加如下的信息:
(4)保存并退出配置文件;
(5)在目标端预先停止新队列new_q
sp_ctrl(sysB)> stop post queue new_q
(6)在源系统的SharePlex控制台sp_ctrl下运行activate config命令激活修改后的新的配置文件,在激活的过程中原先处于激活状态的旧的配置文件会自动解除激活状态;
sp_ctrl(sysA)> activate confignewnamenolock
(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导出数据
(10)目标端数据库导入数据
#导入时,需要在目标端建立与源端相同表空间,如果不想建表空间,则需要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
(13)目标端启动post
sp_ctrl> start post queue <new_q>
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)>qstatus
注:数据泵导入导出的时候,reconcile时scn一般需要加1,rman until scn方式恢复的不需要加1.
sp_ctrl (cluster1vip:2100)>start post
sp_ctrl (cluster1vip:2100)>qstatus
sp_ctrl (cluster1vip:2100)>show sync
使用sqlplus查看数据同步情况,同步完成之后,查看源端与目标端数据是否一致。
如果使用SharePlex做容灾镜像复制,目标端FK,job,trigger则禁止,禁止方法参考3.3节,直到需要切换到灾备库时启用。
如果使用SharePlex做数据迁移,则需要在迁移完成之后启用FK,job,trigger。
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
uSharePlex可以复制不包含在激活的配置文件内的对象的DDL,但是不会复制任何数据,因为没有激活的配置文件包含对象。
SP_OCT_REPLICATE_ALL_DDL设置为1。
环境:RedHat6 Oracle11.2.0.4 SharePlex9.0
注意事项:
1.源库的所有列必须映射给目标端的列,名称可以不同,目标表的列数量可以多于源库表的列数量。
2.在配置了列映射的表中使用ALTER TABLE增加列是不被支持的。
样例配置文件:
sp_ctrl (11rac1:2300)> view config hr_20170708
#source tables target tables routing map
l级联复制情境
1.源库允许有超过1024个复制路由,则可以通过发送到中间系统,通过广播的方式,分发给目标系统。
2.源库由于防火墙限制或者其他因素导致无法直接建立与目标端的连接,则可以使用级联复制。
注:使用级联复制,即使源库无法连接目标端,源端也要能解析目标端的主机。
l级联复制要求
1.在所有系统中创建相同SharePlex用户名用户。
2.在目标端禁用影响DML操作的触发器。
3.排除SharePlex用户的DML与DDL复制,配置文件中对象以外的表可以有DML与DDL操作,但不能影响复制队列。
4.如果序列在目标端是不需要的,则不要复制序列,复制序列会造成复制迟缓。因为序列用来在插入操作时产生列的键值,而值会复制到目标端,所以序列可以不复制。
l配置注意事项:
1.在所有系统的数据库中,必须有相同名称的SharePlex的用户。
2.触发器必须在在中间库与目标库中禁用。
3.SharePlex不支持从中间库到目标库的DDL复制,只支持源库到中间库的DDl复制,所以在中间库需要禁用掉SP_OCT_REPLICATE_DDL与SP_OCT_REPLICATE_ALL_DDL两个参数。
4.需要在源库与中间库创建两个配置文件。
5.源库与中间库开启归档,防止在捕获完成之前联机重做日志被清除。
l配置样例:
Example on source system
Example on intermediary system
cust.% cust.% !cust_partitions
l需要配置参数
如果中间库是Oracle,需要设置参数SP_OCT_REPLICATE_POSTER为1,默认为0,参数设置为0时,SharePlex的capture将忽略post进程的活动。
l配置前提
1.Oracle数据库下,创建Oracle实例以及在/etc/oratab或者windows注册表中指定对应ORACLE_SID,数据库可以为空。
2.不支持DDL复制
3.只需要在源端创建一个配置文件即可。
配置双向复制,停止备机端的export进程。
l创建Change-History配置文件
1)确保系统符合SharePlex要求以及已经按照规范安装了SharePlex软件。
2)在目标段创建与需要记录改变历史的源端表相同结构及表名的表,省略掉所有列上的所有约束。
注:目标记录改变历史表不能有主键约束,外键约束,唯一键,非空,检查约束,也不能在列上定义默认值。因为这个表记录的是改变历史,一行的值有可能有与其他行相同的键值。Post在记录改变历史的目标端不能参照完整性约束。
3)在目标端禁用触发器trigger。
4)在目标表禁止除了SharePlex用户外所有用户的DML与DDL操作。
5)在源端,使用如下语法创建config文件。
!cdc:指定目标端表为change-history表
host是指目标系统
注:
ü上述脚本只添加默认名称的列。如果添加可选择的列或者改变列的名称,使用target命令添加自定义的列名称到Post配置。查看target命令默认以及可选的列定义,可以参考SharePlex Reference Guide
ü在一个change-history配置中,配置文件中捕捉到的添加新表DDL将自动添加默认change-history列。
这部分内容描述如何自定义配置SharePlex记录改变历史。
在目标端可以使用target命令自定义任何目标定义的列,target详细用法可以参考SharePlex Reference Guide。
可以通过在目标端设置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选项将全局设定改为表级别。
在目标端记录改变历史的表中记录源端修改的行的所有列的值,而不仅仅包含修改的列值,需要进行如下操作:
ü打开源端表基于所有列的最小附加日志。
示例语句: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参数时,前镜像行将包含改变前行所有列值。
在目标端屏蔽掉源端DML操作类型,设置SP_OPO_TRACK_OPERATIONS参数为合适的值,使用斜杠/分开多个值。例如,维护改变历史表只记录insert与update,改变参数值为I/U。默认值为I/U/D,将记录所有的DML操作。
可以通过使用target命令的set rule选项去设置应用条件控制改变是否应用到目标记录改变历史表中。例如,你可以指定一个加入第一列与第三列改变了,然后应用操作并且丢弃在其他行上的任何改变,可以参考SharePlex Reference Guide。
默认的,提交记录不包含在记录改变历史表中。可以通过配置Post去插入每一次提交记录,设置SP_OPO_TRACK_COMMITS参数为1.
SharePlex的Post进程可以连接并写入到Kafka的broker中。数据被以XML记录并包含数据定义、操作类型以及被修改的列值写入。数据被以在源端发生的操作的连续系列写入,这些数据可以被以连续的顺序发送到目标数据库或者被外部程序消费。
uSharePlex的Post进程扮演一个Kafka producer角色。一个SharePlex Post进程只能写一个broker的默认partition 0的单一topic。想支持多个topics或者多个broker,需要使用命名Post队列的方式配置多个SharePlex Post进程。
uSharePlex的Post进程不会创建topics,必须在Kafka平台创建topic。
u出于考虑性能的原因,Post在发送到Kafka broker之前将消息集合到一批。优化参数可用来控制批消息的大小。这可以用来平衡性能与延迟。
注:SharePlex到Kafka平台支持的平台,数据类型以及操作类型可以参考SharePlex的Release Notes文档。
当复制数据到Kafka平台时,使用一下步骤配置源端数据库以及SharePlex。
在源端系统oracle数据库中,启用PK/UK最小附加日志。SharePlex必须有Oracle键信息在目标端创建合适键。
SQL>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA(PRIMARY KEY,UNIQUE) COLUMNS;
在源端系统,设置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的语法要求。
说明:
uSID为源端Oracle数据库ORACLE_SID
uhost是目标系统的名字。
以下部分介绍配置SharePlex Post进程连接Kafka,你必须有一个正在运行的Kafka broker。
配置Post到Kafka:
1)创建Kafka topic
2)启动sp_cop(不要激活源端配置文件)
3)运行sp_ctrl
4)使用target命令配置posting到Kafka broker的topic。示例如下:
See View and change Kafka settings for command explanations and options.
查看当前输出到Kafka的设置,使用如下命令。
修改设置,使用如下命令。
说明:
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信息。
Example
To reset the metadata
To view the metadata
启动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
---------- --------------- ---------- ------------------
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
Cpature trace信息收集按计划执行:1.每个小时在源端执行一次,直至跑批业务结束,至少要覆盖业务高峰期。sp_ctrl>trace capture
2.每小时在源端执行,收集更详细的信息sp_ctrl> set param SP_OCT_UTILIZATION_TIMERS 1let it run for 15 mins, then turn offsp_ctrl> reset param SP_OCT_UTILIZATION_TIMERS3.收集更详细的信息:sp_ctrl> stop capturesp_ctrl> set param SP_OCT_UTILIZATION_TIMERS 2sp_ctrl> start capturelet it run for 15 mins, then turn offsp_ctrl> reset param SP_OCT_UTILIZATION_TIMERSsp_ctrl> stop capturesp_ctrl> start capture所有生成的*.csv文件都需要收集。
lshow log event查看event日志,show statusdb查看数据库配置状态。
l当post检测到错误时,会记录100条sql语句以及不同步的数据,可以在修复问题之后,使用该sql语句在条件设置的不苛刻情况下修复不同步的数据,
l进程日志,当进程出现问题,SharePlex不仅仅在event日志中记录,也会在相应进程日志中记录。
注意:
1.一些错误即使写入oramsglist,post也不会忽略这些错误。
l忽略post中的DML错误操作步骤:
a)在目标库,进入SharePlex的vardir目录下的data子目录。
b)找到oramsglist文件。
c)如果复制没有激活,使用文本编辑器打开该文件,如果复制激活状态,则拷贝一份文件副本,然后使用文本编辑器打开副本。
d)在文件的开始增加错误编号。
[oracle@11rac2 data]$ vim oramsglist
942
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
a.表结构
SQL> desc CONTACT_CLSLISTName 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;目标端情况,可以看到此时所有列值都有:
可以为空列插入null值时
可以为空列插入空值时
因为针对插入时,如果值少于列值,针对未明确赋值的列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
环境
源端
目标端
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_ctrl
sp_ctrl> qstatus >>查看队列名称
sp_ctrl> exit
$ qview –i
qview> qinit
qview> open p r >>如果有多个队列,则根据提示选择自己的队列
qview> set detail full
qview >set out
qview > oread 0 100000 >>输出队列消息的十万行
qview> exit
$ ./sp_ctrl
sp_ctrl> set param SP_OPO_DISABLE_OBJECT_NUM <obj_id>
sp_ctrl> qstatus
可以查看是否已经跳过临时对象。
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记录如下:
post进程日志如下:
在分割队列时,启动新的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
有多个vardir,但是未指定SP_SYS_VARDIR变量值,或者使用export SP_SYS_VARDIR设置变量值由于某些原因,变量并未生效导致执行ora_setup脚本时,误将正在工作的链路的SharePlex user更换,导致链路下次启动将出现问题,丢失数据。
这个问题有两种解决办法,但是都会造成丢失数据的问题,所以一定要申请停机时间并且在数据库不处理批作业的时候,保持源端数据静止一段时间,进行如下步骤,需要的停机时间一个小时即可。
(1)qview中使用reset
这个方案不会将更新错的SharePlex User更换回来,但是会解决掉SharePlex重启将不复制的问题。
On the Source machine1. shutdown shareplexqview -iqview> qsetupqview> reset xqview >exitOn the Target machine
1. shutdown shareplex2. qview -iqview>qsetup port#qview >reset pqview >exitIf you have multiple post queues, reset the post queues that got corrupted.3. sqlplus splex/splextruncate shareplex_trans4. restart shareplex
(2)ora_setup更换用户
这个方案可以将用户更换回来,即设定正确的SP_SYS_VARDIR变量,然后执行ora_cleansp,再重新ora_setup将用户更换回来,然后重新激活配置文件。
环境
OS版本
Oracle版本
SharePlex版本
备注
源端
RHEL
11.2.0.4
8.6.4.66
目标端
RHEL
11.2.0.4
8.6.4.66
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:
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_ctrl
sp_ctrl > stop post queue focusts07>>在使用qview打开队列时,需要停止对应队列的post,防止open队列时报错queue is already open.
[oracle@11rac1 ~]$ qview –i
qview > qinit
注:
qsetup - init command if sp_cop is not running
qinit - init command if sp_cop is running
qview > set out
qview > set detail full
qview > open p r
qview > oread 0 10000
qview > exit
最后设置参数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
(3)通过qview查找大回滚事务号
例:
[splex@eb-tardb01 ~]$ qview -i
qview> qinit
qview> open p r //打开队列
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进程operations posted一直保持不变。
其实该状态与丢失归档并没有直接关系,造成该状态的主要原因为有事务在进行回滚,所以造成operations posted一直保持不变,且total与backlog一直在增加,日志中大量报如下图错误:
进程日志中报如下错误:
可以通过以下命令查看post session状态,确认是否在处理回滚的事务。
sp_ctrl > show post session detail queue {queue name}
查看session状态,如果数量一直在处理,等待回滚处理完,链路自动恢复正常。
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员