设为首页 收藏本站
查看: 1756|回复: 0

[经验分享] 浅谈Oracle Online redo log

[复制链接]

尚未签到

发表于 2018-9-13 06:20:18 | 显示全部楼层 |阅读模式
  Oracle online redo log是Oracle数据库中核心文件之一。在数据库操作中,只要有任何的数据块变化,都会生成相应的redo entry。redo entry首先保存在log buffer中,最后由lgwr进程写入到Redo log里面。
  Online Redo Log的维护和性能是影响Oracle工作的一个重要方面。本文从日常维护角度出发,介绍几个常见的场景处理方法。
  1、Redo Log Group和Redo Log Group Member
  Redo Log在数据库中的作用主要在于进行实例恢复(Instance Recovery)。当数据库中一个事务提交commit的时候,由server process修改的数据块是不会直接写回到数据文件里面的。commit动作是会引发lgwr进程将事务生成的redo log写入到online redo log file。这样,形成日志在先的策略。
  如果此时发生数据库突然的停机,如断电、事故,在内存中的数据块是会丢失的。此时,文件的事务编号与日志的进程是不一致的。在服务器启动的open阶段,Oracle会根据online redo log的记录,从最后一个检查点checkpoint开始,进行数据库事务重演。所以,online redo log对数据库的事务一致性和数据恢复是极其重要的。
  Online Redo Log Group是一系列完全相同的online redo log file的集合。在一个数据库中,至少要有两个redo log group交替进行redo log写入操作。但是,我们建议是使用至少三个日志组。
SQL> select group#, sequence#, bytes, members, status from v$log;  GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
  
---------- ---------- ---------- ---------- ----------------
  1        217   52428800          2 CURRENT
  2        215   52428800          2 INACTIVE
  3        216   52428800          2 INACTIVE
  三个日志组是按照交替的顺序进行读写。我们从视图v$log中,可以看到当前正在使用的日志组。这个视图中,我们着重关注group#,sequence#和status三个视图列。
  group#表日志组编号。redo log group的标志是通过组编号来实现的。我们创建group和修改维护group,都是通过制定group#完成。
  sequence#表示日志顺序号。每个日志都是唯一的,分配给日志的编号也是唯一的。这个就是sequence#编号,这个编号会随着archive redo log一起记录。
  status表示当前日志的所处状态,常见的有active,current,inactive和unused。下面详细介绍一下几个状态的含义:
  üCurrent:表示当前正在进行写入的日志组,也是最新的日志组;
  üActive:当一个事务完成commit之后,redo entry写入到了日志文件。并且这个日志已经不是当前current,但是对应的数据块data block还没有从buffer cache中写入到文件中。此时,日志组状态为active。处在active状态的日志组,是不能够被覆盖和删除的;
  üInactive:日志并不是当前正在读写的日志,并且对应的事务数据块都已经写回到数据文件中;
  üUnused:表示新创建的online日志组,还没有使用过;
  下面再来说一说redo group member。在每个redo log group中,都有一个或者多个完全相同的log file。在一个组内,log file完全相同,一个写入日志动作要在组内所有的文件上写入成功之后,才算写入完成。
  在生产条件下,redo group member通常是放置在不同的磁盘存储日志文件。进行这种“multi-path”配置的理由就在于冗余防错。当一个文件出现损坏,虽然一时不能启动数据库,但是我们可以方便利用其它副本进行替换。
  在诸多的Oracle文件中,采用相同multi-path保存配置的还有控制文件control file。
  此处有一点需要注意:很多系统由于各种原因,配置的多路径过多,反而影响效率。相同的redo log在一个文件中写入的时间和十个文件中写入的时间天差地别。配置多路径目的是利用物理冗余防错,过多的冗余事倍功半。
  2、常用的Redo Log调整操作
  在Oracle安装的时候,我们是可以调整Redo Log的大小和组数。同时,在系统运行过程中,我们也可以对现有的日志进行调整。下面是常见的集中类型的redo log操作实例。我们选择Oracle 11R2进行试验。
SQL> select * from v$version;  
BANNER
  
------------------------------------------------------------------------

  
Oracle Database 11g Enterprise Edition>  
PL/SQL>  
CORE        11.2.0.1.0         Production
  注意:进行redo log的调整,一定要选择系统相对空闲的时候,避免业务高峰期。特别是生产环境尤其重要。
  ü查看当前redo 情况
  通过视图v$log和v$logfile可以分别查看当前的日志组和文件情况。
