Oracle Database 11g R2 (11.2) Edition-Based Redefinition – набор новых функциональных возможностей для модернизации приложений без остановки работы пользователей Валерий Юринский Директор отделения технологического консалтинга www.fors.ru Высокая доступность (High Availability) Современный бизнес неразрывно связан с информационными системами и технологиями, поэтому непрерывность функционирования ИТинфраструктуры критически важна для любого предприятия Вынужденный простой информационной системы может привести к сбоям в производстве и реализации продукции, потерям доходов и т.д. Высокая доступность - это та цель, достижение которой гарантирует непрерывность функционирования информационных систем, а значит непрерывность бизнес-процессов в целом www.fors.ru Высокая доступность Вынужденный простой • Неплановый простой БД Сбой оборудования Сбой данных • Плановый простой БД Системные изменения базы данных Модернизация объектов базы данных www.fors.ru Высокая доступность Вынужденный простой и защита от него • Неплановый простой БД Сбой оборудования Real Application cluster (RAC) Сбой данных Physical Standby • Плановый простой БД Системные изменения базы данных Logical Standby, Streams Модернизация объектов базы данных Нет защиты (до Oracle 11g R2) www.fors.ru Высокая доступность Вынужденный простой и защита от него • Неплановый простой БД Сбой оборудования Real Application cluster (RAC) Сбой данных Physical Standby • Плановый простой БД Системные изменения базы данных Logical Standby, Streams Модернизация объектов базы данных Edition-based Redefinition (Oracle 11g R2) www.fors.ru Edition-based Redefinition Версионное переопределение позволяет выполнить модернизацию прикладной системы без остановки работы её пользователей. Edition-based Redefinition gives an ability for Online Application Upgrade. www.fors.ru Edition-based Redefinition “Edition-based Redefinition is the killer feature of Oracle Database 11g Release 2”. Tom Kyte www.fors.ru Edition-based Redefinition "Edition-based Redefinition is the killer feature of Oracle Database 11g Release 2. It is worth 2 features". Tom Kyte (24-feb-2010, Moscow, Russia) "Версионное переопределение – это революционная новинка Oracle Database 11g Release 2 («захватчик рынка»). Она достойна того, чтобы считать её не одной, а сразу несколькими новыми функциями". Том Кайт (24-фев-2010, Москва, Россия) www.fors.ru До обновления (pre-upgrade) Старая версия Пользователи работают с существующим ("старым") приложением www.fors.ru Требования безостановочного обновления приложений Установка обновлений структур данных и нового программного кода не должна оказывать влияния на работу пользователей существующей («старой») системы Транзакции пользователей «старой» системы должны отражаться в «новой» системе Транзакции пользователей «новой» системы должны отражаться в «старой» системе www.fors.ru Обычный сценарий обновления DEPT EMP_V_DEPT CREATE PROCEDURE emp_pr_sal IS BEGIN FOR r IN (SELECT * FROM emp_v_sal) LOOP NULL; END LOOP; END emp_pr_sal; CREATE VIEW emp_v_dept AS SELECT D.deptno, D.dname, D.loc , E.empno, E.ename, E.job , E.sal, E.comm FROM dept D, emp E WHERE EMPD.deptno = E.deptno (+); DEPT_PR DEPT_PR_PR EMP_V_SAL EMP_PR Oracle10g EMP_PR_SAL CREATE VIEW emp_v_sal AS SELECT D.dname, SUM(E.sal) AS sum_sal FROM dept D, emp E WHERE D.deptno = E.deptno (+) GROUP BY D.dname; CREATE PROCEDURE emp_pr IS BEGIN FOR r IN (SELECT * FROM emp) LOOP NULL; END LOOP; END emp_pr; «Инвалидация» объектов - Dependency Tracking www.fors.ru . Обычный сценарий обновления DEPT EMP_V_DEPT EMP_PR_SAL DEPT_PR EMP DEPT_PR_PR EMP_V_SAL EMP_PR Oracle11g CREATE PROCEDURE emp_pr IS BEGIN FOR r IN (SELECT * FROM emp) LOOP NULL; END LOOP; END emp_pr; «Инвалидация» объектов - Fine Grained Dependency Tracking www.fors.ru Обычный сценарий обновления Вывод • Даже используя Oracle 11g не удастся применить обычный сценарий для безостановочного обновления прикладной системы (online application upgrade), поскольку неизбежна «инвалидация» некоторых объектов – это может привести к сбоям в работе пользователей www.fors.ru Глоссарий Edition – версия Edition-based – версионный, на основе версий Editioned – версионируемый, версионированный, гл. версионирован(а), версионируем(ы/а) Noneditioned – неверсионируемый, неверсионированный Editionable – версионируемый Noneditionable – неверсионируемый Editioning view – версионирующее представление Editions-enabled – версионно-полномочный Crossedition – кросс-версионный Forward crossedition trigger – прогрессивный кросс-версионный триггер Reverse crossedition trigger – регрессивный кросс-версионный триггер www.fors.ru Версионное переопределение (Edition-based Redefinition) Oracle11g Release 2 вводит новый «несхемный» объект базы данных – версию (Edition) В каждый момент времени каждая сессия БД связывается с единственной версией Новая версия создается, как потомок предыдущей версии, и наследует все версионируемые объекты родительской www.fors.ru Версионное переопределение (Edition-based Redefinition) По-прежнему ссылку на объекты можно осуществлять с использованием имени схемы - schema.object, однако появляется новое измерение – версия объекта. Оно соответствует версии, установленной для сессии БД Использование версионности позволяет выполнять безостановочное обновление приложений www.fors.ru Обновление (upgrade) Старая версия Установка «нового» приложения www.fors.ru Новая версия Использование обеих версий (hot-rollover period) Старая версия Новая версия www.fors.ru После обновления (post-upgrade) Старая версия «Старая» версия скрывается (retired). После этого работает уже только «новая» версия www.fors.ru Новая версия Подробности www.fors.ru Введение Версия (edition) – это «несхемный» объект БД (non-schema object), то есть он не принадлежит никакой конкретной схеме, а принадлежит всей базе данных Каждая БД имеет, как минимум, одну версию Новая версия создается, как потомок существующей версии. У версии может быть только один потомок (ограничение текущей реализации). www.fors.ru Введение Каждая сессия БД использует версию Версия уникально идентифицируется своим именем Версию, как часть имени объекта, Oracle подставляет автоматически Начальная (initial) версия ORA$BASE, порождается при генерации новой БД Oracle 11.2 или при обновлении БД до Oracle 11.2 www.fors.ru Текущая версия Версия, которую использует сессия в конкретный момент времени называется текущей версией (current edition) Текущей может быть любая версия, для которой пользователю предоставлена привилегия USE Пользователь версии – это пользователь, для сессии которого в данный момент установлена эта версия www.fors.ru Как посмотреть версию 1. SQL*Plus v11.2.0.x Версия сессии: SQL> SHOW EDITION EDITION -----------------------------ORA$BASE www.fors.ru Как посмотреть версию 2. С помощью SQL-функции SYS_CONTEXT('USERENV', 'параметр') CURRENT_EDITION_ID Ид. текущей версии CURRENT_EDITION_NAME Имя текущей версии SESSION_EDITION_ID Ид. версии сессии SESSION_EDITION_NAME Имя версии сессии …_EDITION_ID = {DBA|ALL}_OBJECTS.OBJECT_ID www.fors.ru Изменение текущей версии Изменение версии сессии можно выполнить командой ALTER SESSION SET EDITION = my_ver_2; Для установки версии по умолчанию на уровне БД можно использовать команду ALTER DATABASE DEFAULT EDITION = my_ver_2; www.fors.ru Изменение текущей версии В Oracle Database 11.2.0.2 можно устанавливать версию по умолчанию для каждого сервиса БД • Для одиночного экземпляра: DBMS_SERVICE.CREATE_SERVICE(… , edition => edition_name); DBMS_SERVICE.MODIFY_SERVICE (… , edition => edition_name); • Для конфигурации Real Application Clusters следует использовать утилиту SRVCTL (Server Control utility) : srvctl add service . . . –t edition_name srvctl modify service . . . –t edition_name www.fors.ru Унаследованные и реальные объекты Новая версия создается, как потомок существующей родительской версии В этой дочерней версии объекты базы данных могут быть либо унаследованными (inherited) объектами родительской версии, либо реальными (actual) объектами дочерней версии Если имеется только одна используемая версия, то всё объекты – это реальные (actual) объекты этой версии www.fors.ru Актуализация унаследованных объектов (Actualization of Inherited Objects) Когда пользователь дочерней версии изменяет унаследованный объект командой DDL, то этот объект копируется из родительской версии в дочернюю и команда DDL применяется уже к этой копии Таким образом происходит актуализация (actualization), и в дочерней версии появляется реальный (actual) объект с тем же именем В родительской версии объект остается неизменным и становится невидимым (is no longer visible) в дочерней версии www.fors.ru Актуализация унаследованных объектов (Actualization of Inherited Objects) PRE_UPG edition VIEW POST_UPG edition VIEW (inherited) FUNCTION FUNCTION (inherited) GRANT EXECUTE…; TRIGGER TRIGGER (inherited) PROCEDURE PROCEDURE (inherited) POST_UPG – это потомок PRE_UPG www.fors.ru Актуализация унаследованных объектов (Actualization of Inherited Objects) PRE_UPG edition VIEW POST_UPG edition VIEW (inherited) FUNCTION FUNCTION (actual) TRIGGER TRIGGER (inherited) PROCEDURE PROCEDURE (inherited) POST_UPG – это потомок PRE_UPG www.fors.ru Удаление унаследованного объекта (Dropping an Inherited Object) Когда пользователь дочерней версии удаляет (drops) унаследованный объект, то этот объект перестает быть видимым (is no longer visible) в дочерней версии В родительской версии объект остается неизменным и продолжает быть видимым www.fors.ru Удаление унаследованного объекта (Dropping an Inherited Object) PRE_UPG edition VIEW POST_UPG edition VIEW (inherited) FUNCTION FUNCTION (actual) TRIGGER TRIGGER (inherited) DROP TRIGGER…; PROCEDURE PROCEDURE (inherited) POST_UPG – это потомок PRE_UPG www.fors.ru Удаление унаследованного объекта (Dropping an Inherited Object) PRE_UPG edition VIEW POST_UPG edition VIEW (inherited) FUNCTION FUNCTION (actual) TRIGGER TRIGGER (inherited) DROP TRIGGER…; PROCEDURE PROCEDURE (inherited) POST_UPG – это потомок PRE_UPG www.fors.ru Версионируемые объекты (Editioned Objects) Не все объекты версионируемы (editioned) Чтобы объект схемы был версионируемым должно быть соблюдено два условия: 1. Объект должен быть объектом версионируемого (editionable) типа: Function, Procedure, Package (спецификация и тело), Type (спецификация и тело), Trigger, Library, Synonym (личный, не публичный), View. 2. Объект должен принадлежать версионно-полномочному пользователю (has an editions-enabled owner) www.fors.ru Версионируемые объекты (Editioned Objects) Если объект имеет версионируемый тип, но принадлежит не версионно-полномочному пользователю, то такой объект называется потенциально версионируемым (potentially editioned) В версии может быть своя копия версионируемого объекта - в этом случае только эта копия видна в рамках данной версии www.fors.ru Версионируемые объекты. Пример PRE_UPG edition FUNCTION my_func Пример: POST_UPG edition FUNCTION my_func POST_UPG edition SELECT my_func FROM dual; • В версиях PRE_UPG и POST_UPG есть функция MY_FUNC • Пользователь версии POST_UPG выполняет: SELECT my_func FROM dual; • Происходит вызов функции из версии POST_UPG • Функция из PRE_UPG пользователю версии POST_UPG не видна POST_UPG – это потомок PRE_UPG www.fors.ru Неверсионируемые объекты (Noneditioned Objects) Неверсионируемый объект (Noneditioned Object) – объект схемы, имеющий неверсионируемый тип: • Clusters, Constraints, Database links, Dimensions, Indexes, Indextypes, Java (all), Materialized (views, view logs), Mining models, Object (tables, types, views), Operators, Sequences, Tables В версии не может быть своей копии неверсионируемого объекта – такие объекты идентичны для всех версий и видны во всех версиях www.fors.ru Неверсионируемые объекты (Noneditioned Objects) Версионируемый объект уникально идентифицируется • схемой (owner), • именем объекта (object_name) и • версией (edition_name). Неверсионируемый объект уникально идентифицируется • схемой (owner) и • именем объекта (object_name). www.fors.ru Правила для версионируемых объектов (Rules for Editioned Objects) Неверсионируемый объект не может зависеть от версионируемого объекта, например: • Публичный синоним не может ссылаться на версионируемый объект • Функциональный индекс не может зависеть от версионируемой функции • Материализованное представление не может зависеть от версионирующего представления • Таблица не может иметь столбец пользовательского типа данных, чей владелец является версионно-полномочным Абстрактный тип данных не может быть одновременно версионируемым и эволюционируемым (evolved) www.fors.ru Предоставление версионных полномочий Для предоставления пользователю версионных полномочий (to enable editions for a user) используется фраза ENABLE EDITIONS команды CREATE USER или ALTER USER: ALTER USER scott ENABLE EDITIONS; Предоставленные версионные полномочия: • имеют обратную силу (retroactive), • не могут быть отменены (irreversible). После того, как пользователь стал версионно- полномочным (editions-enabled), каждый объект версионируемого типа, уже принадлежащий ему или создаваемый им, – это версионируемый объект (editioned object). www.fors.ru Создание версии Для создания версий пользователю должна быть предоставлена привилегия CREATE ANY EDITION Создание версий критично для системы, поэтому привилегию следует предоставлять осторожно Версия создается командой CREATE EDITION CREATE EDITION post_upg AS CHILD OF ORA$BASE; www.fors.ru Право использования версии Пользователь, создавший версию, получает на неё привилегию USE WITH GRANT OPTION Право использования версии другими пользователями предоставляется с помощью привилегии USE: GRANT USE ON post_upg TO vrashpil; www.fors.ru Простейший пример CREATE PROCEDURE my_proc IS BEGIN dbms_output.put_line('Ку! Я MY_PROC. Версии-1.0'); END; / EXEC my_proc; Ку! Я MY_PROC. Версии - 1.0 CREATE EDITION POST_UPG AS CHILD OF ORA$BASE; ALTER SESSION SET EDITION = POST_UPG; CREATE OR REPLACE PROCEDURE my_proc IS BEGIN dbms_output.put_line(‘Ку! И я MY_PROC. Но версии-2.0'); END; / EXEC my_proc; Ку! И я MY_PROC. Но версии-2.0 www.fors.ru Таблицы и индексы Таблицы и индексы – это неверсионируемые объекты (noneditionable objects) • Таблицы и индексы содержат огромный объем данных, следовательно, хранение их копий для разных версий потребовало бы слишком много дисковой памяти www.fors.ru Версионирующие представления (Editioning Views) Версионирующие представления (editioning views): • Новый класс представлений, появившийся в Oracle11g R2 • Логически представляют собой копии таблицы в разных версиях - это логические проекции неверсионируемых физических таблиц www.fors.ru Отличия версионирующих представлений от обычных При создании указывается фраза EDITIONING CREATE EDITIONING VIEW emp AS SELECT empno, …, deptno FROM emp_rt; Поскольку логически они представляют собой версию таблицы, то • Могут иметь DML-триггеры всех обычных типов: CREATE TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON editioning_view_name [FOR EACH ROW] • Не могут иметь триггеров типа INSTEAD OF www.fors.ru Версионирующее представление. Ограничения В каждой версии может быть одно единственное версионирующее представление (ВП) для каждой базовой таблицы Во фразе FROM команды SELECT, задающей представление, должна быть только одна таблица ВП может только отображать (project) и переименовывать столбцы • В списке выборки могут быть только реальные данные – столбцы базовой таблицы (не выражения, не функции… ) и необязательные псевдонимы столбцов (aliases) • Запрещается использование WHERE, GROUP BY и т.п. www.fors.ru Версионирующее представление. Ограничения Версионирующие представления нельзя использовать в ограничениях типа FOREIGN KEY Версионирующее представление гарантированно не искажает планы запросов и не приводит к снижению их производительности!!! www.fors.ru Версионирующее представление и удаление базовой таблицы При удалении таблицы, на которой базируется ВП, само ВП и принадлежащие ему триггеры не удаляются При удалении базовой таблицы ВП и все зависимые от него объекты получают статус INVALID («инвалидируются») www.fors.ru Кросс-версионные триггеры В Oracle11g R2 введен новый специализированный вид триггеров – кросс-версионные триггеры (КВТ) (crossedition triggers) КВТ создаются в «новой» версии (post-upgrade edition) КВТ действительны (actual) в «новой» версии www.fors.ru Кросс-версионные триггеры Два типа кросс-версионных триггеров: • Прогрессивные (forward) Срабатывают для команд DML, вызванных сессиями «старой» версии Обновляют данные в «новых» столбцах таблицы на основе изменений данных в «старых» её столбцах • Регрессивные (reverse) /не обязательны, нужны для hot-rollover/ Срабатывают для команд DML, вызванных сессиями «новой» версии Обновляют данные в «старых» столбцах таблицы на основе изменений данных в «новых» её столбцах www.fors.ru Кросс-версионные триггеры CREATE OR REPLACE TRIGGER trg_name {BEFORE | AFTER} {INSERT| [OR] UPDATE| [OR] DELETE} ON table_name [FOR EACH ROW] {FORWARD | REVERSE} CROSSEDITION [{FOLLOWS | PRECIDES} . . . ] [ENABLE | DISABLE] { PL/SQL block } www.fors.ru Кросс-версионные триггеры КВТ создаются для реальной таблицы и являются временными – создаются только на период параллельной работы «старой» и «новой» версии (hot-rollover) КВТ могут быть простыми (simple) или составными (compound) Если при создании не указана фраза REVERSE (регрессивный), то типом триггера будет FORWARD (прогрессивный) www.fors.ru Кросс-версионные триггеры Фразами FOLLOWS и PRECEDES можно настроить порядок срабатывания кросс-версионных триггеров, упорядочивание производится с учетом срабатывания обычных DML-триггеров. FOLLOWS используется для FORWARD-триггеров PRECEDES используется для REVERSE-триггеров В отличие от обычных DML-триггеров для КВТ фразы FOLLOWS и PRECEDES применимы к триггерам других таблиц www.fors.ru Кросс-версионные триггеры Порядок срабатывания триггеров при наступлении соответствующего им события DML: • 1. Обычные триггеры (не кросс-версионные) • 2. Прогрессивные (forward) кросс-версионные триггеры, созданные в текущей версии • 3. Прогрессивные (forward) кросс-версионные триггеры, созданные в дочерних версиях (дочь, внучка и т.д.) • 4. Регрессивные (reverse) кросс-версионные триггеры, созданные в текущей версии • 5. Регрессивные (reverse) кросс-версионные триггеры, созданные в родительских версиях (отец, дед и т.д.) В категориях 1-3 применяются зависимости, заданные FOLLOWS В категориях 4-5 применяются зависимости, заданные PRECEDES www.fors.ru Кросс-версионные триггеры Операция, выполняемая в теле кросс-версионного триггера, должна быть идемпотентна Wikipedia: • Термин идемпотентность означает свойство чего-либо (объекта) которое проявляется в том, что повторное действие над объектом не изменяет его • Идемпотентная операция в информатике - действие, многократное повторение которого не приводит к изменениям иным, нежели при однократном. • Примером такой операции могут служить GET-запросы в протоколе HTTP. По спецификации сервер должен возвращать одни и те же ответы на идентичные запросы (при условии что ресурс не изменился между ними по иным причинам). www.fors.ru КВТ: Дополнительно почитать Функция APPLYING_CROSSEDITION_TRIGGER IF APPLYING_CROSSEDITION_TRIGGER THEN … Функция DBMS_UTILITY.WAIT_ON_PENDING_DML Хинты • /*+ IGNORE_ROW_ON_DUPKEY_INDEX */ • /*+ CHANGE_DUPKEY_ERROR_INDEX */ www.fors.ru Версии. Представления словаря *_EDITIONS Версии *_EDITION_COMMENTS Комментарии *_OBJECTS Объекты БД в версии сессии: актуальные и унаследованные *_OBJECTS_AE Объекты БД всех версий *_ERRORS Ошибки в версии сессии *_ERRORS_AE Ошибки для всех версий *_USERS Пользователи БД *_SERVICES Сервисы БД www.fors.ru имер Краткий пр www.fors.ru Подготовка к безостановочному обновлению приложения Предоставление версионных полномочий владельцу объектов приложения ALTER USER scott ENABLE EDITIONS; www.fors.ru До обновления обновления (pre-upgrade) (pre-upgrade) Старая версия Пользователи работают с существующим («старым») приложением www.fors.ru Остановка для подготовки к безостановочному обновлению Downtime Переименование базовой таблицы RENAME emp TO emp_rt; Создание версионирующего представления CREATE OR REPLACE EDITIONING VIEW emp AS SELECT empno, ename, job, mgr, hiredate , sal, comm, deptno FROM emp_rt; Старая Перенос версия DML-триггеров с базовой таблицы на версионирующее представление DROP TRIGGER emp#BI#R; Пользователи работают CREATE TRIGGER emp#BI#R BEFORE INSERT ON emp FOR EACH ROW с существующим («старым») BEGIN :NEW.empno := emp_seq.NEXTVAL; END; / приложением Перекомпиляция «инвалидировавшихся» объектов ALTER … COMPILE REUSE SETTINGS или @UTLRP.SQL www.fors.ru Возобновление работы системы Downtime Переименование базовой таблицы RENAME emp TO emp_rt; Создание версионирующего представления в «старой» версии CREATE EDITIONING VIEW emp AS SELECT empno, ename, job, mgr, hiredate , sal, comm, deptno FROM emp_rt; Старая Перенос версия DML-триггеров с базовой таблицы на версионирующее представление DROP TRIGGER emp#BI#R; Пользователи работают CREATE TRIGGER emp#BI#R BEFORE INSERT ON emp FOR EACH ROW с существующим («старым») BEGIN :NEW.empno := emp_seq.NEXTVAL; END; / приложением Перекомпиляция «инвалидировавшихся» объектов ALTER … COMPILE REUSE SETTINGS или @UTLRP.SQL www.fors.ru Безостановочное обновление SQL> SHOW USER USER is ”SCOTT” SQL> SHOW EDITION EDITION -----------------------------ORA$BASE Добавление столбцов в таблицу ALTER TABLE emp_rt ADD ( last_name VARCHAR2(25) , first_name VARCHAR2(25)); www.fors.ru Безостановочное обновление Создание версии CREATE EDITION post_upg AS CHILD OF ora$base; Установка «новой» версии для сессии ALTER SESSION SET EDITION = post_upg; www.fors.ru Безостановочное обновление POST_UPG Создание версионирующего представления, в «новой» версии CREATE OR REPLACE EDITIONING VIEW emp AS SELECT empno AS emp_id , last_name, first_name , job, sal, comm , deptno AS dept_id FROM emp_rt; www.fors.ru Безостановочное обновление POST_UPG Создание прогрессивного кросс-версионного триггера CREATE OR REPLACE TRIGGER emp#BIU#R#FW BEFORE INSERT OR UPDATE ON emp_rt FOR EACH ROW FORWARD CROSSEDITION DISABLE BEGIN :NEW.last_name := INITCAP(:NEW.ename); :NEW.first_name := '?'; END; / www.fors.ru Безостановочное обновление POST_UPG Создание регрессивного кросс-версионного триггера CREATE OR REPLACE TRIGGER emp#BIU#R#RV BEFORE INSERT OR UPDATE ON emp_rt FOR EACH ROW REVERSE CROSSEDITION DISABLE BEGIN :NEW.ename := UPPER(:NEW.last_name); END; / www.fors.ru Безостановочное обновление POST_UPG После того, как вы убедитесь, что кросс- версионные триггеры скомпилировались без ошибок, их необходимо включить: • Прогрессивный ALTER TRIGGER emp#BIU#R#FW ENABLE; • Регрессивный ALTER TRIGGER emp#BIU#R#RV ENABLE; www.fors.ru Безостановочное обновление POST_UPG Заполнение данными новых столбцов таблицы • Вариант №1. Использование DBMS_SQL Процедура DBMS_SQL.PARSE имеет новые параметры: EDITION – версия в которой должна быть выполнена команда APPLY_CROSSEDITION_TRIGGER - задает неквалифицированное (то есть без указания схемы) имя кросс-версионного триггера, который следует применить при выполнении SQL-команды www.fors.ru Безостановочное обновление POST_UPG DECLARE ln_cur INTEGER; ln_ret INTEGER; BEGIN ln_cur := dbms_sql.open_cursor; dbms_sql.parse(ln_cur, 'UPDATE emp_rt SET job = job' , dbms_sql.NATIVE , edition => 'POST_UPG' , apply_crossedition_trigger => 'emp#BIU#R#FW'); ln_ret := dbms_sql.execute(ln_cur); dbms_sql.close_cursor(ln_cur); COMMIT; EXCEPTION WHEN OTHERS THEN IF dbms_sql.is_open(ln_cur) THEN dbms_sql.close_cursor(ln_cur); END IF; RAISE; END; / www.fors.ru Безостановочное обновление POST_UPG Заполнение данными новых столбцов таблицы • Вариант №2. Использование DBMS_PARALLEL_EXECUTE Процедура DBMS_PARALLEL_EXECUTE.RUN_TASK имеет новые параметры: EDITION – версия в которой должна быть выполнена команда APPLY_CROSSEDITION_TRIGGER - задает неквалифицированное (то есть без указания схемы) имя кросс-версионного триггера, который следует применить при выполнении SQL-команды www.fors.ru Безостановочное обновление POST_UPG DECLARE . . . BEGIN . . . -- Execute the DML in parallel l_sql_stmt := 'UPDATE emp_rt SET job = job ‘ || 'WHERE rowid BETWEEN :start_id AND :end_id '; DBMS_PARALLEL_EXECUTE.RUN_TASK( task_name => 'mytask‘ , sql_stmt => l_sql_stmt , language_flag => DBMS_SQL.NATIVE , edition => 'POST_UPG‘ , apply_crossedition_trigger => 'emp#BIU#R#RV‘ , parallel_level => 2); . . . END; / www.fors.ru Безостановочное обновление Создание новых индексов CREATE INDEX emp#i#first_name ON emp_rt(first_name) ONLINE INVISIBLE; Создание новых ограничений целостности ALTER TABLE emp_rt ADD CONSTRAINT emp#C#last_name CHECK (last_name = TRIM(INITCAP(last_name)) DISABLE; Проверка правильной работы новых индексов выполняется после установки в тестирующей сессии параметра оптимизации ALTER SESSION SET OPTIMIZER_USE_INVISIBLE_INDEXES = TRUE; Новые индексы делаются видимыми, ограничения включаются ALTER INDEX emp#i#first_name VISIBLE; ALTER TABLE emp_rt ENABLE CONSTRAINT emp#C#last_name; www.fors.ru Безостановочное обновление Переключение пользователей на новую версию: • Предоставление привилегии на использование «новой» версии: GRANT USE ON post_upg TO allen; или GRANT USE ON post_upg TO PUBLIC; • Переключение сессий триггером AFTER LOGON, созданным в «старой» версии CREATE OR REPLACE TRIGGER change_edition_after_logon AFTER LOGON ON DATABASE DISABLE BEGIN IF USER IN ('ALLEN‘, ‘DALLES’) THEN DBMS_SESSION.SET_EDITION_DEFERRED(‘POST_UPG'); END IF; END; / ALTER TRIGGER change_edition_after_logon ENABLE; www.fors.ru Безостановочное обновление После перехода всех пользователей на «новую» версию • «Старая»» версия скрывается (retired) «Новая» версия устанавливается , как версия БД по умолчанию ALTER DATABASE DEFAULT EDITION = post_upg; (В Oracle 11.2.0.2 можно указать версию для каждого сервиса БД) Отключается, а затем удаляется триггер AFTER LOGON, если он использовался Отключаются или удаляются ограничения целостности столбцов, которые больше не используются Выключаются или удаляются кросс-версионные триггеры Отзывается привилегия на использование «старой» версии: REVOKE USE ON ORA$BASE FROM . . .; www.fors.ru Безостановочное обновление После перехода всех пользователей на «новую» версию (продолжение) • Делаются невидимыми, а затем удаляются индексы, использовавшиеся «старой» версией, которые не нужны для работы «новой» • Для освобождения места в таблице: Значения уже неиспользуемых «старых» столбцов устанавливаются в NULL (рекомендуется использование DBMS_PARALLEL_EXECUTE) Неиспользуемые столбцы объявляются UNUSED Таблица сжимается использованием команды ALTER TABLE . . . SHRINK SPACE www.fors.ru Краткий пример в картинках www.fors.ru До обновления EMP MY_PROC EMP_V_ST www.fors.ru Остановка для подготовки 1. Переименовать таблицу EMP_RT EMP MY_PROC EMP_V_ST www.fors.ru Остановка для подготовки 2. Создать версионирующее представление (editioning view) 3. Перекомпилировать объекты EMP_RT MY_PROC EMP EMP_V_ST www.fors.ru Остановка для подготовки 4. Перенести DML-триггеры с таблицы на версионирующее представление (DROP + CREATE) EMP_RT MY_PROC EMP EMP_V_ST www.fors.ru Возобновить работу пользователей Получена «старая» версия подготовленная к обновлению Старая версия EMP_RT MY_PROC EMP EMP_V_ST www.fors.ru Безостановочное обновление 5. Добавить столбцы в реальную таблицу Старая версия EMP_RT MY_PROC EMP EMP_V_ST www.fors.ru Безостановочное обновление 6. Создать новую версию 7. Пересоздать в новой версии версионирующее представление EMP Старая версия CREATE EDITION POST_UPG; EMP_RT MY_PROC EMP EMP_V_ST www.fors.ru EMP Новая версия Безостановочное обновление 8. Провести в новой версии обновление программ Старая версия Новая версия EMP_RT MY_PROC EMP EMP EMP_V_ST www.fors.ru EMP_V_NN EMP_V_ST MY_FUNC MY_PROC Безостановочное обновление 9. Создать кросс-версионные триггеры, заполнить новые столбцы Старая версия Новая версия EMP_RT MY_PROC EMP EMP EMP_V_ST www.fors.ru EMP_V_NN EMP_V_ST MY_FUNC MY_PROC Безостановочное обновление 10. Создать триггер AFTER LOGON для переключения пользователей Старая версия Новая версия EMP_RT MY_PROC EMP EMP EMP_V_ST AFTER LOGON www.fors.ru EMP_V_NN EMP_V_ST MY_FUNC MY_PROC Безостановочное обновление 11. После перехода всех пользователей на новую версию удалить кросс-верс. триггеры, скрыть старую Старая версия Новая версия EMP_RT MY_PROC EMP EMP EMP_V_ST AFTER LOGON www.fors.ru EMP_V_NN EMP_V_ST MY_FUNC MY_PROC Вывод Таким образом, набор функциональных возможностей, включенных в Editionbased Redefinition, позволяет выполнять модернизацию приложения без остановки работы, использующих его людей и устройств!!! www.fors.ru Edition-based Redefinition "Edition-based Redefinition is the killer feature of Oracle Database 11g Release 2. It is worth 2 features". Tom Kyte (24-feb-2010, Moscow, Russia) "Версионное переопределение – это революционная новинка Oracle Database 11g Release 2 («захватчик рынка»). Она достойна того, чтобы считать её не одной, а сразу несколькими новыми функциями". Том Кайт (24-фев-2010, Москва, Россия) www.fors.ru Глоссарий Edition – версия Edition-based – версионный, на основе версий Editioned – версионируемый, версионированный, гл. версионирован(а), версионируем(ы/а) Noneditioned – неверсионируемый, неверсионированный Editionable – версионируемый Noneditionable – неверсионируемый Editioning view – версионирующее представление Editions-enabled – версионно-полномочный Crossedition – кросс-версионный Forward crossedition trigger – прогрессивный кросс-версионный триггер Reverse crossedition trigger – регрессивный кросс-версионный триггер www.fors.ru Контактная информация “ФОРС – Центр разработки” Россия, 129272, Москва, Трифоновский тупик, 3 Тел.: +7 495 787-7040 Факс: +7 495 787-7047 e-mail: develop@fors.ru http://www.fors.ru www.fors.ru «ФОРС – Центр разработки» www.fors.ru Компания «ФОРС» 19 лет на рынке ИТ – технологий ; Ведущий российский партнер корпорации Oracle на территории EMEA; Сфера деятельности компании охватывает полный спектр задач по построению информационных систем; Успешно реализовано свыше 500 сложнейших проектов; Создан ряд уникальных информационных систем для крупнейших государственных и коммерческих организаций; Свыше 350 сотрудников, 70 специалистов обладают сертификатами ведущих мировых вендоров; Территориальные представительства: С.– Петербург, Вятка, Ханты-Мансийск, Минск, Баку; Развитая партнерская сеть – свыше 300 компаний в сфере информационнокоммуникационных технологий. www.fors.ru