OERR: ORA-1410 “invalid ROWID” Master Note / Troubleshooting, Diagnostic and Solution (文档ID 1410.1)

了解ORA-­1410错误

ORA-1410表示rowid无效。 当操作引用表中没有相应行的ROWID时,会抛出此错误。

什么是ROWID?

rowid是一种允许直接访问行的结构。 rowid包含有关对象编号,它所在的数据文件,块编号以及块内的插槽编号的信息。

Oracle 8和更高版本具有以下格式的rowid:

OOOOOOFFFBBBBBBSSS
O=Data Object Number (length=6)
F=Relative File Number (length=3)
B=Block Number (length=6)
S=Slot Number (length=3)

解码ROWID

dbms_rowid包(rowid_info procedure)可用于将rowid解码为其组件。

以下匿名PL/SQL块将解码您提供的任何rowid(参考文档1057891.6)。

SQL> set serveroutput on
SQL> declare
my_rowid rowid := 'AAAQUeAAEAAAAGkAAB'; ­­ or any rowid
rowid_type number;
object_number number;
relative_fno number;
block_number number;
row_number number;
begin
dbms_rowid.rowid_info(my_rowid, rowid_type, object_number, relative_fno, block_number, row_number);
dbms_output.put_line('ROWID: ' || my_rowid);
dbms_output.put_line('Object#: ' || object_number);
dbms_output.put_line('RelFile#: ' || relative_fno);
dbms_output.put_line('Block#: ' || block_number);
dbms_output.put_line('Row#: ' || row_number);
end;
/
ROWID: AAAQUeAAEAAAAGkAAB
Object#: 66846
RelFile#: 4
Block#: 420
Row#: 1
PL/SQL procedure successfully completed.
­­ To identify the object name (object# 66486)
SQL> select *
from dba_objects
where data_object_id = 66846;
­­ To find the datafile name (Relfile# 4)
SQL> select file_id, file_name
from dba_data_files
where RELATIVE_FNO = 4;

发生ORA-1410原因

当Oracle解析rowid(获取文件,块和插槽)时,如果没有相应的行,那么它可能是ORA-1410:

  • 如果文件和块都有效,并且唯一的问题是row slot不存在,则返回“no rows selected”消息。

  • 如果rowid的任何其他部分出现问题,则返回ORA-1410并可能引起关注。 ORA-1410可以指示ROWID用于不属于该表的BLOCK

ORA-1410通常与块损坏相关联,因为它可能是错误的一个来源。但是,还有其他错误来源。

以下是发生ORA-1410的可能原因。

1. 将rowid手动输入到SQL语句中。或者定制的PL/SQL过程具有错误的逻辑并生成不正确的rowid。

  1. rowid是在内部生成的,但在内存中已损坏。

  2. 从一个损坏的索引中检索到了rowid。如果是这种情况,您可能会看到ORA-1410附带的其他损坏错误。

  3. 长时间运行查询访问对象期间对对象的执行DDL操作。例如,如果SQL语句正在访问索引,则重建索引可能会导致ORA-1410。

  4. rowid有效,但数据块或数据文件已损坏(覆盖),因此块地址可能有误。如果是这种情况,您可能会看到ORA-1410附带的其他损坏错误。

  5. rowid有效但指向最近移动的块。这可能是由于在SQL正在进行时截断表的时间而发生的。因此,SQL具有缓存的rowid,但在截断期间删除了该块。如果在SQL语句运行时交换了表分区,则会发生同样的情况。在这种情况下,文件号已更改,SQL语句可以报告ORA-1410。

  6. Oracle Bug,OS错误或其他应用程序错误。

显示如何发生ORA-1410的例子

这是一个简单的例子,展示如何发生ORA-1410。

第一步是创建一个简单的表并添加一行或两行

- 首先创建一个包含一列或两列的简单表。

- 然后插入几行并提交。

- 然后显示rowid

­­­­--Create a simple table
SQL> create table tab1 (col1 varchar(2), col2 varchar2(2)) tablespace users;
Table created.
­­
--Add a couple of rows and commit
SQL> insert into tab1 values('aa','11');
1 row created.
SQL> insert into tab1 values('aa','22');
1 row created.
SQL> commit;
Commit complete.
­­
--Display the rowids
SQL> select rowid from tab1;
ROWID
­­­­­­­­­­­­­­­­­­
AAAQUYAAEAAAAGkAAA
AAAQUYAAEAAAAGkAAB

示例中的下一步是查看插槽号递增时发生的情况(最后3个位置):

  • 将最后一个rowid插槽增加1(因此… AAB变为… … AAC),并使用此不存在的rowid从表中进行选择。 由于我们只更改了最后一个值,因此只更改了插槽,并且未选择任何行。

  • 该示例使用rowid AAAV03AAEAAAsVlAAC:

­­--Increment the slot number by 1 (AAB becomes AAC).
SQL> select * from tab1 where rowid = 'AAAQUYAAEAAAAGkAAC';
no rows selected OR ­­--overwrite the slot value with FFF
SQL> select * from tab1 where rowid = 'AAAQUYAAEAAAAGkFFF';
no rows selected

在上面的例子中,通过简单地改变插槽号,它导致“没有选择行”消息; 这是一条无害的信息。

示例中的下一步是查看rowid中的块更改时发生的情况:


­­--Now change the block number (AAAAGk becomes FFFFGk) and select.
SQL> select * from tab1 where rowid = 'AAAQUYAAEFFFFGkAAB';
select * from tab1 where rowid = 'AAAQUYAAEFFFFGkAAB'
*
ERROR at line 1:
ORA­01410: invalid ROWID

在上面的例子中,部分rowid被FFFF覆盖。 在该示例中,是被覆盖的块地址。 覆盖可能是由几个事件引起的:

  • 一段代码写入内存,它认为它拥有。 如果代码是Oracle,则可能是Oracle错误。 如果代码来自操作系统,则可能是供应商(OS)错误。 如果代码来自应用程序,则使用应用程序代码提供程序。 对于Oracle Bugs,请参与Oracle支持。

  • 内存中存在缺陷,硬件出现故障,内存地址不好。 希望操作系统错误日志中可能有消息来验证这一点。

  • 通过Oracle代码或自定义应用程序代码生成的rowid不正确。

损坏不仅可以发生在rowid上,还可以发生在保存rowid副本的对象(例如索引)上,或者发生在rowid指向的表上。 如果索引已损坏,则索引中的rowid可能包含不正确的组件,如果用于访问数据行,则会导致ORA-1410。 类似地,如果数据组件(表)已损坏,则可能会覆盖块地址,并且索引中的有效rowid可能无法找到该块。 ORA-1410将再次出现。

该示例中的下一步是演示如何更改数据对象id甚至可以导致ORA-1410,即使使用有效的rowid:在此示例中,表进行TRUNCATE操作; 观察对rowid的影响。

­­Show the two rowids in the table
SQL> select rowid from tab1;
ROWID
­­­­­­­­­­­­­­­­­­
AAAQUYAAEAAAAGkAAA
AAAQUYAAEAAAAGkAAB
­­
--Select all columns from the table using one of the rowids.
SQL> select * from tab1 where rowid = 'AAAQUYAAEAAAAGkAAA';
CO CO
­­-- --­­
aa 11 ­­--Now truncate the table
SQL> truncate table tab1;
Table truncated.
­
--Rerun the previous select statement using the known valid rowid.
SQL> select * from tab1 where rowid = 'AAAQUYAAEAAAAGkAAA';
select * from tab1 where rowid = 'AAAQUYAAEAAAAGkAAA'
*
ERROR at line 1:
ORA­01410: invalid ROWID

上面的例子显示了ORA-1410的常见原因和预期原因。 SQL语句在内存中有一些rowid缓存,用于从表中进行选择。 但该表同时被截断,表中的所有块都不复存在。 因此,在同时使用缓存的rowid执行select时,可以看到ORA-1410。 如果交换表分区,成为独立表,并且同时运行的任何SQL都可以获得ORA-1410,则可能会发生同样的情况。

解决

1)首先,确定错误是否可重现。

如果ORA-1410是可重现的,则生成跟踪文件非常重要。 如果没有生成一个,我们需要强制一个。 为此,请设置errorstack事件,并重现错误:

alter system set events '1410 trace name ERRORSTACK level 3';

alter session set events '10236 trace name context forever, level 1';

alter session set tracefile_identifier='ORA1410';
­­
--Then reproduce the error.

从跟踪文件中,识别失败的语句; 它将接近文件的顶部。 如果不方便阅读跟踪文件,请联系Oracle支持并在服务请求中上载跟踪文件。

通过执行上次导致ORA-1410的语句(如跟踪文件中标识的)来确定问题是否重现。

2)错误无法重现

