redo 日志

4.1 redo (重做) log 的功能:数据recovery
4.2 redo log 特征:
     1)记录数据库的变化(DML、DDL)
     2)用于数据块的recover  [SMON]
     3)以组的方式管理redo file ,最少两组redo ,循环使用
     4)和数据文件存放到不同的磁盘上,需读写速度快的磁盘(比如采用RAID10)
     5)日志的block和数据文件的block不是一回事

SQL> select max(lebsz) from x$kccle;     //查看日志文件的块大小。

MAX(LEBSZ)
----------
       512
     
日志切换:
     1)归档模式:将历史日志连续的进行保存。
     2)非归档: 历史日志被覆盖
     3)并产生checkpoint,通知redo log 所对应的 dirty block 从data buffer刷新到datafile,并且更新控制文件
        
4.3 redo 日志组
     1)最少两组(考点),最好每组有两个成员(考点),并存放到不同的磁盘上,大小形同,互相镜像
     2)日志在组写满时发生切换,或手工切换: alter system switch logfile ;
     3)在归档模式,日志进行归档,并把相关的信息写入controlfile

4.4 如何添加日志组

15:49:43 SQL> select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS     ARC     STATUS           FIRST_CHANGE#     FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------------------------------------------
         1              1        143       52428800          1         YES     INACTIVE               2144594         17-7月 -12
         2              1        144       52428800          1         NO      CURRENT               2145200         17-7月 -12
         3              1        142       52428800          1         YES     INACTIVE               2113981         17-7月 -12

alter system flush buffer_cache;后incative变为active

15:50:31 SQL> col member for a50;
15:50:47 SQL> select group#, member from v$logfile;

GROUP# MEMBER
---------- --------------------------------------------------
         1 /u01/oradata/timran11g/redo01.log
         3 /u01/oradata/timran11g/redo03.log
         2 /u01/oradata/timran11g/redo02.log

增加一个组group4,

15:53:53 SQL> alter database add logfile '/u01/data/orcl/redo04.log' size 50m;
在ASM上添加日志组:alter database add logfile '+DATAVG/yjdb/onlinelog/group1-redo01.log' size 512m;

15:53:56 SQL> select group#, member from v$logfile order by group#;

GROUP# MEMBER
---------- --------------------------------------------------
         1 /u01/oradata/timran11g/redo01.log
         2 /u01/oradata/timran11g/redo02.log
         3 /u01/oradata/timran11g/redo03.log
         4 /u01/oradata/timran11g/redo04.log

4.5 如何添加日志组的成员

加member为每个组(一共是4个组)
先建好目录,准备放在/u01/disk2/timran/下
[oracle@timran timran]$ mkdir -p /u01/disk2/timran
[oracle@timran timran]$

16:00:39 SQL> alter database add logfile member
'/u01/disk2/timran/redo01b.log' to group 1,
'/u01/disk2/timran/redo02b.log' to group 2,
'/u01/disk2/timran/redo03b.log' to group 3,
'/u01/disk2/timran/redo04b.log' to group 4;

SQL> select group#,member,status from v$logfile;
 
    GROUP# MEMBER                                                                           STATUS
---------- -------------------------------------------------------------------------------- -------
         3 /u01/oradata/timran11g/redo03.log                                                
         2 /u01/oradata/timran11g/redo02.log                                                
         1 /u01/oradata/timran11g/redo01.log                                                
         4 /u01/oradata/timran11g/redo04.log                                                
         1 /u01/disk2/timran/redo01b.log                                                    INVALID
         2 /u01/disk2/timran/redo02b.log                                                    INVALID
         3 /u01/disk2/timran/redo03b.log                                                    INVALID
         4 /u01/disk2/timran/redo04b.log                                                    INVALID

16:01:54 SQL> select * from v$log;        //看到MEMBERS列已经是2了

GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS     ARC STATUS           FIRST_CHANGE#         FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
         1              1        143       52428800          2        YES INACTIVE               2144594         17-7月 -12
         2              1        144       52428800          2         NO  CURRENT              2145200         17-7月 -12
         3              1        142       52428800          2         YES INACTIVE               2113981         17-7月 -12
         4              1          0       52428800         2         YES UNUSED                       0

16:03:06 SQL> alter system switch logfile;    //多做几次切换,消除invalid  //同步组里的member,这步很重要。

4.6 如何查看日志信息

说明一下v$log这个重要的视图

status有四种状态:
 unused:     新添加的日志组,还没有使用
 inactive:     日志组对应的脏块已经从data buffer写入到data file ,可以覆盖
 active:     日志组对应的脏块还没有从data buffer写入到data file,含有实例恢复需要的信息,不能被覆盖,归档已完成
 current:     当前日志组,日志组对应的脏块还没有从data buffer写入到data file,含有实例恢复需要的信息,不能被覆盖
 
 thread:     线程(通过后台进程lgwr 启动),在单实例的环境下,thread# 永远是1
 sequence:     日志序列号。在日志切换时会递增。
 FIRST_CHANGE#: 在当前日志中记录的首个数据块的scn。(当事务完成的时候会在数据块上写入一个scn,代表数据块的变化)。

