oracle 体系结构及内存管理 09_redo log

一、Oracle日志原理:数据库将buffer cache中的每个buffer(包括DML,DDL数据块对索引的改变、对回滚段数据块的改变、对临时表
    空间的临时段的改变等)的改过程严格按照时间顺序记录到redo log buffer中,再由lgwr写入到redo log文件;
    日志记录(矢量)方式:buffer 地址,时间,改变方式(增,删)。
    可能存在的状况:修改了一行数据,产生了几十K的日志。
    redo log做用:记录数据库的改变过程,实例恢复,配合归档实现介质恢复。html

二、实际日志产生过程:会话的server process修改buffer,先产生日志写入本身的PGA,在某种触发的条件下,再由PGA写入log 
                     buffer,最后由LGWr写入log files;
    Server Process:干的事情:将block读入buffer cache,将buffer读入cpu,修改buffer,将修改日志记入本身的PGA,再由
                   PGA写入redo log buffer.
三、LGWr触发条件:
    1.用户提交或回滚 
    2.有1/3(_log_io_size默认是0)重作日志缓冲区未被写入磁盘 
           select * from x$ksppcv where  indx in  (select indx from x$ksppi where ksppinm ='_log_io_size');
    3.有大于1M的重作日志缓冲区未被写入磁盘
    4.每隔3秒钟
    5.DBWR须要写入的数据的SCN大于LGWR记录的SCN,DBWR触发LGWR写入
    6.发生日志切换时触发LGWR
    
四、如何确保已经提交的事务不会丢失:commit触发LGWr将log buffer中的日志所有写入磁盘日志文件,Write-Ahead-Log:日志写入
    优先,脏的buffer在写入磁盘前,buffer的改变过程必定已经写入log日志。
                                   
五、oracle快速提交
    读缓存:块读入缓存,cpu能够读缓存中的数据,修改仍是修改磁盘上的数据,不能直接修改缓存中数据,没有负责将缓存中数据写
        入磁盘的功能。
    写缓存:oracle实现了写缓存,buffer cache中的buffer修改后,产生日志写入日志文件,实现了写缓存,日志写入存储,因存储有
        写缓存功能(存储后本身的电池),提升了数据库的性能。
    日志是连续的顺序,批量写入日志文件,减小寻道时间,由于日志文件存在存储上,LGWr绕过OS缓存直接写入存储的缓存中。
    
六、Log buffer大小设置
    9i之前,通常是3M在10g中ORACLE的ASMM会自动调整它的值,他遵循这样一个原则,'Fixed SGA Size'+ 'Redo Buffers'是
granule size(粒度) 的整数倍,oracle中分配空间是按照granule size为粒度,空间都是guanule size的整数倍。
    select * from v$sgainfo where name in ('Fixed SGA Size','Redo Buffers','Granule Size');
    查看日志缓冲区大小 show parameter log_buffer;
    在10.2.0.3 中Log Buffer 默认值是14M,在10.2.0.4中,默认值是15M,修改log_buffer的大小不能指定单位和scope不能为both
        alter system set log_buffer=10240 scope=spfile
    数据库的版本信息
        select * from v$version
    redo log的IO块大小通常与操做系统块统一致
        select max(lebsz) from x$kccle;
    log buffer不足的表现:
        REDO NOWAIT #小于100%
        redo log space wait time #较大
        redo allocation,redo copy、redo writing #等闩锁等待较为严重
        log file sync  #发生在提交或回滚后,等待日志缓冲写入日志文件,代表过多的提交或短事务
        
七、REDO LOG 切换的时间应该尽量的不低于10-20 分钟
    一个日志文件从开始写,到写满的时间是10-20分钟,设置日志文件的大小,
    select to_char(FIRST_TIME,'yyyy-mm-dd hh24:mi:ss') f_time,SEQUENCE# from v$log_history;--查询日志切换时间信息
    awr报告load profile,查看每秒产生的redo,再乘以你要的多少时间切换一次就出来了REDO的大小
    SELECT optimal_logfile_size   FROM   v$instance_recovery; --利用系统功能查询日志组推荐的大小单位是M
    日志组的大小标准:不出现明显的日志等待,DG的日志不宜设置过大
    
八、LOG buffer优化建议
        在OLTP 系统上,REDO LOG 文件的写操做主要是小型的,比较频繁,通常的写大小在几K,而每秒钟产生的写IO次数会达到几
    十次,数百次甚至上千次。所以REDO LOG文件适合存放于IOPS 较高的转速较快的磁盘上,IOPS 仅能达到数百次的SATA 盘不适合
    存放REDO LOG 文件。另外因为REDO LOG 文件的写入是串行的,所以对于REDO LOG文件所作的底层条带化处理,对于REDO LOG写
    性能的提高是十分有限的。
    LGWR:每次写入的量小,写入次数比较多,IOPS:每秒中磁盘的IO操做次数,tps:磁盘每秒的请求次数
    SATA,SAS,FC,固态盘
    
九、日志组及成员文件相关的相关操做
日志组大小调整,建立新大小的日志组,切换使用后删除原来日志组,current,active日志组不能删
    ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/app/flashback/ipemsdb/onlinelog/redolog4_01.log') SIZE 50M REUSE ;
    ALTER DATABASE DROP LOGFILE GROUP 4; 
移动日志到新目录,将日志组的状态切至inactive,再将新路径和文件放好,执行命令修改
    ALTER DATABASE RENAME FILE '/u01/app/flashback/ipemsdb/onlinelog/o1_mf_2_bw56d062_.log' TO '/u01/app/flashback/ipemsdb/redolog/o1_mf_2_bw56d062_.log';
