提高rollback的速度

提高rollback的速度

现象:

1、客户端使用sqlplus、rapid sql等工具响应较慢

2、主机cpu使用率较高,主要是IO等待很高

3、操作系统层面操作响应慢

过程:

1、查看alter日志,发现有大量如下信息:

Thread 1 cannot allocate new log, sequence xxxx

Checkpoint not complete

select group#,members,status from v$log;

发现只有3个group,每个group1个member(默认配置),而且一个状态是current,另外两个是active,很显然redo group不够。

2、查看后台进程,发现ora_p000...ora_p015共16个进程在运行,该主机2颗cpu,共8个核心,连接到数据库中查看FAST_START_PARALLEL_ROLLBACK参数值为LOW,即默认值。

这个值表明并行运行的回滚进程有2*number of cpu,刚好是16个进程,与使用ps –ef | grep ora_p看到的一致。

原因:

同事通过db_link向这个数据库插入数据(1千多万行),执行了一个多小时,看到未执行完毕,就停止并rollback了,因此产生大量的回滚!为什么回滚这么慢呢?由Checkpoint not complete可知redo log group太少,LGWR在切换到新的group时,需要等待DBWR把数据写入到datafile。

解决:

1、增加redo log group

alter database add logfile group 4 ('/usr/oracle/oradata/sid/redo04.log') size 209715200;

依次增加到10个group。根据需要适当添加,只要status出现inactive即可。

2、加快回滚速度

提高并行回滚进程的数量,设置为HIGH时回滚进程=4*cpu数。

ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK=HIGH

回滚操作由于要写入redo文件,其本身就是很消耗系统资源的。当在Oracle中回滚长期运行的事务时,需要查看V$SESSION_LONGOPS并评估还需要多少时间。

另:跨库插入大量数据时,最好找dba或系统管理员使用expdp/impdp或其他效率更高的方法来操作!

原文地址:https://www.cnblogs.com/wbzhao/p/2429072.html