SQL>select group#, sequence#, bytes, members, status from v$log;  GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
  
---------- ---------- ---------- ---------- ----------------
  1        217   52428800          2 INACTIVE
  2        218   52428800          2 CURRENT
  3        216   52428800          2 INACTIVE
  
SQL> select group#,member from v$logfile;
  
GROUP#  MEMBER
  
---  ----------------------------------------------------------------
  3  /u01/oradata/WILSON/onlinelog/o1_mf_3_6bcsqtfj_.log
  3  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_3_6bcsqtwv_.log
  2  /u01/oradata/WILSON/onlinelog/o1_mf_2_6bcsqs3t_.log
  2  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_2_6bcsqstm_.log
  1  /u01/oradata/WILSON/onlinelog/o1_mf_1_6bcsqpty_.log
  1  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_6bcsqqt0_.log
  
6 rows selected
  ü添加redo log group
  一些场景下,添加redo log group操作,需要指定group的编号和成员文件。
SQL>>
  
Database>  
SQL>  select group#, sequence#, bytes, members, status from v$log;
  GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
  
---------- ---------- ---------- ---------- ----------------
  1        217   52428800          2 INACTIVE
  2        218   52428800          2 CURRENT
  3        216   52428800          2 INACTIVE
  4          0   10485760          2 UNUSED
  
SQL> select group#,member from v$logfile;
  
GROUP# MEMBER
  
- ----------------------------------------------------------------
  3  /u01/oradata/WILSON/onlinelog/o1_mf_3_6bcsqtfj_.log
  3  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_3_6bcsqtwv_.log
  2  /u01/oradata/WILSON/onlinelog/o1_mf_2_6bcsqs3t_.log
  2  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_2_6bcsqstm_.log
  1  /u01/oradata/WILSON/onlinelog/o1_mf_1_6bcsqpty_.log
  1  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_6bcsqqt0_.log
  4 /u01/oradata/WILSON/onlinelog/redo4a.log
  4 /u01/flash_recovery_area/WILSON/onlinelog/redo4b.log
  
8 rows selected
  注意,在10g以后,我们可以借助OMF(Oracle Managed File)对数据文件和日志文件进行透明化管理。Oracle会自动进行路径选择和名字命名。
SQL>>

  
Database>  
SQL> show parameter create
  
NAME                                 TYPE        VALUE
  
------------------------------------ ----------- ---------------------
  
create_bitmap_area_size              integer     8388608
  
create_stored_outlines               string
  
db_create_file_dest                  string      /u01/oradata
  
db_create_online_log_dest_1          string
  
db_create_online_log_dest_2          string
  
db_create_online_log_dest_3          string
  
db_create_online_log_dest_4          string
  
db_create_online_log_dest_5          string
  
SQL>  select group#, sequence#, bytes, members, status from v$log;
  GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
  
---------- ---------- ---------- ---------- ----------------
  1        217   52428800          2 INACTIVE
  2        218   52428800          2 CURRENT
  3        216   52428800          2 INACTIVE
  4          0   10485760          2 UNUSED
  5          0   10485760          2 UNUSED
  
SQL> select group#,member from v$logfile;
  GROUP# MEMBER
  
---------- -----------------------------------------------------------
  (篇幅原因,部分省略……)
  1  /u01/oradata/WILSON/onlinelog/o1_mf_1_6bcsqpty_.log
  1  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_6bcsqqt0_.log
  4  /u01/oradata/WILSON/onlinelog/redo4a.log
  4  /u01/flash_recovery_area/WILSON/onlinelog/redo4b.log
  5  /u01/oradata/WILSON/onlinelog/o1_mf_5_7vqh94p2_.log
  5  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_5_7vqh94t6_.log
  
10 rows selected
  üActive状态日志组解决
  在上文中,我们讨论过Active状态下,dbwr还没有将相应的事务数据块写入到DB File中,此时Log Group的状态是Active。将Active状态转变为Inactive的方法,就是手工的进行checkpoint,强制启动dbwr一次写入动作。
--当前是group 4为当前日志;  
SQL>  select group#, sequence#, bytes, members, status from v$log;
  GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
  
