2024年10月ora01410无效的rowid(说说Oracle的rowid)

发布时间:

  ⑴ora无效的rowid(说说Oracle的rowid

  ⑵说说Oracle的rowid

  ⑶在Oracle中rowid唯一标识每条记录所在的位置它作为一个伪列在查询中出现

  ⑷selectrowidid

  ⑸fromtest_table

  ⑹whererownum《=;

  ⑺ROWID?????????????????????ID

  ⑻AAAVcbAAPAAAAALAAA

  ⑼AAAVcbAAPAAAAALAAB

  ⑽AAAVcbAAPAAAAALAAC

  ⑾AAAVcbAAPAAAAALAAD

  ⑿AAAVcbAAPAAAAALAAE

  ⒀AAAVcbAAPAAAAALAAF

  ⒁AAAVcbAAPAAAAALAAG

  ⒂AAAVcbAAPAAAAALAAH

  ⒃AAAVcbAAPAAAAALAAI

  ⒄AAAVcbAAPAAAAALAAJ

  ⒅rowid是由个字符组成分个部分分别是

  ⒆个字符的对象编号个字符的文件号个字符的块编号个字符的行编号

  ⒇每一个字符的取值范围以及对应的数值是

  ⒈|A|?|???|a||???|||

  ⒉|B|?|???|b||???|||

  ⒊|C|?|???|c||???|||

  ⒋|D|?|???|d||???|||

  ⒌|E|?|???|e||???|||

  ⒍|F|?|???|f||???|||

  ⒎|G|?|???|g||???|||

  ⒏|H|?|???|h||???|||

  ⒐|I|?|???|i||???|||

  ⒑|J|?|???|j||???|||

  ⒒|K||???|k||???|+||

  ⒓|L||???|l||???|/||

  ⒔|M||???|m||???|?|??|

  ⒕|N||???|n||???|?|??|

  ⒖|O||???|o||???|?|??|

  ⒗|P||???|p||???|?|??|

  ⒘|Q||???|q||???|?|??|

  ⒙|R||???|r||???|?|??|

  ⒚|S||???|s||???|?|??|

  ⒛|T||???|t||???|?|??|

  |U||???|u||???|?|??|

  |V||???|v||???|?|??|

  |W||???|w||???|?|??|

  |X||???|x||???|?|??|

  |Y||???|y||???|?|??|

  |Z||???|z||???|?|??|

  可以看到rowid是一个进制的表示方式利用上述对应表即可计算出

  对象编号AAAVcb?=

  行号AAA~AAJ=~

  进制的转换完全可以交给机器去做Oracle也是这么认为的于是提供了一个叫做dbms_rowid的包它包含了一系列的方法我们借助这个包就可完成上述的工作了

  selectrowid

  substr(rowid)||:||dbms_rowidrowid_object(rowid)??????数据对象编号/object_id

  substr(rowid)||:||dbms_rowidrowid_relative_fno(rowid)文件编号/file_id

  substr(rowid)||:||dbms_rowidrowid_block_number(rowid)块编号/block_id

  substr(rowid)||:||dbms_rowidROWID_ROW_NUMBER(rowid)??行编号/row_num

  fromtest_table

  whererownum《=;

  ROWID?????????????数据对象编号/object_id???文件编号/file_id????块编号/block_id?????行编号/row_num

  AAAVcbAAPAAAAALAAAAAAVcb:???????????AAP:????????????AAAAAL:?????????AAA:

  AAAVcbAAPAAAAALAABAAAVcb:???????????AAP:????????????AAAAAL:?????????AAB:

  AAAVcbAAPAAAAALAACAAAVcb:???????????AAP:????????????AAAAAL:?????????AAC:

  AAAVcbAAPAAAAALAADAAAVcb:???????????AAP:????????????AAAAAL:?????????AAD:

  AAAVcbAAPAAAAALAAEAAAVcb:???????????AAP:????????????AAAAAL:?????????AAE:

  AAAVcbAAPAAAAALAAFAAAVcb:???????????AAP:????????????AAAAAL:?????????AAF:

  AAAVcbAAPAAAAALAAGAAAVcb:???????????AAP:????????????AAAAAL:?????????AAG:

  AAAVcbAAPAAAAALAAHAAAVcb:???????????AAP:????????????AAAAAL:?????????AAH:

  AAAVcbAAPAAAAALAAIAAAVcb:???????????AAP:????????????AAAAAL:?????????AAI:

  AAAVcbAAPAAAAALAAJAAAVcb:???????????AAP:????????????AAAAAL:?????????AAJ:

  这个结果对不对呢?我们可以这样验证注意以下查询需要DBA权限

  首先是object_id

  ownerobject_nameobject_id

  fromdba_objects

  whereobject_name=TEST_TABLE;

  OWNER?????OBJECT_NAME??????????OBJECT_ID

  TEST??????TEST_TABLE

  然后是文件编号和块编号

  ownersegment_namesegment_typeextent_id

  file_idblock_idblocksbytes

  fromdba_extents

  wheresegment_name=TEST_TABLE;

  OWNER?SEGMENT_NAME?SEGMENT_TYPE??EXTENT_ID?FILE_ID?BLOCK_ID?BLOCKS?BYTES

  TEST??TEST_TABLE???TABLE

  TEST??TEST_TABLE???TABLE

  编号为的块落在了编号为的exntent上只能说是验证了一半接下来我们将数据块dump出来看看不过做之前先为这一行打上标记看以下过程

  test$logdwlogdwSQL》selectrowidt*fromtest_tabletwhererownum《=;

  ROWID?????????????????????IDDATA

  AAAVcbAAPAAAAALAAA??????????????????????????????????????Q

  AAAVcbAAPAAAAALAAB??????????????????????????????????????Q

  AAAVcbAAPAAAAALAAC??????????????????????????????????????Q

  AAAVcbAAPAAAAALAAD??????????????????????????????????????Q

  AAAVcbAAPAAAAALAAE??????????????????????????????????????Q

  rowsselected

  test$logdwlogdwSQL》updatetest_tablesetdata=lpad(killkill)whereid=;

  rowupdated

  test$logdwlogdwSQL》selectrowidt*fromtest_tabletwhererownum《=;

  ROWID?????????????????????IDDATA

  AAAVcbAAPAAAAALAAA???????????????????????????????killkill

  AAAVcbAAPAAAAALAAB??????????????????????????????????????Q

  AAAVcbAAPAAAAALAAC??????????????????????????????????????Q

  AAAVcbAAPAAAAALAAD??????????????????????????????????????Q

  AAAVcbAAPAAAAALAAE??????????????????????????????????????Q

  rowsselected

  test$logdwlogdwSQL》mit;

  做好了标记可以dump数据块了

  sys$logdwlogdwSQL》selectget_trace_name()fromdual;

  GET_TRACE_NAME()

  /u/app/oracle/diag/rdbms/logdw/logdw/trace/logdw_ora_trc

  sys$logdwlogdwSQL》altersystemdumpdatafileblock;

  Systemaltered

  打开trc文件摘录如下

  Startdumpdatablockstsn:file#:minblkmaxblk

  DumpofmemoryfromxAFAtoxAFA

  AFFCBCEC

  block_row_dump:

  tabrowxac

  tl:fb:HFLlb:x?:

  lishixinzhi/Article/program/Oracle//

  Oracle数据库SELECT查询老是报ORA-怎么办求大神提点意见

  ORA-invalidrows错误是与ORA-相似的Oracle数据库逻辑层面的讹误。了解ORA-逻辑坏块问题的成因,以及有效的解决手段十分重要。解决方案之一:可以通过如下PL/SQL过程将健康数据复制到新建表中,对于问题数据块中的数据将被跳过,对于能够容忍数据丢失的场景可以考虑这样恢复,之后truncate原表/分区并将健康数据加载进去。具体的脚本见下面的链接:【数据恢复】利用构造ROWID实现无备份情况下绕过ORA-、ORA-、ORA-等逻辑/物理坏块问题oerrora,,“invalidROWID”//*如果对ORA-做errorstack一般会看到下面的LOG:OBJDMISMATCHtyp=,seg.obj=%d,diskobj=%d,dsflg=%d,dsobj=%d,tid=%d,cls=%d触发ORA-错误的stackcall一般都是:kcbgtcr=》kcbzib=》kcbz_check_objd_typ,即在对数据块做逻辑读时运行到kcbz_check_objd_typ函数时,检测到OBJD不一致的问题。由于seg.obj和diskobj不一致,而g以后的kcbz_check_objd_typ函数负责验证块上的objd是否mistmatch,若不一致则触发ORA-错误。造成objdmimatch的主要可能有几种:、写丢失LostWrite,写丢失造成相关数据块没有为现有对象正常格式化,导致虽然该数据块的checksum是正确的,但对应数据字典却是不一致的。写丢失也可能由磁盘或卷组镜像同步软件的不完整复制造成。Iftheon-diskobjdis《kcbdsobj,thenthereispossibilityofOraclemessinguporIOlayer(OSCache,Volumemgretc)missingwrites.对于LostWrite在g版本中没有太好的预防方案,隐藏”_db_lost_write_checking”控制在DBWR写数据文件后立即去读被写的块以便检测出LostWrite,但是该参数对性能的损耗较大,不建议设置。g中引入了DB_LOST_WRITE_PROTECT参数配合DataGuard使用可以有效检测出LostWrite问题。如果自己搞不定可以找ASKMACLEAN专业数据库修复团队成员帮您恢复!

  ORA-:无法使用distinct,groupby等子句从试图中选择rowid或采样

  语句里主查询中用了*号,而*号包含了rowid,而主查询的数据源是子查询,主查询并不存在rowid,因此出现了ORA-错误。解决方法:在子查询中rowid取别名。例:selectrownum,rowidid,......

  同样是invalidROWID,ora-与ora-有何区别

  你使用了oracle的保留字size和rows,不能用来作为列名,把他改成别的吧,比如items_size,items_rows,不然以后调用也很麻烦。,

  执行forupdate时ORA-:无效的ROWID

  我曾经遇到的问题是:用两表联合查询,然后forupdate;结果肯定是生成新的虚拟表、虚拟rowid,所以无法更改。解决办法:只查一个表,用查询条件找到对应字段的值,然后进行更改。

  oracleora-无效的rowid怎么解决

  常见的rowid错误,是指sql引用到的物理地址错误,举个例子:sql查询过程中,表的索引被重建,这时sql查询时用到的索引字段物理地址已经发生了变化,再继续查询时,就会报出rowid错误.

  以下程序为什么会报ORA-:STR绑定值的结尾Null字符缺失

  楼上的果断是Oracle门外汉。Rownum只是一个逻辑字段。这个字段值的设定是这样的:Oracle将取出来的数据的第一条的rownum作为,依次累加。小于等于能查出数据就不难理解。而如果限制条件设成rownum=,那么他永远不满足条件,因为一条数据rownum=,不满足条件去掉,那么第二条的rownum又等于了。所以,rownum总是从开始的,没有和的话,就不可能出现.如果想用=作为限制条件,楼主可以用rowid。rowid可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。建议搜一下rownum和rowid的区别,好好理解下。

  kettle报错无效的ROWID

  kettle报错无效的ROWID,很可能是因为同时执行的转换都操作一个表引起的。其实下面也有其他信息:’转换被检测’、’转换正在杀死其他步骤!’。