【数据库管理】④重做日志Redo Log

1. Redo log(重做日志)的功能

重做日志(Redo log)是数据库管理系统中的一种机制,主要作用包括:

  1. 提供事务的持久性支持:重做日志记录了每个事务对数据库所做的修改操作,以便在系统故障或崩溃时,通过重新执行重做日志中未提交的事务来恢复数据。

  2. 支持数据库备份和恢复:重做日志可以用于还原数据库到某个时间点的状态,同时也是实现增量备份和差异备份等备份策略的重要基础。

  3. 提高数据库性能:数据库管理系统可以将多个操作合并为一个批处理操作,并将其写入重做日志中,从而减少磁盘I/O操作的次数,提高数据库的性能。

  4. 保证数据的一致性:重做日志的使用可以确保数据库的数据一致性,因为当数据库管理系统在执行事务期间出现错误时,可以使用重做日志回滚到之前的状态。

 2. Redo log特征

重做日志(Redo log)是数据库管理系统中的一种机制,具有以下特征:

  1. 持久性:重做日志中记录的操作必须能够在数据库系统崩溃或停机后仍然存在,以便恢复数据库状态。

  2. 顺序写入:重做日志要求数据顺序写入,以提高写入效率和减少磁盘寻址开销。

  3. 循环利用:重做日志空间是有限的,它可以被循环利用,使得旧的日志可以被覆盖而不会导致数据丢失。

  4. 非常规刷盘策略:重做日志的写入不需要等待数据写入磁盘后才返回结果,而是采用非常规刷盘策略,通过缓存日志、延迟刷盘等方式保证高效率写入。

  5. 压缩:重做日志可以压缩记录的操作,以减少日志文件大小,提高存储效率。

  6. 多线程:重做日志可以使用多个线程并行写入,提高写日志的效率。

     

    1)记录数据库的变化(DML、DDL)

    2)用于数据块的recover

    3)以组的方式管理redo file ,最少两组redo ,循环使用

    4)和数据文件存放到不同的磁盘上,需读写速度快的磁盘(比如采用RAID10)

3. 日志切换

日志切换是数据库管理系统中的一个重要概念,它指的是在重做日志(Redo log)空间用尽时,将当前正在写入的日志文件关闭,并开始写入新的日志文件。

在进行日志切换时,数据库管理系统会确保当前正在执行的事务将其所有修改操作都写入日志文件中,并等待这些操作被持久化到磁盘上。然后,系统会将当前的日志文件关闭,并创建一个新的日志文件开始记录后续的操作。

日志切换的目的是确保重做日志空间不会用尽,从而避免数据库出现故障或崩溃时无法恢复数据的情况。通常情况下,数据库管理系统会定期进行日志切换操作,以便及时释放旧的日志文件,同时保证足够的日志空间供未来使用。

Oracle 日志切换的命令是:
 

ALTER SYSTEM SWITCH LOGFILE;

Oracle 日志切换有以下几种模式:

  1. 自动日志切换模式(Automatic Log Switch Mode):当当前联机日志组满时,系统会自动切换到下一个可用的联机日志组。

  2. 手动日志切换模式(Manual Log Switch Mode):需要手动执行 ALTER SYSTEM SWITCH LOGFILE; 命令来进行日志切换。

  3. 强制日志切换模式(Force Log Switch Mode):执行 ALTER SYSTEM SWITCH LOGFILE; 命令后,即使当前联机日志组没有满,系统也会强制切换到下一个可用的联机日志组。这种模式一般用于备份或紧急维护等场景。

在数据库管理系统中,根据日志文件的归档方式,日志切换可以分为归档(Archive)和非归档(No Archive)两种模式。

在归档模式下,数据库管理系统会将当前联机日志组满后的日志文件自动复制到一个预定的归档目录中,并给这些归档日志文件命名。这样做的目的是为了保留历史日志数据,以便备份、还原或查询之用。此外,归档还能提供数据库恢复所需的所有日志文件,以便在完全崩溃的情况下恢复数据库。

