我目前正致力于将 Oracle 9i 数据库(* .dmp文件)迁移到 Oracle 11g 。 为此,我使用exp和imp Oracle实用程序命令行:
exp USERID=<user>/<password>@<database> FILE=<path> OWNER=<owner>
然后我创建一个skeleton.sql文件,它将创建表,索引表和最后的索引。
imp <user>/<password>@<database> FILE=<path> INDEXFILE="<path>\skeleton.sql" FROMUSER=<fromuser> TOUSER=<touser>
在此迁移过程中,我能够正确导入大部分数据,当然,从一个数据库到另一个数据库,表空间保持不变,以避免任何冲突。
但问题出现了。在Oracle 11g中,不再支持KOREAN_LEXER,而是必须使用KOREAN_MORPH_LEXER。为此,我执行以下SQL命令:
call ctx_ddl.create_preference('korean_lexer','korean_morph_lexer');
call ctx_ddl.add_sub_lexer('global_lexer','korean','korean_lexer',null);
然后我导入skeleton.sql文件以便在导入之前注入所需的数据:
sqlplus <user>/<password>@<database> @<path>\skeleton.sql
表格和索引表的创建顺利进行,直到我为我创建的150多个索引中的每个索引收到以下错误:
CREATE INDEX "<schema>"."WORKORDER_NDX16" ON "WORKORDER"
ERROR at line 1 :
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-10502: WORKORDER_NDX16 index does not exist
DRG-13201: KOREAN_LEXER is no longer supported
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 366
仍然会创建索引,此消息只是一个警告。 我尝试重建任何破碎的索引:
ALTER index WORKORDER_NDX16 REBUILD;
再次给我以下错误:
SQL Error : ORA-29874: warning in the execution of ODCIINDEXCREATE routine
ORA-29960: ligne 1,
DRG-10595: failure on ALTER INDEX WORKORDER_NDX16
DRG-50857: oracle error in drixmd.PurgeKGL
ORA-20000: Oracle Text error:
DRG-13201: KOREAN_LEXER is no longer supported
ORA-30576: ConText Option dictionary loading error
DRG-50610: internal error: kglpurge []
29874. 00000 - "warning in the execution of ODCIINDEXALTER routine"
*Cause: A waring was returned from the ODCIIndexAlter routine.
*Action: Check to see if the routine has been coded correctly
Check the user defined warning log tables for greater details.
在我的 skeleton.sql 文件中,在创建每个索引的情况下,每种语言都有以下行:
ctxsys.driimp.set_object('LEXER','MULTI_LEXER',12);
...
ctxsys.driimp.set_sub_value('SUB_LEXER','8', NULL, NULL,'KO:KOREAN_LEXER:');
...
到目前为止,我迷失了该做什么,这似乎是一个简单的问题需要解决,但我的dba技能太低而无法自行完成。
如果有人能帮助我,我会非常感激!
谢谢。
答案 0 :(得分:2)
这看起来您的数据库使用的是Oracle Text索引,它与普通索引不同。您是否完全遵循Oracle Note 300172.1(KOREAN_LEXER Lexer Type的过时)?它提到了下面的代码,这可能有所帮助。
ALTER INDEX <[schema.]index> REBUILD
PARAMETERS('REPLACE LEXER ko_morph_lexer [MEMORY <size>]');
如果所有其他方法都失败了,可以考虑尝试将数据迁移到Oracle 10g数据库并在10g中完成korean_morph_lexer
。如果可行,那么将数据泵从10g移动到11g(或12c)将是一项简单的数据泵任务。