重做日志管理
1.重做日志:是由多文件组成的存储数据库发生的所有更改,当数据发生意外、故障最可以从Redo Log里恢复所有的更改,是构成
数据恢复操作最重要的组成部分。
2.重做日志文件是被由在数据里描述各个数据块更改信息的变化矢量组成的重做记录所填满的。
重做记录被缓存在SGA里的Redo Buffer里,将会被数据库后台进程(LGWR)写入日志文件,在重做记录系统分配SCN标志每次的事务
提交。
注意:并不是只有当事务提交时才会写入Redo Log,当Redo Buffer里已被装满了时也会写入Redo Log,这样当事务没有提交时也能
回滚更改。
3.Redo Log File也是循环使用的,Oracle允许使用最少两个日志组,当正在在线日志满了,系统会用下一个替换,并且每个日志
文件都有编号,一个个循环使用。缺省情况下,数据库创建3个日志组。
SQL> col member for a40
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ---------------------------------------- ---
3 ONLINE D:\APP\ZILING\ORADATA\ORCL\REDO03.LOG NO
2 ONLINE D:\APP\ZILING\ORADATA\ORCL\REDO02.LOG NO
1 ONLINE D:\APP\ZILING\ORADATA\ORCL\REDO01.LOG NO
STATUS列为空表示文件在使用中。
竟然是循环使用必然存在文件被overwrite的情况,如果你的oracle是处于归档模式下,oracle直到归档后台进程(ARCn)把日志存
档了后才能重新使用和覆盖这个在线日志文件。
oracle推荐我们使多路传输redo log文件,因为如果只是单路日志文件,当正在使用的日志文件出现故障,对于数据恢复将是一场
灾难。并且多路日志文件最好放在不同的磁盘上,这样即使其中一个磁盘损坏等故障仍然可以恢复数据库。
4.下在建一个重做日志文件并指定组
Note:建日志文件时一定要指定文件的全路径,因为创此文件是由打操作系统创建的,所以不会自动建在默认的目录或系统目录。
QL> alter database add logfile member 'D:\app\ZiLing\oradata\orcl\redo_bak\REDO02.LOG' to group 2;
Database altered.
前面已讲到日志文件是分组的,一组里面可以有多个日志文件,下面是增加组的sql并指定大小和日志文件名和组号码
SQL> alter database add logfile group 4 ('D:\app\ZiLing\oradata\orcl\redo_bak\REDO01.LOG') size 5000k;
下面移动日志文件
首先关闭数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
再以装载模式启动数据库
SQL> startup mount
ORACLE instance started.
Total System Global Area 535662592 bytes
Fixed Size 1334380 bytes
Variable Size 201327508 bytes
Database Buffers 327155712 bytes
Redo Buffers 5844992 bytes
Database mounted.
SQL> alter database
2 rename file 'D:\app\ZiLing\oradata\orcl\REDO01.LOG'
3 to 'D:\app\ZiLing\oradata\orcl\redo_bak\REDO01.LOG';
Database altered.
打开数据库
SQL> alter database open;
查询
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ---------------------------------------- ---
3 ONLINE D:\APP\ZILING\ORADATA\ORCL\REDO03.LOG NO
2 ONLINE D:\APP\ZILING\ORADATA\ORCL\REDO02.LOG NO
1 ONLINE D:\APP\ZILING\ORADATA\ORCL\redo_bak\REDO01.LOG NO
接下来删除刚建的组
SQL> alter database drop logfile group 4;
Database altered.
接下来删除刚建的日志文件member
SQL> alter database drop logfile member 'D:\app\ZiLing\oradata\orcl\redo_bak\REDO02.LOG';
alter database drop logfile member 'D:\app\ZiLing\oradata\orcl\redo_bak\REDO02.LOG'
*
ERROR at line 1:
ORA-01609: log 2 is the current log for thread 1 - cannot drop members
ORA-00312: online log 2 thread 1: 'D:\APP\ZILING\ORADATA\ORCL\REDO02.LOG'
ORA-00312: online log 2 thread 1:
'D:\APP\ZILING\ORADATA\ORCL\REDO_BAK\REDO02.LOG'
报错了,因为这个组正好在当前在用的组。
怎么办呢,我们先交换日志文件,前面说过日志文件是循环使用的,使用命令先将当前日志文件组交换成另一个组
SQL> alter system switch logfile;
alter system switch logfile
*
ERROR at line 1:
ORA-01109: database not open
报错:因为当前是mount模式,这条命令需要打开启动数据库才能完成
SQL> alter database open;
Database altered.
SQL> alter system switch logfile;
System altered.
这下交换完成了,查询V$LOG看结果,第二个变成CURRENT了
SQL> SELECT GROUP#, ARCHIVED, STATUS FROM V$LOG;
GROUP# ARC STATUS
---------- --- ----------------
1 NO INACTIVE
2 NO CURRENT
3 NO INACTIVE
关闭重开启mount模式再使用以下命令:
SQL> alter database drop logfile member 'D:\app\ZiLing\oradata\orcl\redo_bak\REDO02.LOG';
Database altered.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25989950/viewspace-709524/ ,如需转载,请注明出处,否则将追究法律责任。