TEMP表空间未建导致XMLTYPE类型内容读取错误

今天一用户环境说所有数据表中的xmltype类型,通过查询语句看到如下结果:

例如表名ZLMXXXX的表中配置这个字段是SYS.XMLTYPE,可以看到这个字段所有值都是<Value Error>错误信息,而不报错的是因为该字段是‘空’无内容的原因,仔细询问用户该问题出现前是否做了什么操作,得到的回答是该数据库由于硬件变更,进行了迁移,由于数据库本身比较小,且迁移的环境平台完全一样,因此迁移的方式最原始简单的是‘冷备份’恢复,但是迁移过来就发现所有XMLTYPE内容的字段都出现错误,而其他字段都没有问题。

问题排查

一.检查sys.xmltype TYPE是否缺失或者有效

由于所有XMLTYPE字段都无法访问,首先怀疑sys.xmltypeTYPE包是否在迁移的过程中损坏或者失效,如果该TYPE出现问题,肯定会导致所有该TYPE对象无法访问,检查对象状态:

这里我们看到没有问题,如果出现问题,我们可以通过执行catproc.sql脚本进行修复,具体操作如下:

Run catproc.sql andutlrp.sql as SYS.
sqlplus "/ assysdba"
startup upgrade
spool validate.log
@?/rdbms/admin/catproc.sql
@?/rdbms/admin/utlrp
spool off
shutdown immediate
startup

显然我们这里没有问题,不需要进行修复,接下来该怎么办呢?

二.迁移环境检查

由于用户是采用冷备份恢复的方式进行迁移,按道理是最稳妥的迁移方式,如果环境一致,不太会出现问题,那么估计是迁移恢复过程中出现了环境差异,我仔细检测了操作系统、数据库参数等,都没什么重大的发现,在检测数据文件的时候,发现因为安装路径的限制数据文件的路径进行了变更,进行检测v$datafile也没什么问题,在检查v$tempfile视图的时候,发现该视图下无内容,如下:

再次询问用户的迁移过程,告知由于源端和目标端数据文件路径变更,其采用再源端生成控制文件脚本,修改路径后,然后在目标端重建控制文件的方式进行的迁移,这种方法在处理路径不一致的恢复是可行的,没有错,但是核对其创建过程中发现,其忘了临时表空间文件的添加,因为在控制文件trace脚本中,除了创建控制文件本身,后面还有如下这句:

-- Other tempfiles may require adjustment.

ALTER TABLESPACE TEMP ADD TEMPFILE‘D:\APP\ADMINISTRATOR\ORADATA\YDTEST\TEMP01.DBF‘

SIZE176160768  REUSE AUTOEXTEND OFF;

ALTER TABLESPACE ZLTOOLSTMP ADD TEMPFILE‘D:\APP\ADMINISTRATOR\ORADATA\YDTEST\ZLTOOLSTMP‘

SIZE467664896  REUSE AUTOEXTEND OFF;

ALTER TABLESPACE SMITMP ADD TEMPFILE‘D:\APP\ADMINISTRATOR\ORADATA\YDTEST\SMITMP01.DBF‘

SIZE52428800  REUSE AUTOEXTEND OFF;

-- End of tempfile additions.

更改路径后,补充执行这几句语句,再次查询v$tempfile视图,有了结果,如下:

最后我们再回到之前的表,查看XMLTYPE字段已经正常,问题彻底解决,如下:

关键知识点

sys.xmltype:该TYPE可以通过脚本重建,如果一旦失效,会导致所有XMLTYPE内容失效。另外临时表同样影响XMLTYPE对象的使用。

申明:原创,转帖请注明出处

时间: 2024-10-12 18:36:37

TEMP表空间未建导致XMLTYPE类型内容读取错误的相关文章

一个sql导致temp表空间爆掉

Buffer sort引发的血案 今天遇到的一个问题,在线系统上,有两张表,test1大概50G,test2大概200G,需要查询出来test1表中部分记录,并且这些记录不存在test2表中.于是就写了一个sql: select t1.* from test1 t1, test2 t2 where t1.col1 = t2.col1(+) and t1.col2 = t2.col2(+) and t1.col3 = t2.col3(+) and t2.col1 is null; 因为是在线系统,