---------- ---------- ---------- ---------- ----------------
  1        217   52428800          2 INACTIVE
  2        218   52428800          2 ACTIVE
  3        216   52428800          2 INACTIVE
  4        219   10485760          2 CURRENT
  5          0   10485760          2 UNUSED
  
--手工一次切换,形成group 4为active状态;

  
SQL>>
  
System>  
SQL>  select group#, sequence#, bytes, members, status from v$log;
  GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
  
---------- ---------- ---------- ---------- ----------------
  1        217   52428800          2 INACTIVE
  2        218   52428800          2 ACTIVE
  3        216   52428800          2 INACTIVE
  4        219   10485760          2 ACTIVE
  5        220   10485760          2 CURRENT
  
--写入检查点;

  
SQL>>
  
System>  
SQL>  select group#, sequence#, bytes, members, status from v$log;
  GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
  
---------- ---------- ---------- ---------- ----------------
  1        217   52428800          2 INACTIVE
  2        218   52428800          2 INACTIVE
  3        216   52428800          2 INACTIVE
  4        219   10485760          2 INACTIVE
  5        220   10485760          2 CURRENT
  ü删除redo log group
  删除redo log group要有至少两个前提,需要注意:
  首先是要保证删除日志组状态为unused或者inactive,否则不能删除。其次是删除后,系统日志组个数不能少于2个。
SQL>  select group#, sequence#, bytes, members, status from v$log;  GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
  
---------- ---------- ---------- ---------- ----------------
  1        217   52428800          2 INACTIVE
  2        218   52428800          2 INACTIVE
  3        221   52428800          2 CURRENT
  4        219   10485760          2 INACTIVE
  5        220   10485760          2 ACTIVE
  
--ACTIVE状态删除报错。

  
SQL>>  
alter database drop logfile group 5
  
ORA-01624: 日志 5 是紧急恢复实例 wilson (线程 1) 所必需的
  
ORA-00312: 联机日志 5 线程 1: '/u01/oradata/WILSON/onlinelog/o1_mf_5_7vqh94p2_.log'
  
ORA-00312: 联机日志 5 线程 1: '/u01/flash_recovery_area/WILSON/onlinelog/o1_mf_5_7vqh94t6_.log'
  
SQL>  select group#, sequence#, bytes, members, status from v$log;
  GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
  
---------- ---------- ---------- ---------- ----------------
  1        217   52428800          2 INACTIVE
  2        218   52428800          2 INACTIVE
  3        221   52428800          2 CURRENT
  4        219   10485760          2 INACTIVE
  5        220   10485760          2 ACTIVE

  
SQL>>  
System>  
SQL>  select group#, sequence#, bytes, members, status from v$log;
  GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
  
---------- ---------- ---------- ---------- ----------------
  1        217   52428800          2 INACTIVE
  2        218   52428800          2 INACTIVE
  3        221   52428800          2 CURRENT
  4        219   10485760          2 INACTIVE
  5        220   10485760          2 INACTIVE
  调整好状态之后,再进行删除。
SQL>>

  
Database>  
SQL>  select group#, sequence#, bytes, members, status from v$log;
  GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
  
---------- ---------- ---------- ---------- ----------------
  1        217   52428800          2 INACTIVE
  2        218   52428800          2 INACTIVE
  3        221   52428800          2 CURRENT
  4        219   10485760          2 INACTIVE
  ü增加redo log group member
  直接增加日志组成员的使用几率相对较少,我们一般是一次性直接将成员文件添加完毕。
SQL>>
Database>  
SQL> select group#, member from v$logfile;
  
GROUP# MEMBER
  
-- ----------------------------------------------------------------
  3 /u01/oradata/WILSON/onlinelog/o1_mf_3_6bcsqtfj_.log
  3 /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_3_6bcsqtwv_.log
  2 /u01/oradata/WILSON/onlinelog/o1_mf_2_6bcsqs3t_.log
  2 /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_2_6bcsqstm_.log
  1 /u01/oradata/WILSON/onlinelog/o1_mf_1_6bcsqpty_.log
  1 /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_6bcsqqt0_.log
  4 /u01/oradata/WILSON/onlinelog/redo4a.log
  4 /u01/flash_recovery_area/WILSON/onlinelog/redo4b.log
  4 /u01/oradata/WILSON/onlinelog/redo4c.log
  
9 rows selected
  ü删除redo log group member
  删除group member.