日志组成员增长(无状态限制)和删除(只能删除非current和非最后一个成员)实体文件还需手动删除
    ALTER DATABASE ADD LOGFILE MEMBER '+DG1/ora55/onlinelog_bak/group_2_02.log' TO GROUP 2;
    ALTER DATABASE DROP LOGFILE MEMBER '+DG1/ora55/onlinelog_bak/group_1_03.log';
切换日志,使新建日志联机使用
    alter system switch logfile --不等归档完成就进行switch logfile操做,速度快,尤为在非归档模式下适用,对当前实例生效。
    alter system archive log current --等待归档完成才操做,对全部实例生效。
    ALTER SYSTEM CHECKPOINT;  --切到inactive状态
清空日志文件的内容。主要用于数据库没法进行有效恢复的时候。如标识为current日志组的全部文件都坏了
等。只有非active 和非current状态的组才能被清空
    ALTER DATABASE CLEAR LOGFILE group 1;--已归档
    ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 1; --未归档
查询日志切换时间
    SELECT N.RECID  AS RECID ,N.FIRST_TIME  AS FIRST_TIME ,M.FIRST_TIME AS END_TIME ,
    ROUND((M.FIRST_TIME - N.FIRST_TIME) * 24 * 60, 2)AS MINUTES
    FROM V$LOG_HISTORY M, V$LOG_HISTORY N WHERE M.RECID = N.RECID + 1 ORDER BY M.RECID    
相关视图
    SELECT * FROM V$LOG;
    SELECT * FROM V$LOGFILE;
    SELECT * FROM V$ARCHIVED_LOG;
    SELECT * FROM V$RECOVER_FILE;
    SELECT * FROM V$LOG_HISTORY;  --控制文件中日志的历史信息
    SELECT * FROM V$LOGHIST;
    
十、日志组及日志文件状态v$log
    日志文件组的状态通常有INACTIVE、ACTIVE、CURRENT、UNUSED、CLEARING、CLEARING_CURRNT等六种状态:
    UNUSED : 重作日志文件组对应的文件还从未被写入过数据,刚建立的日志文件组会显示成这一状态。
    CURRENT: 正在使用的日志文件组。当前Oracle数据库正在使用的联机重作日志文件组。
    ACTIVE : 是活动的但不是当前组,实例恢复时须要这组日志。表示虽然当前并未使用,但该文件未归档或
              对应的数据没有所有写入数据文件,实例恢复必须借助该文件中保存的内容。
    INACTIVE:日志文件中的内容已被妥善处理,处于空闲状态。
    CLEARING:日志文件正被重建(重建后该状态会变成UNUSED)。
    CLEARING_CURRENT:表示该组重作日志重建时出现错误。
    v$log.ARCHIVED列值为YES表示已经归档,NO表示未归档。 
    v$log.SEQUENCE列值表示日志序列号,每进行一第二天志切换就+1。
    v$log.FIRST_CHANGE# 列值为日志的SCN号,下一个日志号即上一个日志的next SCN
    
    日志文件的状态有STALE,INVALID 、DELETED、NULL 四种状态。能够经过v$logfile视图查询
    INVALID : 文件是不能够被访问的。
    STALE : 文件中的内容是不彻底的。
    NULL : 文件正在使用。
    DELETED : 文件已再也不有用了。
    
十一、异步提交技术:未等LGWr将日志写完就完成提交
系统级
    ALTER SYSTEM SET COMMIT_WRITE = IMMEDIATE, WAIT
会话级
    ALTER SESSION SET COMMIT_WRITE = IMMEDIATE, NOWAIT
语句级
    COMMIT WRITE BATCH WAIT
    COMMIT WRITE BATCH NOWAIT
    
十二、日志与性能
    减小日志量:nologing,临时表
    redo 性能改进:加大批次提交的量,BULK DML
    
1三、归档
关归档:(设置的归档目录依然存在)
    确认日志组都已归档,除current外其余日志组为inactive状态;
    startup mount;
    alter database noarchivelog;
    alter database open;
开归档:
    shutdown immediate;
    startup mount;
    alter databae archivelog;
    alter database open;
配置归档目录:
    归档目录能够配置本地和远程两种方式,且两种方式互不兼容,同时为了与闪回目录区分统一采用方案2
MANADATORY归档必须成功复制到目的路径以后,联机重作日志才能被复用,OPTIONAL正好相反。经过archive
log list确认归档目录与闪回分开
    alter system set log_archive_dest = '' scope = spfile; --若是log_archive_dest有值先置空
    alter system set log_archive_dest_1 = 'location=/u01/arc_dir/' scope = spfile; --能够设置多个
    log_archive_dest_2 = 'SERVICE=standby1';  --远程 SERVICE 指定远程数据库的网络服务名
自动归档参数LOG_ARCHIVE_START 10g已经废弃,只要开启归档就自动归档。
    ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE;
归档进程调整,结合业务状况设置,默认为2,oracle也会根据系统要求自动调整
    ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=3;
归档相关信息查询
    查询归档目录
    select dest_name,status,archiver,destination,log_sequence,reopen_secs,transmit_mode,process from v$archive_dest;
    查询已归档信息
    select RECID,NAME,DEST_ID,SEQUENCE#,RESETLOGS_CHANGE#,ARCHIVED,STATUS ,BACKUP_COUNT from v$archived_log;
    select * from v$recovery_file_dest;
    select * From v$flash_recovery_area_usage;
    show parameter db_
清除归档日志,归档日志保留时间越久越好
    进入ORACLE数据备份工具 
    rman target / 
    DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7'; 
    若是物理文件被删除
    crosscheck archivelog all; 
    delete expired archivelog all;     数据库

参考文档:
http://www.233.com/oracle/zhonghe/20070316/1327386.html
http://blog.csdn.net/leshami/article/details/5784713缓存

相关文章
相关标签/搜索