redo日志丢失的恢复

方法一:用命令清空日志组方法

1 正常关闭数据库

SQL> shutdown

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

2 删除所有的重做日志文件

3 启动数据库

SQL> startup

ORACLE 例程已经启动。

Total System Global Area  167772160 bytes

Fixed Size                  1247876 bytes

Variable Size              67110268 bytes

Database Buffers           92274688 bytes

Redo Buffers                7139328 bytes

数据库装载完毕。

ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员

ORA-00312: 联机日志 1 线程 1:

'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG'

4查看当前日志状态

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- --- ---------------

FIRST_CHANGE# FIRST_TIME

------------- --------------

         1          1          0   52428800          1 YES UNUSED

       543031 19-5 -10

 

         3          1          0   52428800          1 YES CLEARING

       519887 18-5 -10

 

         2          1         50   52428800          1 NO  CURRENT

       563367 19-5 -10

 

(1)     由于redo01.log不是当前日志,可以对这类非当前日志直接clear,系统会重新自动生成一个重做日志文件

SQL> alter database clear logfile group 1;

数据库已更改。

 

5 继续启动数据库

 

SQL> alter database open;

alter database open

*

1 行出现错误:

ORA-00313: 无法打开日志组 2 (用于线程 1) 的成员

ORA-00312: 联机日志 2 线程 1:

'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'

(2)     发现redo02.log也得恢复,因为redo02.log是当前重做日志文件,尝试直接clear,失败

SQL> alter database clear logfile group 2;

alter database clear logfile group 2

*

1 行出现错误:

ORA-00350: 日志 2 (实例 orcl 的日志, 线程 1) 需要归档

ORA-00312: 联机日志 2 线程 1:

'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'

 

尝试alter database clear unarchived logfile group 2,失败

 

SQL> alter database clear unarchived logfile group 2;

alter database clear unarchived logfile group 2

*

1 行出现错误:

ORA-00313: 无法打开日志组 2 (用于线程 1) 的成员

ORA-00312: 联机日志 2 线程 1:

'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'

ORA-27041: 无法打开文件

OSD-04002: 无法打开文件

O/S-Error: (OS 2) 系统找不到指定的文件。

(3)     从有效的备份中拷贝过来一个redo02.log

SQL> alter database clear unarchived logfile group 2;

 

数据库已更改。

 

SQL> alter database open;

 

数据库已更改。

 

结论: (1)非当前(current)未归档日志文件恢复都可以直接alter database clear logfile group n来重新生成,非当前的归档日志文件恢复可以用alter database clear unarchived logfile group n来重新生成;对于当前日志,  归档日志文件恢复必须从有效的备份中复制一个,然后用alter database clear unarchived logfile group n;

 

方法二:用cancel模式恢复数据库

1 关闭数据库

SQL> shutdown

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

2 删除所有重做日志文件

SQL> startup

ORACLE 例程已经启动。

 

Total System Global Area  167772160 bytes

Fixed Size                  1247876 bytes

Variable Size              67110268 bytes

Database Buffers           92274688 bytes

Redo Buffers                7139328 bytes

数据库装载完毕。

ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员

ORA-00312: 联机日志 1 线程 1:

'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG'

3 recover命令

SQL> recover database until cancel;

完成介质恢复。

SQL> alter database open;

alter database open

1 行出现错误:

ORA-01589: 要打开数据库则必须使用 RESETLOGS NORESETLOGS 选项

 

SQL> alter database open resetlogs;

数据库已更改。

resetlogs是根据控制文件让系统自动重新生成重做日志文件,如果noresetlogs的话,就不会重新生成redo,缺少了文件,数据库无法启动。

 

方法三 通过重新生成控制文件来恢复redo

1 关闭数据库

SQL> shutdown

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

删除所有重做日志文件

2

SQL> startup

ORACLE 例程已经启动。

 

Total System Global Area  167772160 bytes

Fixed Size                  1247876 bytes

Variable Size              67110268 bytes

Database Buffers           92274688 bytes

Redo Buffers                7139328 bytes

数据库装载完毕。

ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员

ORA-00312: 联机日志 1 线程 1:

'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG'

3

SQL> alter database backup controlfile to trace;

 

数据库已更改。

4

SQL> shutdown immediate

ORA-01109: 数据库未打开

已经卸载数据库。

ORACLE 例程已经关闭。

5修改备份的控制文件中的脚本,如下,保存在E:/create.sql

STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS  ARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 100

    MAXINSTANCES 8

    MAXLOGHISTORY 292

LOGFILE

  GROUP 1 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG'  SIZE 50M,

  GROUP 2 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'  SIZE 50M,

  GROUP 3 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03.LOG'  SIZE 50M

-- STANDBY LOGFILE