SQL> select group#,member from v$logfile;  
GROUP#  MEMBER
  
---  ----------------------------------------------------------------
  3  /u01/oradata/WILSON/onlinelog/o1_mf_3_6bcsqtfj_.log
  3  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_3_6bcsqtwv_.log
  2  /u01/oradata/WILSON/onlinelog/o1_mf_2_6bcsqs3t_.log
  2  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_2_6bcsqstm_.log
  1  /u01/oradata/WILSON/onlinelog/o1_mf_1_6bcsqpty_.log
  1  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_6bcsqqt0_.log
  
6 rows selected

  
SQL>>
  
Database>  
SQL>  select group#, sequence#, bytes, members, status from v$log;
  GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
  
---------- ---------- ---------- ---------- ----------------
  1        217   52428800          2 INACTIVE
  2        218   52428800          2 CURRENT
  3        216   52428800          2 INACTIVE
  4          0   10485760          2 UNUSED
  
SQL> select group#,member from v$logfile;
  
GROUP# MEMBER
  
- ----------------------------------------------------------------
  3  /u01/oradata/WILSON/onlinelog/o1_mf_3_6bcsqtfj_.log
  3  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_3_6bcsqtwv_.log
  2  /u01/oradata/WILSON/onlinelog/o1_mf_2_6bcsqs3t_.log
  2  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_2_6bcsqstm_.log
  1  /u01/oradata/WILSON/onlinelog/o1_mf_1_6bcsqpty_.log
  1  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_6bcsqqt0_.log
  4 /u01/oradata/WILSON/onlinelog/redo4a.log
  4 /u01/flash_recovery_area/WILSON/onlinelog/redo4b.log
  
8 rows selected
  3、关于redo log sizing
  最后聊聊redo log的大小问题。在负载较高和投产的系统中,我们经常会遇到log过小引起的一系列问题。通过AWR报告和alert log,我们都可以发现这种现象的端倪。

  如果系统在关键作业时生成的redo>  从AWR报告上,我们主要关注两个与redo log相关的事件:log file parallel write和log file sync。如果两个事件出现在top events中,作为dba和调试人员就需要注意了。
  在Oracle的官方资料中,对redo log的大小设置也是以切换频率而定的,要求调整到15-20分钟进行一次切换。调整的手段主要是增加日志组数量和调大日志成员文件大小。这样,都可以给dbwr和arc进程更多的时间在后台进行数据写入和归档。
  在实际中,笔者还要建议关注日志组成员的数目,我们对日志采用多路径冗余手段,是为了防止出现单磁盘文件以外损坏。但是,过多的日志成员数目也会带来性能瓶颈。笔者曾见过一个日志组成员数量是10个文件,散布在10个设备上。这样,就意味lgwr要写入十次才能将一个log entry写入,性能可想而知。
  在oracle 10g中,官方提供了视图v$instance_recovery,也可以提供一定程度的log大小建议。
SQL>  show parameter fast_start  
NAME                                 TYPE        VALUE
  
------------------------------------ ----------- ------------------------------
  
fast_start_io_target                 integer     0
  
fast_start_mttr_target               integer     0
  
fast_start_parallel_rollback         string      LOW
  
SQL>
  
SQL> select ACTUAL_REDO_BLKS,TARGET_REDO_BLKS,TARGET_MTTR,ESTIMATED_MTTR,
  2      OPTIMAL_LOGFILE_SIZE,CKPT_BLOCK_WRITES  from v$instance_recovery;
  
ACTUAL_REDO_BLKS TARGET_REDO_BLKS TARGET_MTTR ESTIMATED_MTTR OPTIMAL_LOGFILE_SIZE CKPT_BLOCK_WRITES
  
---------------- ---------------- ----------- -------------- -------------------- -----------------
  1768             5174           0             16                                    219
  日志切换过于频繁,会引起系统整体的DML操作等待。所以,如果在调优阶段发现这个问题,首先将其解决和缓解,之后再去看其他的一些问题。

  最后,关于redo log的生成。我们说,很多时候,DBA看到过于频繁的redo>  5、结论
Redo log是Oracle进行还原恢复的一个重要组件。Redo log调整也是DBA的基本技能之一


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-576975-1-1.html 上篇帖子: Oracle Database 11g 相关资源 Oracle官方网站原版 下篇帖子: Oracle数据库中的坏块问题处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表