REDO管理

标签: redo 管理 | 发表时间:2013-03-10 07:47 | 作者:guoyJoe
出处:http://blog.csdn.net
一、什么是REDO LOG

 REDOLOG文件是十分重要的文件,它记录了Oracle的所有变化,是数据库实例恢复机制中最为关键的组成部分。


  sys@OCM> select * from v$log;


    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME     NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------- ------------ --------------
         1          1         49   52428800        512          1 YES INACTIVE               2701394 09-3ÔÂ -13   2711001 09-3ÔÂ -13
         2          1         50   52428800        512          1 YES INACTIVE               2711001 09-3ÔÂ -13   2732482 10-3ÔÂ -13
         3          1         51   52428800        512          1 NO  CURRENT                2732482 10-3ÔÂ -13       2.8147E+14


  
sys@OCM> col member for a50     
sys@OCM> select * from v$logfile;


    GROUP# STATUS  TYPE    MEMBER                                             IS_
---------- ------- ------- -------------------------------------------------- ---
         3         ONLINE  /u01/app/oracle/oradata/ocm/redo03.log             NO
         2         ONLINE  /u01/app/oracle/oradata/ocm/redo02.log             NO
         1         ONLINE  /u01/app/oracle/oradata/ocm/redo01.log             NO


二、REDO LOG的作用

  1、记录ORACLE数据库的变化


  2、可以避免数据提交后直接写入数据文件


  3、实例恢复和介质恢复


三、REDO LOG的块
1、块的大小

  (1)dbfsize redo01.log


  (2)SELECT DISTINCT BLOCK_SIZE FROM V$ARCHIVED_LOG;


  (3)SELECT MAX(LEBSZ) FROM X$KCCLE;


 (4)日志文件头的内容

 ALTER SESSION SET EVENTS 'immediate trace name redohdr level 10';


2、REDO的内容

 (1)改变矢量(Change Vector)


   (2)重做记录(Redo Record)


 (3)一条插入的产生的日志
  create table t5(id int,name varchar2(100));
  select max(ktuxescnw * power(2,32)+ktuxescnb) from x$ktuxe;--[K]ernel [T]ransaction [U]ndo Transa[x]tion Entry
  insert into t5 values(1,'AAAAAA');
  commit;
  select max(ktuxescnw * power(2,32)+ktuxescnb) from x$ktuxe;
  alter system dump logfile '/u01/app/oracle/oradata/ocp/redo02.log' scn min 1694394 scn max 1693357;


四、和REDO LOG性能相关的组件

    1、记录实例中的数据库变化


   2、顺序存取


    3、环状的缓冲区 


    4、LOG_BUFFER定义了缓冲区的大小

   (1)9i以前,一般是3M


   (2)在10g中ORACLE会自动调整它的值,他遵循这样一个原则,'Fixed SGA Size'+ 'Redo Buffers'是granule size 的整数倍
select * from v$sgainfo where name in ('Fixed SGA Size','Redo Buffers','Granule Size');
--在10.2.0.3 中Log Buffer 默认值是14M,在10.2.0.4中,默认值是15M
select * from v$version where rownum<2;


   5、LGWR 
  (1)、LGWR写的具体过程:

   ①先尝试获取redo writing latch,确保其他process不会继续触发lgwr(这里可能会产生log file sync等待事件)


    ②获取redo allocation latch(public redo allocation latch),防止有新的change vector继续写入log buffer,造成LGWR无法确定应该写多少redo


    ③LGWR确定写的范围(从上次lgwr启动所写的最后一个日志块到这个时间点时的最后一个被使用的所有写满or未写满的日志块)此时前台process仍可以向这个范围内的redo block(buffer)写内容(从PGA写)所以lgwr不阻碍其它进程获得redo copy latch(即:不阻止其它进程向log buffer 中可用块中写change vector)


     ④确定redo block(buffer)后生成新SCN号


    ⑤LGWR释放redo allocation latch与redo writing latch


    ⑥LGWR需要等待 其它进程对要写入日志文件的block的更新操作完成(pga-log buffer的操作),通过判断日志block(buffer)上的redo copy latch是否都释放


    ⑦将第4步scn号copy到要写入logfile的log buffer的块头里,然后触发物理的写操作,将这些待写日志块写入redo file


  (2)LGWR触发写日志的条件:

     ①LGWR每3秒钟


     ③LOG_BUFFER写入的数量超过LOG BUFFER的1/3


     ④LOG BUFFER中有超过1M的数据


     ⑤DBWR写入数据文件之前,DBWR需要写入的数据的SCN大于LGWR记录的SCN,DBWR触LGWR写入(日志优先)


 6、REDO LOG组

  (1)Oracle循环使用REDO LOG组


  (2)REDO LOG组的数量对数据库的影响

     ①日志切换等待


     ②系统由于等待日志切换而HANG住


   (3)REDO LOG组的数量

      ①缺省3组(10g)


      ②根据实际需要设置


      ③增加日志组的数量对数据库性能无直接影响


      ④可在线添加日志组
   alter database add logfile group 4 '/opt/oracle/oradata/dbtest/redo04_1.log' SIZE 100M
   alter database drop logfile group 1;
   alter system siwtch logfile;
  
 7、REDO LOG组的镜像

  (1)REDO LOG镜像的主要目的是加强REDO LOG的安全性


  (2)镜像设置的原则

     ①同一个数据库中设置镜像的规则应该一致 --不同的日志组设相同的成员



     ②多个镜像文件应该存放在不同的VG或者文件系统上 --坏一个vg不影响数据库


     ③不同镜像最好能够分布在不同的磁盘上  --IO


     ④镜像的数量以一个为宜                --IO


  (3)镜像对数据库性能的影响

     ①REDO LOG镜像会消耗较多的IO资源


     ②IO性能不佳的系统慎用


     ③小型写性能不佳的系统慎用
   alter database add logfile member '/opt/oracle/oradata/dbtest/redo04_3.log' to group 4
   alter database drop logfile member '/u01/app/oracle/oradata/ocp/redo01_2.log';


