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. mui中一级联动

    <!doctype html><html> <head> <meta charset="utf-8"> <title>& ...

  2. robotframework自动化系列:操作mysql数据库

    随着项目自动化深入和不断完善,大部分功能都已经能完成了自动化的操作:但是在设备添加的时候,遇到了难题.添加设备的时候mac必须是服务器设备管理中已经存在的mac地址,且是没有关联或绑定用户的设备信息. ...

  3. Docker部署Tomcat,Nginx,Redis应用

    一.tomcat部署 1.拉取tomcat镜像 docker pull tomcat:7-jre7 2创建tomcat容器 创建容器用于部署单点登录系统(CAS)  -p表示地址映射 docker r ...

  4. 布线问题 最小生成树 prim + kruskal

    1 : 第一种 prime     首先确定一个点 作为已经确定的集合 , 然后以这个点为中心 , 向没有被收录的点 , 找最短距离( 到已经确定的点 ) , 找一个已知长度的最小长度的 边 加到 s ...

  5. Centos 6.8 配置Lvs

    LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一. 宗旨: 使 ...

  6. Java迭代器的用法【转】

    迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的I ...

  7. PoolManager插件(转载)

    http://www.xuanyusong.com/archives/2974 前几天我在博客里面分享了为什么Unity实例化很慢的原因,并且也分享了一个缓存池的工具.有朋友给我留言说PoolMana ...

  8. C#基础学习2

    变量与数据类型!

  9. Log4net系列二:Log4net邮件日志以及授权码

    Log4net邮件发送 上篇文章我们主要介绍Log4net生成文本格式,本篇文章主要配置邮箱发送.关于项目的引用,搭建我们就不在描述,如果不太清楚,请看上篇文章, 老规矩,我们现在配置文件中添加一个a ...

  10. JavaScript——数组的indexOf()方法在IE8中的兼容性问题

    昨天在工作中遇到一个问题:数组的indexOf()方法在IE8中无效. 如以下代码在IE8中报错“对象不支持“indexOf”属性或方法”: var arr = [1,2,3]; var index ...