zoukankan      html  css  js  c++  java
  • 手动创建数据库实例全攻略8:REDO

    一、REDO的相关概念和实验

    文章来源:http://blog.csdn.net/robinson_0612/article/details/5749556
    
    一、ORACLE常见日志
    Redo log files      -->联机重做日志
    Archive log files   -->归档日志
    Alert log files     -->告警日志
    Trace files         -->跟踪日志
    user_dump_dest          -->用户跟踪日志
    backupground_dump_dest  -->进程跟踪日志
    
    二、联机重做日志的规划管理
    1.联机重做日志                                                                                                                 
      记录了数据的所有变化(DML,DDL或管理员对数据所作的结构性更改等)                                                          
      提供恢复机制(对于意外删除或宕机利用日志文件实现数据恢复)                                                               
      可以被分组管理                                                                                                         
                                                                                                                                   
    2.联机重做日志组                                                                                                           
        由一个或多个相同的联机日志文件组成一个联机重做日志组                                                                   
      至少两个日志组,每组一个成员(建议每组两个成员,分散放开到不同的磁盘)                                                   
      由LGWR后台进程同时将日志内容写入到一个组的所有成员                                                                     
      LGWR的触发条件                                                                                                     
            在事务提交的时候(COMMIT)                                                                                       
            Redo Log Buffer 三分之一满                                                                                     
            Redo Log Buffer 多于一兆的变化记录                                                                             
            在DBWn写入数据文件之前                                                                                         
                                                                                                                                   
    3.联机重做日志成员                                                                                                         
            重做日志组内的每一个联机日志文件称为一个成员                                                                           
            一个组内的每一个成员具有相同的日志序列号(log sequence number),且成员的大小相同                                         
            每次日志切换时,Oracle服务器分配一个新的LSN号给即将写入日志的日志文件组                                                
            LSN号用于唯一区分每一个联机日志组和归档日志                                                                            
            处于归档模式的联机日志,LSN号在归档时也被写入到归档日志之中                                                            
                                                                                                                                   
    4.日志文件的工作方式                                                                                                       
            日志文件采用按顺序循环写的方式                                                                                         
            当一组联机日志组写满,LGWR则将日志写入到下一组,当最后一组写满则从第一组开始写入                                       
            写入下一组的过程称为日志切换                                                                                           
            切换时发生检查点过程                                                                                                   
            检查点的信息同时写入到控制文件                                                                                         
                                                                                                                                   
    5.联机日志文件的规划                                                                                                       
    总原则                                                                                                                 
       分散放开,多路复用                                                                                                 
       日志所在的磁盘应当具有较高的I/O                                                                                    
       一般日志组大小应满足自动切换间隔至少15-20分钟左右业务需求                                                          
       建议使用rdo结尾的日志文件名,避免误删日志文件。如redo1.rdo,redo2.rdo                                               
       规划样例                                                                                                               
                Redo Log Group1     Redo Log Group2     Redo Log Group3                                                                                                                                                                                        
                Member1             Member1              Member1            -->Physical Disk 1                                     
        
                Member2             Member2              Member2            -->Physical Disk 2                                     
                                                                                                                                   
                Member3             Member3              Member3            -->Physical Disk 3                                     
                                                                                                                                   
    6.日志切换和检查点切换                                                                                                     
            ALTER SYSTEM SWITCH LOGFILE;   --强制手动切换                                                                                                                                                                                                        
            ALTER SYSTEM CHECKPOINT;                                                                                               
                                                                                                                                   
            强制设置检查点间隔                                                                                                     
            ALTER SYSTEM SET FAST_START_MTTR_TARGET = n                                                                            
                                                                                                                                   
    7.添加日志文件组                                                                                                           
            ALTER DATABASE ADD LOGFILE [GROUP n]                                                                                   
                ('$ORACLE_BASE/oradata/u01/logn1.rdo',                                                                             
                 '$ORACLE_BASE/oradata/u01/logn2.rdo')                                                                             
                SIZE mM;                                                                                                           
                                                                                                                                   
    8.添加日志成员                                                                                                             
            ALTER DATABASE ADD LOGFILE MEMBER                                                                                      
            '$ORACLE_BASE/oradata/u01/logn1.rdo' TO GROUP 1,                                                                       
            '$ORACLE_BASE/oradata/u01/logn2.rdo' TO GROUP 2;                                                                       
                                                                                                                                   
    9.删除日志成员                                                                                                             
            不能删除组内的唯一一个成员                                                                                             
            不能删除处于active 和current 状态组内的成员                                                                            
            删除处于active 和current 状态组内的成员,应使用日志切换使其处于INACTIVE状态后再删除                                    
            对于组内如果一个成员为NULL 值,一个为INVALID,且组处入INACTIVE,仅能删除INVALID状态成员                                
            删除日志成员,物理文件并没有真正删除,需要手动删除                                                                     
            删除日志文件后,控制文件被更新                                                                                         
            对于处于归档模式下的数据库,删除成员时确保日志已被归档,查看v$log视图获得归档信息                                      
            ALTER DATABASE DROP LOGFILE MEMBER '$ORACLE_BASE/oradata/u01/logn1.rdo'                                                
                                                                                                                                   
    10.删除日志组                                                                                                              
            一个实例至少需要两个联机日志文件组                                                                                     
            活动或当前的日志组不能被删除                                                                                           
            组内成员状态有NULL 值或INVALID状态并存,组不可删除                                                                     
            日志组被删除后,物理文件需要手动删除(对于非OMF)                                                                        
            ALTER DATABASE DROP LOGFILE GROUP n                                                                                    
                                                                                                                                   
    11.日志的重定位及重命名                                                                                                    
            所需权限                                                                                                               
            ALTER DATABASE 系统权限                                                                                            
           复制文件到目的位置操作系统权限(写权限)                                                                             
            CURRENT状态组内的成员不能被重命名                                                                                      
            建议该行为之前备份数据库                                                                                               
            重命名或重定位之后建议立即备份控制文件                                                                                 
            重定位及重命名的两种方法                                                                                               
                添加一个新成员到日志组,然后删除一个旧的成员                                                                       
                使用ALTER DATABASE RENAME FILE 命令(不区分归档与非归档模式)                                                        
                    复制联机日志文件到新路径:ho cp <oldfile> <newfile>                                                             
                    执行ALTER DATABASE RENAME FILE '<oldfile>' TO '<newfile>'                                                      
                对于处于CURRENT状态的需要改名且不切换的情况下                                                                      
                    办法是切换到MOUNT状态下再执行上述操作                                                                          
                                                                                                                                   
    12.清空日志文件组                                                                                                          
            ALTER DATABASE CLEAR LOGIFLE GROUP n                                                                                   
            ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP n --使用unarchived 避免归档                                              
                                                                                                                                   
    13.日志周期循环及切换分析                                                                                                  
                                                                                                                                   
            Group 1      Group 2      Group 3                                                                                      
                                                                                                                                   
            Current      Inactive     Inactive                                                                                     
            ---------- Log Switch -------------                                                                                    
            Active       Current      Inactive                                                                                     
            ---------- Log Switch -------------                                                                                    
            Active       Active       Current                                                                                      
            ---------- Log Switch -------------                                                                                    
            Current      Inactive     Inactive                                                                                     
                                                                                                                                   
            --Active 和Current 称之为在一个循环周期之内(按顺序写日志)                                                              
            --Inactive 称为一个周期之外(一个新的循环)                                                                              
            --新一轮循环开始如在归档状态则先归档再清空,否则直接清空日志                                                           
            --数据库启动时Active 和Current 状态的日志不能丢失,否则出错                                                            
                                                                                                                                   
        14.日志的监视                                                                                                              
            查看日志视图中的物理日志文件是否存在、位置、大小等                                                                     
                SELECT 'ho cp '||member FROM v$logfile;                                                                            
            查看日志文件所处的磁盘空间是否足够                                                                                     
                SQL> ho df -h                                                                                                      
            查看组内是否存在多个成员,如为单一成员应考虑增加日志成员                                                               
            日志切换的间隔时间,应满足15-20分钟业务需求,如果切换间隔很短,应当增加日志文件的大小                                  
                增加方法,先删除日志组,再重建该组(对于current和active的需要切换再做处理)                                          
                                                                                                                                   
            --查看切换时间间隔(下面的示例中为手工切换的时间,不作考虑)                                                             
            SQL> SELECT TO_CHAR(first_time,'yyyy-mm-dd hh24:mi:ss'),group# FROM v$log;                                             
                                                                                                                                   
            TO_CHAR(FIRST_TIME,     GROUP#                                                                                         
            ------------------- ----------                                                                                         
            2010-07-20 09:43:18          1                                                                                         
            2010-07-19 22:44:30          2                                                                                         
            2010-07-19 22:44:32          3                                                                                         
                                                                                                                                   
        15.日志的异常处理(参照演示中9小节)                                                                                         
            不一致的情况(启动时)                                                                                                   
                ALTER DATABASE CLEAR LOGFILE GROUP n                                                                               
                ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP n                                                                    
                                                                                                                                   
    三、与日志有关的动态性能视图                                                                                                   
            V$LOG                                                                                                                  
            V$LOGFILE                                                                                                                                                                                                                                  
            V$LOG中STATUS的状态值                                                                                                  
                UNUSED: 从未对该联机日志写入任何内容,一般为新增加联机日志文件或是使用resetlog后的状态                             
                CURRENT:当前重做日志文件,表示该重做日志文件为活动状态,能够被打开和关闭                                          
                ACTIVE:处于活动状态,不属于当前日志,崩溃恢复需要该状态,可用于块恢复,可能归档,也可能未归档                     
                CLEARING:表示在执行alter database clear logfile命令后正将该日志重建为一个空日志,重建后状态变为unused             
                CLEARING_CURRENT:当前日志处于关闭线程的清除状态。如日志某些故障或写入新日志标头时发生I/O错误                       
                INACTIVE:实例恢复不在需要联机重做文件日志组,可能归档也可能未归档                                                  
                                                                                                                                   
            V$LOGFILE中STATUS的状态值                                                                                              
                INVALID :表明该文件不可访问                                                                                        
                STALE :表明文件内容不完全                                                                                          
                DELETED : 表明该文件不再使用                                                                                       
                NULL :表明文件正在使用                                                                                            
                                                                                                                                   
    四、演示                                                                                                                       
        --1.查看当前数据库的日志                                                                                                   
            SQL> SELECT * FROM v$log;                                                                                              
                                                                                                                                   
                GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM                    
            ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------                    
                     1          1          5   52428800          1 NO  CURRENT                2758062 19-JUL-10                    
                     2          1          3   52428800          2 YES INACTIVE               2695010 16-JUL-10                    
                     3          1          4  104857600          2 YES INACTIVE               2716552 18-JUL-10                    
                                                                                                                                   
                                                                                                                                   
            SQL> SELECT * FROM v$logfile ORDER BY group#;                                                                          
                                                                                                                                   
                GROUP# STATUS  TYPE    MEMBER                                                  IS_                                 
            ---------- ------- ------- ------------------------------------------------------- ---                                 
                     1         ONLINE  /u01/app/oracle/oradata/orcl/redo01.log                 NO                                  
                     2 STALE   ONLINE  /u01/app/oracle/oradata/orcl/redo02.log                 NO                                  
                     2 STALE   ONLINE  /u01/app/oracle/oradata/orcl/redo2.log                  NO                                  
                     3 STALE   ONLINE  /u01/app/oracle/oradata/orcl/redo03.log                 NO                                  
                     3 STALE   ONLINE  /u01/app/oracle/oradata/orcl/redo3.log                  NO                                  
                                                                                                                                   
        --2.添加日志组                                                                                                             
            SQL> SELECT * FROM v$logfile;                                                                                          
                                                                                                                                   
                GROUP# STATUS  TYPE    MEMBER                                                  IS_                                 
            ---------- ------- ------- ------------------------------------------------------- ---                                 
                     2 STALE   ONLINE  /u01/app/oracle/oradata/orcl/redo2.log                  NO                                  
                     2 STALE   ONLINE  /u01/app/oracle/oradata/orcl/redo02.log                 NO                                  
                     1         ONLINE  /u01/app/oracle/oradata/orcl/redo01.log                 NO                                  
                     3 STALE   ONLINE  /u01/app/oracle/oradata/orcl/redo3.log                  NO                                  
                     3 STALE   ONLINE  /u01/app/oracle/oradata/orcl/redo03.log                 NO                                  
                     4         ONLINE  /u01/app/oracle/oradata/orcl/redo4.log                  NO                                  
                     4         ONLINE  /u01/app/oracle/oradata/orcl/redo04.log                 NO                                  
                                                                                                                                   
        --3.添加日志成员                                                                                                           
            SQL> ALTER DATABASE ADD LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo1.log' TO GROUP 1;                            
                                                                                                                                   
            Database altered.                                                                                                      
                                                                                                                                   
            SQL> SELECT * FROM v$logfile WHERE group# = 1 ;                                                                        
                                                                                                                                   
                GROUP# STATUS  TYPE    MEMBER                                                  IS_                                 
            ---------- ------- ------- ------------------------------------------------------- ---                                 
                     1         ONLINE  /u01/app/oracle/oradata/orcl/redo01.log                 NO                                  
                     1 INVALID ONLINE  /u01/app/oracle/oradata/orcl/redo1.log                  NO                                  
                                                                                                                                   
        --4.删除日志成员                                                                                                           
            SQL> ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo01.log';                                     
            ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo01.log'                                           
            *                                                                                                                      
            ERROR at line 1:  --redo01.log处于NULL状态且该日志组为current状态不能删除                                              
            ORA-00362: member is required to form a valid logfile in group 1                                                       
            ORA-01517: log member: '/u01/app/oracle/oradata/orcl/redo01.log'                                                       
                                                                                                                                   
                                                                                                                                   
            SQL> ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo04.log';                                     
                                                                                                                                   
            Database altered.                                                                                                      
                                                                                                                                   
            SQL>  ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo4.log';                                     
             ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo4.log'                                           
            *                                                                                                                      
            ERROR at line 1:   --最后一个日志成员不能被删除                                                                        
            ORA-00361: cannot remove last log member /u01/app/oracle/oradata/orcl/redo4.log for group 4                            
                                                                                                                                   
        --5.日志切换                                                                                                               
            SQL> SELECT * FROM v$log;  --当前的日志组处于CURRENT状态                                                               
                                                                                                                                   
                GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM                    
            ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------                    
                     1          1          5   52428800          2 NO  CURRENT                2758062 19-JUL-10                    
                     2          1          3   52428800          2 YES INACTIVE               2695010 16-JUL-10                    
                     3          1          4  104857600          2 YES INACTIVE               2716552 18-JUL-10                    
                     4          1          0   31457280          1 YES UNUSED                       0                              
                                                                                                                                   
            SQL> ALTER SYSTEM SWITCH LOGFILE;  --进行日志切换                                                                      
                                                                                                                                   
            System altered.                                                                                                        
                                                                                                                                   
            SQL> SELECT * FROM v$log;    --原来的日志组4的unused状态变为current状态                                                
                                                                                                                                   
                GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM                    
            ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------                    
                     1          1          5   52428800          2 YES ACTIVE                 2758062 19-JUL-10                    
                     2          1          3   52428800          2 YES INACTIVE               2695010 16-JUL-10                    
                     3          1          4  104857600          2 YES INACTIVE               2716552 18-JUL-10                    
                     4          1          6   31457280          1 NO  CURRENT                2759277 19-JUL-10                    
                                                                                                                                   
            SQL> ALTER SYSTEM SWITCH LOGFILE;   --再次进行日志切换                                                                 
                                                                                                                                   
            System altered.                                                                                                        
                                                                                                                                   
            SQL> SELECT * FROM v$log;          --日志组1变为current且组4变为active 状态                                            
                                                                                                                                   
                GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM                    
            ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------                    
                     1          1          5   52428800          2 YES ACTIVE                 2758062 19-JUL-10                    
                     2          1          7   52428800          2 NO  CURRENT                2759293 19-JUL-10                    
                     3          1          4  104857600          2 YES INACTIVE               2716552 18-JUL-10                    
                     4          1          6   31457280          1 YES ACTIVE                 2759277 19-JUL-10                    
                                                                                                                                   
        由上可得知,在日志切换时对于unused组将优先作为下一组切换对象                                                               
            --再次删除redo01.log还是收到错误提示                                                                                   
            SQL> ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo01.log';                                     
            ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo01.log'                                           
            *                                                                                                                      
            ERROR at line 1:                                                                                                       
            ORA-00362: member is required to form a valid logfile in group 1                                                       
            ORA-01517: log member: '/u01/app/oracle/oradata/orcl/redo01.log'                                                       
                                                                                                                                   
            SQL> ALTER SYSTEM SWITCH LOGFILE;  --再次进行日志切换                                                                  
                                                                                                                                   
            System altered.                                                                                                        
                                                                                                                                   
            SQL> SELECT * FROM v$log;          --group1变为inactive                                                                
                                                                                                                                   
                GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM                    
            ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------                    
                     1          1          5   52428800          2 YES INACTIVE               2758062 19-JUL-10                    
                     2          1          7   52428800          2 YES ACTIVE                 2759293 19-JUL-10                    
                     3          1          8  104857600          2 NO  CURRENT                2759420 19-JUL-10                    
                     4          1          6   31457280          1 YES INACTIVE               2759277 19-JUL-10                    
                                                                                                                                   
            --反复多切几次日志之后redo01.log被成功删除                                                                             
            SQL>  ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo01.log';                                    
                                                                                                                                   
        Database altered.                                                                                                          
                                                                                                                                   
        --6.删除日志组(CURRENT和ACTIVE状态的不能被删除)                                                                            
            SQL> SELECT * FROM v$log;                                                                                              
                                                                                                                                   
                GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM                    
            ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------                    
                     1          1          9   52428800          1 YES ACTIVE                 2759487 19-JUL-10                    
                     2          1         11   52428800          2 NO  CURRENT                2759502 19-JUL-10                    
                     3          1          8  104857600          2 YES ACTIVE                 2759420 19-JUL-10                    
                     4          1         10   31457280          1 YES ACTIVE                 2759499 19-JUL-10                    
                                                                                                                                   
            SQL> ALTER DATABASE DROP LOGFILE GROUP 4;                                                                              
            ALTER DATABASE DROP LOGFILE GROUP 4                                                                                    
            *                                                                                                                      
            ERROR at line 1:   --处于活动状态的group4 用于灾难恢复,不能被删除                                                     
            ORA-01624: log 4 needed for crash recovery of instance orcl (thread 1)                                                 
            ORA-00312: online log 4 thread 1: '/u01/app/oracle/oradata/orcl/redo4.log'                                             
                                                                                                                                   
            SQL> ALTER SYSTEM SWITCH LOGFILE;   --进行日志切换                                                                     
                                                                                                                                   
            System altered.                                                                                                        
                                                                                                                                   
            SQL> /                                                                                                                 
                                                                                                                                   
            System altered.                                                                                                        
                                                                                                                                   
            SQL> SELECT * FROM v$log;    --group 4的状态变为inactvie                                                               
                                                                                                                                   
                GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM                    
            ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------                    
                     1          1         13   52428800          1 NO  CURRENT                2759720 19-JUL-10                    
                     2          1         11   52428800          2 YES ACTIVE                 2759502 19-JUL-10                    
                     3          1         12  104857600          2 YES ACTIVE                 2759718 19-JUL-10                    
                     4          1         10   31457280          1 YES INACTIVE               2759499 19-JUL-10                    
                                                                                                                                   
            SQL> ALTER DATABASE DROP LOGFILE GROUP 4;   --成功删除group 4                                                          
                                                                                                                                   
            Database altered.                                                                                                      
                                                                                                                                   
            SQL> ho ls /u01/app/oracle/oradata/orcl/redo*                                                                          
            /u01/app/oracle/oradata/orcl/redo01.log  /u01/app/oracle/oradata/orcl/redo1.log                                        
            /u01/app/oracle/oradata/orcl/redo02.log  /u01/app/oracle/oradata/orcl/redo2.log                                        
            /u01/app/oracle/oradata/orcl/redo03.log  /u01/app/oracle/oradata/orcl/redo3.log                                        
            /u01/app/oracle/oradata/orcl/redo04.log  /u01/app/oracle/oradata/orcl/redo4.log                                        
                                                                                                                                   
            SQL> ho rm /u01/app/oracle/oradata/orcl/redo04.log   --删除物理文件                                                    
                                                                                                                                   
            SQL> ho rm /u01/app/oracle/oradata/orcl/redo4.log    --删除物理文件                                                    
                                                                                                                                   
        --7.日志的重定位及重命名(仅演示ALTER DATABASE RENAME FILE 命令)                                                            
            SQL> SELECT name,log_mode FROM v$database;                                                                             
                                                                                                                                   
            NAME      LOG_MODE                                                                                                     
            --------- ------------                                                                                                 
            ORCL      ARCHIVELOG                                                                                                   
                                                                                                                                   
            SQL> SELECT * FROM v$logfile ORDER BY group#;                                                                          
                                                                                                                                   
                GROUP# STATUS  TYPE    MEMBER                                                  IS_                                 
            ---------- ------- ------- ------------------------------------------------------- ---                                 
                     1         ONLINE  /u01/app/oracle/oradata/orcl/redo01.log                 NO                                  
                     2         ONLINE  /u01/app/oracle/oradata/orcl/redo02.log                 NO                                  
                     2         ONLINE  /u01/app/oracle/oradata/orcl/redo2.log                  NO                                  
                     3 STALE   ONLINE  /u01/app/oracle/oradata/orcl/redo03.log                 NO                                  
                     3 STALE   ONLINE  /u01/app/oracle/oradata/orcl/redo3.log                  NO                                  
                                                                                                                                   
            SQL> ho cp /u01/app/oracle/oradata/orcl/redo01.log /u01/app/oracle/oradata/redo01.rdo                                  
                                                                                                                                   
            SQL> ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/orcl/redo01.log'                                              
              2    TO '/u01/app/oracle/oradata/redo01.rdo';                                                                        
                                                                                                                                   
            Database altered.                                                                                                      
                                                                                                                                   
            SQL> SELECT * FROM v$logfile WHERE group# = 1;                                                                         
                                                                                                                                   
                GROUP# STATUS  TYPE    MEMBER                                                  IS_                                 
            ---------- ------- ------- ------------------------------------------------------- ---                                 
                     1         ONLINE  /u01/app/oracle/oradata/redo01.rdo                      NO                                  
                                                                                                                                   
                                                                                                                                   
        --8.清空日志文件组(只有非active 和非current状态的组才能被清空)                                                             
            SQL> SELECT * FROM v$log;                                                                                              
                                                                                                                                   
                GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM                    
            ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------                    
                     1          1         13   52428800          1 YES ACTIVE                 2759720 19-JUL-10                    
                     2          1         14   52428800          2 NO  CURRENT                2761383 19-JUL-10                    
                     3          1         12  104857600          2 YES INACTIVE               2759718 19-JUL-10                    
                                                                                                                                   
            SQL> ALTER DATABASE CLEAR LOGFILE GROUP 1;                                                                             
            ALTER DATABASE CLEAR LOGFILE GROUP 1                                                                                   
            *                                                                                                                      
            ERROR at line 1:     --active 状态不能被清空                                                                           
            ORA-01624: log 1 needed for crash recovery of instance orcl (thread 1)                                                 
            ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/redo1.rdo'                                                  
                                                                                                                                   
            SQL>  ALTER DATABASE CLEAR LOGFILE GROUP 2;                                                                            
             ALTER DATABASE CLEAR LOGFILE GROUP 2                                                                                  
            *                                                                                                                      
            ERROR at line 1:    --current 状态不能被清空                                                                           
            ORA-01624: log 2 needed for crash recovery of instance orcl (thread 1)                                                 
            ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/orcl/redo2.log'                                             
            ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/orcl/redo02.log'                                            
                                                                                                                                   
                                                                                                                                   
            SQL>  ALTER DATABASE CLEAR LOGFILE GROUP 3;                                                                            
                                                                                                                                   
            Database altered.                                                                                                      
                                                                                                                                   
                                                                                                                                   
            SQL> SELECT * FROM v$log;   --group 3被清空后状态变为unused                                                            
                                                                                                                                   
                GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM                    
            ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------                    
                     1          1         13   52428800          1 YES INACTIVE               2759720 19-JUL-10                    
                     2          1         14   52428800          2 NO  CURRENT                2761383 19-JUL-10                    
                     3          1          0  104857600          2 YES UNUSED                 2759718 19-JUL-10                    
                                                                                                                                   
        --9.日志异常处理                                                                                                           
            --启动时提示日志不一致                                                                                                 
            SQL> startup                                                                                                           
            ORACLE instance started.                                                                                               
                                                                                                                                   
            Total System Global Area  251658240 bytes                                                                              
            Fixed Size                  1218796 bytes                                                                              
            Variable Size              83887892 bytes                                                                              
            Database Buffers          163577856 bytes                                                                              
            Redo Buffers                2973696 bytes                                                                              
            Database mounted.                                                                                                      
            ORA-00341:log 1 of thread 1,wrong log # in header                                                                      
            ORA-00312:online log 1 thread 1:'/u01/app/oracle/oradata/orcl/redo1a.rdo'                                              
            ORA-00312:online log 1 thread 1:'/u01/app/oracle/oradata/orcl/redo1b.rdo'                                              
                                                                                                                                   
            SQL> ALTER DATABASE CLEAR LOGFILE GROUP 1;                                                                             
                                                                                                                                   
            Database altered.                                                                                                      
                                                                                                                                   
            SQL> ALTER DATABASE OPEN;                                                                                              
                                                                                                                                   
            Database opened.                                                                                                       
                                                                                                                                   
            --日志文件丢失(非current状态日志组)                                                                                    
            SQL> startup                                                                                                           
            ORACLE instance started.                                                                                               
                                                                                                                                   
            Total System Global Area  251658240 bytes                                                                              
            Fixed Size                  1218796 bytes                                                                              
            Variable Size              88082196 bytes                                                                              
            Database Buffers          159383552 bytes                                                                              
            Redo Buffers                2973696 bytes                                                                              
            Database mounted.                                                                                                      
            ORA-00313: open failed for members of log group 1 of thread 1                                                          
            ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/orcl/redo1a.rdo'                                            
            ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/orcl/redo1b.rdo'                                            
                                                                                                                                   
            SQL> ALTER DATABASE CLEAR LOGFILE GROUP 1;                                                                             
                                                                                                                                   
            Database altered.                                                                                                      
                                                                                                                                   
            SQL> ALTER DATABASE OPEN;                                                                                              
                                                                                                                                   
            Database altered.                                                                                                      
                                                                                                                                   
            --日志文件丢失(current状态日志组)                                                                                      
            SQL> startup                                                                                                           
            ORACLE instance started.                                                                                               
                                                                                                                                   
            Total System Global Area  251658240 bytes                                                                              
            Fixed Size                  1218796 bytes                                                                              
            Variable Size              83887892 bytes                                                                              
            Database Buffers          163577856 bytes                                                                              
            Redo Buffers                2973696 bytes                                                                              
            Database mounted.                                                                                                      
            ORA-00313: open failed for members of log group 3 of thread 1                                                          
            ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo3a.rdo'                                            
            ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo3b.rdo'                                            
                                                                                                                                   
            --查看告警日志                                                                                                         
            SQL> ho tail -n 30 /u01/app/oracle/admin/orcl/bdump/alert_orcl.log                                                     
            ORA-27037: unable to obtain file status                                                                                
            Linux Error: 2: No such file or directory                                                                              
            Additional information: 3                                                                                              
            ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo3a.rdo'                                            
            ORA-27037: unable to obtain file status                                                                                
            Linux Error: 2: No such file or directory                                                                              
            Additional information: 3                                                                                              
            Tue Jul 20 10:45:58 2010                                                                                               
            Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_lgwr_4112.trc:                                                    
            ORA-00313: open failed for members of log group 3 of thread 1                                                          
            ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo3b.rdo'                                            
            ORA-27037: unable to obtain file status                                                                                
            Linux Error: 2: No such file or directory                                                                              
            Additional information: 3                                                                                              
            ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo3a.rdo'                                            
            ORA-27037: unable to obtain file status                                                                                
            Linux Error: 2: No such file or directory                                                                              
            Additional information: 3                                                                                              
            Tue Jul 20 10:45:58 2010                                                                                               
            ARC0: STARTING ARCH PROCESSES                                                                                          
            Tue Jul 20 10:45:58 2010                                                                                               
            ARC1: Becoming the 'no FAL' ARCH                                                                                       
            ARC1: Becoming the 'no SRL' ARCH                                                                                       
            Tue Jul 20 10:45:58 2010                                                                                               
            ARC2: Archival started                                                                                                 
            ARC0: STARTING ARCH PROCESSES COMPLETE                                                                                 
            ARC0: Becoming the heartbeat ARCH                                                                                      
            ARC2 started with pid=18, OS id=4137                                                                                   
            Tue Jul 20 10:45:58 2010                                                                                               
            ORA-313 signalled during: ALTER DATABASE OPEN...                                                                       
                                                                                                                                   
            --查看物理日志文件是否存在                                                                                             
            SQL> ho ls /u01/app/oracle/oradata/orcl/redo3a.rdo                                                                     
            ls: /u01/app/oracle/oradata/orcl/redo3a.rdo: No such file or directory                                                 
                                                                                                                                   
            SQL> ho ls /u01/app/oracle/oradata/orcl/redo3b.rdo                                                                     
            ls: /u01/app/oracle/oradata/orcl/redo3b.rdo: No such file or directory                                                 
                                                                                                                                   
    --尝试使用清空日志组命令                                                                                                       
            SQL> ALTER DATABASE CLEAR LOGFILE GROUP 3;                                                                             
            ALTER DATABASE CLEAR LOGFILE GROUP 3                                                                                   
            *                                                                                                                      
            ERROR at line 1:   --系统处于非归档模式,且group 3状态为CURRENT                                                        
            ORA-00350: log 3 of instance orcl (thread 1) needs to be archived                                                      
            ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo3a.rdo'                                            
            ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo3b.rdo'                                            
                                                                                                                                   
            --尝试使用不归档清空日志                                                                                               
            SQL> ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3;                                                                  
            ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3                                                                        
            *                                                                                                                      
            ERROR at line 1:                                                                                                       
            ORA-00313: open failed for members of log group 3 of thread 1                                                          
            ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo3b.rdo'                                            
            ORA-27037: unable to obtain file status                                                                                
            Linux Error: 2: No such file or directory                                                                              
            Additional information: 3                                                                                              
            ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo3a.rdo'                                            
            ORA-27037: unable to obtain file status                                                                                
            Linux Error: 2: No such file or directory                                                                              
            Additional information: 3                                                                                              
                                                                                                                                   
            --使用带控制文件的介质恢复                                                                                             
            SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;                                                                        
            ORA-00279: change 2835232 generated at 07/20/2010 10:40:23 needed for thread 1                                         
            ORA-00289: suggestion : /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2010_07_20/o1_mf_1_39_%u_.arc              
            ORA-00280: change 2835232 for thread 1 is in sequence #39                                                              
                                                                                                                                   
                                                                                                                                   
            Specify log: {<RET>=suggested | filename | AUTO | CANCEL}                                                              
                                                                                                                                   
            ORA-00308: cannot open archived log '/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2010_07_20/o1_mf_1_39_%u_.arc'
            ORA-27037: unable to obtain file status                                                                                
            Linux Error: 2: No such file or directory                                                                              
            Additional information: 3                                                                                              
                                                                                                                                   
            --使用resetlogs选项打开数据库                                                                                          
            SQL> ALTER DATABASE OPEN RESETLOGS;                                                                                    
                                                                                                                                   
            Database altered.                                                                                                      
                                                                                                                                   
            SQL> SELECT * FROM v$log;   --系统重建group 3                                                                          
                                                                                                                                   
                GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM                    
            ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------                    
                     1          1          2   31457280          2 NO  CURRENT                2835234 20-JUL-10                    
                     2          1          1   31457280          2 YES INACTIVE               2835233 20-JUL-10                    
                     3          1          0   31457280          2 YES UNUSED                       0                              
                                                                                                                                   
            SQL> SELECT * FROM v$logfile;   --为group 3增加了两个成员redo3a.rdo ,redo3b.rdo                                       
                                                                                                                                   
                GROUP# STATUS  TYPE    MEMBER                                                  IS_                                 
            ---------- ------- ------- ------------------------------------------------------- ---                                 
                     2         ONLINE  /u01/app/oracle/oradata/orcl/redo2a.rdo                 NO                                  
                     2         ONLINE  /u01/app/oracle/oradata/orcl/redo2b.rdo                 NO                                  
                     1         ONLINE  /u01/app/oracle/oradata/orcl/redo1a.rdo                 NO                                  
                     3         ONLINE  /u01/app/oracle/oradata/orcl/redo3a.rdo                 NO                                  
                     3         ONLINE  /u01/app/oracle/oradata/orcl/redo3b.rdo                 NO                                  
                     1         ONLINE  /u01/app/oracle/oradata/orcl/redo1b.rdo                 NO                                  
                                                                                                                                   
            对于CURRENT组的也可以使用隐藏参数来解决                                                                                
            步骤:                                                                                                                 
                alter system set "_allow_resetlogs_corruption" = true scope = spfile;                                              
                                                                                                                                   
                recover database using bakcup controlfile;                                                                         
                                                                                                                                   
                alter database open resetlogs;                                                                                     
                                                                                                                                   
                shutdown immediate;                                                                                                
                                                                                                                                   
                startup mount;                                                                                                     
                                                                                                                                   
                alter database open resetlogs;                                                                                     
                                                                                                                                   
                alter system reset "_allow_resetlogs_corruption" scope = spfile sid = '*'                                          
                                                                                                                                   
            对于归档模式下的日志文件丢失,同样可以按上述步骤处理                                                                   

    二、REDO并行机制解析

    文字来源:http://soft.chinabyte.com/96/11092596.shtml
     
    Oracle的数据库日志称为Redo log,所有数据改变都记录Redo log,可以用于修复受损的数据库。Redo log 是用于恢复和一个高级特性的重要数据,一个redo条目包含了相应操作导致的数据库变化的所有信息,所有redo条目最终都要被写入redo文件中去。
    
      Redo log buffer是为了避免Redo文件IO导致性能瓶颈而在sga中分配出的一块内存。一个redo条目首先在用户内存(PGA)中产生,然后由oracle服务进程拷贝到log buffer中,当满足一定条件时,再由LGWR进程写入redo文件。由于log buffer是一块“共享”内存,为了避免冲突,它是受到redo allocation latch保护的,每个服务进程需要先获取到该latch才能分配redo buffer。因此在高并发且数据修改频繁的oltp系统中,我们通常可以观察到redo allocation latch的等待。Redo写入redo buffer的整个过程如下:
    
      在PGA中生产Redo Enrey -> 服务进程获取Redo Copy latch(存在多个---CPU_COUNT*2) -> 服务进程获取redo allocation latch(仅1个) -> 分配log buffer -> 释放redo allocation latch -> 将Redo Entry写入Log Buffer -> 释放Redo Copy latch;
    
      shared strand
    
      为了减少redo allocation latch等待,在oracle 9.2中,引入了log buffer的并行机制。其基本原理就是,将log buffer划分为多个小的buffer,这些小的buffer被成为strand(为了和之后出现的private strand区别,它们被称之为shared strand)。每一个strand受到一个单独redo allocation latch的保护。多个shared strand的出现,使原来序列化的redo buffer分配变成了并行的过程,从而减少了redo allocation latch等待。
    
      shared strand的初始数据量是由参数log_parallelism控制的;在10g中,该参数成为隐含参数,并新增参数_log_parallelism_max控制shared strand的最大数量;_log_parallelism_dynamic则控制是否允许shared strand数量在_log_parallelism和_log_parallelism_max之间动态变化。
    
    HELLODBA.COM>select  nam.ksppinm, val.KSPPSTVL, nam.ksppdesc      
      2  from    sys.x$ksppi nam,      
      3          sys.x$ksppsv val      
      4  where nam.indx = val.indx      
      5  --AND   nam.ksppinm LIKE '_%'      
      6  AND   upper(nam.ksppinm) LIKE '%LOG_PARALLE%';      
         
    KSPPINM                    KSPPSTVL   KSPPDESC      
    -------------------------- ---------- ------------------------------------------      
    _log_parallelism           1          Number of log buffer strands      
    _log_parallelism_max       2          Maximum number of log buffer strands      
    _log_parallelism_dynamic   TRUE       Enable dynamic strands  
      每一个shared strand的大小 = log_buffer/(shared strand数量)。strand信息可以由表x$kcrfstrand查到(包含shared strand和后面介绍的private strand,10g以后存在)。
    
       
    
    HELLODBA.COM>select indx,strand_size_kcrfa from x$kcrfstrand where last_buf_kcrfa != '00';      
         
          INDX STRAND_SIZE_KCRFA      
    ---------- -----------------      
             0           3514368      
             1           3514368      
         
    HELLODBA.COM>show parameter log_buffer      
         
    NAME                                 TYPE        VALUE      
    ------------------------------------ ----------- ------------------------------      
    log_buffer                           integer     7028736    
      关于shared strand的数量设置,16个cpu之内最大默认为2,当系统中存在redo allocation latch等待时,每增加16个cpu可以考虑增加1个strand,最大不应该超过8。并且_log_parallelism_max不允许大于cpu_count。
    
      注意:在11g中,参数_log_parallelism被取消,shared strand数量由_log_parallelism_max、_log_parallelism_dynamic和cpu_count控制。
    
      Private strand
    
      为了进一步降低redo buffer冲突,在10g中引入了新的strand机制——Private strand。Private strand不是从log buffer中划分的,而是在shared pool中分配的一块内存空间。
    
      
    
    HELLODBA.COM>select * from V$sgastat where name like '%strand%';  
    POOL NAME BYTES  
    ------------ -------------------------- ----------  
    shared pool private strands 2684928  
    HELLODBA.COM>select indx,strand_size_kcrfa from x$kcrfstrand where last_buf_kcrfa = '00';  
    INDX STRAND_SIZE_KCRFA  
    ---------- -----------------  
    2 66560  
    3 66560  
    4 66560  
    5 66560  
    6 66560  
    7 66560  
    8 66560  
    ... 
      Private strand的引入为Oracle的Redo/Undo机制带来很大的变化。每一个Private strand受到一个单独的redo allocation latch保护,每个Private strand作为“私有的”strand只会服务于一个活动事务。获取到了Private strand的用户事务不是在PGA中而是在Private strand生成Redo,当flush private strand或者commit时,Private strand被批量写入log文件中。如果新事务申请不到Private strand的redo allocation latch,则会继续遵循旧的redo buffer机制,申请写入shared strand中。事务是否使用Private strand,可以由x$ktcxb的字段ktcxbflg的新增的第13位鉴定:
    
      
    
    HELLODBA.COM>select decode(bitand(ktcxbflg, 4096),0,1,0) used_private_strand, count(*)  
    2 from x$ktcxb  
    3 where bitand(ksspaflg, 1) != 0  
    4 and bitand(ktcxbflg, 2) != 0  
    5 group by bitand(ktcxbflg, 4096);  
    USED_PRIVATE_STRAND COUNT(*)  
    ------------------- ----------  
    1 10  
    0 1 
      对于使用Private strand的事务,无需先申请Redo Copy Latch,也无需申请Shared Strand的redo allocation latch,而是flush或commit是批量写入磁盘,因此减少了Redo Copy Latch和redo allocation latch申请/释放次数、也减少了这些latch的等待,从而降低了CPU的负荷。过程如下:
    
      事务开始 -> 申请Private strand的redo allocation latch (申请失败则申请Shared Strand的redo allocation latch) -> 在Private strand中生产Redo Enrey -> Flush/Commit -> 申请Redo Copy Latch -> 服务进程将Redo Entry批量写入Log File -> 释放Redo Copy Latch -> 释放Private strand的redo allocation latch 。
    
    注意:对于未能获取到Private strand的redo allocation latch的事务,在事务结束前,即使已经有其它事务释放了Private strand,也不会再申请Private strand了。
    
      每个Private strand的大小为65K。10g中,shared pool中的Private strands的大小就是活跃会话数乘以65K,而11g中,在shared pool中需要为每个Private strand额外分配4k的管理空间,即:数量*69k。
    
      
    
    --10g:  
    SQL> select * from V$sgastat where name like '%strand%';  
    POOL NAME BYTES  
    ------------ -------------------------- ----------  
    shared pool private strands 1198080  
    HELLODBA.COM>select trunc(value * KSPPSTVL / 100) * 65 * 1024  
    2 from (select value from v$parameter where name = 'transactions') a,  
    3 (select val.KSPPSTVL  
    4 from sys.x$ksppi nam, sys.x$ksppsv val  
    5 where nam.indx = val.indx  
    6 AND nam.ksppinm = '_log_private_parallelism_mul') b;  
    TRUNC(VALUE*KSPPSTVL/100)*65*1024  
    -------------------------------------  
    1198080  
    --11g:  
    HELLODBA.COM>select * from V$sgastat where name like '%strand%';  
    POOL NAME BYTES  
    ------------ -------------------------- ----------  
    shared pool private strands 706560  
    HELLODBA.COM>select trunc(value * KSPPSTVL / 100) * (65 + 4) * 1024  
    2 from (select value from v$parameter where name = 'transactions') a,  
    3 (select val.KSPPSTVL  
    4 from sys.x$ksppi nam, sys.x$ksppsv val  
    5 where nam.indx = val.indx  
    6 AND nam.ksppinm = '_log_private_parallelism_mul') b;  
    TRUNC(VALUE*KSPPSTVL/100)*(65+4)*1024  
    -------------------------------------  
    706560 
      Private strand的数量受到2个方面的影响:logfile的大小和活跃事务数量。
    
      参数_log_private_mul指定了使用多少logfile空间预分配给Private strand,默认为5。我们可以根据当前logfile的大小(要除去预分配给log buffer的空间)计算出这一约束条件下能够预分配多少个Private strand:
    
      
    
    HELLODBA.COM>select bytes from v$log where status = 'CURRENT';  
    BYTES  
    ----------  
    52428800  
    HELLODBA.COM>select trunc(((select bytes from v$log where status = 'CURRENT') - (select to_number(value) from v$parameter where name = 'log_buffer'))*  
    2 (select to_number(val.KSPPSTVL)  
    3 from sys.x$ksppi nam, sys.x$ksppsv val  
    4 where nam.indx = val.indx  
    5 AND nam.ksppinm = '_log_private_mul') / 100 / 66560)  
    6 as "calculated private strands" 
    7 from dual;  
    calculated private strands  
    --------------------------  
    5  
    HELLODBA.COM>select count(1) "actual private strands" from x$kcrfstrand where last_buf_kcrfa = '00';  
    actual private strands  
    ----------------------  
    5 
      当logfile切换后(和checkpoint一样,切换之前必须要将所有Private strand的内容flush到logfile中,因此我们在alert log中可能会发现日志切换信息之前会有这样的信息:"Private strand flush not complete",这是可以被忽略的),会重新根据切换后的logfile的大小计算对Private strand的限制:
    
      
    
    HELLODBA.COM>alter system switch logfile;  
    System altered.  
    HELLODBA.COM>select bytes from v$log where status = 'CURRENT';  
    BYTES  
    ----------  
    104857600  
    HELLODBA.COM>select trunc(((select bytes from v$log where status = 'CURRENT') - (select to_number(value) from v$parameter where name = 'log_buffer'))*  
    2 (select to_number(val.KSPPSTVL)  
    3 from sys.x$ksppi nam, sys.x$ksppsv val  
    4 where nam.indx = val.indx  
    5 AND nam.ksppinm = '_log_private_mul') / 100 / 66560)  
    6 as "calculated private strands" 
    7 from dual;  
    calculated private strands  
    --------------------------  
    13  
    HELLODBA.COM>select count(1) "actual private strands" from x$kcrfstrand where last_buf_kcrfa = '00';  
    actual private strands  
    ----------------------  
    13 
      参数_log_private_parallelism_mul用于推算活跃事务数量在最大事务数量中的百分比,默认为10。Private strand的数量不能大于活跃事务的数量。
    
      
    
    HELLODBA.COM>show parameter transactions  
    NAME TYPE VALUE  
    ------------------------------------ ----------- ------------------------------  
    transactions integer 222  
    transactions_per_rollback_segment integer 5  
    HELLODBA.COM>select trunc((select to_number(value) from v$parameter where name = 'transactions') *  
    2 (select to_number(val.KSPPSTVL)  
    3 from sys.x$ksppi nam, sys.x$ksppsv val  
    4 where nam.indx = val.indx  
    5 AND nam.ksppinm = '_log_private_parallelism_mul') / 100 )  
    6 as "calculated private strands" 
    7 from dual;  
    calculated private strands  
    --------------------------  
    22  
    HELLODBA.COM>select count(1) "actual private strands" from x$kcrfstrand where last_buf_kcrfa = '00';  
    actual private strands  
    ----------------------  
    22 
      注:在预分配Private strand时,会选择上述2个条件限制下最小一个数量。但相应的shared pool的内存分配和redo allocation latch的数量是按照活跃事务数预分配的。
    
      因此,如果logfile足够大,_log_private_parallelism_mul与实际活跃进程百分比基本相符的话,Private strand的引入基本可以消除redo allocation latch的争用问题。

    三、总结

    REDO是ORACLE设计机制中非常重要的一种,对数据恢复,数据安全起着非常重要的作用。日常维护设计REDO较少,但应注意REDO自动切换的时间间隔和相关切换时点。

  • 相关阅读:
    jquery选择器
    js实现添加className
    日期函数(date)
    IE6和IE7中<a>标签宽高设置无效的问题
    Uva 548 二叉树的递归遍历lrj 白书p155
    Uva 122 树的层次遍历 Trees on the level lrj白书 p149
    Uva 679 Dropping Ballls 二叉树的编号
    Uva 12657 Boxes in a Line 双向链表
    Uva 11988 Broken Keyboard STL+链表
    埃及分数问题+迭代加深搜索
  • 原文地址:https://www.cnblogs.com/alexy/p/createdb8.html
Copyright © 2011-2022 走看看