Можно ли поменять PDB оракула 12с - PullRequest
1 голос
/ 05 октября 2019

У нас есть 2 подключаемых базы данных в одном и том же CDB. Давайте назовем их pdb1 и pdb2. Они находятся в нашей тестовой среде, и вы можете думать о них как об отдельных средах uat. Каждый pdb имеет сервис по умолчанию (pdb1 / pdb2), а также 1 сервис, который я создал (pdb1_s1 / pdb2_s2). Несколько java-приложений указывают на любой из pdbs (серверы приложений uat1 указывают на службы pdb1, серверы uat2 указывают на pdb2). Pbd1 и pdb2 имеют одинаковые таблицы, но с разными данными.

Я бы хотел «поменять» pdbs так, чтобы серверы uat1 по-прежнему использовали службу pdb_s1, но эта служба действительно указывает на pdb2. Почему? Допустим, uat1 является основным env, в котором мы тестируем, но данные в этой базе данных (pdb1) старые / поврежденные. Мы не можем переключиться на uat2 для тестирования, поскольку у него есть другие проблемы на java-серверах.

У меня локально установлен 12c для тестирования решения. Я использую dbms_services, так как srvctl, похоже, не работает на некластеризованном env (но в конце концов нужно будет получить это решение, используя srvctl, так как uat кластеризован).

Я обнаружил, что единственный способ выполнить обмен службами - это удалить службы из обеих pdbs, а затем добавить их обратно в противоположную pdb (создать pdb1_s1 в pdb2 и создать pdb2_s1 в pdb1). Затем я переименовываю pdbs (pdb1-> pdb2 и pdb2-> pdb1). Это вроде работает.

Проблема в том, что служба по умолчанию (pdb1) по-прежнему указывает на pdb1. Я попытался удалить службу pdb1 из pdb1 и создать службу pdb2 в pdb1, но вызвал проблемы (и служба не запускается при перезапуске базы данных).

Можно ли удалить службу по умолчанию и создать новую службу по умолчанию сновое имя?

Как запустить службы не по умолчанию при запуске сервера? Я пытался сохранить состояние, но это не похоже на работу.

Ответы [ 2 ]

1 голос
/ 06 октября 2019

Переименование PDBFRED в PDBBURT.

В случае вопроса ОП, поскольку он хочет сделать своп, он использовал бы следующее для построения процесса:

  1. Переименование PDB1в PDB0
  2. Переименование PDB2 в PDB1
  3. Переименование PDB0 в PDB2

Это не было проверено ... на основе ID документа 2439885.1 от MOS:

Из CDB проверьте статус PDB:

select name, open_mode, restricted from v$pdbs;

select name, con_id, dbid, con_uid, guid from v$containers order by con_id;

select service_id, name, network_name, creation_date, pdb, con_id from cdb_services;

Допустим, мы переименовываем PDBFRED в PDBBURT:

Переведите PDB в режим ОГРАНИЧЕНИЯ для операции переименования:

alter pluggable database PDBFRED close;

alter pluggable database PDBFRED open restricted;

select name, open_mode, restricted from v$pdbs;

Затем подключитесь к PDBFRED и переименуйте его:

alter session set container=PDBFRED;

alter pluggable database rename global_name to PDBBURT;

Очень важно : Вы должны закрыть PDB и открыть ее в режиме чтения / записи для Oracle Database, чтобы завершить интеграцию нового имени службы PDB в CDB.

Закрыть PDB.

alter pluggable database close immediate;

Открыть PDB в режиме чтения / записиде.

alter pluggable database open;

Подключитесь к CDB и снова проверьте PDB:

alter session set container=CDB$ROOT;

select name, open_mode, restricted from v$pdbs;

select name, con_id, dbid, con_uid, guid from v$containers order by con_id;

select service_id, name, network_name, creation_date, pdb, con_id from cdb_services;

Файлы данных для PDB по-прежнему будут иметь исходное имя, например:

/u03/oradata/CDB1/PDBFRED

Есливам нужно переместить файлы в новый каталог, соответствующий имени PDBBURT, затем вам нужно будет создать новый каталог вручную, а затем переместить файлы, используя средство ONLINE MOVE базы данных 12c:

$ mkdir '/u03/oradata/CDB1/PDBBURT

Затем переместите каждый файл данных (сгенерируйте его из dba_data_files):

SQL> alter database move datafile '/u03/oradata/CDB1/PDBFRED/system01.dbf' to '/u03/oradata/CDB1/PDBBURT/system01.dbf'

Чтобы переименовать управляемые файлы Oracle (OMF), выполните следующие действия:документ «Как переименовать файлы, управляемые Oracle (OMF) (Doc ID 191574.1)».

Тем не менее, временные файлы табличного пространства не могут быть перемещены командой «online move», поэтому вам придется удалитьTempfile, связанный с временным табличным пространством и воссоздать новый tempfile в новом каталоге.

SQL> alter database tempfile '/u03/oradata/CDB1/pdb1/temp01.dbf' drop including datafiles;

SQL> alter tablespace TEMP add tempfile '/u03/oradata/CDB1/PDBBURST/temp01.dbf' size 10M reuse;

0 голосов
/ 09 октября 2019

Проблема заключалась в том, что наши администраторы баз данных пытались переименовать службу в уже существующую, не удаляя эти

существующие службы:

  • PDB1 / PBD1_S1
  • PDB2 / PBD2_S1

Таким образом, если вы называете PBD1_S1 - PBD2_S1, то происходит сбой, поскольку служба уже существует в другой PBD.

Решением также является временное имя для служб и pbds.

  • служба переименования: от PBD1_S1 до PBD1_S1_TEMP
  • служба переименования: от PBD2_S1 до PBD1_S1
  • переименовать службу: PBD1_S1_TEMP в PBD2_S1
  • переименовать pbd: PBD1 в PBD1_TEMP
  • переименовать pbd: PBD2 в PBD1
  • переименовать pbd: PBD1_TEMP в 1028 - 1028P*

Конечно, мне (а не администратору) понадобилась неделя, чтобы понять, в чем проблема. Наши администраторы базируются в отдельной команде, и нас, похоже, не волнует то, что мы пытаемся сделать, они работают в основном в IST-часы (разница во времени 10 часов), не отвечают на электронные письма или чаты, перегружены проблемами поддержки prod, поэтому все другие запросы занимаютнавсегда, не будут делиться журналами ошибок или многим другим, что они пытались решить, и в основном отвечают, что они ждут поддержки оракула и сами заблокированы.

...