Миграция NONCDB в PDB | OTUS
🚀 OTUS Fest 2021
Бесплатная образовательная онлайн-конференция для IT-специалистов.
Подробнее

Курсы

Программирование
Backend-разработчик на PHP
-9%
Алгоритмы и структуры данных
-9%
Team Lead
-6%
Архитектура и шаблоны проектирования Разработчик IoT
-13%
C# Developer. Professional
-9%
HTML/CSS
-11%
C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Java Developer. Basic C++ Developer. Professional Web-разработчик на Python MS SQL Server Developer Android Developer. Basic Разработчик программных роботов (RPA) на базе UiPath и PIX Microservice Architecture Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов React.js Developer Node.js Developer Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes JavaScript Developer. Basic Unity Game Developer. Professional Супер-интенсив Azure
Инфраструктура
Экспресс-курс «IaC Ansible»
-10%
Administrator Linux.Basic
-10%
Мониторинг и логирование: Zabbix, Prometheus, ELK
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Administrator Linux. Professional
-6%
Дизайн сетей ЦОД
-13%
NoSQL Основы Windows Server MS SQL Server Developer Инфраструктурная платформа на основе Kubernetes Cloud Solution Architecture Highload Architect Разработчик голосовых ассистентов и чат-ботов VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "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 комментариев
Для комментирования необходимо авторизоваться