在非归档模式下,日志文件不会被自动复制到归档目录中,而是直接覆盖旧的日志文件。这种模式下,用户只能访问当前的联机日志组和最后一次完整备份后的增量备份,不能访问历史日志数据。如果数据库出现灾难性故障,将可能导致无法进行有效的数据库恢复。

一般来说,建议使用归档模式,以便保留历史日志数据并提供完整的数据库恢复能力。

4. Redo log组 

重做日志组(Redo log group)是指在数据库管理系统中一组相互独立的重做日志文件,它们通常被组合在一起以提供足够的重做日志空间。

每个重做日志组包含一个或多个重做日志文件,并且每个日志组的大小和数量可以在数据库创建时进行配置。当当前日志组的空间用尽时,数据库将自动切换到下一个可用的重做日志组,以继续记录重做日志。

使用多个重做日志组的好处是可以增加重做日志的容量和提高系统的可靠性。如果只有一个重做日志组且其已满,则数据库将无法继续执行任何修改操作,这会导致系统崩溃或停机。通过使用多个重做日志组,可以最大限度地减少这种情况的发生。

另外,可以在不同的物理设备上分布重做日志组,从而提高系统的可靠性和可用性。如果一个设备出现故障,其他设备上的重做日志组仍然可用,并且数据库可以继续正常运行。

 

最少两组(NOTE),最好每组有两个成员(NOTE),并存放到不同的磁盘上,大小形同,互相镜像

日志在组写满时发生切换,或手工切换: alter system switch logfile ;

在归档模式,日志进行归档,并把相关的信息写入controlfile

5. 如何添加日志组

5.1 查询日志组信息

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS                                           FIRST_CHANGE# FIRST_TIME      NEXT_CHANGE# NEXT_TIME           CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --------- ------------------------------------------------ ------------- --------------- ------------ --------------- ----------
         1          1        400   52428800        512          1 NO        CURRENT                                               31459677 31-MAR-23         1.8447E+19                   0
         2          1        398   52428800        512          1 YES       INACTIVE                                              23851789 30-MAR-23           31445128 30-MAR-23         0
         3          1        399   52428800        512          1 YES       INACTIVE                                              31445128 30-MAR-23           31459677 31-MAR-23         0

SQL> 

5.2 查询日志路径

SQL> 
SQL> col member for a50
SQL> select group#,member from v$logfile;

    GROUP# MEMBER
---------- --------------------------------------------------
         3 /u02/oradata/CDB1/redo03.log
         2 /u02/oradata/CDB1/redo02.log
         1 /u02/oradata/CDB1/redo01.log

SQL> 
-- 增加一个组group4,大小和之前三组 的BYTES一样

5.3 添加日志组

SQL> 
SQL> alter database add logfile '/u02/oradata/CDB1/redo04.log' size 50m;

Database altered.

SQL> select group#, member from v$logfile order by group#;

    GROUP# MEMBER
---------- --------------------------------------------------
         1 /u02/oradata/CDB1/redo01.log
         2 /u02/oradata/CDB1/redo02.log
         3 /u02/oradata/CDB1/redo03.log
         4 /u02/oradata/CDB1/redo04.log

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS                                           FIRST_CHANGE# FIRST_TIME      NEXT_CHANGE# NEXT_TIME           CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --------- ------------------------------------------------ ------------- --------------- ------------ --------------- ----------
         1          1        400   52428800        512          1 NO        CURRENT                                               31459677 31-MAR-23         1.8447E+19                   0
         2          1        398   52428800        512          1 YES       INACTIVE                                              23851789 30-MAR-23           31445128 30-MAR-23         0
         3          1        399   52428800        512          1 YES       INACTIVE                                              31445128 30-MAR-23           31459677 31-MAR-23         0
         4          1          0   52428800        512          1 YES       UNUSED                                                       0                            0                   0

