Запуск Oracle как службы внутри контейнера docker

#oracle #docker

#Oracle #docker

Вопрос:

Я создаю и запускаю базу данных Oracle с помощью этого файла dockerfile, который запускает экземпляр Oracle с помощью команды в последней строке файла dockerfile.

 CMD exec $ORACLE_BASE/$RUN_FILE
  

Экземпляр Oracle работает, я могу подключиться к нему с помощью Oracle SQL Developer, но я не могу сделать

 ALTER SYSTEM SET audit_trail=db SCOPE=SPFILE;
  

например, и выдает следующие ошибки:

 ORA-65040: operation not allowed from within a pluggable database
65040. 00000 -  "operation not allowed from within a pluggable database"
*Cause:    An operation was attempted that can only be performed in the root
       container.
*Action:   Switch to the root container to perform the operation.
  

Итак, насколько я вижу, мне нужно запустить что-то вроде sqlplus локально в контейнере docker, а затем, вероятно, перезапустить экземпляр с помощью команд SHUTDOWN и STARTUP.

Какой самый простой способ сделать это в имеющемся у меня контейнере? Должен ли я запускать Oracle как службу внутри контейнера docker? Является ли это лучшей альтернативой? (По крайней мере, служба запустится при запуске контейнера, и я смогу использовать bash внутри контейнера, но для этого требуется модификация и перестроение файла dockerfile). Я не эксперт в linux / docker / oracle, и мне нужно знать, двигаюсь ли я в правильном направлении или нет.

Ответ №1:

Когда вы подключаетесь к базе данных из sqldeveloper, вы правильно подключаетесь к PDB (подключаемой базе данных), поэтому вам нужно изменить текущий контейнер (DB) на основной контейнер

 alter session set container = CDB;
  

или что-то в этом роде.

Вы также можете создать базу данных как традиционную базу данных, отличную от CDB, чтобы избежать путаницы с подключаемой базой данных. Просто измените файл ответов, используемый для создания базы данных.

Альтернативный вариант — сделать это в sqlplus:

Доступ к контейнеру:

 docker exec -it <your container-id/name> /bin/bash
cd /opt/oracle/product/18c/dbhome_1/bin
./sqlplus sys/<your syspwd> as sysdba
  

По какой-то причине идентификатор ORACLE_SID иногда отсутствует и выдает странный

 ORA-12162 TNS:net service name is incorrectly specified 
  

поэтому, когда вы находитесь в контейнере, пожалуйста, проверьте и evt. установите его перед обращением к базе данных.

 env
export ORACLE_SID=<your sid>
  

Комментарии:

1. Попытался изменить набор сеансов container = ‘CDB’;, но получил ORA-65015: отсутствующее или недопустимое имя контейнера

2. Попробуйте без кавычек, я пропустил подключаемый материал в своей собственной среде, поэтому я не могу его протестировать.

3. Без кавычек я получил: ORA-65011: Подключаемая база данных CDB не существует.

4. Какая у вас версия БД 12c, 18c? Для версии 18.1 , похоже, обнаружена ошибка BUG: 28558287 — ORA-65011: ПОДКЛЮЧАЕМАЯ БАЗА ДАННЫХ НЕ СУЩЕСТВУЕТ. — Решение, перезапустите DB —

5. Можете ли вы попробовать альтернативу, которую я даю в своей правке к ответу? Там вы должны напрямую попасть в CDB. Или попробуйте перезапустить обходной путь, описанный в ошибке.