这两天在用oracle 的 exp/imp工具时遇到了一些问题,困扰了我很长时间,现在终于解决了,特此记录下来。
源服务器: oracle 9.2.0.6.0
目标服务器: oracle 9.2.0.1.0
问题一:EXP-00003: 未找到段 (****) 的存储定义
原因: 客户端和服务器版本不一致
解决办法:
1. 升级客户端
2.改视图,这一段是网上找到的
当使用9205以前版本的exp程序去9205及以上的数据库中去导出带LOB字段的表时, 会遇到一个错误, 错误信息为"EXP-00003 : 没找到段的存贮定义 .....", 事实上这是一个Oracle的Bug, 可以通过监时地更改视图"exu9tne"的定义来临时解决问题, 如下所示:
在导出前, 连接到SYS用户, 运行以下SQL:
CREATE OR REPLACE VIEW exu9tne (
tsno, fileno, blockno, length) AS
SELECT ts#, segfile#, segblock#, length
FROM sys.uet$
WHERE ext# = 1
UNION ALL
SELECT * FROM SYS.EXU9TNEB
/
导出完成后, 运行以下命令来还原视图的定义, 下面贴的是Oracle 9用的, 10g的还是请访问Metalink来确定, 或者在运行前一个命令之前, 从USER_VIEWS中将原视图的定义查出来, 这样做也是DBA一个很好的习惯.
CREATE OR REPLACE VIEW exu9tne (
tsno, fileno, blockno, length) AS
SELECT ts#, segfile#, segblock#, length
FROM sys.uet$
WHERE ext# = 1
3. 如果表中没有BLOB字段,有时也会出现这个错误,设定参数compress=y可以解决,不需要改视图。
问题二:imp 时停止,无反映
原因: 存储过程写的有问题
解决:
这个问题困扰我最长的时间,一共16M的数据,导入时在表导完后就停止不动了,只能重启服务器进程。在网上找了好多帖子,基本上都是说增大回退段,增加表空间,设置自动归档等等,但我的数据才这么点,根本就不是这个原因,更令人奇怪的是,另一个schema下的200多M数据却很顺利的导进了。
后来在重启服务的时间,注意到dos窗口中显示一个package编译未完成,就想是不是包的问题。将此包从源服务器上删掉后,重新导出,再导入时果然可以了。那就查这个包吧,最后查不查去,问题竟出在一个 select语句上,select "ss" || count(*) into v_a from aa ; 就是这个语句,在源服务器上编译时完全正常,但到本地服务器上编译会导致死锁。在count(*)前加上to_char()就好了,不知道这是什么原因。可能是版本问题吧,