Redo log

1 作用

重做日志文件用来记录数据库所有发生过的更改信息(修改、添加、删除等)以及由Oracle内部行为(创建数据表、索引等)而引起的数据库变化信息,在数据库恢复时,可以从该日志文件中读取原始记录。在数据库运行期间,当用户执行commit命令时,数据库首先将每笔操作的原始记录写入日志文件中,写入日志文件后,才把新的记录传递给应用程序,所以,在日志文件上可以随时读取原始记录以恢复某些数据。
实例恢复 instance recovery

2 特征

1)日志条目+记录数据库中块的变化(DML、DDL):由LGWR写入
2)用于数据块的 recover
3)以组的方式管理 redo file,最少两组 redo,循环使用
4)和数据文件存放到不同的磁盘上,需读写速度快的磁盘(比如采用 RAID10)
5)日志的 block 和数据文件的 block 不一样

3 redo file group

在这里插入图片描述
三组循环使用,每组就一个文件。如果有文件坏了,风险会变大,所以会增加第二个member。一个组里的所有文件的内容是同步的。所以部署在不同的磁盘上。
在生产环境中,安全规划是最好一个日志组两个日志成员(在不同路径);根据生产压力来决定组数和日志大小;一般50M比较小,可以根据生产压力适当调大。

4 查看日志信息的三个视图

4.1 v$log

查看组信息

SQL> select group#,sequence#,bytes/1024/1024 size_M,blocksize,members,status from v$log;

    GROUP#  SEQUENCE#	  SIZE_M  BLOCKSIZE    MEMBERS STATUS
---------- ---------- ---------- ---------- ---------- ----------------
	 1	   10	      50	512	     1 INACTIVE
	 2	   11	      50	512	     1 INACTIVE
	 3	   12	      50	512	     1 CURRENT
  • 每一组现在只有一个成员member,也就是说一组只有一个redo log
  • 最大的序列号12就是当前正在被使用的组group 3,如果现在用到group 1了,那么group 1的号会变为13
  • 默认大小是50 M,数据块字节是512

4.2 v$logfile

查看文件信息

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER					      IS_
---------- ------- ------- -------------------------------------------------- ---
	 1	   ONLINE  /oracledata/oradata/nsfcdc/redo01.log	      NO
	 3	   ONLINE  /oracledata/oradata/nsfcdc/redo03.log	      NO
	 2	   ONLINE  /oracledata/oradata/nsfcdc/redo02.log	      NO

4.3 v$archived_log(归档模式下查看)

THREAD#: 线程在单实例的环境下,thread# 永远是 1
SEQUENCE# 日志序列号。在日志切换时会递增,每一个节点有一个自己的编号
FIRST_CHANGE# 在每个日志组对应一个 sequence 号,其中FIRST_CHANGE# 是首条日志条目的第一个的 scn。

5 工作原理

STATUS 列有四种状态:
1.current: 当前日志组对应的脏块还没有全部从 data buffer 写入到 data file,含有实例恢复需要的信息,不能被覆盖
2. active: 日志组对应的脏块还没有完全从 data buffer 写入到 data file,含有实例恢复需要 的信息,不能被覆盖
3.inactive: 日志组对应的脏块已经从 data buffer 写入到 data file,可以覆盖(如果循环回来是active,那么数据库要等到inactive才能用)
4. unused:新添加的日志组,还没有使用
只要redo log的状态不是current和active就都会被用

如果redo特别忙,切换的过程一直是active,就会一直没有可用的,要一直等
切换日志组:
alter system switch logfile;

6 添加日志组

1.查看当前信息
在这里插入图片描述
2.添加日志组
在这里插入图片描述
3.查看状态
在这里插入图片描述4.切换日志组
在这里插入图片描述
*4个组并不是按顺序循环的

7 添加成员文件

1.为每个组增加一个 member(一共是 3个组) 先建好目录,准备放在/opt/oracle/log_member/下(假设这个目录是一块新的磁盘)

[oracle@nsfcdc ~]$ mkdir log_member
[oracle@nsfcdc log_member]$ pwd
/opt/oracle/log_member

2.为group 1 添加成员文件

SQL>alter database add logfile member '/opt/oracle/log_member/redo01.log' to group 1;

3.为所有group添加1个成员

SQL> select group#,sequence#,bytes/1024/1024 size_M,blocksize,members,status from v$log;

    GROUP# SEQUENCE#	 SIZE_M  BLOCKSIZE    MEMBERS STATUS
---------- --------- ---------- ---------- ---------- ----------------
	 1	  10	     50        512	    2 INACTIVE
	 2	  11	     50        512	    2 INACTIVE
	 3	  12	     50        512	    2 CURRENT

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER					      IS_
---------- ------- ------- -------------------------------------------------- ---
	 1	   ONLINE  /oracledata/oradata/nsfcdc/redo01.log	      NO
	 3	   ONLINE  /oracledata/oradata/nsfcdc/redo03.log	      NO
	 2	   ONLINE  /oracledata/oradata/nsfcdc/redo02.log	      NO
	 1 INVALID ONLINE  /opt/oracle/log_member/redo01.log		      NO
	 2 INVALID ONLINE  /opt/oracle/log_member/redo02.log		      NO
	 3 INVALID ONLINE  /opt/oracle/log_member/redo03.log		      NO

6 rows selected.

STATUS 是 INVALID,说明 member 还没有同步好。
4.切换日志组,完成同步,消除invalid

SQL> alter system switch logfile;

System altered.

# 切换三次

SQL> select group#,status,sequence# from v$log;

    GROUP# STATUS	    SEQUENCE#
