Миграция NONCDB в PDB | OTUS
🔥 Что нужно, чтобы писать чистый код?
Курс «Архитектура и шаблоны проектирования». Спеццена для сдавших тест!
Подробнее

Курсы

Программирование
Flutter Mobile Developer Подготовка к сертификации Oracle Java Programmer (OCAJP)
-8%
Алгоритмы и структуры данных
-12%
Backend-разработчик на PHP
-8%
Web-разработчик на Python
-11%
Архитектура и шаблоны проектирования
-14%
Супер-интенсив «СУБД в высоконагруженных системах»
-18%
iOS-разработчик. Базовый курс
-23%
Разработчик на Spring Framework
-23%
Python Developer. Basic
-16%
C# ASP.NET Core разработчик
-18%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-6%
Highload Architect
-9%
React.js Developer
-12%
Android Developer. Professional
-7%
Software Architect
-12%
Разработчик C# AWS для разработчиков Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов Backend-разработка на Kotlin Agile Project Manager Нереляционные базы данных Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Advanced Fullstack JavaScript developer Супер-интенсив "Tarantool"
Инфраструктура
PostgreSQL
-10%
IoT-разработчик
-12%
Administrator Linux. Professional
-11%
Базы данных
-19%
Administrator Linux.Basic
-18%
Супер-интенсив «СУБД в высоконагруженных системах»
-18%
Супер-интенсив "SQL для анализа данных"
-16%
Highload Architect
-9%
MS SQL Server Developer Безопасность Linux Cloud Solution Architecture Разработчик голосовых ассистентов и чат-ботов Внедрение и работа в DevSecOps Администратор Linux. Виртуализация и кластеризация Нереляционные базы данных Супер-практикум по использованию и настройке GIT Супер-интенсив "Tarantool"
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Миграция NONCDB в PDB

SUBD_Deep_14-5020-6ebc59.09_site.png

По итогам апгрейда с 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:
@apxremov_con.sql
  • Переоткрыл pdb. Все успешно:
SQL> alter pluggable database newpdb close;
SQL> alter pluggable database newpdb open;

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

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться