4_1_Oracle逻辑结构篇之重做日志和归档日志管理-日志文件
增加日志组
要创建一个新的联机重做日志文件组,请使用下面的SQL 命令:
ALTER DATABASE [database] ADD LOGFILE [GROUP integer] filespec [, [GROUP integer] filespec]...]
可以通过filespec 来指定成员名称和位置。可以选择每个重做日志文件组的GROUP 参数值。如果省略了该参数,Oracle 服务器自动生成其值。
SQL> alter database add logfile group 1 ('/u01/app/oracle/oradata/orcl/redo01a.log', '/u01/app/oracle/oradata/orcl/redo01b.log') size 8m;
增加日志成员
有时,DBA 可能需要为已有重做日志组添新的成员日志文件,比如,由于某个磁盘损坏,导致每个重做日志组都丢失了一个成员日志文件,这时,需通过手工方式为每重做日志组增加一个新日志成员文件。可以使用下面的ALTER DATABASE ADD LOGFILE MEMBER
命令向现有的重做日志文件组添加新成员,命令格式如下:
ALTER DATABASE [database] ADD LOGFILE MEMBER [ 'filename' [REUSE][, 'filename' [REUSE]]...TO {GROUP integer|('filename'[, 'filename']...)}]...
最好使用日志文件成员的绝对路径名;否则将在数据库服务器缺省目录下创建该文件。
如果该文件已经存在,其大小必须与指定值相同,并且必须指定REUSE 选项。可以通过指定一个或多个组内成员或者指定组号来识别目标组。
SQL> alter database add logfile member '/u01/app/oracle/oradata/orcl/redo01c.log' to group 1;
日志文件重定位
在重做日志文件创建以后,有时还需改变它们名称和位置,假设原来数据库系统中只有一个硬盘,因此重做日志的所有成员都保存在同一个硬盘中,后来又增加一个硬盘,这时可将重做日志组中的一部分成员移动到新的硬盘中。有两种方法可实现重定位或重命名重做日
志文件:
1)ALTER DATABASE RENAME FILE 命令。
2)添加新成员并删除旧成员。
使用ALTER DATABASE RENAME FILE 命令的步骤如下:
1)关闭数据库
2)使用操作系统命令COPY 重做日志文件到新位置
3)启动数据库到mount 状态
4)执行ALTER DATABASE RENAME FILE 命令
5)打开数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !mv '/u01/app/oracle/oradata/orcl/redo01.log' '/u01/app/oracle/arch/log/redo01.log'
SQL> startup
ORACLE instance started.
Total System Global Area 368263168 bytes
Fixed Size 1345016 bytes
Variable Size 255855112 bytes
Database Buffers 104857600 bytes
Redo Buffers 6205440 bytes
Database mounted.
ORA-03113: end-of-file on communication channel
Process ID: 24106
Session ID: 1 Serial number: 5
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@ocm ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Mon Jul 24 22:30:09 2017
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup mount
ORACLE instance started.
Total System Global Area 368263168 bytes
Fixed Size 1345016 bytes
Variable Size 255855112 bytes
Database Buffers 104857600 bytes
Redo Buffers 6205440 bytes
Database mounted.
SQL> alter database rename file '/u01/app/oracle/oradata/orcl/redo01.log' to '/u01/app/oracle/arch/log/redo01.log';
Database altered.
SQL> alter database open ;
Database altered.
删除重做日志
如果日志组尺寸设置不合理,需要改日志组尺寸,但是ORACLE 数据库中,已存在的日志组的尺寸是不能改变的,这时可通过增加新日志组,然后删除原有的日志组来实现改变日志组尺寸的目的。如果某个重做日志组不再需要使用,也可以将整个重做日志组删除。删除一个重做日志组时,其中成员日志文件将都被删除。在删除重做日志组之前,应首先考虑如下几个问题:
• 无论组中有多少成员,一个数据库至少需要使用两个重做日志组,因此,如果在数据库中只包含两个日志组时,不能进行删除日志组的操作。
• 只能删除处于INACTIVE 状态的重做日志组,如果要删除CURRENT 状态的重做日志组,必须执行一次手工日志切换,将它切换到INACTIVE 状态。
• 如果数据库处于归档模式下,在删除重做日志组之前,必须确定它已经被归档。
SQL> select group#,archived,status from v$log;
GROUP# ARC STATUS
---------- --- ----------------
1 YES INACTIVE
2 YES INACTIVE
3 NO CURRENT
4 YES INACTIVE
5 YES INACTIVE
6 YES INACTIVE
6 rows selected.
SQL> alter database drop logfile group 1;
Database altered.
SQL> alter database drop logfile group 2;
Database altered.
SQL> alter database drop logfile group 4;
Database altered.
SQL> alter database drop logfile group 6;
Database altered.
若要增大或者减小联机重做日志文件组的大小,请添加新的联机重做日志文件组(具有新的大小),然后删除原来日志组。
注意:删除日志组时并不删除操作系统文件。
除了需要删除重做日志组外,更为常见的情况是仅需要删除重做日志组中的某个成员日志文件。比如,由于存放日志文件的硬盘发生物理损坏导致日志成员发生损坏或丢失时,该日志成员将无法访问,此时需要将它从重做日志组中删除。如果要删除一个或多个特定的联机重做日志文件
SQL> set linesize 300
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ------------------------------------------------------------ ---
3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO
5 ONLINE /u01/app/oracle/oradata/orcl/redo05a.log NO
5 ONLINE /u01/app/oracle/oradata/orcl/redo05b.log NO
SQL> alter database drop logfile member '/u01/app/oracle/oradata/orcl/redo05b.log';
Database altered.
删除日志组成员有如下限制:
• 如果要删除的日志组只包含一个成员或者只包含一个有效的成员时,那么不能删除该成员。
• 如果该组是当前组,那么必须先强制执行日志文件切换,然后才能删除该成员。
• 如果数据库正运行在ARCHIVELOG 模式下并且未将该成员所属日志文件组归档,那么无法删除该成员。
清除重做日志
在数据库运行过程中,联机重做日志文件可能会因为某些原因而损坏。如果出现这种情况,数据库最终会由于无法将损坏的重做日志文件归档而停止。或者当一个联机重做日志文件组中的所有成员都已经被破坏时,数据库会因为无法切换到损坏的日志组而停止。如果发生种情况,可以在不关闭数据库情况下,手工清空损坏的重做日志文件的内容,以避免出现
停止运行的情况。
清空重做日志文件就是将重做日志文件中的内容全部初始化,相当于删除该重做日志文件,然后各方面重建它。即使数据库只拥有两个重做日志组,或者要清空的重做日志组是当前日志组,都可以成功执行清空操作。
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ------------------------------------------------------------ ---
3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO
5 ONLINE /u01/app/oracle/oradata/orcl/redo05a.log NO
SQL> select group#,archived,status from v$log;
GROUP# ARC STATUS
---------- --- ----------------
3 NO CURRENT
5 YES INACTIVE
SQL> alter database clear logfile group 5;
Database altered.
-- 如果日志组5 尚未归档,则必须指定UNARCHIVED 子句。指定UNARCHIVED 子句后,Oracle 将避免对5 号日志组进行归档。
SQL> alter database clear unarchived logfile group 5;
Database altered.
在数据库打开时不能清除当前日志组,为了清除当前日志组,可以对日志进行切换或将数据库置成MOUNT 状态。
SQL> select group#,archived,status from v$log;
GROUP# ARC STATUS
---------- --- ----------------
3 NO CURRENT
5 YES INACTIVE
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 368263168 bytes
Fixed Size 1345016 bytes
Variable Size 255855112 bytes
Database Buffers 104857600 bytes
Redo Buffers 6205440 bytes
Database mounted.
SQL> alter database clear unarchived logfile group 3;
Database altered.
SQL> alter database open;
Database altered.