【数据恢复】NOLOGGING UNRECOVERABLE ORA-26040解析

本文介绍了一次Oracle数据库中由于使用NOLOGGING选项加载数据导致的数据块损坏案例。文章详细展示了通过查询UNRECOVERABLE_CHANGE#及UNRECOVERABLE_TIME来定位问题,并通过分析数据文件与Redo Log文件来确定损坏的原因。


SQL> select count(*) from abc;
select count(*) from abc
*
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 17, 块号 131)
ORA-01110: 数据文件 17:
‘C:\APP\XIANGBLI\ORADATA\MACLEAN\DATAFILE\O1_MF_NLOGGING_9475OCS5_.DBF’
ORA-26040: 数据块是使用 NOLOGGING 选项加载的

 
SQL> select UNRECOVERABLE_CHANGE# , UNRECOVERABLE_time from v$datafile where file#=17;

UNRECOVERABLE_CHANGE# UNRECOVERABLE_
——————— ————–
6486756 26-9月 -13

 

把 (文件号 17, 块号 131) dump出来看一下

 

 

*** 2013-09-26 10:07:46.584
Start dump data blocks tsn: 17 file#:17 minblk 131 maxblk 131
Block dump from cache:
Dump of buffer cache at level 4 for pdb=0 tsn=17 rdba=71303299
Block dump from disk:
buffer tsn: 17 rdba: 0x04400083 (17/131)
scn: 0x0.62faac seq: 0xff flg: 0x04 tail: 0xfaac00ff
frmt: 0x02 chkval: 0xa2a1 type: 0x00=unknown
Hex dump of block: st=0, typ_found=0
Dump of memory from 0x000000000BFF2200 to 0x000000000BFF4200
00BFF2200 0000A200 04400083 0062FAAC 04FF0000 [……@…b…..]
00BFF2210 0000A2A1 FFFFFFFF FFFFFFFF FFFFFFFF […………….]
00BFF2220 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF […………….]
Repeat 508 times
00BFF41F0 FFFFFFFF FFFFFFFF FFFFFFFF FAAC00FF […………….]
End dump data blocks tsn: 17 file#: 17 minblk 131 maxblk 131

 

scn: 0x0.62faac seq: 0xff

==》 对应的SCN为6486700,可以看到内容除了头部一点外 全是0XFF

 

dump 对应redo logfile 可以看到

REDO RECORD – Thread:1 RBA: 0x000074.00015418.0078 LEN: 0x003c VLD: 0x01 CON_UID: 0
SCN: 0x0000.0062faac SUBSCN: 1 09/26/2013 10:04:39
CHANGE #1 INVLD CON_ID:0 AFN:17 DBA:0x04400083 BLKS:0x000d OBJ:123054 SCN:0x0000.0062faac SEQ:1 OP:19.2 ENC:0
Direct Loader invalidate block range redo entry

 

OP:19.2=》Layer 19 : Direct Loader Log Blocks – KCOCODLB Opcode 2 : Invalidate range – KCBLCOIR

==》这里在redo里标记了 直接路径加载造成块失效的范围,在redo logfile dump中可以看到大量类似数据

 

即当recover时读取redo,读到“Direct Loader invalidate block range redo entry”信息时,则将对应的数据块的内容除了kcbh头部外全部记录为0XFF

当Oracle读取到这些块时就会知道这些块是SOFT Corrupt ,原因是nologging造成的。

Block is marked as SOFT Corrupt and has 0xff along the block. This is the
format used by Oracle to mark a block as corrupt due to redo invalidation
(NOLOGGING).
NOLOGGING OPERATION in redo:


原文地址:http://www.askmaclean.com/archives/nologging-unrecoverable.html


