Oracle: обновление базы с использованием редакций

Основной смысл заключается в том, чтобы пока все пользователи работают с текущей редакцией, создать новую редакцию на основе текущей, внести в нее необходимые изменения (пользователи этого не заметят), протестировать новую редакцию с изменениями и сделать ее текущей. Чтобы пользователи начали работать с новой редакцией они должны закрыть свои старые сессии и открыть новые, т.е. для большинства приложений выйти из Oracle и зайти обратно.

Есть 2 варианта как организовать цепочку изменений, растянутую во времени (в работающую базу периодически нужно вносить изменения без остановки базы).
1. для каждого нового изменения создаем новую редакцию (можно называть ее по дате изменений, например). таким образом получаем цепочку наследуемых редакций,
в которой последняя редакция становится текущей.
2. используем только 2 редакции, из которых базовая является основной текущей редакцией, а 2-я редакция используется только на время обновления.
В этом случае алгоритм выглядит так:
1. Текущая редакция – WORK.
Создаем на ее основе редакция UPGRADE, в которую вносим изменения.
2. Делаем текущей редакция UPGRADE и передергиваем все сессии к БД (по-очереди перезапускаем сервера приложений)
3. Убеждаемся, что WORK никто не использует и вносим в нее точно такие же изменения
4. Возвращаем текущую редакцию на WORK и заново передергиваем все сессии
5. Удаляем UPGRADE.

Тот же алгоритм более развернуто с командами:
1. проверяем, какая редакция у нас текущая:

1.1. для текущей сессии
SELECT SYS_CONTEXT
(‘userenv’,
‘current_edition_name’) sc
FROM DUAL;

1.2. в базе глобально

SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE
PROPERTY_NAME = ‘DEFAULT_EDITION’;

2. Проверяем, что у текущей редакции нет детей, так как нельзя создать 2 детские редакции для одного родителя

SELECT * FROM ALL_EDITIONS;

3. Создаем редакцию для обновления

CREATE EDITION UPGRADE as child of CURRENT;

4. В отдельной сессии, где мы будем вносить исправления, устанавливаем рабочую редакцию как UPGRADE:

alter session set edition = UPGRADE;

и вносим изменения (обновляем пакеты и перекомпилируем все зависимости)

Объекты PL/SQL рекомендуется компилировать с REUSE SETTINGS:

ALTER PROCEDURE p1 COMPILE REUSE SETTINGS

!! Нужно следить, чтобы ВСЕ действия данного шага выполнялись в сессии с установленной редакцией UPGRADE.
!! Для гарантии лучше пользоваться sqlplus’ом

5. Устанавливаем глобально текущую версию как UPGRADE:

ALTER DATABASE DEFAULT EDITION = UPGRADE

6. Ждем, пока все текущие сессии пользователей завершатся (или принудительно из завершаем, если можем)

?? как в этом убедиться?

по времени если только

7. Проделываем обновление в версии CURRENT (как в п. 4)

8. Устанавливаем глобально текущую версию как CURRENT

9. Ждем, пока все текущие сессии пользователей завершатся (или принудительно из завершаем, если можем)
Здесь уже можно не спешить, т.к. это последний шаг, главное успеть к следующему обновлению.