使用GoldenGate EVENTACTIONS执行数据的实时触发和定制化
Oracle GoldenGate不仅可以在线实时同步数据(包括增量和存量),也内置有一套事件触发流程,允许用户根据某张表某条记录的某个特殊字段值,触发相应的自定义执行流程,比如接收到某个银行账号的大笔转账金额之后,触发一条报警信息,或者根据某条记录,自动停止目标端的投递进程。
基于变更记录触发事件的设置,如果是源端抽取进程,则在Table语句的Filter或Where中定义,如果是目标端投递进程,则可以在Replicat进程的MAP语句中定义。当然,也可以在一个SQLEXEC执行一条SQL语句或存储过程中定义。
在Extract或参数文件中,通过使用 EVENTACTIONS 来定义自定义处理过程。EVENTACTIONS 可以带上多个关键字,比如 : IGNORE, DISCARD, ABORT, STOP, SHELL, TRACE, LOG ,每个关键字代表不同的处理功能,可参考官方文档查看。一旦有符合条件的记录,则触发对应的功能。
本示例中,通过执行shell演示如下功能:当目标端接收完源端的所有数据之后,触发一个导出操作,即将目标库的数据导出为一个DMP文件。
首先需要在源端创建一张作业状态表,当数据处理完成之后,插入一条标志源端执行完成的操作记录,当目标端replicat接收到此记录之后,则触发数据泵的导出操作。
下面是源端的抽取进程参数
EXTRACT ext1
USERID idit_prd, PASSWORD idit_prd
RMTHOST insodb02, MGRPORT 7809
RMTTRAIL ./dirdat/cc
TABLE idit_prd.myobjects ;
TABLE idit_prd.ops_job_status ;
目标端投递进程参数
REPLICAT rep1
SETENV (NLS_LANG="AMERICAN_AMERICA.WE8ISO8859P1")
SETENV (ORACLE_SID=GGDB2)
ASSUMETARGETDEFS
USERID idit_prd,PASSWORD idit_prd
MAP idit_prd.myobjects, TARGET idit_prd.myobjects;
MAP idit_prd.ops_job_status, TARGET idit_prd.ops_job_status , FILTER (@STREQ (STATUS, "PROCESSING COMPLETE" )), EVENTACTIONS ( IGNORE TRANS , STOP, SHELL "/home/oracle/exp.sh" );
本示例中的状态表为OPS_JOB_STATUS.
目标端进程中在Filter中进行记录判断,比较在status字段中是否收到了“PROCESSING COMPLETE”的值,如果是,则触发后面EVENTACTIONS中指定的操作:
· Ignore:忽略后续的操作事务,不再往OPS_JOB_STATUS表写入记录。
· Stop:停止目标端投递进程
· Shell: 执行指定的exp.sh脚本。
以下是exp.sh的内容
#!/bin/ksh
/opt/oracle/product/server/10.2.0.4.5/bin/expdp idit_prd/idit_prd parfile=/home/oracle/exp.par
parfile exp.par中定义的导出内容如下:
tables=MYOBJECTS
directory=dumpdir
logfile=dumpdir:exp.log
dumpfile=myobjects.dmp
运行起来之后,可以看到目标端rep1进程还是运行状态:
GGSCI (insodb02) 12> !
info replicat rep1
REPLICAT REP1 Last Started 2011-04-01 13:28 Status RUNNING
Checkpoint Lag 00:00:00 (updated 00:00:08 ago)
Log Read Checkpoint File ./dirdat/cc000019
2011-04-01 13:06:05.059982 RBA 931
当确认源端处理完了某部分数据,比如某个月或某年的记录之后,我们在源端的状态表中插入一条停止状态的记录:
SQL> insert into ops_job_status values (sysdate,'PROCESSING COMPLETE');
1 row created.
SQL> commit;
Commit complete.
现在查看目标端进程的状态,可以看到投递进程rep1已经stopped,预期的data pump任务也已触发。可以在文件系统上查看导出的DMP文件(对应的data pump 导出目录)。
投递进程状态:
GGSCI (insodb02) 13> !
info replicat rep1
REPLICAT REP1 Last Started 2011-04-01 13:28 Status STOPPED
Checkpoint Lag 00:00:08 (updated 00:00:04 ago)
Log Read Checkpoint File ./dirdat/cc000019
2011-04-01 13:38:15.017514 RBA 1107
导出的dmp文件
oracle@insodb02:/u01/oracle> ls -lrt
-rw-r--r-- 1 oracle dba 1051 Apr 1 13:38 exp.log
-rw-r----- 1 oracle dba 5009408 Apr 1 13:38 myobjects.dmp
由此,我们可以看到,通过OGG,不仅可以在异构平台之后复制数据,也可以基于表里的变化数据,触发相应的脚本,从而实现我们期望的预警或监控运维。
- 使用GoldenGate实现MySQL到Oracle的数据实时同步
- 使用 Oracle GoldenGate 进行实时数据集成
- 【实例】javascript中使用event.target获取触发该事件标签的相关数据而不是通过document
- 使用 Oracle GoldenGate 进行实时数据集成
- flex 4.0 解决在MODULE中使用timer实时刷新数据,卸载MODULE后还在执行的问题
- flex 4.0 解决在MODULE中使用timer实时刷新数据,卸载MODULE后还在执行的问题
- 使用 Oracle GoldenGate 进行实时数据集成
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEvent
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEvent
- 使用Mysql5.1的定时执行删除过期数据
- inotify + rsync实现linux文件实时同步,使用触发同步机制
- 使用ODI进行数据整合过程中的数据源、目标与临时区域(staging area)的分布情况与执行方式
- 使用SerialPort及ZedGraph快速实现串口数据实时显示
- Biztalk使用NativeSQL TableChangeEvent和Query 从Oracle数据库读取数据
- 在FluorineFx下使用RTMP执行实时通讯要点注意(连接失败)
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- 使用AJAX的Struts验证框架--实时数据验证是AJAX技术的一大优势
- 《LoadRunner没有告诉你的》之七——使用 LoadRunner 连续长时间执行测试,如何保证参数化的数据足够又不会重复?