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

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

2、实际日志产生过程:会话的server process修改buffer,先产生日志写入自己的PGA,在某种触发的条件下,再由PGA写入log 
                     buffer,最后由LGWr写入log files;
    Server Process:干的事情:将block读入buffer cache,将buffer读入cpu,修改buffer,将修改日志记入自己的PGA,再由
                   PGA写入redo log buffer.
3、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
    
4、如何确保已经提交的事务不会丢失:commit触发LGWr将log buffer中的日志全部写入磁盘日志文件,Write-Ahead-Log:日志写入
    优先,脏的buffer在写入磁盘前,buffer的改变过程一定已经写入log日志。
                                   
5、oracle快速提交
    读缓存:块读入缓存,cpu可以读缓存中的数据,修改还是修改磁盘上的数据,不能直接修改缓存中数据,没有负责将缓存中数据写
        入磁盘的功能。
    写缓存:oracle实现了写缓存,buffer cache中的buffer修改后,产生日志写入日志文件,实现了写缓存,日志写入存储,因存储有
        写缓存功能(存储后自己的电池),提高了数据库的性能。
    日志是连续的顺序,批量写入日志文件,减少寻道时间,因为日志文件存在存储上,LGWr绕过OS缓存直接写入存储的缓存中。
    
6、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  #发生在提交或回滚后,等待日志缓冲写入日志文件,表明过多的提交或短事务
        
7、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的日志不宜设置过大
    
8、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,固态盘
    
9、日志组及成员文件相关的相关操作
日志组大小调整,创建新大小的日志组,切换使用后删除原来日志组,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;
    
10、日志组及日志文件状态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 : 文件已不再有用了。
    
11、异步提交技术:未等LGWr将日志写完就完成提交
系统级
    ALTER SYSTEM SET COMMIT_WRITE = IMMEDIATE, WAIT
会话级
    ALTER SESSION SET COMMIT_WRITE = IMMEDIATE, NOWAIT
语句级
    COMMIT WRITE BATCH WAIT
    COMMIT WRITE BATCH NOWAIT
    
12、日志与性能
    减少日志量:nologing,临时表
    redo 性能改进:加大批次提交的量,BULK DML
    
13、归档
关归档:(设置的归档目录依然存在)
    确认日志组都已归档,除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

 

转载于:https://my.oschina.net/peakfang/blog/2245109

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值