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/下(假设这个目录是一块新的磁盘)
[[email protected] ~]$ mkdir log_member
[[email protected] 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.