提高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或其他效率更高的方法来操作!