SQL>

6. 如何添加日志组的成员

6.1 先建好目录

准备放在/u01/disk2/maxwell/下

加member为每个组(一共是4个组)

[oracle@oracle-db-19c CDB1]$ $ mkdir -p /u02/disk2/maxwell

6.2 添加日志组成员

SQL> 
SQL> show user;
USER is "SYS"
SQL> 
SQL> alter database add logfile member
  2  '/u02/disk2/maxwell/redo01b.log' to group 1,
  3  '/u02/disk2/maxwell/redo02b.log' to group 2,
  4  '/u02/disk2/maxwell/redo03b.log' to group 3,
  5  '/u02/disk2/maxwell/redo04b.log' to group 4;

Database altered.

SQL> 


6.3 查看v$logfile显示invalid

SQL> col member format a40
SQL> select group#, member, status from v$logfile;

    GROUP# MEMBER                                   STATUS
---------- ---------------------------------------- ---------------------
         3 /u02/oradata/CDB1/redo03.log
         2 /u02/oradata/CDB1/redo02.log
         1 /u02/oradata/CDB1/redo01.log
         4 /u02/oradata/CDB1/redo04.log
         1 /u02/disk2/maxwell/redo01b.log           INVALID
         2 /u02/disk2/maxwell/redo02b.log           INVALID
         3 /u02/disk2/maxwell/redo03b.log           INVALID
         4 /u02/disk2/maxwell/redo04b.log           INVALID

8 rows selected.

SQL> 

6.4 日志切换即可同步

-- 多切几次, 消除invalid

SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /
/


System altered.

SQL> 
System altered.

SQL> SQL> 
SQL> 
SQL> /

System altered.

6.5 再次查看 status

SQL> select group#, member, status from v$logfile;

    GROUP# MEMBER                                   STATUS
---------- ---------------------------------------- ---------------------
         3 /u02/oradata/CDB1/redo03.log
         2 /u02/oradata/CDB1/redo02.log
         1 /u02/oradata/CDB1/redo01.log
         4 /u02/oradata/CDB1/redo04.log
         1 /u02/disk2/maxwell/redo01b.log
         2 /u02/disk2/maxwell/redo02b.log
         3 /u02/disk2/maxwell/redo03b.log
         4 /u02/disk2/maxwell/redo04b.log

8 rows selected.

SQL> 
SQL> select * from v$log;      - 看到MEMBERS值已经是2了

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS                                           FIRST_CHANGE# FIRST_TIME      NEXT_CHANGE# NEXT_TIME           CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --------- ------------------------------------------------ ------------- --------------- ------------ --------------- ----------
         1          1        404   52428800        512          2 YES       INACTIVE                                              31463540 31-MAR-23           31463543 31-MAR-23         0
         2          1        406   52428800        512          2 NO        CURRENT                                               31463546 31-MAR-23         1.8447E+19                   0
         3          1        403   52428800        512          2 YES       INACTIVE                                              31463537 31-MAR-23           31463540 31-MAR-23         0
         4          1        405   52428800        512          2 YES       INACTIVE                                              31463543 31-MAR-23           31463546 31-MAR-23         0

SQL> 

7. 日志视图信息

SQL> 
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS                                           FIRST_CHANGE# FIRST_TIME      NEXT_CHANGE# NEXT_TIME           CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --------- ------------------------------------------------ ------------- --------------- ------------ --------------- ----------
         1          1        404   52428800        512          2 YES       INACTIVE                                              31463540 31-MAR-23           31463543 31-MAR-23         0
         2          1        406   52428800        512          2 NO        CURRENT                                               31463546 31-MAR-23         1.8447E+19                   0
         3          1        403   52428800        512          2 YES       INACTIVE                                              31463537 31-MAR-23           31463540 31-MAR-23         0
         4          1        405   52428800        512          2 YES       INACTIVE                                              31463543 31-MAR-23           31463546 31-MAR-23         0

