来自农村的老实娃
分类:
2009-04-09 12:35:33
你可以创建,修改,启动,停止,删除apply进程,定义应用规则控制队列出队。apply user按照rule sets出队消息,其必须拥有相关权限,通常直接授予dba权限。
一个apply进程包含下列部分:
一个事务处理时依赖于另一个未知状态的事务,则apply server联系coordinator process,corrdinator process监控所有的apply servers确定事务按照正确的顺序应用和提交。
可以通过查询V$STREAMS_APPLY_READER动态性能视图查看当前reader server在做什么,通常会有下列状态:
V$STREAMS_APPLY_COORDINATOR 动态性能视图可以查看当前corrdinator process在做什么:
V$STREAMS_APPLY_SERVER 动态性能视图可以查看当前apply server当前在做什么:
你可以通过DBMS_STREAMS_ADM或DBMS_APPLY_ADM创建apply进程。使用DBMS_STREAMS_ADM创建apply进程更简单一些,因为一些配置都会默认自动进行,不过DBMS_APPLY_ADM创建apply进程更加灵活。
如果使用DBMS_APPLY_ADM.CREATE_APPLY创建apply进程,可以指定下列参数为非默认值:apply_captured, apply_database_link和apply_tag,然后使用DBMS_STREAMS_ADM或DBMS_RULE_ADM为apply进程添加规则集。
下表描述DBMS_STREAMS_ADM和DBMS_APPLY_ADM创建apply进程时的差异:
源端实例化时,Streams数据字典就自动生成了。Streams数据字典是源库数据字典的多版本拷贝,Streams数据字典映射源端的object numbers, object version information, internal column numbers为table names, column names, column datatypess,这种方式能够确保captured消息尽可能小,因为数字毕竟会比字节更节省空间。
除了捕获和传播过程中捕获消息做为参数传给custom rule-based transformation,其它情况下捕获消息在应用时都需要源端的streams数据字典来描述LCR中的内容。要保持映射信息对apply进程可用,oracle自动在目标端数据库维护多版本的streams数据字典,oracle自动传播源端streams数据字典的相关信息到应用消息的数据库。
Apply 进程创建之后处于未启用状态,你可以根据你的环境在其初次启用前设置合适的参数,这些参数可以控制apply进程操作方式,比如说time_limit参数指定apply进程自动停止前的运行时间。设置好参数之后你就可以启动apply进程了。
Apply 进程参数parallelism指定同时应用的事务数即apply servers数量。例如parallelism设置为5,则apply进程共可以使用5个apply server,reader server也是一个并行服务,因此如果parallelism设置为5,则apply进程共可使用6个并行执行服务。
提示:
设置parallelism参数会自动重启apply进程,另外如果该参数值设置过大,超过可用的并行执行服务可能导致apply进程不可用,因此设置前要确保初始化参数processes和parallel_max_servers两参数值适当。通过设置参数commit_serialization,Apply servers能够在目标端数据库以不同事源库的顺序提交无相关依赖的事务(有依赖关系的事务提交顺序必然与源库端相同),该参数拥有两个值:
可以通过设置一些预订上限实现apply进程自动重启。 time_limit 指定apply进程持续运行时间, transaction_time 指定apply进程运行的事务数,如果设置了上述参数值,当apply进程达到指定值时就会自动停止。而 disable_on_limite 控制apply进程达到上限时停止还是重启,如果设置该参数值为y,则apply进程达到设定上线后就会自动停止,如果设置为n,则apply进程达到设定上线后会自动重启动。重启动后的apply进程以新的session连接。 disable_on_error 参数控制当apply进程遇到错误时停止还是继续应用事务。
数据库重启不会影响到apply进程的状态,比如在apply进程启用状态下关闭数据库并重启动后,apply进程也会处于启用状态,如果关闭前apply进程处于错误或不可用状态,重启后apply进程仍会处于错误或不可用状态。
可以通过查询DBA_APPLY_ERROR数据字典获取错误队列的信息,错误队列中包含数据库所有的应用错误,比如未被成功应用的事务的错误信息。一条事务可能有多条messages组成,对于unhandled的应用错误,apply进程自动将该事务移动至错误队列。
多数错误都可被修正,如果某些导致错误的原因被找到并修正,你可以通过DBMS_APPLY_ADM.EXECUTE_ERROR/EXECUTE_ALL_ERRORS过程重新运行事务,或者通过DBMS_APPLY_ADM.DELETE_ERROR/DELETE_ALL_ERRORS过程删除队列中的错误事务,执行过程的用户没有限制,即可以用置入错误对象的用户执行,也可以找有权限的用户执行。
重新执行事务也会触发apply handlers或conflict resolution handlers(如果有的话),因此通过配置handler解决错误也是一种不错的方式,比如说对于row LCR造成的错误,在配置适当的DML handler后再重新执行事务就可以了。
错误队列使用异常队列(exception queues),当你使用DBMS_STREAMS_ADM.SET_UP_QUQUE过程创建ANYDATA队列时,该过程为队列创建一个队列表,同时会自动为队列表创建一个异常队列。多个队列可以使用同一个队列表,每个队列表都会有一个异常队列,因此异常队列能够同时存储多个队列和apply进程的错误信息。异常队列只包含它的队列表的应用错误,不过Streams错误队列包含数据库中所有异常队列的应用错误信息,你可以使用DBMS_APPLY_ADM包管理Streams应用错误,但是不能直接从异常队列中出队应用错误。
提示:
如果消息客户端出队消息时遇到错误,则消息客户端将其移动至异常表,不过这些信息不会存入错误队列,错误队列中只保存apply进程应用时的错误信息。