章主要介绍对“当为下列控制暂停状态的时候解决数据流的捕获”,这个问题的一些解决办法
这种警告往往出现在目标site无法很快的与源stream同步,在10中,它是自动启动的,为的是减少事件进入排队区的比率。
如果有Streams AQ出现的话,而又不是FLOWCONTROl的状态,那就应该不会是该问题。
这里介绍的是实现一下的控制(仅对9.2 source)。当缓存查询超过阀值内存,也叫溢出,Stream会将这些信息写入磁盘,这样Stream不再会对内存中队列进行优化,所以最大限度减少溢出是流量控制的的一种控制形式。
在9i中用一个心跳表。其作用是确保事实更新元数据也对Stream复制提供一个快速的反馈。在oracle 10g 源数据库和目标数据库stream控制为自动,但如果结合9iR2使用,必须手动控制9iR2 source site。
我们要从一些视图信息查看一些状态信息。主要有一下几点
a) HC脚本会显示捕获状态和捕捉的一个具体统计
用此语句查看:SELECT CAPTURE_NAME, STATE FROM V$STREAMS_CAPTURE;
b)V$BUFFERED_SUBSCRIBERS可能显示太多的浏览信息
在V$BUFFERED_PUBLISHERS;中可以显示以下信息
* the queue owner and name
* the number of messages that have been enqueued, but not browsed
* the number of messages that have been spilled, but not browsed
* the percentage of the streams pool that is being used (or 0 if there is no streams pool)
* the state of the publisher. Possible values are:
- PUBLISHING MESSAGES (normal)
- IN FLOW CONTROL: TOO MANY UNBROWSED MESSAGES
- IN FLOW CONTROL: OVERSPILLED MESSAGES
- IN FLOW CONTROL: INSUFFICIENT MEMORY AND UNBROWSED MESSAGES
c)传播时可能会有ORA-25307的错误
以一个HC(Health Scripts)为例,运行过后抛出ORA-25307的错误,原因是排队率过高,原因是捕获过程中排队LCRS是因为内存不足,或者就是因为发出的信息比捕获信息要慢。
原因可以归结为一下几点:
1) INIT.ORA参数中stream pool太小或者没有设置
2) AQ_TM_PROCESSES参数过高
3) 捕获参数没有正确的设置
4) 太多的队列信息被浏览
5) 由于长期运行的事物,捕获较慢引起的高延迟
6) 检查应用延迟,就是从dba_apply_process中查看。
7) 长期运行的事物
8) 一些已知的bug
9) 为特定的数据库版没有找到适当补丁
10)服务器捕获进程更新,但是客户端没有更新
解决的办法如下:
1) 更改INIT.ORA设置为大于200MB最佳
2) 降低AQ_TM_PROCESSES参数值
3) 正确的配置捕获参数,例如从新启动捕获进程,然后再实行捕捉,如果有大量的内存操作,可以设置 _SGA_SIZE相关的参数
4) 如果有太多的未被浏览的信息,那就很有可能是传播过程中出现问题可以如下解决
1、 具体通过DBMS_CAPTURE_ADM.STOP_CAPTURE进行流量控制
2、 用DBMS_PROPAGATION_ADM.STOP_PROPAGATION停止传播
3、 检查DBA_QUEUE_SCHEDULES / DBA_PROPAGATION,确保传播进程,如果不用就是用kill -9杀掉操作系统的进程
4、 设置JOB_QUEUE_PROCESSES为0,等待几分钟过,确保CJQ进程和其他J进程都消失(OS下),然后再将JOB_QUEUE_PROCESSES设置成原来的值。
5、 用HC脚本
6、 使用DBMS_PROPAGATION_ADM.START_PROPAGATION开始传播
7、 检查DBA_QUEUE_SCHEDULES / DBA_PROPAGATION,确保开始的传播和它相相关的J进程。
8、 检查DBA_QUEUE_SCHEDULES列的TOTAL_NUMBER,TOTAL_BYTES ...如果有传播的话,这列值将会不断改变。
请联系Oracle支持工作,进一步诊断ORA-25307的错误