Последнее время пришлось делать множество операций экспорта и импорта между различными базами версий 10g и 11g, используя как оригинальный экспорт (Original Export) (expimp) так и datapump экспорт (DataPump Export) (expdpimpdp). Столкнулся со множеством проблем.
Основная мысль
Original Export окончательно отомрет. Об этом конкретно написано в статье — Feature Obsolescence — Original Export 10.2 [ID 345187.1]. Исправление багов закончилось еще 31.07.2010. Расширенная поддержка закончится через год 31.07.2013. И всё, дальше только движение по инерции. Поэтому, лучше переходить на DataPump Export. Особенно если вы используете 11g. Original Export есть смысл использовать только в двух случаях: 1) Когда нужно импортировать файл сделанный Original Export, когда-то давно. 2) Если возникает проблема которая решена в Original Export но не решена в DataPump Export, например с chr(0) (см.ниже).
Что почитать
Пара статей, с которыми полезно ознакомиться
Master Note for Data Pump [ID 1264715.1] и Master Note for Export and Import [ID 1264691.1].
Проблемы с которыми я сам непосредственно столкнулся
Original Export
- ORA-01400 cannot insert NULL into IMP-00019 IMP-00003
- ORA-01406 fetched column value was truncated
- ORA-01455 converting column overflows integer datatype
Datapump Export
- Проблема chr(0). ORA-39126 ORA-06502 LPX-00216 ORA-06512
- ORA-31633: unable to create master table ORA-31626 job does not exist ORA-00955
- ORA-39065 unexpected master process exception in DISPATCH
1. Проблема chr(0). ORA-39126 ORA-06502 LPX-00216 ORA-06512
Для DataPump Export. При импорте (impdp) возникает ошибка, у меня она выглядела так:
Processing object type SCHEMA_EXPORT/TABLE/TABLE
ORA-39126: Worker unexpected fatal error in KUPW$WORKER.PUT_DDLS [TABLE:"UDB_BUF"."CMP_DETAILS"]
ORA-06502: PL/SQL: numeric or value error
LPX-00216: invalid character 0 (0x0)
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.KUPW$WORKER", line 9001
----- PL/SQL Call Stack -----
object line object
handle number name
0x2146dcf18 20462 package body SYS.KUPW$WORKER
0x2146dcf18 9028 package body SYS.KUPW$WORKER
0x2146dcf18 16665 package body SYS.KUPW$WORKER
0x2146dcf18 3956 package body SYS.KUPW$WORKER
0x2146dcf18 9725 package body SYS.KUPW$WORKER
0x2146dcf18 1775 package body SYS.KUPW$WORKER
0x2146e8f38 2 anonymous block
ORA-39126: Worker unexpected fatal error in KUPW$WORKER.PUT_DDLS [TABLE:"UDB_BUF"."CMP_DETAILS"]
ORA-06502: PL/SQL: numeric or value error
LPX-00216: invalid character 0 (0x0)
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.KUPW$WORKER", line 9001
----- PL/SQL Call Stack -----
object line object
handle number name
0x2146dcf18 20462 package body SYS.KUPW$WORKER
0x2146dcf18 9028 package body SYS.KUPW$WORKER
0x2146dcf18 16665 package body SYS.KUPW$WORKER
0x2146dcf18 3956 package body SYS.KUPW$WORKER
0x2146dcf18 9725 package body SYS.KUPW$WORKER
0x2146dcf18 1775 package body SYS.KUPW$WORKER
0x2146e8f38 2 anonymous block
Job "REG_RT"."IMP_TO_UDB_BUF" stopped due to fatal error at 11:09:35
Причина возникновения ошибки:
В коде процедур или пакетов или в определениях объектов используется оператор chr(0). В данном, конкретном случае, это функциональный индекс
CREATE INDEX cmp_det_intersect_search_i
ON cmp_details (UPPER (store_no), NVL (lvl1_num, CHR (0)), NVL (lvl2_num, CHR (0)), NVL (lvl3_num, CHR (0)))
TABLESPACE index_tbsp;
В Original Export эту проблему устранили, а в DataPump Export нет (например, Bug 3591564 : ORA-1756 IMPORTING FUNCTIONAL INDEX).
Способы решения:
1). Использовать Original Export.
2). Перед экспортом удалить объекты которые содержат chr(0), а после импорта создать их вручную.
3). (может не помочь). При импорте исключить объекты которые содержать chr(0).
4). Изменить приложение — отказаться от использования chr(0).
2. ORA-01400 cannot insert NULL into IMP-00019 IMP-00003
Для Original Export. При импорте (imp) возникает ошибка (см.ниже) при этом столбец ROW_MODE на самом деле вообще не содержит NULL значений.
IMP-00019: row rejected due to ORACLE error 1400
IMP-00003: ORACLE error 1400 encountered
ORA-01400: cannot insert NULL into ("UDB_BUF"."ADR_ADDRESS_VOC"."ROW_MODE")
Column : 1000375427
Column : 60
Column : кв.6
Column : 45000000000
Column :
Column :
Column :
Column : 1000375327
Column :
Column : Н
Column : 27
Column : 10-AUG-1999:10:11:56
Column : 27
Column : 23-AUG-1999:17:42:54
Column : 27
Column : Н
Column :
Column : 601
Column : 6
Column : 1
Column : 10-AUG-1999:10:11:56
Column :
Column : 46000000001
Column :
Причина возникновения ошибки:
В 11g1R1 ввели новый тип столбца, который не сохраняет default значения столбца в блоке данный. При получении пустых данных, NULL значения такого столбца, заменяются теми которые определены по умолчанию. Но это не работает с DIRECT=Y. Подробнее — ORA-1400 During Import of Export Dump Written in Direct Path Mode [ID 826746.1]
Способы решения:
1). Использовать DataPump Export экспорт.
2). Использовать Original Export с DIRECT=N.
3. ORA-31633: unable to create master table ORA-31626 job does not exist ORA-00955
Для DataPump Export. При импорте (impdp) возникает ошибка
ORA-31626: job does not exist
ORA-31633: unable to create master table "REG_RT.IMP_TO_UDB_BUF"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.KUPV$FT", line 863
ORA-00955: name is already used by an existing object
Причина возникновения ошибки:
Обычно такая ошибка возникает когда процесс импорта прерывают, а затем запускают новый процесс импорта, при этом имя job такое же (параметр JOB_NAME). Подробнее здесь — DataPump Export or Import Fails With ORA-31633 ORA-6512 ORA-955 [ID 556425.1].
Способы решения:
Обычно достаточно просто удалить таблицу которая указана в сообщении об ошибке REG_RT.IMP_TO_UDB_BUF. Хотя в статье советуется сначала убедиться что job не работает.
4. ORA-01406 fetched column value was truncated
Для Original Export. При экспорте (exp) возникает ошибка
EXP-00008: ORACLE error 1406 encountered
ORA-01406: fetched column value was truncated
EXP-00000: Export terminated unsuccessfully
Причина возникновения ошибки:
Обычно эта ошибка возникает если делать FULL экспорт из 11 версии сервера (сервер), версией exp которая меньше чем 11 (клиент). Подробнее — Full Export Fails With Error ORA-1406 When Exporting 11g Database [ID 553993.1].
Способы решения:
В статье предлагают какие-то не совсем мне понятные способы:
1). Изменить character set БД на AL32UTF8 (это может быть совсем не просто).
2). Применить patch 6804150 (я его не нашел, но он вроде входит в состав patch set 10.2.0.5. Куда его устанавливать, на сервер или на клиента?)
3). Установить patch set 10.2.0.5 (только для 10g? Куда, сервер или клиент?)
Мои способы:
1) Попробовать сделать экспорт только конкретной схемы. Т.е. вместо FULL=Y — OWNER=XXX.
2) Использовать DataPump Export.
5. ORA-01455 converting column overflows integer datatype
Для Original Export. При экспорте (exp) возникает ошибка
EXP-00008: ORACLE error 1406 encountered
ORA-01455: converting column overflows integer datatype
EXP-00000: Export terminated unsuccessfully
Причина возникновения ошибки:
Обычно эта ошибка возникает если делать экспорт из 11.2 версии сервера (сервер), версией exp которая меньше чем 11.2 (клиент). Подробнее — EXP: ORA-1455 is raised when exporting from an 11.2 database using a 9i,10g or 11gR1 exp utility [ID 1381690.1]. В 11.2 БД создается с DEFERRED_SEGMENT_CREATION=TRUE по умолчанию, т.е. сегменты для пустых таблиц не создаются. Они создаются при первой вставке данных в таблицу.
Способы решения:
В статье предлагают следующие способы способы:
1). Использовать DataPump Export (expdp).
2). Выделить хотя бы один экстент для пустых таблиц. Т.к. я выгрухаю одну схему, то использую запрос
SELECT 'ALTER TABLE ' || table_name || ' ALLOCATE EXTENT;'
FROM dba_tables
WHERE segment_created = 'NO' AND owner IN ('REG_RT');
с помощью которого получаю набор запросов для выполнения (этот способ мне помог).
3). Почитать 1083330.1. (не читал)
4). Пересоздать БД с DEFERRED_SEGMENT_CREATION=FALSE. (для рабочей базы не приемлемо).
6. ORA-39065 unexpected master process exception in DISPATCH
Для DataPump Export. При экспорте (exp) возникает ошибка
ORA-39006: internal error
ORA-39065: unexpected master process exception in DISPATCH
ORA-01403: no data found
ORA-39097: Data Pump job encountered unexpected error 100
Установил 11.2.0.3 + Patch 10. На 11.2.0.3 Patch 8 таких проблем не было. Т.е. использую CPU который еще никогда не использовал, соответственно уже возникает подозрение на CPU. Хотя проблема скорее всего возникает не из-за самого CPU, а что-то ломается при его установке.
Причина возникновения ошибки:
Причин может быть множество.
Способы решения:
Т.к. причин много, то и способов решения тоже много:
1). Убедиться что таблица DUAL одна (у меня она была одна).
select owner, object_name, object_type from dba_objects where object_name=’DUAL’;
OWNER|OBJECT_NAME|OBJECT_TYPE
SYS|DUAL|TABLE
PUBLIC|DUAL|SYNONYM
2). Увеличить streams_pool_size (по умолчанию = 0, увеличил до 128Мб — не помогло).
3). Увеличить aq_tm_processes (по умолчанию = 1, увеличил до 5 — не помогло).
4). Помогла статья DataPump Export Started Failing After Applying CPU Patch [ID 453796.1]. Метаданные DataPump в таблице METANAMETRANS$ потеряны. Нужно восстановить их (всё выполнять под SYS). Сначала проверить что это так
select count(*) from metanametrans$; (=0)
Пересоздать метаданные
@$ORACLE_HOME/rdbms/admin/catmet2.sql
@$ORACLE_HOME/rdbms/admin/utlrp.sql
Проверить еще раз
select count(*) from metanametrans$; (=3302 для 11.2.0.3 Patch 10)
5). Если это не помогло, можно еще попробовать DataPump Import Or Export (IMPDP/EXPDP) Fails With Errors ORA-31626 ORA-31637 [ID 345198.1]