SQL> 

-- 说明一下v$log这个重要的视图
-- status有四种状态:
unused		-- :新添加的日志组,还没有使用
inactive	-- :日志组对应的脏块已经从data buffer写入到data file ,可以覆盖
active		-- :日志组对应的脏块还没有从data buffer写入到data file,不能被覆盖
current		-- :当前日志组,日志组对应的脏块还没有从data buffer写入到data file,不能被覆盖
thread		-- :线程(通过后台进程LGWR 启动),在单实例的环境下,thread# 永远是1
sequence	-- :日志序列号.在日志切换时会递增.
FIRST_CHANGE# -- :在当前日志中记录的首个数据块的 scn.(当事务完成的时候会在数据块上写入一个scn,代表数据块的变化).

8. 日志恢复

8.1 例1多元化成员(多个member),单个成员( inactive)日志组丢失

SQL> 
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS                                           FIRST_CHANGE# FIRST_TIME      NEXT_CHANGE# NEXT_TIME           CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --------- ------------------------------------------------ ------------- --------------- ------------ --------------- ----------
         1          1        404   52428800        512          2 YES       INACTIVE                                              31463540 31-MAR-23           31463543 31-MAR-23         0
         2          1        406   52428800        512          2 NO        CURRENT                                               31463546 31-MAR-23         1.8447E+19                   0
         3          1        403   52428800        512          2 YES       INACTIVE                                              31463537 31-MAR-23           31463540 31-MAR-23         0
         4          1        405   52428800        512          2 YES       INACTIVE                                              31463543 31-MAR-23           31463546 31-MAR-23         0

SQL> 

8.1.1 删除INACTIVE组的member日志

[oracle@oracle-db-19c CDB1]$ cd /u02/disk2/maxwell
[oracle@oracle-db-19c maxwell]$ ls -ltr
total 204816
-rw-r-----. 1 oracle oinstall 52429312 Mar 31 10:05 redo03b.log
-rw-r-----. 1 oracle oinstall 52429312 Mar 31 10:05 redo01b.log
-rw-r-----. 1 oracle oinstall 52429312 Mar 31 10:05 redo04b.log
-rw-r-----. 1 oracle oinstall 52429312 Mar 31 10:08 redo02b.log
[oracle@oracle-db-19c maxwell]$ rm redo01b.log 
[oracle@oracle-db-19c maxwell]$ 

8.1.2 重启数据库

SQL> 
SQL> startup force
ORACLE instance started.

Total System Global Area  629145392 bytes
Fixed Size                  9137968 bytes
Variable Size             419430400 bytes
Database Buffers          184549376 bytes
Redo Buffers               16027648 bytes
Database mounted.
Database opened.
SQL> set pagesize 300 linesize 300
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS                                           FIRST_CHANGE# FIRST_TIME      NEXT_CHANGE# NEXT_TIME           CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --------- ------------------------------------------------ ------------- --------------- ------------ --------------- ----------
         1          1        404   52428800        512          2 YES       INACTIVE                                              31463540 31-MAR-23           31463543 31-MAR-23         0
         2          1        406   52428800        512          2 YES       INACTIVE                                              31463546 31-MAR-23           31564324 31-MAR-23         0
         3          1        407   52428800        512          2 NO        CURRENT                                               31564324 31-MAR-23         1.8447E+19                   0
         4          1        405   52428800        512          2 YES       INACTIVE                                              31463543 31-MAR-23           31463546 31-MAR-23         0

SQL> 

8.1.3 v$logfile查询


SQL> select group#, member, status from v$logfile;

    GROUP# MEMBER                                   STATUS