如果无法再现,请检查是否有任何表在错误发生时被truncate,或者是否交换了任何表分区。 如果其中任何一个发生,则预计会出错; 解决方案是避免在可能正在读取表的SQL语句时进行截断或交换。

3)错误再现

如果ORA-1410是可重现的,则识别失败语句中涉及的表。 从失败的语句中,获取FROM子句中正在访问的表。 如果失败的语句引用视图,则从视图定义中查找基表并继续第4步

4)验证表和索引

使用表及其索引上的ONLINE子句运行Validate以检查是否存在损坏

SQL> analyze table <owner>.<table_name> validate structure ONLINE;
­­--For each index on the table, run a validate also SQL> analyze index <owner>.<index_name> validate structure ONLINE.
­­--For a partitioned table, refer to Doc ID 111990.1

如果表’Validate’返回错误,则表已损坏并需要从最新备份恢复,或者可以使用DocID 1527738.1中描述的plsql脚本重新创建表。

如果索引“Validate”返回错误,则可以删除并重新创建索引。

如果表和所有索引干净地验证(返回’table analyze’),则坏的rowid被缓存在内存中,这通常可以通过刷新缓冲区缓存或刷新共享池来清除。 这将导致临时性能影响,直到通过正常处理重新填充缓存:

SQL> alter system flush buffer_cache;

