www.fors.ru

реклама
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
Скачать