---------- ---------------------------------------- ---------------------
         3 /u02/oradata/CDB1/redo03.log
         2 /u02/oradata/CDB1/redo02.log
         1 /u02/oradata/CDB1/redo01.log
         4 /u02/oradata/CDB1/redo04.log
         1 /u02/disk2/maxwell/redo01b.log        INVALID	-- 表明该文件不可访问
         2 /u02/disk2/maxwell/redo02b.log        INVALID	-- 表明该文件不可访问
         3 /u02/disk2/maxwell/redo03b.log        INVALID	-- 表明该文件不可访问
         4 /u02/disk2/maxwell/redo04b.log

8 rows selected.

SQL> 

8.1.4 拷贝日志做恢复

[oracle@oracle-db-19c maxwell]$ cp /u02/oradata/CDB1/redo01.log /u02/disk2/maxwell/redo01b.log
[oracle@oracle-db-19c maxwell]$ cp /u02/oradata/CDB1/redo02.log /u02/disk2/maxwell/redo02b.log 
[oracle@oracle-db-19c maxwell]$ cp /u02/oradata/CDB1/redo03.log /u02/disk2/maxwell/redo03b.log 
[oracle@oracle-db-19c maxwell]$ 

8.1.5 日志切换

SQL>  alter system switch logfile;

System altered.

SQL> select group#, member, status from v$logfile;

    GROUP# MEMBER                                   STATUS
---------- ---------------------------------------- ---------------------
         3 /u02/oradata/CDB1/redo03.log
         2 /u02/oradata/CDB1/redo02.log
         1 /u02/oradata/CDB1/redo01.log
         4 /u02/oradata/CDB1/redo04.log
         1 /u02/disk2/maxwell/redo01b.log
         2 /u02/disk2/maxwell/redo02b.log
         3 /u02/disk2/maxwell/redo03b.log
         4 /u02/disk2/maxwell/redo04b.log

8 rows selected.

SQL> 

8.2 例2 group (inactive)组全部丢失

SQL> select * from v$log;
GROUP# THREAD#	SEQUENCE# BYTES	BLOCKSIZE	MEMBERS	ARC	STATUS	FIRST_CHANGE# FIRST_TIM	NEXT_CHANGE#	NEXT_TIME	CON_ID
-----  -------	--------- -----	---------	-------	---	------	------------- ---------	------------	---------	-----
1		1		265		52428800	512		2		NO	INACTIVE8004446		  14-SEP-20	8004453			14-SEP-20	0
2		1		266		52428800	512		2		NO	CURRENT	8004453		  14-SEP-20	281474976710655				0
3		1		264		52428800	512		2		NO	INACTIVE8003348		  13-SEP-20	8004446			14-SEP-20	0
4		1		253		52428800	512		2		NO	INACTIVE7901812		  14-SEP-20	8003348			14-SEP-20	0

[oracle@oracle-db-19c maxwell]$ rm /u02/oradata/CDB1/redo03.log
[oracle@oracle-db-19c maxwell]$ rm /u02/disk2/maxwell/redo03b.log
[oracle@oracle-db-19c maxwell]$ ll
total 153612
-rw-r----- 1 oracle oinstall 52429312 Sep 14 22:32 redo01b.log
-rw-r----- 1 oracle oinstall 52429312 Sep 14 22:48 redo02b.log
-rw-r----- 1 oracle oinstall 52429312 Sep 14 22:27 redo04b.log
-- 实例没有奔溃的情况下,使用clear命令
SQL> alter database clear logfile group 3;	-- 注意:这一步使刚才在OS里删掉的那两个group2的文件又建立上了.
Database altered.
[oracle@oracle-db-19c maxwell]$ ll
total 204816
-rw-r----- 1 oracle oinstall 52429312 Sep 14 22:32 redo01b.log
-rw-r----- 1 oracle oinstall 52429312 Sep 14 22:53 redo02b.log
-rw-r----- 1 oracle oinstall 52429312 Sep 14 22:53 redo03b.log
-rw-r----- 1 oracle oinstall 52429312 Sep 14 22:27 redo04b.log

