IMP-00058: 遇到 ORACLE 錯誤 1461 和 ORA-01461錯誤

mengzhaoliang發表於2009-12-09

描述:把windows伺服器A的Oracle10g的使用者資料遷移到Linux伺服器B的Oracle10g中,主要用簡單的exp、imp命令匯入。
環境:windows中的Oracle資料庫版本和linus伺服器Oracle資料庫版本一樣 Oracle10.2.0.1.0


在windows伺服器A中匯出該資料時,沒有錯誤。
1、
>exp user/password file=d:\200909dump.dump log=d:\200909log.log

2、
在匯入伺服器B時出現錯誤。主要三個錯誤
2.1 如:
. . 正在匯入表              "CW_CONTRACT_INFO"
IMP-00019: 由於 ORACLE 錯誤 12899 而拒絕行
IMP-00003: 遇到 ORACLE 錯誤 12899
ORA-12899: 列 "RFPM"."CW_CONTRACT_INFO"."CON_NAME" 的值太大 (實際值: 105, 最大值: 100)

主要由於表中的實際資料超出範圍,直接更改伺服器A資料庫中的表結構即可。

2.2
IMP-00017: 由於 ORACLE 錯誤 959, 以下語句失敗:
 "CREATE TABLE "CW_PROJECT_WEEKLY_PROJECT" ("WEEKLY_PRJ_ID" VARCHAR2(32) NOT "
 "NULL ENABLE, "PRJ_ID" VARCHAR2(32), "PRJ_NAME" VARCHAR2(100), "WORK_COMPLET"
 "E" VARCHAR2(4000), "NEXT_WEEK_WORK" VARCHAR2(4000), "PROBLEM" VARCHAR2(2000"
 "), "START_DATE" DATE, "END_DATE" DATE, "USER_NAME" VARCHAR2(1000), "WORK_OF"
 "FICE" VARCHAR2(100), "PERCENT" VARCHAR2(32), "CREATE_DATE" DATE, "MODIFY_DA"
 "TE" DATE, "BSFLAG" VARCHAR2(10), "REMARK" VARCHAR2(255), "CREATOR_ID" VARCH"
 "AR2(32), "STATUS" VARCHAR2(10), "WORK_COMPLETE_NEW" CLOB, "NEXT_WEEK_WORK_N"
 "EW" CLOB, "PROBLEM_NEW" CLOB)  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 25"
 "5 STORAGE(INITIAL 786432 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)"
 " TABLESPACE "RFPM" LOGGING NOCOMPRESS LOB ("WORK_COMPLETE_NEW") STORE AS  ("
 "TABLESPACE "RFPM" ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 10 NOCACHE LO"
 "GGING  STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFA"
 "ULT)) LOB ("NEXT_WEEK_WORK_NEW") STORE AS  (TABLESPACE "RFPM" ENABLE STORAG"
 "E IN ROW CHUNK 8192 PCTVERSION 10 NOCACHE LOGGING  STORAGE(INITIAL 65536 FR"
 "EELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)) LOB ("PROBLEM_NEW") STORE"
 " AS  (TABLESPACE "RFPM" ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 10 NOCA"
 "CHE LOGGING  STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POO"
 "L DEFAULT))"
IMP-00003: 遇到 ORACLE 錯誤 959
ORA-00959: 表空間 'RFPM' 不存在

主要由於表中的LOB欄位需要存放在‘RFPM’表空間中,不能存放在預設空間。
可以把伺服器B中建立一個‘RFPM’表空間,並且使用者有寫的許可權。

2.3
. . 正在匯入表     "CW_PROJECT_WEEKLY_PROJECT"
IMP-00058: 遇到 ORACLE 錯誤 1461
ORA-01461: 僅能繫結要插入 LONG 列的 LONG 值
IMP-00028: 上一個表的部分匯入已回退: 回退 36 行

可能有以下幾種原因:
[1]插入到字串長度大於4000位元組。
[2]插入到表中的記錄的某個欄位資料的實際長度大於2000個位元組(如果是UTF-8,則是1333個位元組);或者是插入的記錄中有兩個或兩個以上長度大於2000位元組的字串。
[3]資料庫與客戶端的JDBC驅動不匹配。
[4]伺服器A和伺服器B字符集不同等等。

我這遇到的問題屬於第二種。檢視了CW_PROJECT_WEEKLY_PROJECT表中的欄位沒有long型別的。只有三個是CLOB型別的。
但這和CLOB型別沒有關係。

>select * from nls_database_parameters
伺服器A中的字符集為:NLS_CHARACTERSET:ZHS16GBK
伺服器B中的字符集為:NLS_CHARACTERSET:AL32UTF8

其中看到有兩個欄位為varchar2(4000),在伺服器A中和伺服器B中存放的漢字是不一樣的。
檢視了最大的中文個數:
select length(max(t.work_complete)),length(max(t.next_week_work)) from cw_project_weekly_project t
看到work_complete欄位有768個漢字,在伺服器A中存放1536個位元組,varchar2(4000)可以存放2000個漢字沒有問題。

但在伺服器B中的字符集為AL32UTF8,只能是1333個位元組,即不能超過666個漢字。

可以找出超過最大範圍的資料,然後進行修改小於666個漢字。匯出,再匯入即可。


或者:
如果這兩個欄位中的資料量不大,可以先匯出這兩個欄位為null的所有資料,然後再匯出不為null的資料。
如:
exp  tables=(CW_PROJECT_WEEKLY_PROJECT) query='where work_complete is null and next_week_work is null'  file=d:\20091209tab1.dump log=d:\20091209exptab.log

匯入上面的資料正常:
如:
imp    tables=(CW_PROJECT_WEEKLY_PROJECT)  file=d:\20091209tab1.dump log=d:\20091209imptab.log

可以用plsql 7.0版本以上工具,把不為空的資料匯出成指令碼,然後在匯入伺服器B資料庫中。不符合條件的資料自然就不能匯入資料庫了。
(注意:這個匯入的指令碼不能把LOB型別的資料匯入資料庫中)
如:
>select * from CW_PROJECT_WEEKLY_PROJECT where work_complete is null and next_week_work is null

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12778571/viewspace-622062/,如需轉載,請註明出處,否則將追究法律責任。

相關文章