删除current redo log的恢复

本文记录了一次Oracle数据库中删除当前redo log文件后的一系列恢复操作过程,包括未shutdown情况下的恢复流程与强行shutdown后的复杂恢复步骤,强调了在出现问题时避免随意shutdown的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  近日测试删除current redo log的恢复,却不知引发一系列案中案,特记录如下(CentOS 6.3,Oracle 11.2.0).

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
         1          1         22   52428800        512          1 YES INACTIVE               1819273 08-SEP-13      1839279 08-SEP-13
         2          1         23   52428800        512          1 NO  CURRENT                1839279 08-SEP-13   2.8147E+14
         3          1         21   52428800        512          1 YES INACTIVE               1798901 08-SEP-13      1819273 08-SEP-13

SQL>insert into t(txt) values('aa');

SQL>commit;

-- commit后,oracle将脏数据写入到redo.log,些时未有switch logfile,故data未写入datafile和archived logfile.此时删除redo02.log,不shutdown

SQL> host rm /db/oracle/app/oracle/oradata/pvm/redo02.log;

SQL>alter system switch logfile;

-- 此时仍可switch logfile,因为switch logfile触发checkpoint,data会写入到datafile.

-- 此时继续switch logfile,而再switch到redo02.log时,因该log已删除,故

SQL>alter system switch logfile;

--会一直停在运行的状态,ctrl+c退出运行

SQL> SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
         1          1         25   52428800        512          1 NO  CURRENT                1851152 09-SEP-13   2.8147E+14
         2          1         23   52428800        512          1 NO  INACTIVE               1839279 08-SEP-13      1851142 09-SEP-13
         3          1         24   52428800        512          1 NO  ACTIVE                 1851142 09-SEP-13      1851152 09-SEP-13

--redo02.log status变为inactive,但ARC=no. 因为寻址不到redo02.log,故无法archived.

-- 重建redo02.log

SQL> alter database clear unarchived logfile group 2;

Database altered.
-- 以上command是会重建redolog,但必须redo log非active及current status才可.

-- 因 redo02已写datafile,故data不会丢失,重启db,验证;

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  422670336 bytes
Fixed Size                  1336960 bytes
Variable Size             327158144 bytes
Database Buffers           88080384 bytes
Redo Buffers                6094848 bytes
Database mounted.
Database opened.
SQL> select * from t;

TXT                                                DTE
-------------------------------------------------- ---------
aa                                      07-SEP-13

SQL>

 --以上为redo log删除后,未shutdown的情况下的恢复,若强行shutdown后,恢复就比较麻烦一些

-- 以下再测试删除redo并shutdown后的恢复

-- 同样上面的操作,insert data/commit/rm redo/switch logfile ,此时 删除的redo log status为active,然后强行shutdown abort;,再重启,报错:

SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  422670336 bytes
Fixed Size                  1336960 bytes
Variable Size             331352448 bytes
Database Buffers           83886080 bytes
Redo Buffers                6094848 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/db/oracle/app/oracle/oradata/pvm/redo01.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
-- 考虑不完全恢复,并用alter database open resetlogs来重建redo log:

SQL> recover database until cancel;
ORA-00279: change 1851860 generated at 09/09/2013 01:13:56 needed for thread 1
ORA-00289: suggestion : /db/oracle/app/oracle/flash_recovery_area/PVM/archivelog/2013_09_09/o1_mf_1_25_%u_.arc
ORA-00280: change 1851860 for thread 1 is in sequence #25


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/db/oracle/app/oracle/oradata/pvm/system01.dbf'


ORA-01112: media recovery not started


SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/db/oracle/app/oracle/oradata/pvm/system01.dbf'
--至此,无法打开database.修改参数文件,加上_allow_resetlogs_corruption=true,试强行打开db.

 

SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup pfile='/db/oracle/app/oracle/oradata/pvm/initpvm.ora';
LRM-00109: could not open parameter file '/db/oracle/app/oracle/oradata/pvm/initpvm.ora'
ORA-01078: failure in processing system parameters
SQL> startup pfile='/db/oracle/oracle/product/11.2.0/db_1/dbs/initpvm.ora';
ORACLE instance started.

Total System Global Area  422670336 bytes
Fixed Size                  1336960 bytes
Variable Size             306186624 bytes
Database Buffers          109051904 bytes
Redo Buffers                6094848 bytes
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00600: internal error code, arguments: [2662], [0], [1851868], [0], [1851885], [4194432], [], [], [], [], [], []
Process ID: 13554
Session ID: 1 Serial number: 5

 

--出现internal error,再次呜呼唉灾,再次证明,oracle的隐含参数不要轻易使用.

-- 回到linux查,却发现redo01.log生成了,@_@

--于是,退出sqlplus(一定要退出),再login sqlplus

SQL> shutdown abort;
ORACLE instance shut down.

SQL> startup;
ORACLE instance started.

Total System Global Area  422670336 bytes
Fixed Size                  1336960 bytes
Variable Size             331352448 bytes
Database Buffers           83886080 bytes
Redo Buffers                6094848 bytes
Database mounted.
Database opened.
---此时可正常打开.

-- select data

SQL>select * from t;

no rows selected

 

-- data丢失. 不完全恢复找不到redo01.log,只能恢复到未insert data前的状态.

 

总结:

1.出现问题时,不要轻易shutdown

2.不要随便使用oracle的隐含参数

<think>我们正在处理一个Oracle RAC环境中的问题:如何删除备用重做日志(Standby Redo Log, SRL)。备用重做日志在Data Guard环境中用于接收主库传递过来的重做数据,在物理备库上使用。当不再需要备用重做日志时,我们可以将其删除。 操作步骤: 1. 确认当前备用重做日志的状态和组信息。 2. 删除备用重做日志组。 注意:在删除之前,确保这些日志组没有被使用(即没有活动的事务正在写入)。在RAC环境中,每个实例都可能有自己的线程,因此需要确保所有实例的备用重做日志都被删除。 具体步骤: a. 查询当前备用重做日志信息: ```sql SELECT GROUP#, THREAD#, SEQUENCE#, BYTES, MEMBERS, STATUS FROM V$STANDBY_LOG; ``` 如果STATUS为ACTIVE或CURRENT,表示正在使用,不能立即删除。需要等待其状态变为UNUSED或INACTIVE。 b. 删除备用重做日志组: 对于每个组,执行: ```sql ALTER DATABASE DROP STANDBY LOGFILE GROUP <group_number>; ``` 在RAC环境中,需要确保删除所有实例的备用重做日志组。注意,每个实例的线程(THREAD)对应的组都需要删除。 但是,在RAC环境中,备用重做日志组通常是所有实例共享的(每个组有多个成员,每个成员位于不同的存储上,以支持所有实例的访问)。实际上,在RAC中配置备用重做日志时,我们为每个线程(对应一个实例)创建相同数量的组。因此,删除时需要删除所有组的日志。 另一种做法是,我们可以先删除每个组的成员,然后再删除组。但是,Oracle允许直接删除整个组。 重要:在删除之前,确保数据库处于打开状态(备库通常是处于打开状态,但应用日志可能暂停)。建议在维护窗口进行,并暂停日志应用。 步骤详细: 1. 连接到备库(如果是物理备库,确保以只读方式打开或处于应用日志的状态)。 2. 检查日志组状态,确保没有活动日志。 3. 逐个删除每个组。 例如,删除组5: ```sql ALTER DATABASE DROP STANDBY LOGFILE GROUP 5; ``` 注意:在RAC环境中,每个节点都应该能够访问到这些日志文件,因此删除操作在任意一个节点执行即可(因为RAC共享存储),但操作会作用于整个数据库。 但是,根据Oracle文档,在RAC环境中,删除日志文件的操作需要在所有实例上都执行吗?实际上,不需要。因为日志文件是数据库级的,而不是实例级的。所以在一个实例上执行删除即可。 然而,为了安全,最好在每个实例上都检查一下V$STANDBY_LOG视图,确保没有实例在使用要删除的日志组。 另外,删除物理文件:上述命令只会从数据库控制文件中删除日志组,并不会删除操作系统上的文件。因此,在删除日志组后,需要手动删除操作系统上的日志文件。 因此,完整的步骤包括: 1. 暂停日志应用(如果备库正在应用日志): ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; ``` 2. 检查日志组状态,确保所有备用重做日志组都是未激活状态(UNUSED或INACTIVE)。 3. 逐个删除备用重做日志组。 4. 手动删除操作系统上的备用重做日志文件。 5. 如果需要,重新启动日志应用: ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; ``` 注意:在RAC环境中,步骤1和步骤5需要在所有实例上执行吗?实际上,暂停日志应用只需要在一个实例上执行(因为恢复进程是全局的),同样,重新启动日志应用也只需要在一个实例上执行。 但是,为了确保一致性,建议在主节点(或者通常运行恢复进程的节点)上执行这些操作。 另外,如果备用重做日志组正在使用(比如由于主库还在传输日志),那么删除操作会报错。因此,确保在删除前,主库已经停止向该备库传输日志(或者将备库置为未保护模式),或者等待备用重做日志组不再活动。 然而,在正常的操作中,我们可能不希望停止主库的传输。因此,可以选择在备库上临时停止重做传输服务(这需要协调主备库)。但更简单的方法是在备库上等待备用重做日志组变为非活动状态。 总结步骤: 1. 在备库上停止日志应用(可选,如果日志应用正在运行,可能会持续写入日志,导致日志组状态变化,但为了安全,停止应用可以避免状态变化): ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; ``` 2. 等待所有备用重做日志组变为INACTIVE或UNUSED(可以通过反复查询V$STANDBY_LOG来确认)。 3. 使用ALTER DATABASE DROP STANDBY LOGFILE GROUP命令删除每个组。 4. 手动删除操作系统上的日志文件(注意:在RAC环境中,文件可能位于共享存储上,确保所有节点都不可访问这些文件)。 5. 重新启动日志应用(如果之前停止了): ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; ``` 注意:在RAC环境中,如果备用重做日志组配置了多个成员(每个成员位于不同的磁盘路径),那么每个成员都需要在操作系统删除。 引用说明:以上操作参考了Oracle Data Guard的常见管理方法,但具体操作细节可参考Oracle官方文档[^1]。 根据用户提供的引用,我们注意到引用[1]提到了主库只向本地备库传输重做日志,但归档到远程备库。引用[2]则是在备库上创建监听器的配置。这些引用与当前问题关联不大,因此我们主要依据标准操作流程。 相关问题: §§相关问题§§ 1. 在删除备用重做日志之前,如何确认它们没有被使用? 2. 在Oracle RAC环境中,备用重做日志的配置与单实例有什么不同? 3. 删除备用重做日志后,对Data Guard的运行会有什么影响?</think>### 在Oracle RAC环境中删除备用重做日志(Standby Redo Log)的操作方法 #### 1. **确认备用重做日志状态** 在删除前,先检查日志组状态,确保没有活动日志: ```sql SELECT GROUP#, THREAD#, SEQUENCE#, BYTES, MEMBERS, STATUS FROM V$STANDBY_LOG; ``` - 若状态为 `ACTIVE` 或 `CURRENT`,需等待其变为 `UNUSED` 或 `INACTIVE`[^1]。 - 在RAC环境中需检查所有实例的线程(`THREAD#`)。 #### 2. **暂停日志应用(可选)** 为避免数据不一致,建议在物理备库暂停日志应用: ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; ``` #### 3. **删除备用重做日志组** 通过SQL命令逐组删除(以组号5为例): ```sql ALTER DATABASE DROP STANDBY LOGFILE GROUP 5; ``` - **RAC注意事项**: - 需删除所有线程(Thread)关联的日志组。 - 若日志组跨多个路径,需确保所有路径下的文件被清除。 #### 4. **手动删除操作系统文件** 从数据库控制文件删除后,需手动清理物理文件: ```bash rm /u01/oradata/SRL/standby_redo01.log # 根据实际路径删除 ``` #### 5. **重启日志应用(若已暂停)** ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; ``` #### 6. **验证删除结果** ```sql SELECT * FROM V$STANDBY_LOG; -- 应无返回结果 SELECT NAME FROM V$LOGFILE WHERE TYPE='STANDBY'; -- 确认无残留 ``` ### 关键注意事项 1. **RAC环境特殊性**: - 操作需在**所有实例**上验证状态。 - 确保共享存储(如ASM/GPFS)中的文件被完全清除。 2. **影响范围**: - 删除后主库仍可传输redo,但备库失去实时恢复能力,需重新配置SRL恢复[^1]。 3. **文件权限**: - 操作需由`oracle`用户执行,确保对日志文件路径有写权限。 > 示例:删除组号5的SRL后控制文件更新 > ```sql > ALTER DATABASE DROP STANDBY LOGFILE GROUP 5; > -- 返回 "Database altered" 表示成功 > ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值