今天一用户环境说所有数据表中的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对象的使用。
申明:原创,转帖请注明出处