8.3 例3 active日志组丢失

-- 注:  本例日志组3状态是ACTIVE状态的.
[oracle@oracle-db-19c maxwell]$ rm /u01/oradata/CDB1/redo03.log
[oracle@oracle-db-19c maxwell]$ rm /u01/disk2/maxwell/redo03b.log
SQL> alter database clear logfile group 3;
alter database clear logfile group 3
*
第 1 行出现错误:
ORA-01624:   日志 3 是紧急恢复实例 CDB1 (线程 1) 所必需的
ORA-00312:   联机日志 3 线程 1:   '/u01/oradata/CDB1/redo03.log'
ORA-00312:   联机日志 3 线程 1:   '/u01/disk2/maxwell/redo03b.log'
-- Active日志损坏,Oracle 建议此时先做一个手工检查点切换
SQL> alter system checkpoint;
-- 如果转为inactive,则按照clear方法处理;如果halt了(挂住了),则转为 clear unarchived(current)处理.
-- (可能会出现各种现象,教材没出现过的,进也不成,退也不成)
SQL> alter database clear logfile group 3;

8.4 例4 current日志组丢失.

--- 注:  本例日志组1状态是ACTIVE状态的.
[oracle@oracle-db-19c maxwell]$ rm /u02/oradata/CDB1/redo01.log
[oracle@oracle-db-19c maxwell]$ rm /u02/disk2/maxwell/redo01b.log
SQL> alter system switch logfile; 切换几次,触动它一下.
-- 告警日志会记录有关信息
-- 暂时好像没有什么问题发生,继续切换,当current 又转会到group1时,死机!

当前日志损坏的问题比较复杂,可以分以下几种情况讨论

8.4.1 如果数据库没有崩溃

第一步,可以做一个完全检查点,将db buffer中的所有dirty buffer全部刷新到磁盘上.

SQL> alter system checkpoint;

第二步,尝试数据库在打开状态下进行不做归档的强制清除.

SQL> alter database clear unarchived logfile group n;

数据库此时为打开状态,这步若能成功,一定要做一个新的数据库全备(NOTE).因为当前日志没有归档,归档日志sequence已无法保持连续性.

8.4.2 如果数据库已经崩溃,准备做传统的基于日志的不完全恢复或闪回数据库.

SQL> recover database until cancel;
SQL> alter database open resetlogs;

8.4.3 如果严重到以上方法都不能resetlogs打开数据库,可以试试下面的最后一招:

修改pfile文件,第一行添加_allow_resetlogs_corruption=TRUE

该参数的含义是: 允许在破坏一致性的情况下强制重置日志,打开数据库.

_allow_resetlogs_corruption将使用所有数据文件最旧的SCN打开数据库,所以通常来讲需要保证 SYSTEM TBS拥有最旧的 SCN.在强制打开数据库之后,可能因为各种原因会有 ora-600错误.

[oracle@maxwell dbs]$ vi inittest11g.ora
_allow_resetlogs_corruption=TRUE
*.audit_file_dest='/u01/admin/orcl/adump'
*.audit_trail='db'
*.compatible='11.1.0.0.0' ...
# 再以pfile 启动instance 到mount状态,然后 alter database open resetlogs  //这是在不一致状态下强行打开了数据库,建议做一个逻辑全备.

9. 使日志恢复到原来的配置

尝试使用OEM方式恢复原状.删除增加的member和group4,注意当前日志组要切换后才能删除,最后,验证无误后删掉/u02/disk2目录.

9.1 查询日志组