4.7、日志恢复(PPT-II-146-148)

例1 inactive日志组丢失

SQL> select * from v$log;
 
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS     ARCHIVED STATUS           FIRST_CHANGE#     FIRST_TIME
---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------
         1              1         59       52428800          2         NO           CURRENT               7108854         2013-3-25 1
         2              1         56       52428800          2         YES          INACTIVE               7087087         2013-3-25 1
         3              1         58       52428800          2         YES         INACTIVE              7108852         2013-3-25 1
         4             1         57       52428800          2         YES          INACTIVE               7108300         2013-3-25 1
 
注意:本例日志组4是INACTIVE状态的。

[oracle@timran timran]$ rm /u01/oradata/timran11g/redo04.log
[oracle@timran timran]$ rm /u01/disk2/timran/redo04b.log

SQL> alter database clear logfile group 3;        //注意:这一步使刚才在os里删掉的那两个group4的文件又建立上了。

例2 active日志组丢失(脏块未回写完成,但是归档已完成)

注:本例日志组3状态是ACTIVE状态的。

[oracle@timran timran]$ rm /u01/oradata/timran11g/redo03.log
[oracle@timran timran]$ rm /u01/disk2/timran/redo03b.log

SQL> alter database clear logfile group 3;
alter database clear logfile group 3
*
第 1 行出现错误:
ORA-01624: 日志 3 是紧急恢复实例 timran11g (线程 1) 所必需的
ORA-00312: 联机日志 3 线程 1: '/u01/oradata/timran11g/redo03.log'
ORA-00312: 联机日志 3 线程 1: '/u01/disk2/timran/redo03b.log'

SQL> alter system checkpoint;      //把cache buffer中的脏块全部写入datafile

SQL> alter database clear logfile group 1;

例3 current日志组丢失。

注:本例日志组1状态是CURRENT状态的

[oracle@timran timran]$ rm /u01/oradata/timran11g/redo01.log
[oracle@timran timran]$ rm /u01/disk2/timran/redo01b.log
[oracle@timran timran]$

01:10:11 SQL> alter system switch logfile;    切换几次,触动它一下。

告警日志会记录有关信息(ADR)

暂时好像没有什么问题发生,继续切换,当current 又转会到group1时,死机!

当前日志损坏的问题比较复杂,可以分以下几种情况讨论(PPT-II-147)

1)如果数据库没有崩溃(open)

第一步,可以做一个完全检查点,将db buffer中的所有dirty buffer全部刷新到磁盘上。

SQL> alter system checkpoint;

第二步,尝试数据库在打开状态下进行不做归档的强制清除。

SQL> alter system switch logfile;
SQL> alter database clear unarchived logfile group 2;

数据库此时为打开状态,这步若能成功,一定要做一个新的数据库全备(考点)。为何?因为当前日志没有归档,归档日志sequence已无法保持连续性。

2)如果数据库已经崩溃,准备做传统的基于日志的不完全恢复或使用闪回数据库
   在open过程中需要实例恢复要用到REDO LOG,所以database无法open

SQL> recover database until cancel;
SQL> alter database open resetlogs;

3)如果严重到以上方法都不能resetlogs打开数据库,可以试试下面的最后一招:

修改pfile文件,第一行添加_allow_resetlogs_corruption=TRUE   600
该参数的含义是:允许在破坏一致性的情况下强制重置日志,打开数据库。_allow_resetlogs_corruption将使用所有数据文件最旧的SCN打开数据库,所以通常来讲需要保证SYSTEM表空间拥有最旧的SCN。在强制打开数据库之后,可能因为各种原因会有ora-600错误。

[oracle@work dbs]$ vi inittest11g.ora

_allow_resetlogs_corruption=TRUE
*.audit_file_dest='/u01/admin/timran11g/adump'
*.audit_trail='db'
*.compatible='11.1.0.0.0'
...
...

//再以pfile 启动instance 到mount状态,然后 alter database open resetlogs
//这是在不一致状态下强行打开了数据库,建议做一个逻辑全备。
exp/expdp

4.8 使日志恢复到原来的配置

尝试使用EM方式恢复原状。删除增加的member和group4,注意当前日志组要切换后才能删除,最后,验证无误后删掉/u01/disk2目录。