8、日志切换
 (1)日志切换的场景

   ①当前日志文件满后


   ②ALTER SYSTEM SWITCH LOGFILE;


   ③ALTER SYSTEM ARCHIVE LOG CURRENT;--所有实例的当前日志


 (2)日志切换的过程

    ①读控制文件,选择下一个日志文件,并清除控制文件中的相关记录。如果DBW进程正在进行日志切换检查点,或者ARCHn进程正在归档日志内容,那么LGWR会等待这些操作完成才进行日志切换工作。


    ②把当前没有存盘的所有LOG BUFFER都写入磁盘,然后把最后一个REDO记录的SCN写入LOG文件的头块中。完成这些操作后,LGWR关闭当前的日志文件。


    ③进行第二次读控制文件,把下一个日志文件的状态设置为CURRENT,老的日志文件修改为ACTIVE。当DBW完成日志切换检查点和归档操作后,这个日志文件的状态会被改为INACTIVE。


    ④打开新日志文件的所有成员(如果组中有超过1个成员),并在文件头中写入一个新的日志序列号和low SCN。然后修改SGA控制变量,允许生成REDO信息。要注意的是,因为写入文件头的信息包括文件编号,因此写文件头的操作不是并行操作,对于同组的不同成员,写入的数据不是完全一致的。


五、性能相关

  1、REDO LOG文件的大小与日志切换

  (1)日志切换对系统性能的影响


      ①日志文件切换时,系统将处于完全的等待状态


      ②日志文件切换过于频繁,会影响系统的性能


      ③日志文件切换时间过长,会严重影响系统的性能


(2)日志切换与日志文件的大小

      ①日志文件越小,日志切换越频繁


      ②日志文件越大,每个日志文件中包含的变化越多


      ③日志文件切换以10-30分钟为宜


      ④日志文件大小一般在100M-2000M之间


  (3)问题场景
       Thread 1 cannot allocate new log,sequence 69
       Checkpoint not complete
       current log#2 seq# 68 mem# 0:/oradata/bxdb/redo02.log
       等待事件:
       log file switch(checkpoint incomplete)
       log file switch(archiving needed)


  2、等待事件:log file sync
     (1)问题场景
       发出commit:

        开始commit-->logfile sync等待开始--->lgwr开始-->lgwr完成(IO)-->logfile sync等待结束--commit完成


     (2)解决方法:

       ①IO性能来解决这个问题:RAID 5--->RAID 1+0


       ②加大LOG BUFFER


       ③减少提交的次数


       ④把部分经常提交的事务设置为异步提交:ALTER SESSION SET COMMIT_WRITE = NOWAIT;
         


  (3)nologging使用
    表空间:1.nologgin,2.force logging
    alter tablespace test3 nologging;
    create table a(id int) tablespace test3; //test3-->nologging
    alter tablespace test3 no force logging;
    表:1.no force logging start  2.表本身no logging(alter table a nologging;)  3.使用append插入
    insert /*+ append */ into test3 select * from t3;
    *************supplemental
    select supplemental_log_data_min,supplemental_log_data_pk from v$databae;
    alter database add supplemental log data; --rowid
    alter database add supplemental log data(primary key) columns; --primary


六、开启归档模式
   SELECT log_mode FROM v$database;
   ARCHIVE LOG LIST;
   alter system set log_archive_dest_1 = 'LOCATION=/u01/app/oracle/archivelog3';
   shutdown immediate;
   startup mount;
   alter database archivelog;
   select dest_name,status,archiver,destination,log_sequence,reopen_secs,transmit_mode,process
   from v$archive_dest;  --归档路径及状态
   select name,sequence#,registrar,standby_dest,archived,status from v$archived_log;--从控制文件中获得归档的相关信息
   v$log_history          --控制文件中日志的历史信息
   v$archive_processes    --归档相关的后台进程信息

   select member,bytes/1024/1024 from v$log a,v$logfile b where a.group#=b.group#;





