понедельник, 20 июля 2009 г.

Скорая помощь при разрушении DBMS_REGISTRY

Год назад собирался написать эту статью, пока еще было актуальным. ;)

В действительности, с учетом некоторой неторопливости - я бы даже сказал - тормознутости айтишников, актуальность статья не должна потерять еще достаточно долго.

Итак, приступим.

В двух словах - суть проблемы. В Oracle 10 R2, при установке патчсета 10.2.0.4, в случае, если вся БД переведена в native compilation (PL/SQL), при выполнении catupgrd.sql иногда (в действительности достаточно часто) вылетает ошибка, связанная с отсутствием package body пакета DBMS_REGISTRY, после чего обновить метаданные становится невозможно. И апгрейд БД заходит в тупик.

Ошибка, в общем-то, не вполне тривиальная.

Тем более, что иногда нервные DBA выполняют даунгрейд и/или брутальную переустановку софта/пересоздание БД. ;) (чего в действительности делать не нужно)

Чтобы избежать таких неприятностей, по-хорошему перед установкой патчсета необходимо сначала вернуть БД в состояние interpreted PL/SQL скриптом dbmsupgin.sql. Одно но: эта процедура выполняется последовательно (рекомпиляция utlrp), идет достаточно долго и БД стартована в состоянии UPGRADE/RESTRICTED SESSION. На продуктивных серверах даунтайм получается достаточно большим и на это могут пойти не все. Тем более, что после апгрейда ПО и словаря потом надо все равно перекомпилировать весь PL/SQL-код обратно в native.

Что делать, если вы погорячились и уже попали в засаду - софт обновлен, а обновление метаданных ударилось в отсутствие тела пакета DBMS_REGISTRY?

Во-первых, не надо паники. Ничего переустанавливать не нужно.

Прямо не сходя с места и не перезапуская экземпляр, нужно всего лишь соединиться как SYSDBA и выполнить скрипт prvtcr.plb из $ORACLE_HOME/rdbms/admin:

oracle @ athena ~ $ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Mon Jul 20 16:58:32 2009

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining
and Real Application Testing options

SQL> @$ORACLE_HOME/rdbms/admin/prvtcr.plb
(пустые строки в выводе удалены)
Package created.
No errors.
Package created.
No errors.
Package body created.
No errors.
Synonym created.
Package body created.
No errors.
Package body created.
No errors.
1 row deleted.
1 row created.
Commit complete.
Context created.
PL/SQL procedure successfully completed.
View created.
Synonym created.
Grant succeeded.
View created.
Synonym created.
Grant succeeded.
View created.
Synonym created.
Grant succeeded.
View created.
Synonym created.
Grant succeeded.
View created.
Synonym created.
Grant succeeded.
View created.
Synonym created.
Grant succeeded.
View created.
Synonym created.
Grant succeeded.
View created.
Synonym created.
Grant succeeded.

После чего, не сходя с места, можно спокойно выполнять catupgrd.sql, завершая обновление, причем изменения режима компиляции PL/SQL выполнять не нужно.

PS. Следует учесть лишь тот факт, что прогон словарных скриптов при обновлении, в случае, когда вся БД находится в режиме native compilation, все же потребует несколько большего времени, чем в режиме interpreted.