首页 > 代码库 > 14_Oracle_Admin_联机重做日志文件的增删改

14_Oracle_Admin_联机重做日志文件的增删改

一、增加联机重做日志的组和组成员

1. 增加组

wKiom1Qkek_yumG5AAGo7hcJ92A547.jpg

 

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. 增加组成员

 

wKioL1QkeoawHju0AAIE3yjExLs620.jpg

建议将文件名起为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. 删除组成员

wKiom1QkenDDd254AAL_WMTPyy8044.jpg

 

如果删除了组成员,则会出组成员不对称的情况。这样的操作是允许的,但应该是临时的,一旦进行了这样的操作,需要马上纠正,以保障每个组至少有两个成员,以防止单点故障。

 

wKiom1Qkenyg2Gt-AAKv1n9XkUE806.jpg

 

一个数据库实例启动后,至少要保证有两组联机重做日志文件,以确保可以循环写入。组成员的状态如果是INVALID,则数据库无法访问该联机重做日志文件。无法删除的情况如下:

 1. 如果一个组中只剩最后一个组成员(或该组有多个组成员,但只有一个是有效(VALID)的),则该组将无法删除;

 2. 如果该组成员属于ACTIVE CURRENT状态的组,也无法删除,如果一定要删除,可先执行LogSwitches操作。

 

事实上,删除RedoLog Memebre并不是真正的删除了这个文件,而是对ControlFile中的相关参数进行修改,当删除成功后,再通过操作系统的相关命令删除真实的文件。在删除一个组成员前,务必保证该成员已经被归档。

 

wKioL1QkerDC_f6TAAG_l3y0FG8088.jpg

 

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. 删除组

 

wKioL1QkesCghc1yAAG5isjtNmE574.jpg

当组处于ACTIVECURRENT状态时,无法删除组;组删除操作也是针对Control file,而非文件本身。

 

wKiom1QkeqiyGSVVAAGl3kbg67s760.jpg

  

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*

#手动删除操作系统下的文件

 

三、联机重做日志文件的重新定位和重命名

 

wKiom1QkerrTjJPFAAL_N5_yiSI041.jpg

 

为联机重做日志文件重新定位和重命名是进行备份时的必要操作,进行此项操作需要有ALTERDATABASE的权限,并具有相应的操作系统权限,如移动拷贝等。

在进行RelocateRename等操作(改变数据库的结构)前,请务必对现有数据库进行备份。当RelocateRename等操作结束后,也应该立即对数据库的control file进行备份。

 

wKiom1QkesfyUplyAAJFrg_vGrk921.jpg

进行relocaterename操作最简单的办法是新建一个成员,然后删除老成员。此外,还可以通过以下步骤来实现:

 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

 

四、清除联机重做日志文件

 

wKioL1Qkev7TNQSYAAHai9Qk88s244.jpg


Redo Log File使用一段时间后,文件可能会发生损坏,此时将无法再向其中写入数据了,这时就需要执行清空命令,对其进行重新初始化。这样的操作有可能造成数据丢失,因此不到万不得已,轻易不要进行这样的操作。

 

如果不希望清理这个损坏的RedoLog File时将其归档,可以增加UNARCHIVED命令。

本文出自 “重剑无锋 大巧不工” 博客,请务必保留此出处http://wuyelan.blog.51cto.com/6118147/1558313

14_Oracle_Admin_联机重做日志文件的增删改