OERR: ORA-1410 "invalid ROWID" Master Note / Troubleshooting, Diagnostic and Solution (文档ID 1410.1)
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。
rowid是在内部生成的,但在内存中已损坏。
从一个损坏的索引中检索到了rowid。如果是这种情况,您可能会看到ORA-1410附带的其他损坏错误。
长时间运行查询访问对象期间对对象的执行DDL操作。例如,如果SQL语句正在访问索引,则重建索引可能会导致ORA-1410。
rowid有效,但数据块或数据文件已损坏(覆盖),因此块地址可能有误。如果是这种情况,您可能会看到ORA-1410附带的其他损坏错误。
rowid有效但指向最近移动的块。这可能是由于在SQL正在进行时截断表的时间而发生的。因此,SQL具有缓存的rowid,但在截断期间删除了该块。如果在SQL语句运行时交换了表分区,则会发生同样的情况。在这种情况下,文件号已更改,SQL语句可以报告ORA-1410。
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:
ORA01410: 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:
ORA01410: 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)的更多相关文章
- 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' ...
- 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 ...
- 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 ...
- 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 ...
- Master Note: Undo 空间使用率高 (Doc ID 1578639.1)
Master Note: High Undo Space Usage (Doc ID 1578639.1) APPLIES TO: Oracle Database Cloud Schema Servi ...
- LR连接oracle时出现:SQLState=28000[Oracle][ODBC][Ora]ORA-01017:invalid username/password;logon denied
出现的现象:
- oracle 错误码查看命令oerr ora及常用错误码总结--不断更新
oracle 错误码查看命令oerr ora及常用错误码总结--不断更新 1.ORA-00907: 缺失右括号 我自己的问题出在 字段的default 和 not null 顺序反了,defalut ...
- 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, " ...
- 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 ...
随机推荐
- 3.bool布尔值int,str的转化,字符串的常用方法,字符串format,is判断(字符串的数字),for循环
1.bool 布尔值 bool 布尔值 -- 用于条件使用 True 真 False 假 True 真 False 假 print(bool(-10)) # 0 是 False 非0的都是True p ...
- Jmeter逻辑控制器操作,附栗子
jmeter中的逻辑控制器确定采样器的执行顺序.右键线程组-->添加-->逻辑控制器. 一.简单控制器 简单控制器对JMeter如何处理添加到其中的采样器没有影响.只是方便我们做分组命名. ...
- 第一篇 .NET高级技术之索引器
基础知识补充 索引 器 没有名字 ,索引器的内部本质 (ILSpy的IL模式下看)类型 this[参数]{get;set;} 可以是只读或者只写(在get或者set前加上private) 字符串是只读 ...
- the little schemer 笔记(9)
第九章 ...and Again, and Again, and, Again, ... 你想来点鱼子酱吗? 那就去找它吧. (looking a lat)是什么,其中a是 caviar, lat是( ...
- UvaLive6441(期望概率dp)
1.涉及负数时同时维护最大和最小,互相转移. 2.考场上最大最小混搭转移WA,赛后发现如果是小的搭小的,大的搭大的就可过,类似这种: db a = (C[i] - W[i]) * dp1[i - ][ ...
- POJ1961(kmp中Next数组的性质)
对于某个位置i,i - Next[i]是循环节长度,i整除(i - Next[i])时是完整的几个循环元. ; int n, kase, Next[maxn]; char ch[maxn]; inli ...
- python_函数嵌套(4)
第1章 名称空间 1.1 定义 1.2 变量运行流程 1.3 临时名称空间 1.4 python三种名称空间 第2章 作用域 2.1 作用域分类 2.2 加载顺序 2.3 取值顺序 函数嵌套 2.4 ...
- EmitMapper系列之一:EmitMapper入门
EmitMapper的总结 EmitMapper简介 前言: 参考官网: http://emitmapper.codeplex.com/ Project Description Powerful cu ...
- AJPFX辨析Java中运算符 ++ 和 += 的区别
我们都知道Java中 ++ 和 +=1 都是把数字增加一后,把值赋给左边,那二者有什么区别呢? i+=1 运行的底层Heap申请一个区域存放i,在数据区域开劈一个区域存放1,2个内存段被数据被送入到 ...
- 从 fn_dbLog 解析操作日志(补充update)
过去经常听到SQL server 日志,可是在提供的界面上看到的Log不是我们想要的,我们想窥探具体的数据操作日志.专业恢复追踪数据库操作日志的软件:ApexSQLLog,偶然发现SQL Server ...