0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: субд, базы данных, oracle 12c, pdb, pluggable database, asm, ora-04045, cdb, режим nocopy, show pdbs, скрипт миграции, sys.registry$sqlpatch, bundle_data, clob, xmltype, рестриктед-режим, apex</p>
1
<p>Теги: субд, базы данных, oracle 12c, pdb, pluggable database, asm, ora-04045, cdb, режим nocopy, show pdbs, скрипт миграции, sys.registry$sqlpatch, bundle_data, clob, xmltype, рестриктед-режим, apex</p>
2
<p>По итогам апгрейда с 11 на 12 логичным показался шаг превращения базы в<strong>pluggable</strong>. Казалось бы, три простых действия - и проблема решена. Но во время миграции вылез ряд нетривиальных ошибок.</p>
2
<p>По итогам апгрейда с 11 на 12 логичным показался шаг превращения базы в<strong>pluggable</strong>. Казалось бы, три простых действия - и проблема решена. Но во время миграции вылез ряд нетривиальных ошибок.</p>
3
<h2>Итак, алгоритм обновления следующий</h2>
3
<h2>Итак, алгоритм обновления следующий</h2>
4
<ul><li>Останавливаем базу:</li>
4
<ul><li>Останавливаем базу:</li>
5
</ul>export ORACLE_SID=<your_sid> sqlplus / as sysdba sqlplus> shutdown immediate;<ul><li>Стартуем в режиме чтения:</li>
5
</ul>export ORACLE_SID=<your_sid> sqlplus / as sysdba sqlplus> shutdown immediate;<ul><li>Стартуем в режиме чтения:</li>
6
</ul>sqlplus> STARTUP OPEN READ ONLY;<ul><li>Снимаем с неё<strong>xml</strong>:</li>
6
</ul>sqlplus> STARTUP OPEN READ ONLY;<ul><li>Снимаем с неё<strong>xml</strong>:</li>
7
</ul>BEGIN DBMS_PDB.DESCRIBE( pdb_descr_file => '/tmp/newpdb.xml'); END; /<ul><li>Опять останавливаем:</li>
7
</ul>BEGIN DBMS_PDB.DESCRIBE( pdb_descr_file => '/tmp/newpdb.xml'); END; /<ul><li>Опять останавливаем:</li>
8
</ul>sqlplus> shutdown immediate;<ul><li>Подключаемся к<strong>CDB</strong>базе и создаём<strong>pdb</strong>на основе ранее снятого<strong>xml</strong>. Я использовал режим<strong>nocopy</strong>для сохранения тех же файлов на<strong>ASM</strong>.</li>
8
</ul>sqlplus> shutdown immediate;<ul><li>Подключаемся к<strong>CDB</strong>базе и создаём<strong>pdb</strong>на основе ранее снятого<strong>xml</strong>. Я использовал режим<strong>nocopy</strong>для сохранения тех же файлов на<strong>ASM</strong>.</li>
9
</ul>export ORACLE_SID=<your_cdb> sqlplus / as sysdba CREATE PLUGGABLE DATABASE newpdb USING '/tmp/newpdb.xml' NOCOPY;<ul><li>После успешного выполнения смотрим<strong>show pdbs</strong>и видим, что контейнер появился. Переключаемся на него и пускаем<strong>скрипт миграции</strong>:</li>
9
</ul>export ORACLE_SID=<your_cdb> sqlplus / as sysdba CREATE PLUGGABLE DATABASE newpdb USING '/tmp/newpdb.xml' NOCOPY;<ul><li>После успешного выполнения смотрим<strong>show pdbs</strong>и видим, что контейнер появился. Переключаемся на него и пускаем<strong>скрипт миграции</strong>:</li>
10
</ul>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<ul><li>Далее скрипт отрабатывал у меня очень долго и в итоге свалился на компиляции с ошибкой:</li>
10
</ul>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<ul><li>Далее скрипт отрабатывал у меня очень долго и в итоге свалился на компиляции с ошибкой:</li>
11
</ul>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<ul><li>Лекарство нашёл на металинке. Дело в том, что в таблице<strong>SYS.REGISTRY$SQLPATCH</strong>поле<strong>BUNDLE_DATA</strong>должно быть типа<strong>CLOB</strong>, а оно<strong>XMLTYPE</strong>, нужно пересоздать. Присоединяемся к<strong>cdb</strong>, на всякий случай делаем копию таблицы<strong>SYS.REGISTRY$SQLPATCH</strong>. Удаляем её:</li>
11
</ul>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<ul><li>Лекарство нашёл на металинке. Дело в том, что в таблице<strong>SYS.REGISTRY$SQLPATCH</strong>поле<strong>BUNDLE_DATA</strong>должно быть типа<strong>CLOB</strong>, а оно<strong>XMLTYPE</strong>, нужно пересоздать. Присоединяемся к<strong>cdb</strong>, на всякий случай делаем копию таблицы<strong>SYS.REGISTRY$SQLPATCH</strong>. Удаляем её:</li>
12
</ul>drop table registry$sqlpatch;<ul><li>Пересоздаём скриптом:</li>
12
</ul>drop table registry$sqlpatch;<ul><li>Пересоздаём скриптом:</li>
13
</ul>@?/rdbms/admin/catsqlreg.sql<ul><li>Проверяем, что у таблицы поле теперь правильного типа. Теперь заново пытаемся прогнать конвертацию:</li>
13
</ul>@?/rdbms/admin/catsqlreg.sql<ul><li>Проверяем, что у таблицы поле теперь правильного типа. Теперь заново пытаемся прогнать конвертацию:</li>
14
</ul>ALTER SESSION SET CONTAINER=newpdb; @?/rdbms/admin/noncdb_to_pdb.sql<ul><li>Компиляция прошла, пробую переоткрыть базу. Открывается, но база поднялась в<strong>рестриктед-режиме</strong>:</li>
14
</ul>ALTER SESSION SET CONTAINER=newpdb; @?/rdbms/admin/noncdb_to_pdb.sql<ul><li>Компиляция прошла, пробую переоткрыть базу. Открывается, но база поднялась в<strong>рестриктед-режиме</strong>:</li>
15
</ul>SQL> alter pluggable database newpdb open; Warning: PDB altered with errors.<ul><li>Смотрим проблемы и видим ошибку:</li>
15
</ul>SQL> alter pluggable database newpdb open; Warning: PDB altered with errors.<ul><li>Смотрим проблемы и видим ошибку:</li>
16
</ul>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<ul><li>Проверил, что все патчи корректно стоят, и такая проблема может быть связана с<strong>APEX</strong>. Так как он мне не нужен, то я просто его удалил. Для удаления требуется, чтобы все<strong>PDB</strong>были открыты. Присоединился к<strong>cdb</strong>:</li>
16
</ul>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<ul><li>Проверил, что все патчи корректно стоят, и такая проблема может быть связана с<strong>APEX</strong>. Так как он мне не нужен, то я просто его удалил. Для удаления требуется, чтобы все<strong>PDB</strong>были открыты. Присоединился к<strong>cdb</strong>:</li>
17
</ul><ul><li>Переоткрыл<strong>pdb</strong>. Все успешно:</li>
17
</ul><ul><li>Переоткрыл<strong>pdb</strong>. Все успешно:</li>
18
</ul>SQL> alter pluggable database newpdb close; SQL> alter pluggable database newpdb open;<p><em>На этом всё. Есть вопрос? Пишите в комментариях!</em></p>
18
</ul>SQL> alter pluggable database newpdb close; SQL> alter pluggable database newpdb open;<p><em>На этом всё. Есть вопрос? Пишите в комментариях!</em></p>
19
19