Oracle逻辑导出时出现EXP ORA-01455故障排查
Oracle逻辑导出时出现EXP ORA-01455故障排查
[color=#4169e1]一、Exp导出日志报错
. . 正在导出表 tmp_T_SHEET
导出了 0 行
. 正在导出同义词
. 正在导出视图
. 正在导出存储过程
. 正在导出运算符
. 正在导出引用完整性约束条件
. 正在导出触发器
. 正在导出索引类型
. 正在导出位图, 功能性索引和可扩展索引
. 正在导出后期表活动
. 正在导出实体化视图
. 正在导出快照日志
EXP-00008: 遇到 ORACLE 错误 1455
ORA-01455: 转换列溢出整数数据类型
EXP-00000: 导出终止失败
解决问题方法如下:
1.1 版本问题
客户端和服务器采用的是不相同的版本,所以要一致。
1.2 Direct=y
用了这个参数可能导致问题
1.3 statistics参数
ORA-01455: 转换列溢出整数数据类型 ,Export 命令会将表的statistics 值转成成整形。 当这个statistics值超过2^31-1时,就会报这个错误。
最后在exp命令后加 “INDEXES=n STATISTICS=none”这两个参数,exp就可以成功导出了。
最后结果:
按照网上的说法,加上INDEXES=n STATISTICS=none参数,依然报错,显然不是统计信息的原因。
二、Insert报错
除了exp报错外,突然发现有一张表不能够insert。
现象:
INSERT INTO T_MOD_INFO (ID, INFO_SUBJECT) VALUES (seq_mod_info.nextval,'123123');
ORA--00942表或试图不存在
检查:
检查表和索引的状态和权限都对,都是该执行用户下的对象,状态都对。
三、重命名报错
3.1 ORA-26563错误
我试着用create table tab01 as select * from tab;发现新建的tab01表操作完全正常,于是想把原来的表重新命名,然后删除tab表。可是发现该表重命名也报错:ORA-26563: 不允许重命名此表
SQL> alter table tab rename to tab _2;
alter table tab rename to tab _2
*
ERROR 位于第 1 行:
ORA-26563: 不允许重命名此表
3.2 查找原因
如果在重命名表的时候出现ORA-26563: 不允许重命名此表错误,试着将表上的物化视图日志drop就可以了。
四、删除表上的物化视图日志
SQL> DROP MATERIALIZED VIEW log ON tab;
删除表上的物化视图日志后,对表再进行insert操作,一切正常;然后,在运行exp脚本导出数据,也不再报ORA-01455错误。
五、大多数记录数为0的正式表(不是临时表)没有被导出
出现此错误之前,大多数记录数为0的正式表(不是临时表)没有被导出.
查阅资料,得到原因是Oracle11g增加了参数deferred_segment_creation,参数默认值是TRUE,这样,新建的表无记录时,是滞后分配段的,甚至连DDL定义也无法获取,所以EXP无法导出空表.
解决方法:用本用户登录,下面三个语句查看,结果是不是0行记录(通常第一个肯定不是0条)
(1)select 'alter table '||table_name||' allocate extent;'
from user_tables WHERE SEGMENT_CREATED='NO';
(2)select * from user_indexes WHERE SEGMENT_CREATED='NO';
(3)select * from user_lobs where segment_created='NO';
按照第一个语句构造出来的语句(一组alter table TAB_XX allocate extent;语句)执行,之后再查看,三个语句结果都是0行记录了.
之后,进行EXP正常.
注:上述Oracle参数如果设置为FALSE(alter system set deferred_segment_creation=FALSE;),则之后新建的空表会自动分配段,之前建的空表(未经过曾经有数据的环节)仍是没有分配段的,仍然需要上述方法处理一下.