oracle之二redo日志的更多相关文章

  1. Oracle recover current redo ORA-00600:[4193] (oracle 故障恢复current redo日志ORA-00600:[4193]报错)

    背景:搭建了一套oracle 19c主备库(单实例非CDB,PDB),linux7.5在断电后(没有进行数据库关闭)重启数据库报错如下图,redo当前状态下进行不完全恢复主库后resetlogs 打开 ...

  2. ORACLE DG添加redo日志成员

    ORACLE DG在线日志添加日志成员 SQL>select SEQUENCE#,first_time,next_time,APPLIED, THREAD# from v$archived_lo ...

  3. oracle之二归档日志

    归档日志 archivelog 5.1 归档和非归档的区别     1)归档会在日志切换时,备份历史日志,用于OLTP,可以进行冷备份和热备份,可以实现数据库完全恢复.不完全恢复(基于时间点)     ...

  4. oracle(十二)redo 与 undo

    1.undo:回滚未提交的事务.未提交前,内存不够用时,DBWR将脏数据写入数据文件中,以腾出内存空间. 这就是undo存在的原因. redo:恢复所有已提交的事务 2.实例失败(如主机掉电)可能出现 ...

  5. Oracle redo 日志切换时间频率

    DB: 11.2.0.3.0 查看Oracle的redo日志切换频率 两条SQL,原理是一样的,第二个用到了统计函数 时间单位:分钟 方法一. select * from v$log a where ...

  6. 查看Oracle的redo日志切换频率

    1.Oracle log 每次切换会记录到告警日志中 设想写个方案来查看log切换频率来判断Oracle log是否应该更改大小. 2.sql a.查看redo日志信息 select * from v ...

  7. Oracle redo 日志损坏的几种情况下的恢复

    Oracle redo 日志损坏的几种情况下的恢复 第一:损坏的redo为非正在使用的redo log 1.归档模式,不是当前正在日志损坏,数据库打开模式. 模拟损坏:SQL> select * ...

  8. 7.26实习培训日志-Oracle SQL(二)

    Oracle SQL(二) 条件表达式 CASE 语句 或者DECODE 函数,两者均可实现 IF-THEN-ELSE 的逻辑,相比较而言,DECODE 更加简洁 SELECT last_name , ...

  9. Oracle GoldenGate 二、配置和使用

    Oracle GoldenGate 二.配置和使用 配置和使用GoldenGate的步骤 1 在源端和目标端配置数据库支持GoldenGate 2 在源端和目标端创建和配置GoldenGate实例 3 ...

随机推荐

  1. 【SDOI2009】 HH的项链 - 莫队

    题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...

  2. PAT 2-07. 素因子分解(20)

    题目链接:http://www.patest.cn/contests/ds/2-08 题目意思:long int范围内的正整数N进行素因子分解. 直接整除即可,不需要素数筛选 代码如下: #inclu ...

  3. node.js03 第一个node.js程序和读取文件

    Hello World 1.创建运行 创建txt文件起名为hellonode,在记事本中编写JavaScript脚本文件 例如: var bbl = 'hellonode' console.log(b ...

  4. 怎么创建一个良好的Git提交信息

    译   原文:https://dev.to/chrissiemhrk/git-commit-message-5e21 提交信息是对提交之前添加和更改的文件所做的更改的简短描述. 良好的提交信息不仅对你 ...

  5. Hadoop的SecondaryNameNode的作用是什么?

    为节省篇幅,将SecondaryNameNode简称SNN,NameNode简称NN. NN与fsimage.edits文件 NN负责管理HDFS中所有的元数据,包括但不限于文件/目录结构.文件权限. ...

  6. 神舟zx6-ct5da装黑苹果Macos 10.15.6记录

    可能是一时脑子抽风,突然就想体验一把mac系统.以前就了解过,给非苹果电脑装macos叫黑苹果,emmmmm.好吧,给我的神船也整一个. 看了很多个视频,整理一下装黑苹果过程.本人电脑系统是win10 ...

  7. C# 解析获取Url参数值

    今天遇到一个需求,需要处理通过接口传过来的一个参数,参数内容为一个拼接好的Url地址,且该地址还会携带了一些额外的参数,包括但不限于数字,字符串,json串.样例如下: http://www.cple ...

  8. vue-cli3.0 vue脚手架3.0的使用

    1.安装vue-cli 3.0 npm install -g @vue/cli # or yarn globaladd @vue/cli 安装成功后查看版本:vue -V(大写的V)     2.命令 ...

  9. Mysql如何将某个字段的值,在原有的基础上+1?

    Eg: 电商项目中,需要统计某件商品的购买数量问题,这时产品提了一个bug,告诉你我需要你做一个购买数量统计?你会怎么做呢? 这里我只说我自己的思路,首先是浏览加购物车,创建订单并支付,mq消息消费后 ...

  10. spring集成shiro,事务失效问题 not eligible for auto-proxying

    BeanPostProcessor bean实例化顺序有关,@Configuration会最先实例化,也就是在spring启动完成之前. 导致Configuration中使用的注入,没能在spring ...