ora-01652无法通过128(在temp表空间中)扩展temp段

有两种原因:一是临时表空间空间太小,二是不能自动扩展. 分析过程: 既然是temp表空间有问题,那当然就要从temp表空间说起啦.首先要说明的是temp表空间的作用,temp表空间主要是用作需要排序的操作. 1.临时表空间 是用于在进行排序操作(如大型查询,创建索引和联合查询期间存储临时数据)每个用户都有一个临时表空间. 2.对于大型操作频繁,(大型查询,大型分类查询,大型统计分析等),应指定单独的临时表空间,以方便管理. 3.分配用户单独临时表空间,一般是针对 大型产品数据库,OLTP数据库,

解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程

解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程 昨天开发人员跟我说,执行一个sql语句后,大约花了10分钟,好不容易有一个结果,但是报了一个ora-01652错误,查阅了oracle的错误代码说明:意思是指temp表空间无法自动扩展temp段.这种问题一般有两种原因:一是临时表空间空间太小,二是不能自动扩展. 分析过程: 既然是temp表空间有问题,那当然就要从temp表空间说起啦.首先要说明的是temp表空间的作用,temp表空间主要是用作需要排序的操作. 1.

TEMP表空间之Ogg复制进程占用

当日有个变更需求,需要提取数据到压测环境下,在impdp导入过程中发现. . . . imported "RCS"."T_RCS_MER_DAY":"PMAX" 0 KB 0 rowsProcessing object type TABLE_EXPORT/TABLE/COMMENTProcessing object type TABLE_EXPORT/TABLE/INDEX/INDEX一直卡着不动,根据经验应该是该表有索引表空间,应该是索引表空间

Oracle Temp 表空间切换

一.TEMP表空间作用 临时表空间主要用途是在数据库进行排序运算.管理索引.访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理.当 oracle 里需要用到 sort 的时候, PGA 中 sort_area_size 大小不够时,将会把数据放入临时表空间里进行排序,同时如果有异常情况的话,也会被放入临时表空间 , 正常来说,在完成 Select 语句.create index 等一些使用 TEMP 表空间的排序操作后, Oracle 是会自动释放掉临时段的.注意这里的释放,仅仅是

temp表空间的作用

temp表空间的作用: temp表空间主要用途是进行排序运算[如创建索引.order by及group by.distinct.union/intersect/minus/.sort-merge及join.analyze命令].索引[如创建索引.IMP进行数据导入].访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理. 当临时表空间不足时,表现为运算速度异常的慢,并且临时表空间迅速增长到最大空间(扩展的极限),并且一般不会自动清理了. 如果临时表空间没有设置为自动扩展,则临时表空间

ORACLE数据库建表空间、建用户、分配用户表空间,分配用户权限

1.建表空间 create tablespace 表空间名 datafile  'D:\app\Administrator\oradata\orcl\ABC.DBF' size 100M autoextend on next 50M extent management 2.建用户 create  user 用户名  identified by password default tablespace 表空间名 temporary tablespace temp   (默认表空间名) 3.给用户赋予

plsql表空间的建立即相关问题

通过pl/sql登录到Oracle数据库上,然后执行菜单:文件/新建/命令窗口 ,打开一个命令窗口然后在该命令窗口中执行脚本创建和删除表空间 创建表空间create tablespace db_name_datafile 'D:\oracle\product\10.2.0\oradata\orcl\db_name_.dbf' size 200Mautoextend on next 10M maxsize unlimited loggingextent management local autoa

oraclle数据库建表空间和建用户,删除表空间

oracle创建表空间 注意点: 1.如果在PL/SQL 等工具里打开的话,直接修改下面的代码中[斜体加粗部分]执行 2.确保路径存在,比如[D:\oracle\oradata\Oracle9i\]也就是你要保存文件的路径存在 /*分为四步 */ /*第1步:创建临时表空间  */ create temporary tablespace user_temp   tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf'  size 50m autoex