DATAFILE

  'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/SYSTEM01.DBF',

  'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/UNDOTBS01.DBF',

  'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/SYSAUX01.DBF',

  'E:/ORACLE/PRODUCT/10.2.0/ORCL/TEST.DBF'

CHARACTER SET ZHS16GBK

;

6 执行create.sql

SQL> @E:/create.sql

ORACLE 例程已经启动。

 

Total System Global Area  167772160 bytes

Fixed Size                  1247876 bytes

Variable Size              67110268 bytes

Database Buffers           92274688 bytes

Redo Buffers                7139328 bytes

 

控制文件已创建。

7resetlogs打开数据库

SQL> alter database open resetlogs;

数据库已更改。

 

方法四 修改系统参数方法

 

SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 5 19 22:44:14 2010

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

SQL> conn sys/admin as sysdba

已连接。

SQL> conn test/test

已连接。

SQL> select * from test;

 

        ID

----------

         1

         2

         3

         4

         5

         6

 

已选择6行。

 

SQL> insert into test values(7);

 

已创建 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> conn sys/admin as sysdba

已连接。

SQL> shutdown abort;

ORACLE 例程已经关闭。

1 initorcl.ora里加入_allow_resetlogs_corruption=true

2指定pfile启动数据库到mount

 SQL> startup mount pfile='E:/oracle/product/10.2.0/admin/orcl/pfile/initorcl.ora';

ORACLE 例程已经启动。

 

Total System Global Area  167772160 bytes

Fixed Size                  1247876 bytes

Variable Size              62915964 bytes

Database Buffers           96468992 bytes

Redo Buffers                7139328 bytes

数据库装载完毕。

SQL> alter database open;

alter database open

*

1 行出现错误:

ORA-01589: 要打开数据库则必须使用 RESETLOGS NORESETLOGS 选项

 

 

SQL> alter database open resetlogs;

 

数据库已更改。

3 检验数据是否丢失

 

SQL> select * from test.test;

 

        ID

----------

         1

         2

         3

         4

         5

         6

 

已选择6行。

由于执行了shutdown abort,这时候对数据的修改还没有保存到数据文件中,虽然执行了commit,这个时候数据还在联机日志中,等待CKPT触发数据库写进程将数据写入数据文件,redo被删除后,数据也丢失

