Oracle-expdp报错ORA-08103: object no longer exists

2023-10-24 09:04

本文主要是介绍Oracle-expdp报错ORA-08103: object no longer exists,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题:

        用户的expdp备份任务,不定期出现执行报错的情况,报错ORA-08103: object no longer exists

Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_BODY
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
ORA-39126: Worker unexpected fatal error in KUPW$WORKER.FETCH_XML_OBJECTS [REF_CONSTRAINT:"OWNER"."FK_TABLENAME"] 
ORA-08103: object no longer exists
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.KUPW$WORKER", line 9715
----- PL/SQL Call Stack -----object      line  objecthandle    number  name
0x103697dc58     21979  package body SYS.KUPW$WORKER
0x103697dc58      9742  package body SYS.KUPW$WORKER
0x103697dc58     11838  package body SYS.KUPW$WORKER
0x103697dc58      2808  package body SYS.KUPW$WORKER
0x103697dc58     10422  package body SYS.KUPW$WORKER
0x103697dc58      1824  package body SYS.KUPW$WORKER
0x1027151600         2  anonymous block
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT

问题分析:

        expdp导出期间发生ORA-08103: object no longer exists的错误,通常原因为导出任务操作的对象发生了DDL操作,引发object_data_id发生了改变,导致操作的对象object_data_id不一致,出现找不到对象的情况,按照这个思路对问题开始进行分析

        首先,每次报错日志显示的对象都是在外键约束对象REF_CONSTRAINT:"OWNER"."FK_TABLENAME",所以检查这个外键约束的最近一次DDL时间以及约束所在表的最近一次DDL时间,都在2018年6月,不在报错发生的时间点

​​SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
1 select constraint_name,constraint_type,status,table_name,owner,LAST_CHANGE
2 from dba_constraints
3 where constraint_name='FK_TABLENAME';
​
​
CONSTRAINT_NAME                CON STATUS                   TABLE_NAME                     OWNER                          LAST_CHANGE
------------------------------ --- ------------------------ ------------------------------ ------------------------------ -------------------
FK_TABLENAME                R   ENABLED                      TABLENAME                     OWNER                    2018-06-21 16:32:26
​
​
SQL> 1  select owner,object_name,CREATED,last_ddl_time2  from dba_objects3* where object_name='TABLENAME'
​
OWNER                                    OBJECT_NAME                    CREATED             LAST_DDL_TIME
---------------------------------------- ------------------------------ ------------------- -------------------
OWNER                                    TABLENAME                   2018-06-21 16:11:00 2018-06-25 14:40:29
​
SQL>

        由于报错的日志无法确认具体是哪个对象导致的,所以我们需要通过开启errorstack 定位到具体8103错误的操作语句对象

--使用sys用户在导出备份开始之前设置事件对ORA-8103发生错误时,dump出报错详细信息
alter system set events '8103 trace name errorstack level 3';
--报错结束之后,关闭8103事件
alter system set events '8103 trace name errorstack off';

        通过开启errorstack,在expdp再次发生报错时我们定位到了错误发生时的sql语句,从trace里面的执行sql语句里面我们提取了可能触发报错的表backupuser.backup_table_tmp

*** 2023-10-12 21:06:16.594
dbkedDefDump(): Starting a non-incident diagnostic dump (flags=0x0, level=3, mask=0x0)
----- Error Stack Dump -----
ORA-08103: object no longer exists
----- Current SQL Statement for this session (sql_id=2qw01kxr5vgh0) -----
SELECT /*+rule*/ SYS_XMLGEN(VALUE(KU$), XMLFORMAT.createFormat2('T_STAT_T', '7')), 0 ,KU$.BASE_OBJ.NAME ,KU$.BASE_OBJ.OWNER_NAME ,KU$.BASE_OBJ.TYPE_NAME ,'TABLE_STATISTICS' 
FROM SYS.KU$_TAB_STATS_VIEW KU$ 
WHERE NOT BITAND(KU$.BASE_OBJ.FLAGS,128)!=0 AND   KU$.OBJ_NUM IN (SELECT * FROM TABLE(DBMS_METADATA.FETCH_OBJNUMS(200001))) 
AND  NOT (KU$.BASE_OBJ.NAME  IN(select distinct segment_name from  backupuser.BACKUP_TABLE_TMP))
----- PL/SQL Stack -----
----- PL/SQL Call Stack -----object      line  objecthandle    number  name
0x1044c4e078      3665  package body SYS.DBMS_METADATA
0x1044c4e078      4269  package body SYS.DBMS_METADATA
0x1044c4e078      4581  package body SYS.DBMS_METADATA
0x1044c4e078      8160  package body SYS.DBMS_METADATA
0x103697dc58     11566  package body SYS.KUPW$WORKER
0x103697dc58      2808  package body SYS.KUPW$WORKER
0x103697dc58     10422  package body SYS.KUPW$WORKER
0x103697dc58      1824  package body SYS.KUPW$WORKER
0x1027151600         2  anonymous blockobject      line  object

        通过logmnr对报错时间点归档日志进行挖掘,确认表是否发生了DDL操作

