Внешние процедуры на языке С 1353
* Действие: другие сообщения об ошибках (если они есть) подскажут причину выдачи этого сообщения.
После этого сообщения об ошибке должно быть выдано специфическое сообщение об ошибке ОС. Чтобы продемонстрировать эту ошибку, я сделал следующее:
$ cp lobtofile.pc extproc.so
То есть скопировал исходный код поверх .so-файла, что, определенно, должно вызвать проблемы. Теперь при попытке вызвать внешнюю процедуру я получаю:
declare х clob; у number; begin у := lob io.write(x, х); end; at line 1:
ORA-06520: PL/SQL: Error loading external library
ORA-06522: ld.so.l:extprocPLSExtProc:fatal:/export/home/tkyte/src/ lobtofile/extproc.so: unknown file type ORA-06512: at OPS$TKYTE.LOB IO , line 0
ORA-06512: at line 1
Итак, как видите, среди сообщений об ошибках есть сообщение ОС, свидетельствующее о неизвестном типе файла, что и поможет выявить причину возникновения ошибки (в данном случае все просто: при просмотре файла extproc.se оказывается, что он содержит исходный код на языке С).
ORA-06521 PL/SQL: ошибка отображения функции
06521, 00000, PL/SQL: Error mapping function
* Причина: ошибка возникла при попытке динамического сопоставления с указанной функцией в PL/SQL.
* Действие: другие сообщения об ошибках (если они есть) подскажут причину выдачи этого сообщения.
Эта ошибка обычно возникает по одной из следующих причин:
в имени внешней процедуры в оболочке PL/SQL или в коде на языке С сделана ошибка;
разработчик заб1л экспортировать функцию в Windows ( declspec( dllexport)).
Для демонстрации этой ошибки я изменил исходный код в файле lobtofile.pc следующим образом:
tifdef WIN NT dec1spec (dllexport) #endif
int xlobToFile(OCIExtProcContext * ctx,
Я добавил х к имени файла. Теперь при попытке выполнения мы получаем:
declare х clob; у number; begin у := lob io.write(x, x); end;
ERROR at line 1:
ORA-06521: PL/SQL: Error mapping function
ORA-0 6 52 2: ld.so.l: extprocPLSExtProc: fatal: lobToFile: cant find symbol
OPA-06512: at OPS$TKYTE.LOB IO , line 0
ORA-06512: at line 1
Это показывает, что причина ошибки — cant find symbol, т.е. нет соответствия ж-ду именем, указанным в PL/SQL-коде, и именем функции во внешней библиотеке. Либо вкралась опечатка, либо имя функции не экспортировано (в среде Windows).
ORA-06523 превышено максимальное количество аргументов
06523, 00000, Maximum number of arguments exceeded
* Причина: веется ограничение на количество аргументов, которые можно передавать внешней функции.
* Действие: в документации для своей версии сервера и платформы проверьте, как вычисляется максимальное количество
Это сообщение об ошибке можно получить в случае слишком большого списка параметров. Во внешние процедуры обычно можно передавать до 128 параметров (меньше, если передаются числа двойной точности, double, поскольку они занимают 8 байт, а не 4). При получении этого сообщения об ошибке, если действительно необходимо передавать столько параметров, проще всего обойти это ограничение с помощью набора. Например, следующий фрагмент:
2 l input strArray := strArray();
3 l output strArray := strArray();
5 dbms output.put line(Pass strArray) ;
6 for i in 1 .. 1000 loop
7 l input.extend;
8 linput(i) := Element i;
10 demo passing pkg.pass(l input, l output);
11 dbms output.put line(l input.count = l input.count
12 l output.count = l output.count);
13 for i in 1 .. l input.count loop
14 if (l input(i) != l output(i)) then
15 raise program error;
l input.count = 1000 l output.count = 1000 PL/SQL procedure successfully completed.
показывает, что с помощью набора я могу передавать внешней процедуре 1СОО строк -во много раз превысив ограничение на количество параметров.
Внешние процедуры на языке С 1355
ORA-06525 неправильная длина для данных типа CHAR или RAW
06525, 00000 , Length Mismatch for CHAR or RAW data
* Причина: значение, указанное в переменной, задающей длину строки,
недопустимо. Эта ошибка может произойти, если в PL/SQL
переменная типа RAW указана в качестве параметра,
передаваемого в режиме INOUT, OUT или в качестве
возвращаемого значения, но соответствующая переменная,
задающая длину, не передана. Эта ошибка может также
возникать при несоответствии заданного в переменной
значения длины фактической длине данных типа orlvstr или
* Действие: исправьте код внешней процедуры и правильно задайте переменную, определяющую длину.
Это сообщение об ошибке, если вы следуете моим принципам передачи и возврата параметров, может произойти только в случае возвращения из функции данных типа и строки. Решение проблемы очень простое: надо правильно задать длину. Для пустого параметра типа RAW, переданного в режиме OUT, необходимо установить длину 0, как делалось в представленных выше примерах. Для непустого параметра типа RAW, переданного в режиме OUT, длина должна быть меньше или равна атрибуту MAXLEN. Аналогично, длина возвращаемой строки тоже должна устанавливаться правильно: меньше чем MAXLEN, но, поскольку память для строки выделяет внешняя процедура, значения MAXLEN она не получает, поэтому атрибут LENGTH должен быть меньше или равен 32760 (максимальное значение, которое может быть обработано в PL/SQL).
ORA-06526 невозможно загрузить библиотеку PL/SQL
06526, 00000, Unable to load PL/SQL library
* Причина: PL/SQL не смог загрузить библиотеку, на которую ссыпается конструкция EXTERNAL. Это серьезная ошибка, которая обычно
* Действие: сообщите о проблеме службе поддержки.
Это внутренняя ошибка. Сообщение о ней выдаваться не должно, но если уж оно получено, возможны два варианта.
Во-первых, это сообщение об ошибке может сопровождаться другим, более деталь-н1м сообщением. Например:
ERROR at line 1: ORA-6526: Unable to load PL/SQL library ORA-4030: out of process memory when trying to allocate 65036 bytes (callheap,KQL tmpbuf)
Второе сообщение самоочевидно: не хватает памяти. Необходимо сократить объем используемой сеансом памяти.
Если же сопровождающее ошибку ORA-6526 сообщение не позволяет понять причину ошибки, обращайтесь в службу поддержки.
Некоторые ошибки и их устранение
SP2-1503/SP2-0152
Windows Server 2003 R2 с установленным на нём Oracle Client 10.2.0.4.
При запуске sqlplus от имени пользователя с администраторскими полномочиями коннект осуществляется без проблем. Но при попытке подключиться к базе от имени пользователя без администраторских полномочий появляется ошибка:
Вызвано это невозможностью создать global object пользователем без администраторских полномочий. Я решил проблему так:
Результат — ошибок нет, пользователь счастлив и может работать.
ORA-28759: сбой при открытии файла
При выполнении обращения из БД (под Windows) к серверу с поддержкой SSL (по HTTPS) появилась ошибка:
Суть проблемы в том, что Oracle Wallet Manager (OWM) при редактировании wallets меняет разрешения на доступ к файлу. В результате файл становится доступным только пользователю, от которого был запущен OWM.
Решение:
Измените разрешения на доступ к файлу так, чтобы пользователь, от которого работает Oracle DB, имел доступ хотя бы на чтение.
ORA-12154: TNS:could not resolve the connect identifier specified
PL/SQL Developer и Windows x64.
sqlplus
При попытке подключиться с помощью sqlplus, используя Easy Connect, тоже можно получить ошибку:
Для решения убедитесь, что » $ORACLE_HOME/network/admin/sqlnet.ora » или вообще не содержит параметра » NAMES.DIRECTORY_PATH «, или данный параметр имеет одним из значений (или единственным значением) » EZCONNECT «:
Ошибка компиляции при установке Oracle Client
Первоначально пробуем выполнить:
Для Ubuntu 14.04 вероятно придётся пересоздать symlink:
и создать новый:
и снова пробуем выполнить:
SQL Developer, Oracle XE и ORA-12705 в Linux
При попытке настроить Jasper Reports Integration столкнулся с этой же ошибкой при настройке соединения Tomcat. Решается путём создания » $CATALINA_BASE/bin/setenv.sh » с добавлением в него следующих параметров запуска Java:
У меня содержимое файла выглядит так:
Проблемы с external job (sjsec 6a)
В какой-то момент стал получать ошибку:
Это происходило в Oracle, установленном на сервер под управлением Windows.
Решение — убедитесь и при необходимости запустите сервис OracleJobScheduler .
Где SID — SID вашего экземпляра БД.
ORA-01075 you are currently logged on
Нашёл решение здесь, но решил у себя продублировать. Итак, если при подключении к БД получаем что-то типа:
нужно выполнить следующие шаги:
SQLDeveloper из Oracle 11g (64 bit) на Windows (64 bit)
При запуске sqldeveloper, который идёт в комплекте с Oracle 11G (11.2.0.4.0, 64bit) и установлен на Windows Server 2008 R2 (64 bit), получаем окно, в котором нас просят указать путь к java.exe. Однако, при указании пути к java, которая идёт вместе с Oracle или же к другой java 64 bit, ничего не происходит, кроме того, что снова появляется это же окно.
Если же пытаемся запустить » %ORACLE_HOME%sqldevelopersqldeveloperbinsqldeveloper «, то при указании пути к java получаем сообщение:
Как ни парадоксально, но это решается установкой java 32-bit и добавлением в файл » %ORACLE_HOME%sqldevelopersqldeveloperbinsqldeveloper.conf » строки, в которой с помощью SetJavaHome задан JAVA_HOME (путь к java), например так:
ORA-00845: MEMORY_TARGET not supported on this system
На Windows я с такой ошибкой пока не встречался, а на linux решение простое:
Где:
size — размер больше или равен объёму выделяемой для всех экземпляров Oracle памяти. В нашем случае он равен 12Gb (size=12g).
должны получить что-то похожее на следующее:
ORA-12034: materialized view log on «SCHEMA».»MVIEW» younger than last refresh
Можно смотреть ноту 204127.1 на Metlink.
В некоторых случаях помогает:
Проблемы при повторной конфигурации Oracle XE.
Один из вариантов повторной конфигурации Oracle XE заключается в удалении » /etc/sysconfig/oracle-xe » (для Red Hat) и выполнении » /etc/init.d/oracle-xe configure «. Однако, если у вас имеется созданное вами табличное пространство в указанном вами файле данных, выполните обязательно бэкап этого табличного пространства. Указанный скрипт выполнит пересоздание DBID для известных ему файлов данных, но не тронет те, что вы создали. Таким образом, после старта системы вы не сможете ни получить доступ к вашим файлам, ни подключить их к БД, т.к. в них прописаны старые DBID. Будьте внимательнее.
ORA-01704: string literal too long
При работе с Oracle через JDBC, столкнулся с проблемой в виде ошибки «ORA-01704: string literal too long». Оказывается, в некоторых случаях (JDBC — один из них) нельзя просто взять и вставить строку длиной больше 4000 символов в поле таблицы. Даже если это поле типа CLOB. Т.е. не прокатывает строка вида:
Пересоздание сессии в удалённой БД (dblink)
Разработчики стали жаловаться, что, при обращении к объекту, размещённому в удалённой БД, через database link, появляется следующая ошибка:
В результате, на требуемом нам сервере будет создана новая сессия. Проблема была решена. Такой вот lifehack.
К сожалению, воспроизвести ситуацию уже невозможно, но, вероятно, могла помочь и следующая последовательность действий:
Certificate of the remote server does not match the target address.
Эта заметка относится к Oracle Database 12.2.
В wallet-файле есть необходимый сертификат, но при обращении к ресурсу получаем ошибку:
» habrahabr.ru » и есть то значение, которое необходимо подставить:
Ещё один широко известный в узких кругах ресурс:
ORA-27369: job of type EXECUTABLE failed with exit code: 274662
Если при выполнении shell-скрипта, вызываемого посредством scheduler job’а с типом «external», вы получаете » ORA-27369: job of type EXECUTABLE failed with exit code: 274662 «, проверьте » $ORACLE_HOME/rdbms/admin/externaljob.ora «. Параметры run_user и run_group должны соответствовать пользователю и группе от чьего имени запущен oracle.
ORA-00392: log 1 of thread 1 is being cleared, operation not allowed
При открытии БД с resetlogs получаем ошибку:
Вероятно, первая команда » alter database open resetlogs » завершилась неудачно и в control-файле redo остались в статусе CLEARING/CLEARING_CURRENT:
Можно попробовать использовать следующие команды:
а затем уже повторить:
На metalink есть документ (Doc ID 1352133.1)
Ora 06512 что за ошибка
Внешние процедуры на языке С 1353
* Действие: другие сообщения об ошибках (если они есть) подскажут причину выдачи этого сообщения.
После этого сообщения об ошибке должно быть выдано специфическое сообщение об ошибке ОС. Чтобы продемонстрировать эту ошибку, я сделал следующее:
$ cp lobtofile.pc extproc.so
То есть скопировал исходный код поверх .so-файла, что, определенно, должно вызвать проблемы. Теперь при попытке вызвать внешнюю процедуру я получаю:
declare х clob; у number; begin у := lob io.write(x, х); end; at line 1:
ORA-06520: PL/SQL: Error loading external library
ORA-06522: ld.so.l:extprocPLSExtProc:fatal:/export/home/tkyte/src/ lobtofile/extproc.so: unknown file type ORA-06512: at OPS$TKYTE.LOB IO , line 0
ORA-06512: at line 1
Итак, как видите, среди сообщений об ошибках есть сообщение ОС, свидетельствующее о неизвестном типе файла, что и поможет выявить причину возникновения ошибки (в данном случае все просто: при просмотре файла extproc.se оказывается, что он содержит исходный код на языке С).
ORA-06521 PL/SQL: ошибка отображения функции
06521, 00000, PL/SQL: Error mapping function
* Причина: ошибка возникла при попытке динамического сопоставления с указанной функцией в PL/SQL.
* Действие: другие сообщения об ошибках (если они есть) подскажут причину выдачи этого сообщения.
Эта ошибка обычно возникает по одной из следующих причин:
в имени внешней процедуры в оболочке PL/SQL или в коде на языке С сделана ошибка;
разработчик заб1л экспортировать функцию в Windows ( declspec( dllexport)).
Для демонстрации этой ошибки я изменил исходный код в файле lobtofile.pc следующим образом:
tifdef WIN NT dec1spec (dllexport) #endif
int xlobToFile(OCIExtProcContext * ctx,
Я добавил х к имени файла. Теперь при попытке выполнения мы получаем:
declare х clob; у number; begin у := lob io.write(x, x); end;
ERROR at line 1:
ORA-06521: PL/SQL: Error mapping function
ORA-0 6 52 2: ld.so.l: extprocPLSExtProc: fatal: lobToFile: cant find symbol
OPA-06512: at OPS$TKYTE.LOB IO , line 0
ORA-06512: at line 1
Это показывает, что причина ошибки — cant find symbol, т.е. нет соответствия ж-ду именем, указанным в PL/SQL-коде, и именем функции во внешней библиотеке. Либо вкралась опечатка, либо имя функции не экспортировано (в среде Windows).
ORA-06523 превышено максимальное количество аргументов
06523, 00000, Maximum number of arguments exceeded
* Причина: веется ограничение на количество аргументов, которые можно передавать внешней функции.
* Действие: в документации для своей версии сервера и платформы проверьте, как вычисляется максимальное количество
Это сообщение об ошибке можно получить в случае слишком большого списка параметров. Во внешние процедуры обычно можно передавать до 128 параметров (меньше, если передаются числа двойной точности, double, поскольку они занимают 8 байт, а не 4). При получении этого сообщения об ошибке, если действительно необходимо передавать столько параметров, проще всего обойти это ограничение с помощью набора. Например, следующий фрагмент:
2 l input strArray := strArray();
3 l output strArray := strArray();
5 dbms output.put line(Pass strArray) ;
6 for i in 1 .. 1000 loop
7 l input.extend;
8 linput(i) := Element i;
10 demo passing pkg.pass(l input, l output);
11 dbms output.put line(l input.count = l input.count
12 l output.count = l output.count);
13 for i in 1 .. l input.count loop
14 if (l input(i) != l output(i)) then
15 raise program error;
l input.count = 1000 l output.count = 1000 PL/SQL procedure successfully completed.
показывает, что с помощью набора я могу передавать внешней процедуре 1СОО строк -во много раз превысив ограничение на количество параметров.
Внешние процедуры на языке С 1355
ORA-06525 неправильная длина для данных типа CHAR или RAW
06525, 00000 , Length Mismatch for CHAR or RAW data
* Причина: значение, указанное в переменной, задающей длину строки,
недопустимо. Эта ошибка может произойти, если в PL/SQL
переменная типа RAW указана в качестве параметра,
передаваемого в режиме INOUT, OUT или в качестве
возвращаемого значения, но соответствующая переменная,
задающая длину, не передана. Эта ошибка может также
возникать при несоответствии заданного в переменной
значения длины фактической длине данных типа orlvstr или
* Действие: исправьте код внешней процедуры и правильно задайте переменную, определяющую длину.
Это сообщение об ошибке, если вы следуете моим принципам передачи и возврата параметров, может произойти только в случае возвращения из функции данных типа и строки. Решение проблемы очень простое: надо правильно задать длину. Для пустого параметра типа RAW, переданного в режиме OUT, необходимо установить длину 0, как делалось в представленных выше примерах. Для непустого параметра типа RAW, переданного в режиме OUT, длина должна быть меньше или равна атрибуту MAXLEN. Аналогично, длина возвращаемой строки тоже должна устанавливаться правильно: меньше чем MAXLEN, но, поскольку память для строки выделяет внешняя процедура, значения MAXLEN она не получает, поэтому атрибут LENGTH должен быть меньше или равен 32760 (максимальное значение, которое может быть обработано в PL/SQL).
ORA-06526 невозможно загрузить библиотеку PL/SQL
06526, 00000, Unable to load PL/SQL library
* Причина: PL/SQL не смог загрузить библиотеку, на которую ссыпается конструкция EXTERNAL. Это серьезная ошибка, которая обычно
* Действие: сообщите о проблеме службе поддержки.
Это внутренняя ошибка. Сообщение о ней выдаваться не должно, но если уж оно получено, возможны два варианта.
Во-первых, это сообщение об ошибке может сопровождаться другим, более деталь-н1м сообщением. Например:
ERROR at line 1: ORA-6526: Unable to load PL/SQL library ORA-4030: out of process memory when trying to allocate 65036 bytes (callheap,KQL tmpbuf)
Второе сообщение самоочевидно: не хватает памяти. Необходимо сократить объем используемой сеансом памяти.
Если же сопровождающее ошибку ORA-6526 сообщение не позволяет понять причину ошибки, обращайтесь в службу поддержки.
Learn the cause and how to resolve the ORA-06512 error message in Oracle.
Description
When you encounter an ORA-06512 error, the following error message will appear:
Cause
This error is caused by the stack being unwound by unhandled exceptions in your PLSQL code.
The options to resolve this Oracle error are:
- Fix the condition that is causing the unhandled error.
- Write an exception handler for this unhandled error.
- Contact your DBA for help.
The ORA-06512 error message indicates the line number of the unhandled error in the PLSQL code. This is quite useful when troubleshooting.
Resolution
Option #1 — Fix the Error Condition
Let’s look at an example of how to resolve an ORA-06512 error by fixing the error condition.
For example, if you created a procedure called TestProc as follows:
This procedure was successfully created. But when we try to execute this procedure, we will get an ORA-06512 error as follows:
The first line of the error message (ie: ORA-06502) indicates the error that occurred, while the second line of the error message (ie: ORA-06512) indicates that the error occurred at line 5 of the PLSQL code.
In this example, you’ve tried to assign a 3 digit number to a variable called v_number that can only handle 2 digits. You could correct this error by redefining the v_number variable as number(3).
And now when we execute our TestProc procedure, the ORA-06512 error has been resolved.
Option #2 — Write an Exception Handler
Let’s look at an example of how to resolve an ORA-06512 error by writing an exception handler.
For example, if you created a procedure called TestProc as follows:
This procedure was successfully created. But when we try to execute this procedure, we will get an ORA-06512 error as follows:
The first line of the error message (ie: ORA-06502) indicates the error that occurred, while the second line of the error message (ie: ORA-06512) indicates that the error occurred at line 5 of the PLSQL code.
In this example, you’ve tried to assign a 3 digit number to a variable called v_number that can only handle 2 digits. You could correct this by writing an exception handler to set the v_number variable to 99 (so that it is only 2 digits) when this error occurs.
And now when we execute our TestProc procedure, the ORA-06512 error has been resolved.
При выполнении ХП иногда появляется такая ошибка:
В коде ничего особенного:
Страно то, что на одних и тех же входных данных ХП иногда работает без ошибок, а иногда выдает эту ошибку. Как вывести дополнительную информацию об ошибке?
1 ответ 1
ORA-06512 это собственно не ошибка а сообщение о трассировке стека ошибки.
Ошибка это ORA-00936 — как правило это связано с тем, что одно из полей принимает значение null там где не положено.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками sql oracle процедуры или задайте свой вопрос.
Похожие
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.11.15.35459
Ora 06512 что за ошибка
Детальный контроль доступа и контексты приложения (Часть 4)
Теперь присоединимся различными пользователями и протестируем функциональность приложения.
Таким образом, результат показывает, что нельзя получить роль, не предназначенную для текущего пользователя. Чтобы убедиться, что ни к каким данным нет доступа, попробуем теперь запросить что-нибудь, и посмотрим, что произойдет:
Появилось сообщение об ошибке. Это сообщение возникло, потому что так написана предикатная функция:
Полученный результат — это результат выполнения raise_application_error в предикатной функции. Конечный пользователь получает сообщение об ошибке ORA-28112. Далее, в следующей секции, мы рассмотрим, как обнаружить эти ошибки и отладить их.
Далее установим такую роль, чтобы можно было что-нибудь сделать, и попробуем выполнить эти же операции:
Итак, результат показывает, что можно видеть только ту запись, которая соответствует текущему пользователю, нельзя изменить какие бы то ни было данные, нельзя удалить записи, и вставка нового служащего также завершается неудачно. Происходит как раз то, что и предполагалось. В самом приложении, HR_APP не делается ничего специально для выполнения этих правил, теперь это делает база данных.
Далее присоединимся как MGR и посмотрим, что произойдет:
Таким образом, теперь нам, как MGR, можно:
И, наконец, присоединимся как контролер и посмотрим на поведение приложения при работе с этой ролью:
На этом завершается тестирование трех ролей рассматриваемого примера. Все требования удовлетворены — безопасность данных обеспечена, и они стали прозрачными для приложения.
Обработка ошибок и отладка
Во время создания вышеописанного приложения я натолкнулся на некоторые ошибки и должен был его отлаживать. Так как детальный контроль доступа работает на сервере, то при обнаружении ошибок и отладке приложения могут возникнуть сложности. Следующий раздел поможет успешной отладке и обнаружению ошибок.
Во время разработки процедур детального контроля доступа могут появиться четыре основных кода ошибок Oracle:
При написании предикатных функций я часто пользуюсь одной утилитой — это пакет ‘debug’. Этот пакет, автором которого является Кристофер Бек (Christopher Beck) из Oracle, позволяет вставить в код предложения команду ‘print’. Кроме того, этот пакет позволяет широко использовать предложения типа:
Таким образом, работа процедуры debug.f похожа на с-функцию printf, а сама она использует пакет UTL_FILE. На сервере базы данных она создает управляемые программистом файлы трассировки. Файлы трассировки содержат отладочные предложения, которые можно использовать для просмотра выполненных действий при выполнении кода. Так как программный код находится в ядре базы данных, отладка может оказаться сложной. Наличие файлов трассировки может сэкономить много времени. Скрипты, которые можно загрузить (см. далее в этом же разделе) содержат отладочный пакет и комментарии по его установке и использованию.
“За” и “Против”
Существует много за эту возможность и совсем немного против. Фактически, сложно вообще найти хотя одно против этой возможности. Как бы то ни было, они перечислены ниже:
Упрощает разработку приложения – переносит управление доступом из приложения на уровень данных.
Отладка может оказаться сложной, так как детальный контроль доступаосуществляется в фоновом режиме. Для этой цели более подходят пакеты типа ‘debug’, о которых идет речь в секции диагностики и отладки.
Гарантирует полную защиту информации базы данных . Независимо от средства доступа к данным, гарантируется, что политика безопасности подключена и не может быть проигнорирована.
Допускает значительные изменения политики безопасности без влияния на клиентские приложения.
Упрощает управление объектами базы данных . Уменьшается общее число объектов базы данных, необходимых для поддержки приложения.
Хорошо работает . Использование контекстов приложения позволяет воспользоваться преимуществами разделяемого SQL.
Для того, чтобы получить все скрипты, используемые в этой статье, загрузите tar-файл. Пожалуйста, непременно прочитайте файл README.TXT, входящий в состав архива. Tar-файл можно открыть под Windows с помощью WinZip версии 6.0 и выше.
Дополнительную информацию Вы можете получить в компании Interface Ltd.
Проблемы exp, imp и datapump expdp, impdp в версиях Oracle 10g и 11g
Последнее время пришлось делать множество операций экспорта и импорта между различными базами версий 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) (см.ниже).
Что почитать
Проблемы с которыми я сам непосредственно столкнулся
Original Export
Datapump Export
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). Выделить хотя бы один экстент для пустых таблиц. Т.к. я выгрухаю одну схему, то использую запрос
с помощью которого получаю набор запросов для выполнения ( этот способ мне помог ).
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 )