实例优化——redo_log_buffer

用户修改一条数据时,redo的一系列的行为
1,用户发出一条SQL语句,Oracle为该事务分配了唯一的事务号
2,服务器进程负责将需要的数据、索引和undo数据读入内存,并将要更新的行加锁
3,服务器进程获得重做拷贝闩锁(闩锁实现对redo_buffer的串行使用),该闩锁是服务器进程访问redo_log_buffer
的第一步。此时如果,没有其他的闩锁使用,则别的服务器进程无法使用redo_log_buffer
4,服务器进程获得重做分配闩锁从而获得在redo_log_buffer中的预留空间,此时释放重做分配闩锁
5,服务器进程利用重做拷贝闩锁把 重做项(更新数据的原始值,操作类型,事务号等信息)写入redo_log_buffer
中,然后释放重做拷贝闩锁
6,服务器进程把还原信息写入该事务相关的undo段中,undo段在用户使用rollback时使用
7,服务器进程更新锁住的数据,将回滚所需的原始值和对数据所做的修改都写入db_buffer_cache中,然后
db_buffer_cache的这些数据被标记为脏数据
========================================


LGWR把redo_log_buffer的数据写入redofiles条件:
1,3秒
2,1/3,特别说明,并不是redo_log_buffer永远不会超过其1/3容量,而是说当redo_log_buffer的数据量
达到其容量的1/3这个阀值时,LGWR会写出其中的数据,而剩下的2/3的数据可以供其他服务器进程使用
3,checkpoint
4,commit
5,DBWR写之前

SQL> show parameter log_buffer

NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
log_buffer                           integer                          11187200

============================================================

查看会话的等待事件
SQL> col event for a35
SQL> col username for a10
SQL> select sw.sid,s.username,sw.event,sw.wait_time
  2  from v$session s,v$session_wait sw
  3  where sw.event not like 'rdbms%'
  4  and sw.sid=s.sid
  5  order by sw.wait_time,sw.event;

       SID USERNAME   EVENT                                WAIT_TIME
---------- ---------- ----------------------------------- ----------
       142 SYS     SQL*Net message to client                   -1
       151            Streams AQ: qmn coordinator idle wa          0
                         it

       146            Streams AQ: qmn slave idle wait              0
       148            Streams AQ: waiting for time manage          0
                          ment or cleanup tasks

       139            jobq slave wait                              0
       158            jobq slave wait                              0
       159            jobq slave wait                              0
       143            jobq slave wait                              0
       170            pmon timer                                   0
       165            smon timer                                   0

10 rows selected.


Log bufffer space
说明:缺少redo_log_buffer空间
原因:
1,一般是服务器进程写入速度比LGWR的写出速度快——调整redo_log_buffer大小
2,redo_files所在磁盘速度慢——将重做日志文件迁移到高速磁盘
3,设备争用——将重做日志文件和数据文件或归档放在不同磁盘上

Log file parallel write
说明:日志文件并行写等待,是将redo_log_buffer中的数据写入磁盘引起的等待事件
原因:
1,一般是日志文件所在的磁盘慢——同上,换高速设备
2,磁盘争用——同上,分散

Log file single write
说明:与写日志文件头块有关,表示检查点中的等待

Log file switch(archiving needed)
说明:日志文件切换等待。——当日志组,写完一圈后,而归档还未完成,日志切换不过了
原因:
1,I/O问题——分开日志文件,减少磁盘争用
2,ARCH归档进程跟不上LGWR进程的速度——启动多个ARCH进程或I/O进程
3,日志组太少——增加日志组

Log file switch(checkpoint incomplete)
说明:日志切换频繁,造成checkpoint排队
原因:
1,一般是redo_log_buffer太小——增加redo_log_buffer大小
2,日志组太小——加日志组

Log file sync
说明:当用户commit时,redo_log_buffer中的数据会一次全部写到重做日志文件中,
此时发生LGWR的写出等待
原因:
1,磁盘争用
2,磁盘速度慢

Latch free
说明:是当前的服务器进程需要某个闩锁,比如等待共享池的library_cache闩锁
通过v$latch查看相关的闩锁命中率
SQL> select LATCH#,NAME,GETS,MISSES,1-(MISSES/(GETS+MISSES)) "gets rate"
  2  from v$latch
  3  where MISSES > 1;

    LATCH# NAME                       GETS     MISSES  gets rate——进一步确认闩锁的命中率
---------- -------------------- ---------- ---------- ----------
        42 slave class create          150         10      .9375
       213 shared pool             2483935          9 .999996377
       148 redo allocation           86149        870 .990002183
       117 cache buffers lru ch     420467          3 .999992865
           ain

        17 messages                 412799         19 .999953975
       131 object queue header      701391          2 .999997149
           operation

       136 archive process latc      18453          2 .999891628
           h

       214 library cache           4006075          6 .999998502
       323 qmn task queue latch       7450        238 .969042664
       109 Memory Management La        697          5 .992877493
           tch

       146 redo writing             121231          2 .999983503

11 rows selected.

==============================================================

SQL> show parameter log_buffer;

NAME                                 TYPE                    VALUE
------------------------------------ ------------- ----------------
log_buffer                           integer             11187200——单位是字节,设置时也必须用字节来修改

SQL> select name,value/(1024*1024) M
  2  from v$parameter
  3  where name = 'log_buffer';

NAME                          M
-------------------- ----------
log_buffer           10.6689453


假设要设置为15M,转换为字节
SQL> select 15*1024*1024 bytes from dual;

     BYTES
----------
  15728640

SQL> alter system set log_buffer = 15728640 scope=spfile;

System altered.

SQL> shutdown immediate
SQL> startup
SQL> show parameter log_buffer

NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
log_buffer                           integer                          19446784

SQL> select 19446784/1024/1024 MB from dual;

        MB
----------
18.5458984——这里的buffer大小为15M,但是其数值为18.5458984M,是因为Oracle会根据系统情况做一些调整

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26465805/viewspace-713102/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26465805/viewspace-713102/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值