<think>好的,我需要帮用户解决ORA-01511错误,特别是关于重命名日志或数据文件时的解决方案。首先,我应该回忆一下ORA-01511错误的基本信息。这个错误通常与重命名或管理数据库的日志文件或数据文件有关,可能是在执行ALTER DATABASE RENAME FILE命令时出现的。用户之前提到过ORA-01578和ORA-26040,但这次的问题不同,需要专注于ORA-01511。 接下来,我需要确认错误的具体原因。ORA-01511的错误代码通常表示在重命名文件时,数据库无法更新控制文件中的文件信息。可能的原因包括:文件不存在、权限问题、文件正在被使用,或者操作步骤不正确。 根据Oracle的文档,重命名数据文件或日志文件需要特定的步骤。通常,用户需要将数据库启动到MOUNT状态,而不是OPEN状态,否则无法修改控制文件。此外,物理文件必须已经存在于目标路径,并且Oracle进程(如DBWn或LGWR)必须有权限访问新位置。 可能用户在执行ALTER DATABASE RENAME FILE时,数据库仍处于OPEN状态,导致无法修改控制文件,从而触发ORA-01511。另外,检查操作系统级别的文件是否存在,权限是否正确也很重要。例如,Linux/Unix上的权限问题或Windows上的共享锁定可能导致文件无法访问。 解决方案方面,标准步骤应该是:关闭数据库,启动到MOUNT状态,执行重命名命令,然后打开数据库。但用户可能需要在线操作,所以可能需要分情况处理,比如对于日志文件,可能需要先重新创建日志组,然后删除旧的;对于数据文件,可能需要将表空间脱机后进行重命名。 另外,需要注意在RAC环境中,所有实例都必须关闭,否则会有实例仍在使用文件,导致重命名失败。同时,确保在重命名后,备份控制文件和spfile,以防止后续问题。 用户可能遇到的另一个问题是,在重命名过程中,如果文件路径错误或文件不存在,也会导致错误。因此,验证源文件和目标文件的路径是否正确,以及Oracle用户是否有足够的权限访问这些路径是必要的步骤。 最后,应该提醒用户在进行任何结构修改前备份数据库,避免数据丢失。同时,引用相关的Oracle文档或可靠的资源来支持解决方案的正确性,比如官方文档或认证的博客文章。例如,用户提供的引用[2]虽然涉及NOLOGGING操作,但可能部分步骤类似,但需要确保引用的准确性。 总结来说,解决ORA-01511的步骤应包括检查数据库状态,确保正确操作步骤,验证文件存在和权限,处理在线或离线情况,并在操作前后进行必要的备份。同时,根据具体情况可能需要不同的处理方法,比如数据文件和日志文件的不同操作流程。</think>### ORA-01511错误解决方案:重命名日志或数据文件 ORA-01511错误通常发生在尝试通过`ALTER DATABASE RENAME FILE`命令修改数据库文件路径时,**控制文件未能正确更新文件信息**。以下是分步解决方案: --- #### **1. 检查数据库状态与文件路径** - **错误场景**: 若数据库处于`OPEN`状态时执行重命名操作,会因文件被活跃进程占用而失败[^1]。 - **解决方法**: ```sql -- 关闭数据库并启动到MOUNT状态 SHUTDOWN IMMEDIATE; STARTUP MOUNT; ``` --- #### **2. 执行文件重命名操作** - **对于数据文件**: ```sql ALTER DATABASE RENAME FILE '/old/path/datafile01.dbf' TO '/new/path/datafile01.dbf'; ``` - **对于日志文件**: ```sql ALTER DATABASE RENAME FILE '/old/path/redo01.log' TO '/new/path/redo01.log'; ``` **注意**: - 目标文件必须已物理存在且路径正确。 - Oracle用户需有目标目录的读写权限(如Linux中`chown`或`chmod`)[^1]。 --- #### **3. 处理在线重命名(特定场景)** - **表空间脱机法(数据文件)**: ```sql ALTER TABLESPACE users OFFLINE; -- 手动复制文件到新路径(操作系统命令) ALTER TABLESPACE users RENAME DATAFILE '/old/path/users01.dbf' TO '/new/path/users01.dbf'; ALTER TABLESPACE users ONLINE; ``` - **重建日志组(日志文件)**: ```sql ALTER DATABASE DROP LOGFILE GROUP 1; ALTER DATABASE ADD LOGFILE GROUP 1 ('/new/path/redo01.log') SIZE 100M; ``` --- #### **4. 验证与恢复** - 重命名后执行: ```sql ALTER DATABASE OPEN; ``` - 检查告警日志(`alert_<SID>.log`)确认无残留错误。 - 若操作中断导致数据库无法启动,需通过备份恢复控制文件或使用`RECOVER DATABASE`命令[^2]。 --- #### **关键注意事项** 1. **RAC环境**:所有实例必须关闭,仅保留一个实例执行操作。 2. **ASM存储**:使用`ALTER DISKGROUP`移动文件,而非直接重命名路径。 3. **备份控制文件**: ```sql ALTER DATABASE BACKUP CONTROLFILE TO TRACE; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值