---------- ---------------- ---------
	 1 INACTIVE		   13
	 2 INACTIVE		   14
	 3 CURRENT		   15
SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER					      IS_
---------- ------- ------- -------------------------------------------------- ---
	 1	   ONLINE  /oracledata/oradata/nsfcdc/redo01.log	      NO
	 3	   ONLINE  /oracledata/oradata/nsfcdc/redo03.log	      NO
	 2	   ONLINE  /oracledata/oradata/nsfcdc/redo02.log	      NO
	 1	   ONLINE  /opt/oracle/log_member/redo01.log		      NO
	 2	   ONLINE  /opt/oracle/log_member/redo02.log		      NO
	 3	   ONLINE  /opt/oracle/log_member/redo03.log		      NO

6 rows selected.

8 修改现有的日志文件大小

先删再建
1.删除日志组

  • 先查看各组状态
SQL> select group#,sequence#,bytes/1024/1024 size_M,blocksize,members,status from v$log;

    GROUP#  SEQUENCE#	  SIZE_M  BLOCKSIZE    MEMBERS STATUS
---------- ---------- ---------- ---------- ---------- ----------------
	 1	   16	     100	512	     1 INACTIVE
	 2	   17	      50	512	     2 CURRENT
	 3	   15	      50	512	     2 INACTIVE

current和active状态下的group不能删

  • 删除group 3
SQL> alter database drop logfile group 3;

Database altered.

2.添加组及成员

  • 添加成员及成员文件
SQL> alter database add logfile member '/opt/oracle/log_member/redo03.log' to group 3;
alter database add logfile member '/opt/oracle/log_member/redo03.log' to group 3
*
ERROR at line 1:
ORA-00301: error in adding log file '/opt/oracle/log_member/redo03.log' - file cannot be created
ORA-27038: created file already exists
Additional information: 1

drop logfile group的时候不会删掉磁盘上的文件,删除物理文件需要rm。而且删除日志组的时候,控制文件也被更新。

  • 手动删除物理文件
SQL> ! rm /oracledata/oradata/nsfcdc/redo03.log

SQL> ! rm /opt/oracle/log_member/redo03.log
  • 重新添加成员及成员文件
SQL> alter database add logfile group 3 '/oracledata/oradata/nsfcdc/redo03.log' size 100M;

Database altered.
SQL> alter database add logfile member '/opt/oracle/log_member/redo03.log' to group 3;

Database altered.

SQL> select group#,sequence#,bytes/1024/1024 size_M,archived,members,status from v$log;

    GROUP#  SEQUENCE#	  SIZE_M ARC	MEMBERS STATUS
---------- ---------- ---------- --- ---------- ----------------
	 1	   16	      50 YES	      2 INACTIVE
	 2	   17	      50 NO	      2 CURRENT
	 3	    0	     100 YES	      2 UNUSED
  • 为group 1一次添加两个成员文件
SQL> alter database add logfile group 1 ('/oracledata/oradata/nsfcdc/redo01.log','/opt/oracle/log_member/redo01.log') size 100M;

Database altered.

SQL> select group#,sequence#,bytes/1024/1024 size_M,archived,members,status from v$log;

    GROUP#  SEQUENCE#	  SIZE_M ARC	MEMBERS STATUS
---------- ---------- ---------- --- ---------- ----------------
	 1	   16	      100 YES	      2 INACTIVE
	 2	   17	      50 NO	      2 CURRENT
	 3	    0	     100 YES	      2 UNUSED
  • 把active变为inactive:手动发起检查点
SQL> alter system checkpoint;

System altered.

SQL> select group#,status from v$log;

    GROUP# STATUS
---------- ----------------
	 1 CURRENT
	 2 INACTIVE
	 3 INACTIVE
  • 为group 2扩展大小至100 M
SQL>  select group#,sequence#,bytes/1024/1024 size_M,archived,members,status from v$log;

    GROUP#  SEQUENCE#	  SIZE_M ARC	MEMBERS STATUS
---------- ---------- ---------- --- ---------- ----------------
	 1	   20	     100 NO	      2 CURRENT
	 2	   19	     100 YES	      2 INACTIVE
	 3	   18	     100 YES	      2 INACTIVE

9 日志成员文件的迁移

9.1 方法一:关库-移动

1.关库

SQL> shutdown immediate;

2.重命名文件

mv /oracledata/oradata/nsfcdc/redo02.log /opt/oracle/log_member/redo02_1.log

3.将数据库启动到mount

SQL> statup mount;
SQL> select group#,member from v$logfile order by 1;

4.通知控制文件

SQL> alter database rename file '/oracledata/oradata/nsfcdc/redo02.log' to '/opt/oracle/log_member/redo02_1.log';

5.打开数据库

SQL> alter database open;

9.2 方法二:先删后加

1.查看组信息

SQL> select group#,status from v$log;
SQL> select group#,member from v$logfile;

2.手动发起检查点,切换current组

SQL> alter system checkpoint;
SQL> select group#,status from v$log;

3.删除非current组成员文件

SQL> alter database drop logfile member '/oracledata/oradata/nsfcdc/redo02.log';

4.添加组成员文件

SQL> alter database add logfile member '/opt/oracle/log_member/redo02.log' to group 2;

10 在线日志文件的恢复方法

  • 不小心干掉current日志组的报错信息:
    在这里插入图片描述
  • 解决办法:(不完全恢复)
SQL> conn / as sysdba
Connected to an idle instance.
 
SQL> create pfile from spfile;
File created.
 
SQL> startup mount;
ORACLE instance started.

SQL> recover database until cancel;
Media recovery complete.
 
SQL> alter database open resetlogs;
Database altered.
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值