redo (重做) log 的
功能:数据recovery 4.2 redo log 特征: 1)记录
数据库的变化(DML、DDL) 2)用于数据块的recover 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 15:50:31
sql> col member for a50; 15:50:47
sql> select group#,member from v$logfile; select * 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/oradata/timran11g/redo04.log' size 50m; 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/oradata/timran11g/redo01b.log' to group 1,'/u01/oradata/timran11g/redo02b.log' to group 2,'/u01/oradata/timran11g/redo03b.log' to group 3,'/u01/oradata/timran11g/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 4; //注意:这一步使刚才在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; (执行检查点)
sql> alter database clear logfile group 3; 例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; 切换几次,触动它一下。 告警日志会记录有关信息 暂时好像没有什么问题发生,继续切换,当current 又转会到group1时,死机! 当前日志损坏的问题比较复杂,可以分以下几种情况讨论(PPT-II-147) 1)如果
数据库没有崩溃 第一步,可以做一个完全检查点,将db buffer中的所有dirty buffer全部刷新到磁盘上。
sql> alter system checkpoint; 第二步,尝试
数据库在打开状态下进行不做归档的强制清除。
sql> alter database clear unarchived logfile group n;
数据库此时为打开状态,这步若能成功,一定要做一个新的
数据库全备(注意点)。为何?因为当前日志没有归档,归档日志sequence已无法保持连续性。 2)如果
数据库已经崩溃,准备做传统的基于日志的不完全恢复或使用闪回
数据库。
sql> recover database until cancel;
sql> alter database open resetlogs; 3)如果严重到以上
方法都不能resetlogs打开
数据库,可以试试下面的最后一招:
修改pfile
文件,第一行
添加_allow_resetlogs_corruption=TRUE 该参数的含义是:允许在破坏一致性的情况下强制重置日志,打开
数据库。_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 //这是在不一致状态下强行打开了
数据库,建议做一个逻辑全备。 4.8 使日志恢复到原来的配置 尝试使用EM方式恢复原状。
删除增加的member和group4,注意当前日志组要切换后才能
删除,最后,验证无误后删掉/u01/disk2目录。