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. BFS+PRIM

    转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1299324104 在一个y行 x列的迷宫中,有可行走的通路空格' ',不可行走的墙'#', ...

  2. PHP gd 库添加 freetype

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

  3. KMS算法

    解题:http://hihocoder.com/problemset/problem/1015 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时 ...

  4. sql server group by 分组带sum avg求和需要注意的一点

    这是在写SQL语句遇到的一个sum  和group bu分组的问题

  5. Python 版本对比

    python2 与 python3可认为代码不通用,你也可以点击Python2.x与3​​.x版本区别来查看两者的不同 python3.6以上支持f-string,一种很方便的变量替换方式 高版本可能 ...

  6. Spring Boot 注册 Servlet 的三种方法,真是太有用了!

    本文栈长教你如何在 Spring Boot 注册 Servlet.Filter.Listener. 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spr ...

  7. iOS 二维码扫描 通过ZBar ZXing等第三方库

    扫描二维码的开源库有很多如 ZBar.ZXing等 ZBar的使用方法: 下载ZBar SDK 地址https://github.com/bmorton/ZBarSDK ZBarSDK是一个开源的SD ...

  8. Deprecated: Assigning the return value of new by reference is deprecated in报错

    出现了Deprecated: Assigning the return value of new by reference is deprecated in wwwroot\common.inc.ph ...

  9. Proteus与Keil连接及其仿真(有例子哦!)

    记录一下Proteus仿真的一些设置和使用,以方便自己以后复习和大家交流!如有错误,希望大家指正. 1.Proteus软件的安装,这里就不作说明了.

  10. .netcore中使用EFCore连接SQL Server并部署至Ubuntu

    前面一篇记录了如何在windows下开发asp.net core程序,并部署至ubuntu系统中.但仅仅是建立了一个demo项目,项目本身并没有实现多少功能.多数时候,我们的项目是要和数据库打交道.E ...