一、增加联机重做日志的组和组成员
1. 增加组
SQL> desc v$logfile;
1
2
3
4
5
6
7
| Name Null? Type
------------------------------------------------- --------------------
GROUP# NUMBER
STATUS VARCHAR2(7)
TYPE VARCHAR2(7)
MEMBER VARCHAR2(513)
IS_RECOVERY_DEST_FILE VARCHAR2(3)
|
SQL> col member format a40
SQL> select * from v$logfile;
1
2
3
4
5
6
7
|
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ----------------------------------------------------
3 ONLINE /oracle/oradata/orcl/redo03.log NO
2 ONLINE /oracle/oradata/orcl/redo02.log NO
1 ONLINE /oracle/oradata/orcl/redo01.log NO
-- 当前的联机重做日志文件一共有三组,每组有一个组成员
|
SQL> alter database add logfile group 4
2 ('/oracle/oradata/orcl/redo04.log') size 50M;
1
2
3
| -- 新增第四组
Database altered.
|
SQL> select * from v$logfile;
1
2
3
4
5
6
| GROUP# STATUS TYPE MEMBER IS_
---------- ------- ---------------------------------------------------
3 ONLINE /oracle/oradata/orcl/redo03.log NO
2 ONLINE /oracle/oradata/orcl/redo02.log NO
1 ONLINE /oracle/oradata/orcl/redo01.log NO
4 ONLINE /oracle/oradata/orcl/redo04.log NO
|
[oracle@localhost~]$ cd /oracle/oradata/orcl
[oracle@localhostorcl]$ ll
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| total 1745000
-rw-r-----. 1 oracle oinstall 9748480 Aug 29 19:10 control01.ctl
-rw-r-----. 1 oracle oinstall 9748480 Aug 27 09:21 control02.ctl
-rw-r-----. 1 oracle oinstall 9748480 Aug 27 09:21 control03.ctl
-rw-r-----. 1 oracle oinstall 104865792 Aug 29 18:56example01.dbf
-rw-r-----. 1 oracle oinstall 52429312 Aug 29 19:10 redo01.log
-rw-r-----. 1 oracle oinstall 52429312 Aug 29 18:18 redo02.log
-rw-r-----. 1 oracle oinstall 52429312 Aug 29 18:19 redo03.log
-rw-r-----. 1 oracle oinstall 52429312 Aug 29 19:09 redo04.log
-- 可以看到第四个组了
-rw-r-----. 1 oracle oinstall 650125312 Aug 29 19:07sysaux01.dbf
-rw-r-----. 1 oracle oinstall 723525632 Aug 29 19:07system01.dbf
-rw-r-----. 1 oracle oinstall 20979712 Aug 29 16:26 temp01.dbf
-rw-r-----. 1 oracle oinstall 57679872 Aug 29 19:10 undotbs01.dbf
-rw-r-----. 1 oracle oinstall 5251072 Aug 29 18:56 users01.dbf
|
2. 增加组成员
建议将文件名起为rdo,以防止误删除。
SQL> alter database add logfile member
2 '/oracle/oradata/orcl/redo04a.log' to group 4;
1
2
3
| -- 增加组成员无需指定大小,会自动和现有组成员的大小保持一致。
Database altered.
|
SQL> select * from v$logfile;
1
2
3
4
5
6
7
8
| GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ---------------------------------------- ---
3 ONLINE /oracle/oradata/orcl/redo03.log NO
2 ONLINE /oracle/oradata/orcl/redo02.log NO
1 ONLINE /oracle/oradata/orcl/redo01.log NO
4 ONLINE /oracle/oradata/orcl/redo04.log NO
4 INVALID ONLINE /oracle/oradata/orcl/redo04a.log NO
-- 新增了一个组成员redo04a.log
|
[oracle@localhost~]$ cd /oracle/oradata/orcl
[oracle@localhostorcl]$ ll
1
2
3
4
5
6
7
8
9
| total 1796204
-rw-r-----. 1 oracle oinstall 9748480 Aug 29 19:17 control01.ctl
…
-rw-r-----. 1 oracle oinstall 52429312 Aug 29 19:17 redo01.log
-rw-r-----. 1 oracle oinstall 52429312 Aug 29 18:18 redo02.log
-rw-r-----. 1 oracle oinstall 52429312 Aug 29 18:19 redo03.log
-rw-r-----. 1 oracle oinstall 52429312 Aug 29 19:15 redo04a.log
-- 新增的组成员
-rw-r-----. 1 oracle oinstall 52429312 Aug 29 19:09 redo04.log
|
二、删除联机重做日志的组和组成员
A. 删除组成员
如果删除了组成员,则会出组成员不对称的情况。这样的操作是允许的,但应该是临时的,一旦进行了这样的操作,需要马上纠正,以保障每个组至少有两个成员,以防止单点故障。
一个数据库实例启动后,至少要保证有两组联机重做日志文件,以确保可以循环写入。组成员的状态如果是INVALID,则数据库无法访问该联机重做日志文件。无法删除的情况如下:
1. 如果一个组中只剩最后一个组成员(或该组有多个组成员,但只有一个是有效(VALID)的),则该组将无法删除;
2. 如果该组成员属于ACTIVE 或CURRENT状态的组,也无法删除,如果一定要删除,可先执行LogSwitches操作。
事实上,删除RedoLog Memebre并不是真正的删除了这个文件,而是对ControlFile中的相关参数进行修改,当删除成功后,再通过操作系统的相关命令删除真实的文件。在删除一个组成员前,务必保证该成员已经被归档。
SQL> select * from v$logfile;
1
2
3
4
5
6
7
| GROUP# STATUS TYPE MEMBER IS_
---------- ------- ----------------------------------------------------
3 ONLINE /oracle/oradata/orcl/redo03.log NO
2 ONLINE /oracle/oradata/orcl/redo02.log NO
1 ONLINE /oracle/oradata/orcl/redo01.log NO
4 ONLINE /oracle/oradata/orcl/redo04.log NO
4 ONLINE /oracle/oradata/orcl/redo04a.log NO
|
SQL> alter database drop logfile member'/oracle/oradata/orcl/redo04a.log';
1
2
3
4
5
6
7
| alter database drop logfile member'/oracle/oradata/orcl/redo04a.log'
*
ERROR at line 1:
ORA-01609: log 4 is the current log for thread 1 - cannotdrop members
ORA-00312: online log 4 thread 1:'/oracle/oradata/orcl/redo04.log'
ORA-00312: online log 4 thread 1:'/oracle/oradata/orcl/redo04a.log'
-- 无法删除,因为当前的组状态是CURRENT
|
SQL> alter system switch logfile;
1
2
| -- 执行Log Switches操作
System altered.
|
SQL> alter system checkpoint;
1
2
| -- 执行检查点操作
System altered.
|
SQL> select group#, thread#, sequence#,status from v$log;
1
2
3
4
5
6
7
| -- 以保证要删除的组处于INACTIVE状态
GROUP# THREAD# SEQUENCE# STATUS
---------- ---------- ---------- ----------------
1 1 38 CURRENT
2 1 36 INACTIVE
3 1 37 INACTIVE
4 1 35 INACTIVE
|
SQL> alter database drop logfile member'/oracle/oradata/orcl/redo04a.log';
1
2
| -- 这一次成功删除了组成员
Database altered.
|
SQL> select * from v$logfile;
1
2
3
4
5
6
7
| GROUP# STATUS TYPE MEMBER IS_
---------- ------- ---------------------------------------------------
3 ONLINE /oracle/oradata/orcl/redo03.log NO
2 ONLINE /oracle/oradata/orcl/redo02.log NO
1 ONLINE /oracle/oradata/orcl/redo01.log NO
4 ONLINE /oracle/oradata/orcl/redo04.log NO
-- 第四组已经没有redo04a.log这个组成员了
|
[oracle@localhost ~]$ cd /oracle/oradata/orcl
[oracle@localhost orcl]$ ll
1
2
3
4
5
6
7
8
9
| total 1712800
-rw-r-----. 1 oracle oinstall 9748480 Sep 10 05:06 control01.ctl
...
-rw-r-----. 1 oracle oinstall 52429312 Sep 10 05:06 redo01.log
-rw-r-----. 1 oracle oinstall 52429312 Sep 10 05:01 redo02.log
-rw-r-----. 1 oracle oinstall 52429312 Sep 10 05:01 redo03.log
-rw-r-----. 1 oracle oinstall 52429312 Sep 10 05:00 redo04a.log
-- 虽然删除了组成员,但文件任然保存在磁盘上
-rw-r-----. 1 oracle oinstall 52429312 Sep 10 05:00 redo04.log
|
SQL> alter database drop logfile member'/oracle/oradata/orcl/redo04.log';
1
2
3
4
5
| alter database drop logfile member'/oracle/oradata/orcl/redo04.log'
*
ERROR at line 1:
ORA-00361: cannot remove last log member/oracle/oradata/orcl/redo04.log for group 4
--无法进一步删除组成员redo04.log,因为这已经是最后一个组成员了。
|
B. 删除组
当组处于ACTIVE或CURRENT状态时,无法删除组;组删除操作也是针对Control file,而非文件本身。
SQL> select group#, thread#, sequence#, status from v$log;
1
2
3
4
5
6
7
|
GROUP# THREAD# SEQUENCE# STATUS
---------- ---------- ---------- ----------------------------------
1 1 38 INACTIVE
2 1 40 ACTIVE
3 1 41 CURRENT
4 1 39 INACTIVE
|
SQL> alter database drop logfile group 3;
1
2
3
4
5
6
| alter database drop logfile group 3
*
ERROR at line 1:
ORA-01623: log 3 is current log for instance orcl (thread 1)- cannot drop
ORA-00312: online log 3 thread 1:'/oracle/oradata/orcl/redo03.log'
-- 不能DROP处于CURRENT状态的组
|
SQL> alter database drop logfile group 4;
1
2
| -- 处于INACTIVE状态的第四组可以删除
Database altered.
|
SQL> select group#, thread#, sequence#, status from v$log;
1
2
3
4
5
6
|
GROUP# THREAD# SEQUENCE# STATUS
---------- ---------- ---------- ----------------
1 1 38 INACTIVE
2 1 40 ACTIVE
3 1 41 CURRENT
|
[oracle@localhost ~]$ cd /oracle/oradata/orcl/
[oracle@localhost orcl]$ ll
1
2
3
4
5
6
7
8
9
| total 1712800
-rw-r-----. 1 oracle oinstall 9748480 Sep 10 05:22 control01.ctl
...
-rw-r-----. 1 oracle oinstall 52429312 Sep 10 05:17 redo01.log
-rw-r-----. 1 oracle oinstall 52429312 Sep 10 05:18 redo02.log
-rw-r-----. 1 oracle oinstall 52429312 Sep 10 05:22 redo03.log
-rw-r-----. 1 oracle oinstall 52429312 Sep 10 05:00 redo04a.log
-rw-r-----. 1 oracle oinstall 52429312 Sep 10 05:17 redo04.log
# 第四组文件本身并没有被删除
|
[oracle@localhost orcl]$ rm -f redo04*
#手动删除操作系统下的文件
三、联机重做日志文件的重新定位和重命名
为联机重做日志文件重新定位和重命名是进行备份时的必要操作,进行此项操作需要有ALTERDATABASE的权限,并具有相应的操作系统权限,如移动拷贝等。
在进行Relocate和Rename等操作(改变数据库的结构)前,请务必对现有数据库进行备份。当Relocate和Rename等操作结束后,也应该立即对数据库的control file进行备份。
进行relocate和rename操作最简单的办法是新建一个成员,然后删除老成员。此外,还可以通过以下步骤来实现:
1. 关闭数据库
2.拷贝现有的onlineredo log files 到其他的位置 3.以mount模式启动数据库 4.执行ALTERDATABASE的命令 5.将数据库设为Open状态
SQL> select * from v$logfile;
1
2
3
4
5
6
|
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ---------------------------------------------------
3 ONLINE /oracle/oradata/orcl/redo03.log NO
2 ONLINE /oracle/oradata/orcl/redo02.log NO
1 ONLINE /oracle/oradata/orcl/redo01.log NO
|
现在想移动redo03.log到上一级目录:
SQL> shutdown immediate
1
2
3
4
| Database closed.
Database dismounted.
ORACLE instance shut down.
-- 关闭数据库
|
[oracle@localhost ~]$ cd /oracle/oradata
[oracle@localhost oradata]$ ll
1
2
3
| total 8
drwxr-x---. 3 oracle oinstall 4096 Sep 10 05:24 orcl
drwxr-xr-x. 3 oracle oinstall 4096 Sep 9 16:43 smn
|
[oracle@localhost oradata]$ cp orcl/redo03.log ./
[oracle@localhost oradata]$ ll
1
2
3
4
5
| total 51212
drwxr-x---. 3 oracle oinstall 4096 Sep 10 05:24 orcl
-rw-r-----. 1 oracle oinstall 52429312 Sep 10 05:39redo03.log
drwxr-xr-x. 3 oracle oinstall 4096 Sep 9 16:43 smn
-- 将redo03.log复制到/oracle/oradata/下
|
SQL> startup mount;
1
2
3
4
5
6
7
8
| ORACLE instance started.
-- 以mount模式打开数据库
Total System Global Area 422670336 bytes
Fixed Size 1336960 bytes
Variable Size 318769536 bytes
Database Buffers 96468992 bytes
Redo Buffers 6094848 bytes
Database mounted.
|
SQL> alter database rename file '/oracle/oradata/orcl/redo03.log' to
2 '/oracle/oradata/redo03.log';
1
2
| -- 执行alter database命令
Database altered.
|
SQL> alter database open;
1
2
| -- 正常开启数据库
Database altered.
|
SQL> select * from v$logfile;
1
2
3
4
5
6
7
|
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ---------------------------------------------------
3 ONLINE /oracle/oradata/redo03.log NO
-- redo03.log的位置发生了改变
2 ONLINE /oracle/oradata/orcl/redo02.log NO
1 ONLINE /oracle/oradata/orcl/redo01.log NO
|
四、清除联机重做日志文件
Redo Log File使用一段时间后,文件可能会发生损坏,此时将无法再向其中写入数据了,这时就需要执行清空命令,对其进行重新初始化。这样的操作有可能造成数据丢失,因此不到万不得已,轻易不要进行这样的操作。
如果不希望清理这个损坏的RedoLog File时将其归档,可以增加UNARCHIVED命令。
|