将windows下的10g数据库转移到11g下的数据库时遇到如下问题

来源:互联网 发布:网络支付 编辑:程序博客网 时间:2024/06/11 04:07

windows下的数据库字符集是AMERICAN_AMERICA.ZHS16GBK,linux下的字符集是AMERICAN_AMERICA.AL32UTF8

(1). 10数据库下的表结构导入到11下,发现数据的长度增加了,超过最大字段长度,导致插入失败。而且还有好多张表的字段都是这个问题。

报错内容

IMP-00019: row rejected due to ORACLE error 12899
IMP-00003: ORACLE error 12899 encountered
ORA-12899: value too large for column "NINGBO"."MENU"."NAME" (actual: 65, maximum: 63)

解决办法:

1. 先导入数据的表结构,rows=n参数表示不导入行数据,#imp username/passwd@netServicename tables=(tb1,tb2) file=/opt/xx.dmp rows=n

2. 修改varchar2字段类的长度,该示例将所有varchar2(63)类型的列改成了varchar(127)。

查询所有varchar2类型,长度为63的类名,并通过连接符"||"拼接出修改长度的语句。实现语句:select 'alter table '||t.table_name ||' modify('||t.column_name|| ' varchar2(127));' from user_tab_columns t where t.DATA_TYPE='VARCHAR2' and t.DATA_LENGTH=63;

将查询结构以csv文件类型导出到桌面,然后用txt编辑,删除第一行,将所有引号替换为空。将语句全部拷贝到pl/sql的sql语句窗口下执行即可。

(2) 如果插入的表数据行数太多,使用默认的缓冲区会导致缓冲区满了,结果数据回退插入失败。

错误内容:

IMP-00098: INTERNAL ERROR: impgst2
IMP-00028: partial import of previous table rolled back: 6539492 rows rolled back
IMP-00032: SQL statement exceeded buffer length
解决办法: 根据实际情况通过imp的buffer参数增加缓冲区的内存,buffer的单位是byte,下面语句指定的buffer是200M。

导入语句代码:impusername/passwd@netServicename fromuser=expuser touser=impuser file=/home/XXX.dmp IGNORE=Y buffer=204800000 log=/home/oracle/193.log

(3) 小心拿到的dump文件本身就有块损坏问题,折腾了我不少时间。由于错误日志删掉了,没法贴出错误代码。

错误描述:数据导入到一半以后,到了某一张表后,提示无法识别dump文件语句内容,然后出现大量乱码,kill掉imp进程后,控制台的命令符都是乱码。

解决办法: 重新导出原来数据库的数据。

(4) 数据导入时是根据表字母的顺序导入的,如果一张表的表结构中有外键,那么数据将无法导入。

解决办法1: 先到如主表,再导入其他表,在imp中添加tables=(tb1,tb2,tb3)。如果不知道那些是主表,可以采用先取消约束的办法,在imp中添加constraints=N

我才用的解决办法:先导入表表结构,然后通过sql语句忽略掉所有约束。数据导入后别忘记开启约束。

禁止约束语句: select 'alter table '||t.table_name||' disable constraint '||t.constraint_name||' cascade;' from USER_CONSTRAINTS t;

启动约束命令: select 'alter table '||t.table_name||' enable constraint '||t.constraint_name||' ;' from USER_CONSTRAINTS t;

用法和修改列的类型长度一样。如果查询出来的有些约束的是已经被删掉的约束,带BIN开头的,忽略错误就行了,或者从文件中删掉该行语句。

注意: 导入数据时,imp语句中加IGNORE=Y参数,表示如果表结构已经存在,忽略创建,进行插入数据。

经验总结:

数据导入前

1. 先修改用户的环境变量: .bash_profile文件下添加 export NLS_LANG=AMERICAN_XXXX.XXX和export LNAG=en_US。省得出现提示信息中文乱码问题,要看英文提示,迟早要学会的。

2. 数据库不要开启归档模式,不然插入错误会把日志空间分分钟给你写满,让你的数据库连接工具等连不上数据库。

3. 数据导入时,dump文件的字符集是ZHS16GBK,数据库服务端和客户端都是AL32UTF8。导入数据会进行转化,不会有乱码

import done in AL32UTF8 character set and AL16UTF16 NCHAR character set
export client uses ZHS16GBK character set (possible charset conversion


0 0
原创粉丝点击