Можно ли заменить PDB Oracle 12c
У нас есть 2 подключаемые базы данных в одном cdb. Назовем их pdb1 и pdb2. Они находятся в тестовой среде, и вы можете рассматривать thwm как отдельные среды 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 кластеризован).
Я обнаружил, что единственный способ выполнить замену служб - это удалить службы из обоих pdb, а затем добавить их обратно в противоположный pdb (создать pdb1_s1 в pdb2 и создать pdb2_s1 в pdb1). Затем я переименовываю pdbs (pdb1-> pdb2 и pdb2->pdb1). Это вроде работает.
Проблема в том, что служба по умолчанию (pdb1) по-прежнему указывает на pdb1. Я попытался удалить службу pdb1 из pdb1 и создать службу pdb2 в pdb1, но вызвал проблемы (и служба не запускается при перезапуске базы данных).
Можно ли удалить службу по умолчанию и создать новую службу по умолчанию с новым именем?
Как сделать так, чтобы при запуске сервера запускались не стандартные службы? Я попытался сохранить состояние, но, похоже, это не сработало.
2 ответа
Проблема заключалась в том, что наши администраторы баз данных пытались переименовать службу в уже существующую, не удаляя эти
существующие услуги:
- 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 в PBD2
Конечно, мне (не администратору баз данных) потребовалась неделя, чтобы понять, в чем проблема. Наши администраторы баз данных находятся в отдельной команде, похоже, они не заботятся о том, что мы пытаемся сделать, работают в основном в часы IST (разница во времени 10 часов), не отвечают на электронные письма или чаты, перегружены проблемами поддержки prod, поэтому все остальные запросы принимают навсегда, не будут делиться журналами ошибок или большей частью чего-либо, что они пытались исправить, и в основном отвечают, что они ждут поддержки оракула и сами заблокированы.
Переименование PDBFRED в PDBBURT.
В случае вопроса OP, поскольку он хочет выполнить своп, он использовал бы следующее, чтобы построить процесс:
- Переименуйте PDB1 в PDB0
- Переименуйте PDB2 в PDB1
- Переименуйте PDB0 в PDB2
Это не было проверено... на основе Doc 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) (идентификатор документа 191574.1) ".
Тем не менее, временные файлы временного табличного пространства нельзя переместить с помощью команды "online move", поэтому вам придется удалить временный файл, связанный с временным табличным пространством, и воссоздать новый временный файл в новом каталоге.
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;