<think>首先,用户的问题是关于“Oracle 归档日志丢失 数据恢复方法”。我需要基于系统指令来构建我的回答。系统指令包括: 1. 所有行内数学表达式使用$...$格式。 2. 独立公式使用$$...$$格式并单独成段。 3. LaTeX语法正确。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层的指令是:回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 参考的站内引用是: - 引用[1]: Oracle 数据库在线重做日志丢失恢复方法。包括使用备份恢复日志挖掘恢复和第三方工具恢复。 - 引用[2]: 使用Oracle归档日志文件进行MySQL数据恢复。但这似乎不直接相关,因为用户的问题是关于Oracle自己的归档日志丢失。 用户意图是查找在Oracle数据库归档日志丢失的情况下如何进行数据恢复的方法。 我的回答需要结构化、清晰。我应该: 1. **介绍问题**:解释归档日志丢失的严重性。 2. **逐步解决方法**:提供具体的恢复方法,基于引用[1]。 3. **添加引用标识**:在引用的段落末尾添加[^1]。 4. **生成相关问题**:在最后添加相关问题部分。 5. **使用LaTeX**:如果有数学表达式,使用$...$或$$...$$。但在这个主题中,可能没有太多数学内容。我可以提到一些概念,比如数据库状态,但可能不需要复杂公式。如果有机会,我可以简单提及,但不要强迫。 例如,如果讨论到数据一致性,我可以说数据库状态的一致性方程,但保持简单。比如,$S_{consistent} = \text{恢复后的状态}$,但这可能不必要。最好只在实际需要时使用。 现在,结构化回答: - **开头**:简要介绍归档日志的作用和丢失的后果。 - **主体**:分步描述恢复方法: - 方法1: 使用备份恢复(从备份还原数据库)。 - 方法2: 使用日志挖掘恢复(如果有可用的日志)。 - 方法3: 使用第三方工具恢复。 基于引用[1]。 - **结尾**:总结建议,并强调及时备份的重要性。 - **相关问题**:生成3-5个相关问题。 引用标识:在描述方法时,如果直接引用内容,添加[^1]。 例如:"根据Oracle文档,可以使用备份恢复方法[^1]。" 确保使用中文。 生成相关问题: 1. 如何防止Oracle归档日志丢失? 2. Oracle归档日志丢失后如何最小化数据损失? 3. 有哪些第三方工具可用于Oracle数据恢复? 4. 归档日志和在线重做日志的区别是什么? 5. 在归档日志丢失的情况下,如何验证数据库的完整性? 现在,草拟回答。</think>### Oracle 归档日志丢失的数据恢复方法 在 Oracle 数据库中,归档日志(Archived Redo Logs)是用于记录数据库事务历史的关键组件。它们支持数据恢复、备份和故障转移。如果归档日志丢失(例如,由于存储故障或人为错误),数据库可能无法恢复到一致状态,导致数据丢失或系统停机。归档日志丢失的严重性取决于丢失的范围:如果只丢失部分日志恢复可能可行;如果全部丢失恢复可能依赖于备份。以下介绍几种可靠的恢复方法,基于 Oracle 官方推荐的最佳实践[^1]。 #### 步骤1: 评估损失情况 在开始恢复前,先确认归档日志丢失的范围: - **检查日志状态**:使用 SQL*Plus 或 RMAN (Recovery Manager) 命令检查日志序列号。例如: ```sql SELECT GROUP#, SEQUENCE#, STATUS FROM V$LOG; ``` 如果状态显示为 "UNARCHIVED",则归档日志丢失。 - **确定丢失日志的序列号**:记录缺失的日志文件序列号,以指导恢复操作。 - **备份可用性检查**:确保有最近的数据库备份(如全备或增量备)。如果没有备份,恢复难度增加,可能需要第三方工具。 #### 步骤2: 选择并执行恢复方法 根据损失情况和备份可用性,选择以下方法之一。建议在测试环境先验证,再应用到生产库。 1. **使用备份恢复(推荐方法)** 如果存在完整的数据库备份(包括数据文件和控制文件),这是最可靠的方法。步骤如下: - **恢复备份**:使用 RMAN 还原数据库到备份点。 ```bash RMAN> STARTUP MOUNT; RMAN> RESTORE DATABASE; RMAN> RECOVER DATABASE; ``` 此命令会尝试应用可用的归档日志恢复数据。如果日志丢失,RMAN 会提示错误,此时需要跳过缺失日志。 - **跳过丢失日志**:如果部分归档日志丢失,使用 `UNTIL` 子句恢复日志丢失前的点。 ```bash RMAN> RECOVER DATABASE UNTIL SEQUENCE <last_valid_sequence>; ``` 这里,`<last_valid_sequence>` 是最后一个有效的日志序列号。恢复后,数据库会处于一致状态,但可能丢失部分事务[^1]。 - **优点**:简单高效,能保证数据库完整性。 - **缺点**:可能导致数据丢失(从备份点到恢复点之间的数据)。 2. **使用日志挖掘恢复(如果部分日志可用)** 如果归档日志未完全丢失(例如,部分日志文件仍存在),可以使用 OracleLogMiner 工具从剩余日志中提取事务信息。 - **启用 LogMiner**:首先,配置 LogMiner 分析日志文件。 ```sql EXEC DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/path/to/archived_log.log', OPTIONS => DBMS_LOGMNR.NEW); EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG); ``` - **挖掘并应用事务**:查询 `V$LOGMNR_CONTENTS` 视图,提取丢失事务的 SQL 语句,然后手动执行以恢复数据。 ```sql SELECT SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'YOUR_SCHEMA'; ``` 执行输出 SQL 来重做事务。 - **优点**:能恢复部分数据,减少损失。 - **缺点**:耗时且复杂,需要专业知识;如果日志完全丢失,此方法无效[^1]。 3. **使用第三方工具恢复(作为备选方案)** 如果备份和日志挖掘不可行,考虑专业工具(如 Oracle Data Guard、Quest SharePlex 或第三方恢复软件)。这些工具能扫描存储介质,尝试恢复已删除的日志文件。 - **操作步骤**: - 安装工具(如使用 Oracle Data Guard 创建物理备库)。 - 配置工具扫描归档日志存储路径。 - 如果工具成功恢复日志文件,再用 RMAN 应用日志完成恢复。 - **优点**:可能恢复完全丢失日志。 - **缺点**:成本高(需购买许可),成功率不保证;仅适用于日志文件未被覆盖的情况[^1]。 #### 步骤3: 恢复后验证与预防措施 - **验证数据库完整性**:恢复后,运行检查命令: ```sql ALTER DATABASE OPEN; SELECT * FROM V$DATABASE_BLOCK_CORRUPTION; -- 检查数据块损坏 ``` 如果输出为空,表示数据库一致。 - **预防措施**:为避免未来丢失: - **启用多重归档**:配置多个归档路径(`LOG_ARCHIVE_DEST_n` 参数)。 - **定期备份日志**:使用 RMAN 备份归档日志到异地存储。 - **监控工具**:部署 Oracle Enterprise Manager 实时监控日志状态。 **总结**:归档日志丢失时,优先使用备份恢复(方法1),因为它高效可靠;如果部分日志可用,尝试日志挖掘(方法2);第三方工具(方法3)作为最后手段。及时备份是防止数据丢失的关键[^1]。如果操作不确定,请联系 Oracle 支持或专业 DBA。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值