**********本博客所有内容均为原创,如有转载请注明作者和出处!!!**********
Name:    guoyJoe

QQ:        252803295

Email:    [email protected]

Blog:       http://blog.csdn.net/guoyJoe

ITPUB:    http://www.itpub.net/space-uid-28460966.html

OCM:     http://education.oracle.com/education/otn/YGuo.HTM
_____________________________________________________________
加群验证问题:哪些SGA结构是必需的,哪些是可选的?否则拒绝申请!!!

答案在: http://blog.csdn.net/guoyjoe/article/details/8624392

Oracle@Paradise  总群:127149411

Oracle@Paradise No.1群:177089463(已满)

Oracle@Paradise No.2群:121341761

Oracle@Paradise No.3群:140856036



作者:guoyJoe 发表于2013-3-10 7:47:46 原文链接
阅读:92 评论:0 查看评论

相关 [redo 管理] 推荐:

REDO管理

- - CSDN博客数据库推荐文章
一、什么是REDO LOG.  REDOLOG文件是十分重要的文件,它记录了Oracle的所有变化,是数据库实例恢复机制中最为关键的组成部分.     GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME     NEXT_CHANGE# NEXT_TIME.

Oracle online redo log 扫盲

- - CSDN博客数据库推荐文章
Oracle 的日志分为:ONLINE REDO LOG 和 archived log. 一个数据库至少要有2组 redo log,每组 redo log 至少要有一个 member(出于安全考虑,建议每组 redo log 至少有 2 个多元化的 redo log member). redo log 循环使用,当一组日志写满后,就会切换到下一组日志.

Redo write触发的四种情况

- - CSDN博客推荐文章
1、当LGWR空闲的时候,会每隔3秒检查一次是否有从redo buffer写入redelog中的数据,如果有,一个后台进程就会自动的执行将其写入. 2、当有进程要从redo buffer中分配空间时,会先计算redo buffer中已经占用的空间,如果该空间大于_log_io_size这个参数值,并且此时的LGWR处于空闲状态,便会被激活执行后台写.

redo log大量生成的诊断处理流程

- - CSDN博客推荐文章
redo log大量生成的诊断处理流程. 本文是原创文章,转载请注明出处:. 1.获得归档日志暴增时段的一个归档日志:可以查询v$archived_log视图,结合completion_time列进行定位. 2.对该归档日志进行转储dump.    --请将路径修改成当时的redo归档的路径.   以上命令会在user_dump_dest中生成一个trace文件,请将该trace文件传到linux中(root用户or oracle用户均可).

如何定位那些SQL产生了大量的redo日志

- - ImportNew
在ORACLE数据库的管理、维护过程中,偶尔会遇到归档日志暴增的情况,也就是说一些SQL语句产生了大量的redo log,那么如何跟踪、定位哪些SQL语句生成了大量的redo log日志呢. 下面这篇文章结合实际案例和官方文档“How to identify the causes of High Redo Generation (文档 ID 2265722.1)”来实验验证一下.

必须了解的MySQL三大日志:binlog、redo log和undo log

- - DockOne.io
日志是 MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息. MySQL日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类. 作为开发,我们重点需要关注的是二进制日志( binlog)和事务日志(包括 redo log和 undo log),本文接下来会详细介绍这三种日志.

理解数据库中的undo日志、redo日志、检查点 | 乐天的个人网站

- -
数据库存放数据的文件,本文称其为data file. 数据库的内容在内存里是有缓存的,这里命名为db buffer. 某次操作,我们取了数据库某表格中的数据,这个数据会在内存中缓存一些时间. 对这个数据的修改在开始时候也只是修改在内存中的内容. 当db buffer已满或者遇到其他的情况,这些数据会写入data file.

管理

- - 人月神话的BLOG
对于中小企业而言现在管理上欠缺的不是人治或者说儒家佛家等东方管理思想,而真正欠缺的是西方法治的科学管理方法. 现在很多中小企业花很多钱去听什么东方管理思想的培训是误入歧途,东西方管理思想需要融合,但是基础还是科学的管理方法和模式. 而在这个里面最重要的仍然是流程管理,知识管理,质量管理,项目管理这些内容,而不是简单的纯管理.

日志管理

- - CSDN博客系统运维推荐文章
#很关键 [root@client01 ~]# ls /var/log/ anaconda.ifcfg.log. tallylog #关键日志,大部分记录在里面 [root@client01 ~]# ls /var/log/messages /var/log/messages. [root@client01 ~]# ps -ef|grep log #系统日志服务 root.

Firefox 权限管理

- Daimon - LinuxTOY
在最近的 Firefox 6 中引入了一个新的权限管理组件,可以细致的调整访问的每个网站权限. 该功能已经内置到 Firefox 6 以后的版本中,在地址栏输入 about:permissions 打开如下图所示:. 新的界面十分直观,希望可以更方便用户细微调整隐私策略. 消息来源:Pinguy OS Blog.