--查询问题时间点涉及的归档日志1  select name,FIRST_TIME,NEXT_TIME2  from v$archived_log3  where FIRST_TIME between to_date('2023-10-12 21:00:00','yyyy-mm-dd hh24::mi:ss') and to_date('2023-10-12 21:10:00','yyyy-mm-dd hh24:mi:ss')4* order by 3
​
NAME                                                                                                 FIRST_TIME          NEXT_TIME
---------------------------------------------------------------------------------------------------- ------------------- -------------------
+DATA2/xxdb/archivelog/2023_10_12/thread_2_seq_1173870.1779.1150059883                               2023-10-12 21:01:45 2023-10-12 21:04:42
+DATA2/xxdb/archivelog/2023_10_12/thread_1_seq_1051584.3520.1150059963                               2023-10-12 21:02:39 2023-10-12 21:06:03
+DATA2/xxdb/archivelog/2023_10_12/thread_2_seq_1173871.1649.1150060057                               2023-10-12 21:04:42 2023-10-12 21:07:37
+DATA2/xxdb/archivelog/2023_10_12/thread_1_seq_1051585.1715.1150060161                               2023-10-12 21:06:03 2023-10-12 21:09:21
+DATA2/xxdb/archivelog/2023_10_12/thread_2_seq_1173872.654.1150060229                                2023-10-12 21:07:37 2023-10-12 21:10:28
+DATA2/xxdb/archivelog/2023_10_12/thread_1_seq_1051586.1560.1150060361                               2023-10-12 21:09:21 2023-10-12 21:12:40
​
--进行logmnr挖掘
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( LOGFILENAME => '+DATA2/xxdb/archivelog/2023_10_12/thread_2_seq_1173870.1779.1150059883', OPTIONS => DBMS_LOGMNR.NEW);
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( LOGFILENAME => '+DATA2/xxdb/archivelog/2023_10_12/thread_1_seq_1051584.3520.1150059963', OPTIONS => DBMS_LOGMNR.ADDFILE);
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

        在日志里面,发现了backupuser.backup_table_tmp在问题时间点确实发生了DDL:truncate table BACKUP_TABLE_TMP的操作

alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SQL> SELECT TIMESTAMP,OPERATION,SQL_REDOFROM V$LOGMNR_CONTENTS WHERE username IN ('backupuser');
TIMESTAMP           OPERATION            SQL_REDO
------------------- -------------------- --------------------------------------------------------------------------------
2023-10-12 21:05:16 DDL                  truncate table BACKUP_TABLE_TMP;
2023-10-12 21:05:16 INSERT               insert into "backupuser"."BACKUP_TABLE_TMP"("OWNER","SEGMENT_NAME","PARTITION_NAME","BYTES") values ('TESTUSER','XXX_PT_LOG','-1','-1');

问题解决:

        跟用户进一步确认表的DDL操作逻辑,用户反馈表是备份作业任务的配置表,在备份开始后会truncate表重新插入要备份的配置信息,根据这个操作流程,想要触发ORA-08103: object no longer exists的错误,需要备份程序在同一时间执行两个expdp备份作业,一查备份的日志果然在问题时间段有两个备份作业在执行

        跟用户沟通,将两个备份作业配置在不同时间段执行,后面expdp报错不再发生,问题得以解决。

这篇关于Oracle-expdp报错ORA-08103: object no longer exists的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/274128

相关文章

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

解决Java异常报错:java.nio.channels.UnresolvedAddressException问题

《解决Java异常报错:java.nio.channels.UnresolvedAddressException问题》:本文主要介绍解决Java异常报错:java.nio.channels.Unr... 目录异常含义可能出现的场景1. 错误的 IP 地址格式2. DNS 解析失败3. 未初始化的地址对象解决

Python报错ModuleNotFoundError的10种解决方案

《Python报错ModuleNotFoundError的10种解决方案》在Python开发中,ModuleNotFoundError是最常见的运行时错误之一,通常由模块路径配置错误、依赖缺失或命名冲... 目录一、常见错误场景与原因分析二、10种解决方案与代码示例1. 检查并安装缺失模块2. 动态添加模块

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

《idea报错java:非法字符:‘ufeff‘的解决步骤以及说明》:本文主要介绍idea报错java:非法字符:ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现uf... 目录BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题?最

解决Maven项目报错:failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题

《解决Maven项目报错:failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题》这篇文章主要介... 目录Maven项目报错:failed to execute goal org.apache.maven.pl

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL