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. python __builtins__ 函数

    dir(__builtins__) 1.'abs', 对传入参数取绝对值 abs(x, /) Return the absolute value of the argument. >>&g ...

  2. Luogu P1613跑路【倍增】By cellur925

    题目传送门 开始的思路:直接跑一遍最短路,得到最短路的那个值.然后把那个值进行一下二进制拆分,看能拆几次.(可能是受到了刚做过的题影响) ;i>=;i--) { <<i)>qw ...

  3. noi,ac第五场部分题解 By cellur925

    题目质量还是不错的,只是我太菜了== 传送门 T1:序列计数(count) 题目描述 长度为n+1的序列A,其中的每个数都是不大于n的正整数,且n以内每个正整数至少出现一次. 对于每一个正整数k=1, ...

  4. Luogu P1754球迷购票问题【dp/卡特兰数】By cellur925

    题目传送门 虽然是水dp,但我感到还是有些无从下手== f[i][j]表示还剩i个50元没考虑,j个100元没考虑的方案数,可有转移f[i][j]=f[i-1][j]+f[i][j-1] 但其实它也可 ...

  5. 查看软件安装的位置 Ubuntu

    Ubuntu和windows不一样,不是所有的软件都在一个文件夹,而是不同类型的分散在不同的文件夹下 所以查找起来也是不同的 如果知道是用 apt-get install 方法安装的,可以直接用 dp ...

  6. jQuery 第九章 工具方法

    $.type() $.isArray() $.isFunction() $.isWindow()... $.trim() $.proxy() $.noConflict() $.each() $.map ...

  7. springboot&mybatis 增删改查系列(二)

    数据库篇 我的数据库名为data0525,数据表名为user,其中有五列uid,uname,upass,usex,umessage.uid为主键并且自动生成,由于是练习表,所以并没有考虑设计的合理性. ...

  8. video.py OpenCv例程阅读

    #!/usr/bin/env python ''' Video capture sample. Sample shows how VideoCapture class can be used to a ...

  9. web.xml报错:Invalid content was found starting with element 'init-param'

    问题与分析 在web.xml中配置servlet节点时报错如下: cvc-complex-type.2.4.a: Invalid content was found starting with ele ...

  10. Codeforces Round #544 (Div. 3) B.Preparation for International Women's Day

    链接:https://codeforces.com/contest/1133/problem/B 题意: 给n个数,和一个k,在n个数中选几对数,保证没对数相加可以整除k. 求最大能选几个数. 思路: ...