С разрастанием компаний появляется потребность в наличии возможности совместного использования информации между несколькими базами данных и приложениями. Применение разнородных технологий для совместного использования информации лишь усложняет эффективную репликацию. Технология Oracle Streams (Потоки Oracle) представляет собой единое универсальное решение для осуществления обмена информацией по всему предприятию.
В контексте Oracle Streams каждая единица информации называется событием (event), и обмен всеми такими событиями осуществляется в потоке. Поток передает указываемую информацию в указываемые пункты назначения. Oracle Streams захватывает происходящие в базе данных изменения за счет использования как активных, так и архивных журналов повторного выполнения. Он перехватывает их и сохраняет в очередях после выполнения надлежащего форматирования, а затем передает в другие базы данных и, если нужно, применяет их там. С его помощью информацию можно захватывать (собирать), передавать и применять и в пределах одной и той же базы данных Oracle, и между двумя базами данных Oracle, и между несколькими базами данных Oracle и даже между базой данных Oracle и базой данных другого типа (не Oracle).
При применении Oracle Streams также можно выполнять преобразование потоков данных на любом из трех следующих этапов: на этапе захвата данных, на этапе их передачи в целевое место и на этапе их применения в целевом месте. В состав событий могут входить сообщения, помещаемые в очередь базы данных приложениями, а также DML- и DDL-изменения. В частности, Oracle Streams можно применять для решения следующий задач.
- Репликация данных. Oracle Streams можно применять для захвата изменений в исходной базе данных, организации и передачи этих изменений в целевые базы данных и их использования или применения в этих целевых базах данных.
- Усовершенствованная организация очередей сообщений. Предлагаемая в составе Oracle Streams функция Advanced Queuing (AQ) позволяет ставить сообщения в очередь, передавать их очередям-подписчикам (subscribing queues), уведомлять приложения пользователей о том, что сообщения уже готовы к эксплуатации, и удалять сообщения из очередей в пункте их назначения.
- Управление событиями и уведомление о них. Возможность перехватывать события и передавать их на основании соблюдения определенных правил позволяет применять Oracle Streams и для уведомления о событиях. События, находящиеся в очереди, могут удаляться из нее явным образом клиентским приложением для обмена сообщениями или другой программой и сопровождаться выполнением на их основании каких-нибудь действий, отправки соответствующего уведомления на адрес электронной почты или мобильный телефон в том числе.
- Загрузка хранилища данных. Oracle Streams может перехватывать изменения, вносимые в производственную базу данных, и затем отправлять их в хранилище данных. В ходе процесса применения этих изменений к данным, перед выполнением их загрузки в целевую базу данных, могут применяться различные операции преобразования.
- Защита данных. Технологию Oracle Streams можно также применять и для обслуживания логической резервной базы данных. Логическая резервная база данных может оставаться открытой для операций чтения и записи и подвергаться запросам по мере применения обновлений. Резервные базы данных являются прекрасным решением для разгрузки производственной базы данных от запросов.
На заметку! Oracle Streams может применяться на нескольких уровнях: на уровне базы данных, на уровне схемы и даже на уровне отдельных таблиц, и использовать для осуществления перехвата изменений на этих уровнях различные правила.
Архитектура Oracle Streams
Тремя базовыми элементами технологии Oracle Streams являются этап захвата, этап подготовки и этап потребления событий внутри базы данных Oracle.
На этапе захвата (capture) осуществляется сбор информации об изменениях из исходной базы данных на уровне таблицы, схемы или всей базы данных. В Oracle Streams события могут захватывать двумя способами: явным и неявным. Явным захватом называется процесс, когда пользователи и приложения вручную помещают события в очередь. Помещаемыми в очередь подобным образом событиями могут быть либо записи об изменениях, содержащиеся в журналах повторного выполнения, либо сообщения определяемого пользователем типа, называемые пользовательскими сообщениями. Неявным захватом называется процесс, когда сервер перехватывает DML- и DDL-изменения из исходной базы данных за счет исследования содержимого активных и архивных журналов повторного выполнения. Процесс неявного захвата выполняется в фоновом режиме и предусматривает участие следующих компонентов.
- Сервер считывания, который считывает журналы повторного выполнения и разбивает их на разделы.
- Один или несколько серверов подготовки, которые сканируют разделы журналов параллельным образом и выполняют предварительную фильтрацию изменений.
- Сервер построения, объединяющий записи из журналов повторного выполнения, которые он получает от серверов подготовки и передает их процессу захвата.
Далее процесс захвата преобразует объединенные записи данных повторного выполнения в логические записи изменений (Logical Change Records — LCR) и передает их на этап подготовки для дальнейшей обработки. Каждая LCR-запись описывает изменения, внесенные в одну строку оператором DML. Один оператор DML может приводить к генерации нескольких LCR-записей. LCR-запись, которая представляет собой набор захваченных изменений, также называется событием (event). LCR-записи, содержащие информацию о данных таблицы, называются логическими записями изменений строк (row LCR), а те, что содержат информацию о DDL-изменениях — логическими записями изменений DDL (DDL LCR). Правила, используемые в процессе захвата, зависят от того, какие изменения захватываются. Обратите внимание, что Oracle Streams можно настраивать так, чтобы база данных могла извлекать изменения из потока данных повторного выполнения в исходном месте и затем передавать в целевое место либо отдельно только LCR-записи, либо весь поток данных повторного выполнения с последующим извлечением необходимых LCR-записей непосредственно в самом целевом месте.
На этапе подготовки (staging) процесс Oracle Streams сохраняет события в очереди. В число этих событий могут входить изменения, захваченные как явным, так и не явным образом.
На последнем этапе, этапе потребления (consumption), находящиеся в очереди события начинают использоваться в целевой базе данных. Перед использованием событие должно удаляться из очереди. Пользователи и приложения могут удалять события из очереди явным образом. Однако по большей части их удаление из очереди происходит все-таки в рамках неявного процесса применения (apply process). Удаление из очереди и обработка захваченных данных осуществляется в соответствии с правилами. В ходе процесса применения захваченные данные могут как применяться напрямую, так предварительно преобразовываться с использованием кода PL/SQL.
Настройка Oracle Streams
Ниже перечислены шаги, которые необходимо выполнить для настройки механизма Oracle Streams и администрирования осуществляемых с его помощью операций по передаче изменений между несколькими базами данных. Следует иметь в виду, что тут предлагается лишь очень краткий обзор процесса настройки Oracle Stream, чтобы у вас могло сложиться общее впечатление о том, что он собой представляет. Для настоящей настройки Oracle Streams следует обязательно использовать соответствующие инструкции, предлагаемые в руководствах по Oracle.
1. Сначала нужно внести необходимые изменения в файл init.ora или SPFILE.
- Проверить, чтобы в параметре COMPATIBLE была указана версия 10.2.0 или выше в обеих базах данных (на самом деле в нем можно даже указывать версию 9.2 или выше).
- Проверить, чтобы для параметра JOB_QUEUE_PROCESSES в исходной базе данных было установлено, как минимум, значение 2.
- Проверить, чтобы для параметра GLOBAL_NAMES как в исходной, так и в целевой базе данных было установлено значение true.
- Установить параметр LOG_ARCHIVE_DEST_n. Нужно, чтобы на сайте, отвечающего за основной процесс захвата, присутствовало хотя бы одно место для размещения архива журналов.
- Проверить, чтобы под компонент памяти STREAMS_POOL_SIZE в SGA было выделено хотя бы 200 Мбайт.
- Удостовериться в том, что табличное пространство является достаточно большим для того, чтобы удовлетворять требования параметра UNDO_RETENTION.
- Удостовериться в том, что исходная база данных функционирует в режиме архивирования журналов (ARCHIVELOG).
2. Затем необходимо создать нового пользователя для управления Oracle Streams. Перед его созданием может потребоваться создать для него новое табличное пространство:
SQL> CREATE TABLESPACE streams_tbs DATAFILE '/u01/app/oracle/oradata/ streams_tbs.dbf' SIZE 100M;
Теперь можно создать в базе данных самого пользователя, ответственного за администрирование Oracle Streams, как показано ниже:
SQL> CREATE USER strmadmin IDENTIFIED BY strmadmin DEFAULT TABLESPACE streams_tbs TEMPORARY TABLESPACE temp QUOTA UNLIMITED ON streams_tbs;
3. Далее нужно выдать пользователю–администратору Oracle Streams (strmadmin) привилегии CONNECT, RESOURCE и DBA:
SQL> GRANT DBA TO strmadmin;
4. Для предоставления необходимых привилегий администратору Oracle Streams следует использовать процедуру GRANT_ADMIN_PRIVILEGE из пакета DBMS_STREAMS_AUTH:
SQL> BEGIN DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE( GRANTEE => 'strmadmin', GRANT_PRIVILEGES => true); END;
5. Затем необходимо создавать канал связи между исходной и целевой базой данных, как показано ниже:
SQL> CREATE DATABASE LINK целевая_база_данных CONNECT TO strmadmin IDENTIFIED BY strmadmin USING 'target.db.world';
6. Oracle Streams осуществляет перемещение данных между исходной и целевой базой данных с помощью очередей. Поэтому далее необходимо создать очередь как в исходной, так и в целевой базе данных. Для этого потребуется выполнить в той и другой следующую процедуру, которая подразумевает создание обеих очередей с принятыми по умолчанию именами.
EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE();
7. Далее нужно включить дополнительную журнализацию для всех тех таблиц в исходной базе данных, для которых планируется перехватывать изменения. Делается это следующим образом:
SQL> ALTER TABLE emp ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE) COLUMNS;
8. И, наконец, напоследок необходимо сконфигурировать процесс захвата в исходной базе данных с использованием процедуры ADD_TABLE_RULES из пакета DBMS_STREAMS_ADM:
SQL> BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => 'scott.emp', streams_type => 'capture', streams_name => 'capture_stream', queue_name => 'strmadmin.streams_queue', include_dml => true, include_ddl => true, inclusion_rule => true); END; /
После настройки Oracle Streams в соответствие с перечисленными выше шагами можно тестировать настроенную конфигурацию, запустив процесс захвата и применив процесс применения для репликации данных таблицы (в данном примере — emp) из исходной базы данных в аналогичную таблицу в целевой базе данных. Для захвата изменений используется следующая процедура:
SQL> BEGIN DBMS_CAPTURE_ADM.START_CAPTURE( capture_name => 'capture_stream'); END; /
Для переноса захваченных изменений в целевую базу данных служит такая процедура:
SQL> BEGIN DBMS_APPLY_ADM.START_APPLY( apply_name => 'apply_stream'); END; /
Технология Oracle Streams была рассмотрена в этой статье моего блога очень кратко. Тем не менее, она представляет собой очень мощное и полезное средство для выполнения в базах данных операций по репликации, переносу и обновлению данных. Главным интерфейсом к Oracle Streams служит соответствующая коллекция поставляемых Oracle пакетов PL/SQL. Здесь было показано, как применять некоторые из этих пакетов для настройки и управления механизмом Oracle Streams, чтобы вы могли посмотреть, что конкретно происходит на этапе захвата и передачи изменений. Для оказания помощи пользователям в настройке, администрировании и мониторинге сред Oracle Streams компания Oracle поставляет специальный инструмент Streams в составе интерфейса OEM Console. Для удобства работы с Oracle Streams рекомендуется использовать именно его.