oracle之二redo日志
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日志的更多相关文章
- Oracle recover current redo ORA-00600:[4193] (oracle 故障恢复current redo日志ORA-00600:[4193]报错)
背景:搭建了一套oracle 19c主备库(单实例非CDB,PDB),linux7.5在断电后(没有进行数据库关闭)重启数据库报错如下图,redo当前状态下进行不完全恢复主库后resetlogs 打开 ...
- ORACLE DG添加redo日志成员
ORACLE DG在线日志添加日志成员 SQL>select SEQUENCE#,first_time,next_time,APPLIED, THREAD# from v$archived_lo ...
- oracle之二归档日志
归档日志 archivelog 5.1 归档和非归档的区别 1)归档会在日志切换时,备份历史日志,用于OLTP,可以进行冷备份和热备份,可以实现数据库完全恢复.不完全恢复(基于时间点) ...
- oracle(十二)redo 与 undo
1.undo:回滚未提交的事务.未提交前,内存不够用时,DBWR将脏数据写入数据文件中,以腾出内存空间. 这就是undo存在的原因. redo:恢复所有已提交的事务 2.实例失败(如主机掉电)可能出现 ...
- Oracle redo 日志切换时间频率
DB: 11.2.0.3.0 查看Oracle的redo日志切换频率 两条SQL,原理是一样的,第二个用到了统计函数 时间单位:分钟 方法一. select * from v$log a where ...
- 查看Oracle的redo日志切换频率
1.Oracle log 每次切换会记录到告警日志中 设想写个方案来查看log切换频率来判断Oracle log是否应该更改大小. 2.sql a.查看redo日志信息 select * from v ...
- Oracle redo 日志损坏的几种情况下的恢复
Oracle redo 日志损坏的几种情况下的恢复 第一:损坏的redo为非正在使用的redo log 1.归档模式,不是当前正在日志损坏,数据库打开模式. 模拟损坏:SQL> select * ...
- 7.26实习培训日志-Oracle SQL(二)
Oracle SQL(二) 条件表达式 CASE 语句 或者DECODE 函数,两者均可实现 IF-THEN-ELSE 的逻辑,相比较而言,DECODE 更加简洁 SELECT last_name , ...
- Oracle GoldenGate 二、配置和使用
Oracle GoldenGate 二.配置和使用 配置和使用GoldenGate的步骤 1 在源端和目标端配置数据库支持GoldenGate 2 在源端和目标端创建和配置GoldenGate实例 3 ...
随机推荐
- 深度强化学习:Policy-Based methods、Actor-Critic以及DDPG
Policy-Based methods 在上篇文章中介绍的Deep Q-Learning算法属于基于价值(Value-Based)的方法,即估计最优的action-value function $q ...
- 解读闭包,这次从ECMAScript词法环境,执行上下文说起
对于x年经验的前端仔来说,项目也做了好些个了,各个场景也接触过一些.但是假设真的要跟面试官敞开来撕原理,还是有点慌的.看到很多大神都在手撕各种框架原理还是有点羡慕他们的技术实力,羡慕不如行动,先踏踏实 ...
- Typora markdown代码块显示序号
打开偏好设置,找到代码块 打开显示行号 然后关闭Typora重新打开 此时代码块就有行号了
- Elasticsearch第五篇:PlainElastic.Net 操作 Elasticsearch
再次强调,我安装的Elasticsearch 版本是 7.8.0 ,C# 操作 Elasticsearch 的驱动有 NEST.Elasticsearch.net .PlainElastic.Net ...
- 《Java从入门到失业》第一章:计算机基础知识(二):计算机组成及基本原理
1.2计算机组成及基本原理 1.2.1硬件组成 这里说的计算机主要指微型计算机,俗称电脑.一般我们见到的有台式机.笔记本等,另外智能手机.平板也算.有了一台计算机,我们就能做很多事情了,比如我在写这篇 ...
- AS报错:gradle project sync failed
情形一: Android studio下突然报错: gradle project sync failed.Basic functionality(e.g.editing,debugging) will ...
- package controllerutil
原文链接:https://s0godoc0org.icopy.site/sigs.k8s.io/controller-runtime/pkg/controller/controllerutil imp ...
- python中a, b = a, a + b这条语句是如何执行的?
a,b=b,a+b,这条语句在"理解"上还是与C语言有些差别的.在Python中,可以做下面的方式理解:首先,把等号右边的算式分别算完再说,然后按照一一对应的关系把值赋给等号左边的 ...
- cinderclient命令行源码解析
一.简介 openstack的各个模块中,都有相应的客户端模块实现,其作用是为用户访问具体模块提供了接口,并且也作为模块之间相互访问的途径.Cinder也一样,有着自己的cinder-client. ...
- 招新裁老,两面派互联网大厂,培训三个月,就拿15K,凭什么?
看到一位朋友在发帖子求问:亲身经历,(如有谎言我名字倒过来写)一个大学同学18年毕业的.在兰州一个二本学的兽医农牧,毕业难找工作,去深圳一个机构培训了三个月吧,然后就去做大数据 算法了,然后又去做ja ...