一、增加联机重做日志的组和组成员
1. 增加组
SQL> desc v$logfile;
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;
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;
-- 新增第四组 Database altered.
SQL> select * from v$logfile;
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
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;
-- 增加组成员无需指定大小,会自动和现有组成员的大小保持一致。 Database altered.
SQL> select * from v$logfile;
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
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;
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';
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;
-- 执行Log Switches操作 System altered.
SQL> alter system checkpoint;
-- 执行检查点操作 System altered.
SQL> select group#, thread#, sequence#,status from v$log;
-- 以保证要删除的组处于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';
-- 这一次成功删除了组成员 Database altered.
SQL> select * from v$logfile;
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
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';
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;
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;
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;
-- 处于INACTIVE状态的第四组可以删除 Database altered.
SQL> select group#, thread#, sequence#, status from v$log;
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
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;
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
Database closed. Database dismounted. ORACLE instance shut down. -- 关闭数据库
[oracle@localhost ~]$ cd /oracle/oradata
[oracle@localhost oradata]$ ll
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
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;
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';
-- 执行alter database命令 Database altered.
SQL> alter database open;
-- 正常开启数据库 Database altered.
SQL> select * from v$logfile;
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命令。