SQL> 
SQL> set pagesize 200 linesize 200
SQL> 
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS                                           FIRST_CHANGE# FIRST_TIME      NEXT_CHANGE# NEXT_TIME           CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --------- ------------------------------------------------ ------------- --------------- ------------ --------------- ----------
         1          1        394   52428800        512          1 YES       INACTIVE                                              23709710 31-MAR-23           23718839 31-MAR-23         0
         2          1        395   52428800        512          1 YES       INACTIVE                                              23718839 31-MAR-23           23718973 31-MAR-23         0
         3          1        396   52428800        512          1 NO        CURRENT                                               23718973 31-MAR-23         1.8447E+19                   0

SQL> 

9.2 删除日志组

删除的日志组不能是current或者ACTIVE,处于active的日志文件组无法删除,因为这个日志文件组可能会在实例恢复的时候使用

可以切换检查点, 使active的日志文件组变成inactive的日志文件组

SQL> alter system checkpoint;
可以切换日志改变日志组
SQL> alter system switch logfile; 
SQL> alter database drop logfile group 4; 
SQL> select * from v$log;
GROUP# THREAD#	SEQUENCE# BYTES	BLOCKSIZE	MEMBERS	ARC	STATUS	FIRST_CHANGE# FIRST_TIM	NEXT_CHANGE#	NEXT_TIME	CON_ID
-----  -------	--------- -----	---------	-------	---	------	------------- ---------	------------	---------	-----
1		1		261		52428800	512		2		NO	INACTIVE7872212		  14-SEP-20	7893950			14-SEP-20	0
2		1		262		52428800	512		2		NO	CURRENT	7893950		  14-SEP-20	281474976710655				0
3		1		260		52428800	512		2		NO	INACTIVE7851184		  13-SEP-20	7872212			14-SEP-20	0

9.3 删除日志组成员

SQL> col member format a40
SQL> select group#, member, status from v$logfile;
GROUP#	MEMBER										STATUS
------	----------------------------------------	----------------------------------------
3		/u01/app/oracle/oradata/orcl/redo03.log
2		/u01/app/oracle/oradata/orcl/redo02.log
1		/u01/app/oracle/oradata/orcl/redo01.log
1		/u01/disk2/klausyao/redo01b.log
2		/u01/disk2/klausyao/redo02b.log
3		/u01/disk2/klausyao/redo03b.log
SQL> alter database drop logfile member '/u01/disk2/klausyao/redo01b.log';
ERROR at line 1:
ORA-01609: log 1 is the current log for thread 1 - cannot drop members
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/orcl/redo01.log'
ORA-00312: online log 1 thread 1: '/u01/disk2/klausyao/redo01b.log'
-- 当前正在使用中,先删除其他的成员,再切换日志组后删除
SQL> alter database drop logfile member '/u01/disk2/klausyao/redo02b.log';
SQL> alter database drop logfile member '/u01/disk2/klausyao/redo03b.log';
Database altered.
SQL> alter system switch logfile; 
SQL> alter database drop logfile member '/u01/disk2/klausyao/redo01b.log';
Database altered.

9.4 查验

SQL> select group#, member, status from v$logfile;

    GROUP# MEMBER                                   STATUS
---------- ---------------------------------------- ---------------------
         3 /u02/oradata/CDB1/redo03.log
         2 /u02/oradata/CDB1/redo02.log
         1 /u02/oradata/CDB1/redo01.log

SQL> 

9.5 物理删除文件

[oracle@oracle-db-19c ~]$ cd /u02/disk2/maxwell
[oracle@oracle-db-19c maxwell]$ ll
total 204816
-rw-r----- 1 oracle oinstall 52429312 Oct 26 23:48 redo01b.log
-rw-r----- 1 oracle oinstall 52429312 Oct 26 23:35 redo02b.log
-rw-r----- 1 oracle oinstall 52429312 Oct 26 23:35 redo03b.log
-rw-r----- 1 oracle oinstall 52429312 Oct 26 23:41 redo04b.log
-- 删除文件夹
[oracle@oracle-db-19c oracle-db-19cyao]$ rm -rf /u02/disk2

猜你喜欢

转载自blog.csdn.net/u011868279/article/details/129872672