SQL> alter system flush shared_pool;

最后,如果ORA-1410错误仍然存在,则可能是由于Oracle错误。 请参阅下面的已知错误列表或使用Oracle支持打开服务请求以进行更深入的调查。 如果打开服务请求,请务必包含以下文档中要求的信息:

Note:1671526.1 - Required Diagnostic Data Collection for ORA-01410

OERR: ORA-1410 "invalid ROWID" Master Note / Troubleshooting, Diagnostic and Solution (文档ID 1410.1)的更多相关文章

  1. Troubleshooting 10g and 11.1 Clusterware Reboots (文档 ID 265769.1)

    Troubleshooting 10g and 11.1 Clusterware Reboots (文档 ID 265769.1) This document is intended for DBA' ...

  2. Master Note: Troubleshooting ORA-1548 error (Doc ID 1577988.1)

    APPLIES TO: Oracle Database Cloud Schema Service - Version N/A and laterOracle Database Exadata Clou ...

  3. Umbraco(5)-Creating Master Template Part 1(翻译文档)

    原文地址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/umbraco5-creating-master-template-par ...

  4. Getting Error "Invalid Argument to LOCATOR.CONTROL: ORG_LOCATOR_CONTROL='' in Material Requirements Form (文档 ID 1072379.1)

    APPLIES TO: Oracle Work in Process - Version 11.5.10.2 and later Information in this document applie ...

  5. Master Note: Undo 空间使用率高 (Doc ID 1578639.1)

    Master Note: High Undo Space Usage (Doc ID 1578639.1) APPLIES TO: Oracle Database Cloud Schema Servi ...

  6. LR连接oracle时出现:SQLState=28000[Oracle][ODBC][Ora]ORA-01017:invalid username/password;logon denied

    出现的现象:

  7. oracle 错误码查看命令oerr ora及常用错误码总结--不断更新

    oracle 错误码查看命令oerr ora及常用错误码总结--不断更新 1.ORA-00907: 缺失右括号 我自己的问题出在 字段的default 和 not null 顺序反了,defalut ...

  8. count failed: not master{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" } at src/mongo/shell/query.js:191在SECONDARY节点无法show dbs

    count failed: not master{ "note" : "from execCommand", "ok" : 0, " ...

  9. Master Note for Transportable Tablespaces (TTS) -- Common Questions and Issues (Doc ID 1166564.1)

    APPLIES TO: Oracle Database Cloud Exadata Service - Version N/A and laterOracle Database Cloud Servi ...

随机推荐

  1. bzoj 3573: [Hnoi2014]米特运输【树形dp+瞎搞】

    阅读理解题,题意是以1为根的有根树,每个点有点权,求修改最少点权能使每个点的权值等于其所有子节点权值之和并且每个点的所有子节点权值相等的个数 然后就比较简单了,就是有个技巧是数太大,需要对所有操作都取 ...

  2. [转]Markdown语法参考

    << 访问 Wow!Ubuntu NOTE: This is Simplelified Chinese Edition Document of Markdown Syntax. If yo ...

  3. PHP gd 库添加 freetype

    gd 库未安装 freetype 可能导致验证码图片加载不出来等问题. 先到 PHP 的扩展目录里面找到 gd 扩展文件夹 最好先 make clean 清除之前编译的可执行文件及配置文件,运行/us ...

  4. linux之用户态和内核态

    一. Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程 ...

  5. .Net开发人员必备工具下载

    .Net开发人员必备工具下载   本人亲测下载地址: Win8.1破解工具下载: http://pan.baidu.com/s/1eQf2UiQ 可激活版本 Windows Vista Busines ...

  6. 跟我一起玩Win32开发(15):ListView控件

    这个控件其实不用阿拉来介绍,因为它太常见了,就好像我们一出门就会看到妹子一样常见.当然也可以说,它是对ListBox的扩充. 在使用该控件之前,我先介绍VS的一个相当好玩的功能. 在代码文件的#inc ...

  7. c#学习系列之装箱拆箱

    1.      装箱和拆箱是一个抽象的概念 2.      装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型       利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的 ...

  8. 基于ABP的Easyui admin framework正式开放源代码

    下载&反馈:http://www.webplus.org.cn v1.0 (2016/9/21) EF6+MVC5+API2+Easyui1.4.2开发 后台管理不使用iframe,全ajax ...

  9. Mac上面不能安装Homebrew

    这个stackoverflow的答案解决了我的问题: http://stackoverflow.com/questions/18039029/mac-can-t-install-homebrew 问题 ...

  10. PMP项目管理学习笔记(12)——范围管理之创建工作分解结构(WBS)

    创建工作分解结构过程是范围管理知识领域中最重要的过程,因为要在此过程明确所要做的全部工作 输入:收集需求和定义范围过程的输出会成为创建工作分解结构过程的输入(需求文档.组织资产过程.项目范围说明书) ...