- 会话启动了一个控制文件事务(在提交事务之前更新所有控制文件为最新);
- 会话提交了一个事务到控制文件;
- 一个控制文件的条目被修改了,该修改要更新到所有控制文件上去
- 在保证控制文件的备份数量足够安全(不会出现控制文件全部丢失)的情况下使控制文件数量最少;
- 如果操作系统支持AIO,设置数据库支持AIO;
- 将控制文件转移到IO负载比较低的磁盘上去。
- 备份一个控制文件;
- RAC中在实例之间共享一个控制文件信息时;
- 读取控制文件的头数据块或者其他数据块时。
select P1 as FileName from V$SESSION_WAIT
where EVENT = 'control file sequetial read' and STATE='WAITING';
- 如果操作系统支持AIO,设置数据库支持AIO;
- 将控制文件转移到IO负载比较低的磁盘上去。
select P1 as FileName from V$SESSION_WAIT
where EVENT = 'control file single write' and STATE='WAITING';
- 如果操作系统支持AIO,设置数据库支持AIO;
- 将控制文件转移到IO负载比较低的磁盘上去。
- 不要使表空间长期处于热备状态。当表空间处于热备状态时,表空间不再被更新,Redo Log会急剧增加;
- 将Redo Log文件放在高速存储设备上,千万别放在RAID5上,可以考虑放在裸设备上;
- Redo log文件所在的磁盘应尽量避免有其他IO操作的存在;
- 对某些操作,如大批量数据导入,可以设置NOLOGGIN、UNRECOVERABLE选项,或者在SQL语句中使用提示/*+APPEND*/,以减少Redo Log的产生。
- 在确保Redo Log数据足够安全(不会发生Log文件丢失)的情况下,尽量减少Redo Log组的成员数;
- 在配置需要使用到Redo Log的功能时,如Streams复制、LogMiner、逻辑模式的DG,尽量设置为最低级别的补充日志(Supplemental Logging);
- 适当增加Log_buffer的大小
select retries.value/entries.value "Redo Log Buffer Retry Ratio"
from V$sysstat retries, V$sysstat entries
where retries.name = 'redo buffer allocation retries'
and entries.name = 'redo entries';
SELECT name, value
FROM v$sysstat
WHERE name = 'redo log space requests';
- 第二、三步的相关等待数据可以从statspack或awr的“redo write time”统计项获得;
- 第三步的等待时间和Log File Parallel Write的等待时间相同;
- 当系统负载非常高时,第五、六两步的时间就会很长,因为此时尽管LGWR进程已经通知了前台/用户进程写日志已经完成,但是系统负载太高,前台/用户进程需要等待操作系统安排其运行计划。
- 如果他们的等待时间差不多,则说明是Log文件的IO问题(即第三步)导致的Log File Sync等待,我们就需要优化Log文件的IO(如上一节所述的方法);
- 如果Log File Sync的等待时间远远大于Log File Parallel Write的等待时间,则说明Log File Sync是由于在提交或回滚时的其他Redo Log机制(非IO原因)引起的,如Latch Free、LGWR wait for copy等log buffer相关的latch冲突。
select (sum(decode(name, 'redo synch time', value)) / sum(decode(name, 'redo synch writes', value)))
/ (sum(decode(name, 'redo write time', value)) / sum(decode(name, 'redo writes', value)))
as sync_cost_ratio
from v$sysstat
where name in ('redo synch writes', 'redo synch time', 'redo writes', 'redo write time');
- 按照上一节中的方法减少Redo Log的产生、提供Redo Log的IO效率、减少Redo Log与其他IO的冲突;
- 将一些小事务合并成批量事务,以减少提交和回滚次数。
SQL> alter system switch logfile;
System altered.
- 从控制文件获取下一日志文件的文件号;
- 获取Redo Copy和Redo Allocation的Latch;
- 清空Redo,将buffer中的Redo记录写入Log文件中去;
- 关闭当前Redo Log文件;
- 更新控制文件,包括:
SQL> select GROUP#, ARCHIVED, STATUS from v$log;
GROUP# ARC STATUS
---------- --- ----------------
1 NO INACTIVE
3 NO INACTIVE
2 NO CURRENT
SQL> SELECT to_char(b.first_time, 'YYYY-MM-DD HH24:MI:SS') as swtich_time,
2 (b.first_time - a.first_time) * 24 as "switch_interval(hr)"
3 FROM v$log_history a, v$log_history b
4 WHERE a.SEQUENCE# + 1 = b.SEQUENCE#
5 AND ROWNUM <= 10
6 ORDER BY 1;
SWTICH_TIME switch_interval(hr)
------------------- -------------------
2007-08-25 00:28:59 2.3975
2007-08-25 06:04:53 5.59833333
2007-08-25 12:15:52 6.18305556
2007-08-25 21:58:13 9.70583333
2007-08-25 23:50:39 1.87388889
2007-08-26 00:28:42 .634166667
2007-08-26 08:32:04 8.05611111
2007-08-26 17:58:05 9.43361111
2007-08-26 23:26:57 5.48111111
2007-08-27 07:21:35 7.91055556
... ...
... ...
Beginning log switch checkpoint up to RBA [0x18106.2.10], SCN: 0x0003.93b3fb7d
Thread 1 advanced to log sequence 98566
Current log# 7 seq# 98566 mem# 0: /export/home/icssprd/data/data02/icssprd_redo_07a.rdo
Current log# 7 seq# 98566 mem# 1: /export/home/icssprd/data/data18/icssprd_redo_07b.rdo
Mon May 28 12:35:14 2007
ARC0: Evaluating archive log 2 thread 1 sequence 98565
ARC0: Beginning to archive log 2 thread 1 sequence 98565
Creating archive destination LOG_ARCHIVE_DEST_1: '/export/home/icssprd/admin/arch/1_98565.dbf'
Mon May 28 12:36:47 2007
Completed checkpoint up to RBA [0x18106.2.10], SCN: 0x0003.93b3fb7d
Mon May 28 12:38:02 2007
ARC0: Completed archiving log 2 thread 1 sequence 98565
Mon May 28 12:41:26 2007
Beginning log switch checkpoint up to RBA [0x18107.2.10], SCN: 0x0003.93b4a3a6
Thread 1 advanced to log sequence 98567
Current log# 8 seq# 98567 mem# 0: /export/home/icssprd/data/data10/icssprd_redo_08a.rdo
... ...
- 增加Redo Log文件的大小,使日志切换频率降低;
- 增大参数Log_checkpoint_interval大小,该参数设置系统两次checkpoint之间Redo Log数据块(该数据块的大小由操作系统的数据块大小决定)的数量。但是Oracle会限制这些数据块总的大小要小于最小log文件的90%。如最小log文件大小为100M,操作系统的数据块大小为512K,则Log_checkpoint_interval要小于(100 * 90% / 0.5) = 180
Thread 1 cannot allocate new log, sequence 9556
All online logs needed archiving