М��грация NONCDB в PDB
2026-03-10 15:07 Diff

Теги: субд, базы данных, oracle 12c, pdb, pluggable database, asm, ora-04045, cdb, режим nocopy, show pdbs, скрипт миграции, sys.registry$sqlpatch, bundle_data, clob, xmltype, рестриктед-режим, apex

По итогам апгрейда с 11 на 12 логичным показался шаг превращения базы в pluggable. Казалось бы, три простых действия — и проблема решена. Но во время миграции вылез ряд нетривиальных ошибок.

Итак, алгоритм обновления следующий

  • Останавливаем базу:
export ORACLE_SID=<your_sid> sqlplus / as sysdba sqlplus> shutdown immediate;
  • Стартуем в режиме чтения:
sqlplus> STARTUP OPEN READ ONLY;
  • Снимаем с неё xml:
BEGIN DBMS_PDB.DESCRIBE( pdb_descr_file => '/tmp/newpdb.xml'); END; /
  • Опять останавливаем:
sqlplus> shutdown immediate;
  • Подключаемся к CDB базе и создаём pdb на основе ранее снятого xml. Я использовал режим nocopy для сохранения тех же файлов на ASM.
export ORACLE_SID=<your_cdb> sqlplus / as sysdba CREATE PLUGGABLE DATABASE newpdb USING '/tmp/newpdb.xml' NOCOPY;
  • После успешного выполнения смотрим show pdbs и видим, что контейнер появился. Переключаемся на него и пускаем скрипт миграции:
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 NEWPDB MOUNTED ALTER SESSION SET CONTAINER=newpdb; @?/rdbms/admin/noncdb_to_pdb.sql
  • Далее скрипт отрабатывал у меня очень долго и в итоге свалился на компиляции с ошибкой:
ORA-04045: errors during recompilation/revalidation of SYS.DBMS_QOPATCH ORA-00600: internal error code, arguments: [kql_tab_diana:new dep], [0x26CB2C008], [0x2AD2C9CE76A0], [1], [2], [], [], [], [], [], [], [] ORA-06512: at "SYS.DBMS_UTILITY", line 1294 ORA-06512: at line 1
  • Лекарство нашёл на металинке. Дело в том, что в таблице SYS.REGISTRY$SQLPATCH поле BUNDLE_DATA должно быть типа CLOB, а оно XMLTYPE, нужно пересоздать. Присоединяемся к cdb, на всякий случай делаем копию таблицы SYS.REGISTRY$SQLPATCH. Удаляем её:
drop table registry$sqlpatch;
  • Пересоздаём скриптом:
@?/rdbms/admin/catsqlreg.sql
  • Проверяем, что у таблицы поле теперь правильного типа. Теперь заново пытаемся прогнать конвертацию:
ALTER SESSION SET CONTAINER=newpdb; @?/rdbms/admin/noncdb_to_pdb.sql
  • Компиляция прошла, пробую переоткрыть базу. Открывается, но база поднялась в рестриктед-режиме:
SQL> alter pluggable database newpdb open; Warning: PDB altered with errors.
  • Смотрим проблемы и видим ошибку:
SQL> select * from pdb_plug_in_violations; PSU bundle patch 160719 (Database Patch Set Update : 12.1.0.2.160719 (23054246)): Installed in the PDB but not in the CDB. RESOLVED Call datapatch to install in the PDB or the CDB
  • Проверил, что все патчи корректно стоят, и такая проблема может быть связана с APEX. Так как он мне не нужен, то я просто его удалил. Для удаления требуется, чтобы все PDB были открыты. Присоединился к cdb:
  • Переоткрыл pdb. Все успешно:
SQL> alter pluggable database newpdb close; SQL> alter pluggable database newpdb open;

На этом всё. Есть вопрос? Пишите в комментариях!