Реализация проекта внедрения ЭАР в НФПК
Download
Report
Transcript Реализация проекта внедрения ЭАР в НФПК
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: [email protected]
http://www.fors.ru
www.fors.ru
«ФОРС – Центр разработки»
www.fors.ru
Компания «ФОРС»
19 лет на рынке ИТ – технологий ;
Ведущий российский партнер корпорации Oracle на территории EMEA;
Сфера деятельности компании охватывает полный спектр задач по построению
информационных систем;
Успешно реализовано свыше 500 сложнейших проектов;
Создан ряд уникальных информационных систем для крупнейших государственных
и коммерческих организаций;
Свыше 350 сотрудников, 70 специалистов обладают сертификатами ведущих
мировых вендоров;
Территориальные представительства: С.– Петербург, Вятка, Ханты-Мансийск,
Минск, Баку;
Развитая партнерская сеть – свыше 300 компаний в сфере информационнокоммуникационных технологий.
www.fors.ru