Блеск и нищета технологии Edition-based redefinition в Oracle Database
Часть 1. Блеск
Сейчас бесшовные обновления – это одно из главных требований для многих систем, и системы, использующие базы данных Oracle, не являются исключением. В этой статье я расскажу о технологии Edition-based redefinition, которая создана для решения данной проблемы, а также о трудностях, с которыми мы столкнулись в процессе внедрения и использования этой технологии.
Данная статья может пригодиться тем, кто работает с высоконагруженными системами, использующими СУБД Oracle и хочет начать обновлять их, не отключая пользователей.
Начну с того, что мы используем Edition-based redefinition (далее EBR) в одной из банковских систем уже около двух лет и смогли заметить как достоинства, так и недостатки. Технология была внедрена в 2020 как средство процесса внесения изменений в схему данных, позволяющее изменять объекты в БД без вмешательства в работу текущих пользователей.
Целью внедрения EBR является ускорение выхода новых задач на прод, которое достигается тем, что, используя EBR, многие патчи можно устанавливать без Downtime, хотя раньше это было невозможно. Таким образом, мы можем делать установки на тестовые стенды и на прод чаще. Примером могут служить интеграционные пакеты базы данных, которые используются в большом количестве функционала системы. Если раньше установка таких пакетов требовала отключения всех пользователей и перекомпиляцию объектов, то, используя EBR, можно установить его без Downtime на «горячую» базу.
Что же такое EBR?
Edition-based redefinition – это технология баз данных Oracle, позволяющая использовать несколько версий объектов PL/SQL, представлений и синонимов в одной схеме, что позволяет выполнять обновления приложений базы данных без Downtime, при этом не затрагивая работу текущих пользователей.
Чтобы лучше понять как работает эта технология, обратимся к условному пакету CONTRACT, который агрегирует функции работы с договорами в какой-либо системе. В базе, где используется EBR, может одновременно хранится несколько различных пакетов CONTRACT, которые будут относиться к разным редакциям.
Редакция или Edition - это, по сути, метка версии, которую можно назначить всем редактируемым (Editionable) объектам в схеме. Начиная с версии 11.2 в Oracle можно заводить разные редакции (editions), каждую со своим набором хранимых объектов и возможностью переключаться между ними. Редакции зависят друг от друга, а именно находятся в отношениях родитель (предок)-потомок. Причём, каждая редакция может иметь только одного прямого потомка и одного прямого родителя. Все редакции являются потомками редакции «ORA$BASE», которая создается при включении EBR. На рис. 1. приведен пример редакций на базе. Как можно увидеть, изначально была редакция «ORA$BASE», от которой была создана редакция «RT20_1» в качестве потомка, а далее, уже от неё редакция «RT20_2» и т.д. То есть, последовательность редакций имеет линейную структуру. Одна из редакций является редакцией по умолчанию, т.е. это та редакция, к которой подключается пользователь, если он не указал редакцию специально.