9.  APPLY 进程结构

你可以创建,修改,启动,停止,删除apply进程,定义应用规则控制队列出队。apply user按照rule sets出队消息,其必须拥有相关权限,通常直接授予dba权限。

9.1.  Apply 进程的组成部分

  一个apply进程包含下列部分:

  • 一个reader server出队消息。
  • 一个coordinator 进程从reader server中获取事务并发送给apply servers。
  • 一个或多个apply servers应用LCRs。

  一个事务处理时依赖于另一个未知状态的事务,则apply server联系coordinator process,corrdinator process监控所有的apply servers确定事务按照正确的顺序应用和提交。

9.1.1.  Reader Server 状态

  可以通过查询V$STREAMS_APPLY_READER动态性能视图查看当前reader server在做什么,通常会有下列状态:

  • INITIALIZING :启动中
  • IDLE :空闲中
  • DEQUEUE MESSAGES :出队消息中
  • SCHEDULE MESSAGES :收集消息到事务中
  • SPILLING :从内存分隔未来应用messages到硬盘中
  • PAUSED :等待 DDL LCR 应用中
9.1.2.  Coordinator Process 状态

  V$STREAMS_APPLY_COORDINATOR 动态性能视图可以查看当前corrdinator process在做什么:

  • INITIALIZING :启动中
  • APPLYING :发送事务到apply server中
  • SHUTTING DOWN CLEANLY :正常中止
  • ABORTING :失败中止
9.1.3.  Apply Server 状态

  V$STREAMS_APPLY_SERVER 动态性能视图可以查看当前apply server当前在做什么:

  • INITIALIZING :启动中
  • IDLE :空闲中
  • RECORD LOW-WATERMARK :执行管理操作维护apply 信息
  • ADD PARTITION :执行管理操作增加分区,用于记录in-progress事务信息
  • DROP PARTITION :执行管理操作删除分区,用于记录in-progress事务信息
  • EXECUTE TRANSACTION :应用事务中
  • WAIT COMMIT :等待其它低commitSCN事务应用后提交本事务。这个状态只在apply进程参数  COMMIT_SERIALIZATION 设置为非空值, PARALELLISM 设置值大于1时有效
  • WAIT DEPENDENCY :等待关联事务被应用后,应用该事务中的LCR。这个状态只在apply进程参数 PARALELLISM 设置值大于 1 时有效
  • WAIT FOR NEXT CHUNK :等待大事务中的下一份LCRs
  • TRANSACTION CLEANUP :清除应用事务,包括从apply进程队列中移除LCRs

9.2.  Apply 进程的创建

  你可以通过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进程时的差异:

9.3.  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数据字典的相关信息到应用消息的数据库。

9.4.  Apply 参数

  Apply 进程创建之后处于未启用状态,你可以根据你的环境在其初次启用前设置合适的参数,这些参数可以控制apply进程操作方式,比如说time_limit参数指定apply进程自动停止前的运行时间。设置好参数之后你就可以启动apply进程了。

9.4.1.  并行度

  Apply 进程参数parallelism指定同时应用的事务数即apply servers数量。例如parallelism设置为5,则apply进程共可以使用5个apply server,reader server也是一个并行服务,因此如果parallelism设置为5,则apply进程共可使用6个并行执行服务。

    提示:

    设置parallelism参数会自动重启apply进程,另外如果该参数值设置过大,超过可用的并行执行服务可能导致apply进程不可用,因此设置前要确保初始化参数processes和parallel_max_servers两参数值适当。
9.4.2.  串行化提交

  通过设置参数commit_serialization,Apply servers能够在目标端数据库以不同事源库的顺序提交无相关依赖的事务(有依赖关系的事务提交顺序必然与源库端相同),该参数拥有两个值:

  • full :apply进程按照源端顺序提交,默认即为full。
  • none :apply进程在提交无依赖的事务时可不按照原有顺序。设置为none的话对性能提升会有助益。
9.4.3.  自动重启和出错时停止

  可以通过设置一些预订上限实现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进程仍会处于错误或不可用状态。

9.5.  错误队列

  可以通过查询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进程应用时的错误信息。