25 нояб. 2012 г.

Tom Kyte in Moscow - 2012

Москву снова посещает Том Кайт!
11 декабря 2012 годя состоится его семинар в основу которого положены новые возможности следующей версии базы данных Oracle.
Спешите зарегистрироваться - количество мест ограничено !


Место проведения: "Radisson SAS Slavyanskaya пл. Европы, д.2 Москва, Россия"
Дата и время: Вторник, 11 Декабря 2012 09:00 – 18:00
Программа мероприятия и ссылка на регистрацию

Встретимся у Тома Кайта!

30 окт. 2012 г.

Top 12 features in next generation Oracle Database from Tom Kyte

Несомненно, самой главной новостью прошедшего Oracle OpenWorld 2012 был анонс новой версии базы данных Oracle Database. Количество и качество новых возможностей просто поражает, некоторые из них носят глобальный характер (напр: Pluggable Database).
На моей памяти, ни в одной версии СУБД Oracle не было анонсировано столько новых возможностей. Так что нас ждет интересное время!

Мне впервые удалось попасть на Oracle OpenWorld, и только здесь осознаешь огромные масштабы компании: 50 тысяч человек - участников конференции, приехавшие сюда с всего мира, перекрытый центр Сан-Франциско, огромное количество сессий и очень много информации. Я выбирал только сессии посвященные новым возможностям СУБД, но мой день был занят с утра до вечера! К сожалению, не удалось попасть на сессии посвященные другим интересным темам.
Не буду скрывать: чувствуешь некоторую гордость, связанную с причастностью к всему этому.

После прилета (перелет из Москвы в Сан-Франциско занял 16 часов!), самое трудное - это адаптироваться к 11-ти часовой разнице в времени с Москвой. Удалось побывать в центральном офисе Oracle в Redwood city, съездить на мост GoldenGate, а также... прогуляться по кампусу Google. Офис Google произвел впечатление своей оригинальностью и подходом к организации работы сотрудников.
Спасибо за экскурсию сотруднику Oracle Development Team Впадимиру Бегуну !

В последний день Oracle OpenWorld 2012 выступил Том Кайт с рассказом о самых лучших 12-ти новых возможностей следующей версии СУБД Oracle Database. Вот этот список с небольшими моими комментариями.

1. Even better PL/SQL from SQL
Непосредственно в тексте SQL-запроса можно указывать текст PL/SQL-функции, которая вызывается внутри запроса. Цель этого нововведения: уменьшить время переключения между SQL-движком и виртуальной машиной PL/SQL в процессе выполнения запроса. Также появилась новая прагма компилятора PL/SQL, которая позволяет пометить функции вызываемые внутри SQL-запросов. Для таких функций PL/SQL-компилятор генерирует дополнительную информацию для уменьшения затрат на переключение контекста SQL<->PL/SQL. В результате: значительно повысилась скорость выполнения запросов внутри которых вызывается PL/SQL-функции!

2. Improved defaults
Расширение возможностей установки значений по умолчанию для колонок таблиц. Включает в себя две новые возможности:
- автоинкрементные поля (значение которых вставляются автоматически из последовательности);
- установка значения по умолчанию при вставке NULL в поле, при этом в строке таблицы фактически НЕ происходит замена NULL на значение по умолчанию, а устанавливается ссылка на словарь (dictionary based default for NULL).

3. Bigger varchar2, nvarchar2, raw -up to 32K
Поля типа varchar2, nvarchar2, raw теперь могут иметь размер до 32K. Добавлен новый параметр Max_SQL_String_Size в init.ora для включения этой возможности.

4. Top-N and pagination queries
В SQL-запросах теперь поддерживается фраза TOP, FETCH NEXT и OFFSET для получения необходимого количества строк в произвольном окне курсора. Очень полезная возможность при формировании результата запроса, который должны отображаться в многостраничном виде (pagination) !

5. Row pattern matching
С помощью фразы MATCH_RECOGNIZE в SQL-запросе теперь можно получить набор строк которые удовлетворяют определенному условию по времени (time series use case explained). Например: строки в которых объем продаж возрастал, а затем пошел на понижение.

6. Adaptive Execution plans
Динамическое изменение отдельных шагов плана (например замена Nested Loops на Hash Join), если после первого выполнения оптимизатор понял, что ошибся.

7. Partitioning Improvements
Асинхронная перестройка глобальных индексов после операций TRUNСATE или DROP секции. Теперь, после удаления или очистки партиции, глобальные индексы на таблице не переводятся в недействительное состояние, а производится их перестройка в фоновом режиме.

В DDL-операций над секциями теперь можно указывать несколько секций.

Поддержка смешанного секционирования Interval+Reference.
Перемещение секций (ALTER TABLE .. MOVE PARTITION) в online, без остановки. DML-операции при этом не блокируются и продолжают свою работу.

8. Enhanced Statistics
Расчет статистики для временных таблиц на уровне сессии.
Поддержка гибридных гистограмм.
Операции CTAS и INSERT … SELECT автоматически рассчитывают статистику в ходе своего выполнения.

9. Temporary Undo
Теперь undo-сегменты для временных таблиц сохраняются в TEMP-табличном пространстве, а не в UNDO, как это было в прошлых версиях. Раньше, при изменении временных таблиц все равно генерировалось REDO-информация, поскольку производилась запись в UNDO (redo генеривароал undo !). Благодаря этому стала возможна поддержка DML-операций над временной таблицей на StandBy-сервере.

10. Data Optimization
Встроенный Information Lifecycle Management [ILM]
СУБД автоматически сопровождает температурную карту (heat map) данных.
"Холодные" данные автоматически сжимаются и перемещаются на лругие уровние хранения. Политики ILM объявляются декларативно на уровне DDL-операций над таблицами.

11. Transaction Guard
Встроенная инфраструктура для определения факта фиксации транзакции после сбоя. Transaction Guard использует другая мощная технология - Application Continuity. Разработчикм могут использовать Transaction Guard в своих приложениях самостоятельно (независимо от Application Continuity).

12. Pluggable database
Теперь несколько баз данных могут работать в рамках одного набора фоновых процессов и SGA. Применяется для конлидации нескольких БД в едином экземпляре (контейнере). Эта новая возможность потребовала изменения всей архитектуры СУБД Oracle.

Чуть позже после релиза новой версии СУБД будет подробная информация об этой и других новых технологиях,

4 окт. 2012 г.

Flex Cluster and In-memory database

3 октября этот, не побоюсь этого слова, непрерывный "угар" связанных с потоком новых технологий Oracle Database новой версии, продолжился! :-)

Итак, объвлен новый тип кластера - Flex Cluster.

Flex-кластер состоит из узлов имеющих прямой доступ к системе хранения (Hub node) и из узлов которые прямого доступа к storage неимеют (Leaf node). Hub-узлы это хорошо знакомые нам узлы которые работают под управлением Grid Infrastructure. Leaf-узлы подключаются к hub-узлам и как уже было отмечено, общаются с разделяемым диском через hub-узлы (это не мешает им иметь свой локальный storage). На leaf-узлах запускаются экземпляры БД (используется Flex ASM) и приложения.

Поддерживается установка в обычном режиме Oracle Clusterware (как в предыдущих версиях) - без Flex-кластера. Также есть процедура миграции с обычного кластера в режим Flex-Cluster.

Также в новой версии СУБД, в технологию RAC были добавлено много других новых возможностей, вот список того что мне удалось запомнить:
- Shared Grid Name Service - GNS который обеспечивает разыменование для неcкольских кластеров (раньше GNS работал только в пределах одного кластера);

- поддержка нескольких public-сетей и, соответственно одновременная их поддержка в скан-листенерах (раньше public-сеть была только одна);

- установка в листенерах ограничений за регистрацию экземпляров (раньше такого запрета не было, что позволяло злоумышленнику зарегистрировать свой fake-экземпляр и перехватить соединения реальных пользователей, применялся Workaround - использование шифрования соединений по SSL с помощью ASO);

- добавлена возможность выполнения изменения состояния ресурсов в режиме What-If (что-если), то есть моделирование команды без ее фактического выполнения.

Также прошла большая сессия посвященная новым технологиям по работе с памятью. В настоящий момент это действительно проблема: сейчас серверы имеют большой объем оперативной памяти и флеш-памяти, и эффективно его задействовать это не тривильная задача.
В новой версии появилось ряд новых технологий для ее использования.

P.S.

На фотографии слайд с выступдения Andrew Mendelsohn, Senior Vice President Oracle Database Server Technologies посвященной Pluggable Database. Позже на технической сессии, архитектор этой технологии объяснял, что происходит когда БД вставляется в контейнер:
- в случае, если вставляемая БД имеет более старую версию, чем контейнер, то происходит обновление словаря (неявный upgrade!);
- для М-кода (кода виртуальной машины PL/SQL) системных пакетов, которые имеют прямую линковку с бинарниками СУБД (например пакеты dbms_sql, dbms_output и т.д.) происходит неявная рекомпиляция тела пакетов с бинарными файлами контейнера в который БД вставляется .
Я, как и все сидевшие в аудитории, был в шоке ... :-)

2 окт. 2012 г.

Oracle DB новой версии: Application Continuity, Global Data Services and Flex-ASM

После посещения семинаров на Oracle OpenWorld и общения с коллегами из Development Team удалось разобраться с двумя очень мощными технологиями которые будут реализованы в новой версии СУБД: Application Continuity и Global Data Service.

Application Continuity - это возможность автоматического повтора транзакции в случае сбоя соединения к RAC. Как вы помните Transparent Application Failover не защищает от потери транзакции: в случае сбоя в момент выполнения транзакции приложение получает исключение ORA-25402 transaction must rollback.

Фактически, с точки зрения разработчика, Application Continuity выглядит как TAF с типом восстановления "транзакция" (transactional), но реализован не только на стороне клиента, поскольку задействует новую возможность СУБД - Transaction Guard. Transaction Guard - это технология для определения факта фиксации транзакции (или НЕфиксации) после сбоя.

Application Continuity реализована посредством специального драйвера повтора (Replay Driver) на стороне клиента. После сбоя, с помощью Transaction Guard, этот драйвер проверяет факт фиксации транзакции (успел ли пройти commit ?), в случае если транзакция не была зафиксирована, производится ее повтор. Если транзакция успела зафиксироваться, то приложение продолжает работу.

В случае, если повтор транзакции требует восстановления контекста сессии (напрмер: в транзакции есть вызовы PL/SQL которые используют глобальные переменные пакета), разработчик может определить свою функцию обратного вызова (callback), которая будет вызвана перед повтором транзакции. В случае невозможности повтора транзакции (например: между DML-операторами происходила запись в файл с помощью вызова пакета UTL_FILE), разработчик может явно запретить повтор такой транзакции в коде приложения.

Для поддержки сохранения значений последовательностей (если перед сбоем был вызов nextval, повтор транзакции снова "накрутит" последовательность !), введена возможность сохранения их значений для повтора. Аналогичная возможность есть для функций SYSGUID и SYSDATE.

В настоящий момент Replay Driver есть только для JDBC: в дальнейшем обещают и для OCI и ODP.Net.

Другая интересная технология которая появилась в новой версии - это глобальные сервисы (Global Data Services).
Это новый вид сервисов, которые обслуживаются несколькими БД, и данные в этих БД синхронизированы (Например: с помощью Active DataGuard или Golden Gate).
Ключевые особенности глобальных сервисов: - могут быть read-only или read-write;
- соединение с GDS осуществляют специализированные листенеры (GDS-листенер);
- на каждый регион (площадку) имеется свой GDS-листенер;
- формат дескриптора TNS расширен для указания региона к которому относится клиент;
- GDS-листенеры осуществляют балансировку нагрузки между БД;
- в процессе балансировки GDS-листенер учитывает не только степень загрузки БД, но и сетевую задержку до БД и время отставания (все эти параметры задаются в виде атрибутов gds-сервиса);
- информация о gds-сервисах хранится в специальном каталоге который реплицируется между регионами;
- для клиента использование gds-сервиса прозразно, в частности, точно также отрабатывает TAF при потере текущей БД или узла (если это кластерная БД).

Много нового появилось в ASM.
Самое главное новшество - Flex ASM. Идея Flex ASM заключается в том, что теперь экземпляры БД не зависят от одного ASM-экземпляра на текущем узле, а могут задействовать ASM-экземпляры на других узлах. В общем случае на узле может работать только ASM-экземпляр, и может не быть экземпляра БД.
Для поддержки коммуникации с ASM-экземплярами и балансировки нагрузки между ними, вводится новая подсеть - ASM Network (помимо public и interconnect сетей).

На фото: выступдение Andrew Mendelsohn, Senior Vice President Oracle Database Server Technologies, где он рассказывает о другой интересной фиче новой версии - Data Redaction.

Знаю, знаю - у вас возникло много вопросов. :-) Это пока краткий обзор новых технологий Oracle Database новой версии.
Позже будет полная исчерпывающая информация!

Oracle Database новой версии - new features (short list)

Посетив пять (!) докладов посвященных новым возможностям очередной версии СУБД спешу сообщить вам их список. Пока коротко, что удалось запомнить, безусловно потом будет глубокое и подробное описание в постах и в презентациях.

Oracle Database core:
1) В таблицах поля типа varchar2, nvarchar2 и raw могут иметь размер до 32K
2) Data Redaction - маскирование данных прямо на лету, в процессе выборки в приложение
3) Упоминавшаяся ранее Pluggable Database. Для ее поддержки были доработы многие механизмы СУБД, например Resource Manager, чтобы распределять аппаратные ресурсы между базами в контейнере, также были расширены возможности RMAN
4) Встроенный автоматический ILM. Очень мощная технология. Был отдельный семинар посвященный только ей.
5) Невидимые колонки (invisible columns)
6) Переименование файлов данных в online
7) Поддержка автоинкрементных полей (identity column) в таблицах
8) Автоматический сбор локальной статистики (в пределах сессии) для временных таблиц
9) Динамическое изменение отдельных шагов плана (например замена Nested Loops на Hash Join), если после выполнения оптимизатор понял что ошибся.
10) Поддержка фразы "Top N" в запросах.
11) Локальные последовательности, с которыми можно работать на standby-БД
12) Сжатие трафика SQL*Net
13) Возможность записи в временные таблицы на standby-БД

Oracle PL/SQL в новой версии СУБД:
1) Переменные привязки передаваемые в динамический блок могут иметь неSQL-типы (boolean, record и PL/SQL-массивы)
2) Права и роли теперь могут выдаваться непосредственно PL/SQL-объекту (функции, процедуре, типу и пакету). Помимо всего прочего появляется дополнительная защита от SQL-инъекции.
3) Декларативное ограничение видимости вызова PL/SQL-объектов. Теперь не нужно применять описанный мною workaround ! (http://www.igormelnikov.com/2012/07/protect-plsql-api-by-data-vault.html)
4) Декларация UDF-функции прямо в теле запроса (в фразе with) для устранения переключения контекста между SQL и PL/SQL движками. Добавлена специальная прагма компилятора pragma udf для уже существующих функций. Отдельно было сказано, что SQL-движок не содержит в себе свою PL/SQL VM, а просто компилятор генерирует дополнительную информацию для упреждающего формирование контекста вызова PL/SQL-функции в SQL-машине!
5) В Edition base redefinition версионируемость может включается на уровне объекта. В пределах одной схемы теперь потенциально версионируемыми может быть только часть объектов !
6) Функции теперь могут возвращать неявный курсор (например как в MS SQL Server) Пакет dbms_sql расширен для возврата и чтения таких курсоров на уровне PL/SQL. Расширены клиентские библиотеки OCI, ODP.Net и JDBC для работы с такими курсорами на стороне клиента.
7) Внешние библиотеки доступны только через объект Directory, а не через явное указание пути к файлу как это было ранее.
8) Наследование привилегий (INHERIT PRIVILEGES) создателя для IR-функций. Применяется когда вызывающий имеет более высокие права чем создатель и нужно ограничить в правах такую функцию.

Также много нового ждет нас в технологии RAC. Завтра рассказ про Application Continuity и Global Data Services, а также про новые фичи в ASM !

1 окт. 2012 г.

Oracle Database новой версии объявлена !

Свершилось эпохальное событие: объявлена Oracle Database следующей версии !
Среди новых возможностей была анонсирована технология Pluggable Database:
  • несколько баз данных могут работать в рамках одного набора фоновых процессов и SGA (да-да: имеем несколько табличных пространств system и словарей в рамках одного instance !);
  • применяется данная технология для консолидации нескольких БД на одной машине.
Также была анонсирована Exadata X3. Среди новых возможностей:
  • переход на 8-ми ядерные процессоры Intel E2690 в узлах БД;
  • увеличение объема памяти в узлах БД до 128Гб (с возможностью апгрейда до 256Гб);
  • увеличение объема памяти в ячейках хранения до 64 Гб;
  • увеличение объема флеш-памяти в ячейках хранения в 4 раза (до 1600Гб);
  • увеличение быстродействия флеш-памяти на 40% за счет перехода на новые карты памяти.
Попутно была объявлена новая возможность в Storage Software - write-back cache:
  • отложенная запись на жесткие диски с помощью флеш-памяти;
  • работает начиная с версии Storage Software 11.2.3.2.0 (Exadata X3 работает только с этой версией и выше);
  • владельцы прежних версий Exadata могут воспользоваться этой технологией просто обновив софт в ячейках);
  • на узлы БД требуется установка Exadata Bundle Patch 9 (или выше).
Завтра - более подробно о новых технологиях в новой версии СУБД !

9 сент. 2012 г.

SQL*Net and Infiniband SDP for highspeed network

В среде RAC, в некоторых случаях, может потребоваться иметь отдельную выделенную подсеть для подключения клиентов. Например: помимо обычных GUI-приложений, через которые пользователи подключаются к СУБД напрямую, есть мощный кластер серверов приложений, работающий на отдельном выделенном оборудовании, и порождающий интенсивный SQL*Net-трафик. В этом случае, будет хорошей идеей сделать выделенную высокоскоростную подсеть для связи СУБД и сервера приложений.

Подробно процедура настройки сети описана в документе Multiple Public Networks in Private Database Clouds. При попытке претворить эту идею в жизнь вдруг выясняется (раздел 8.2 вышеприведенного документа), что scan-листенер поддерживает перенаправление запросов на соединение только внутри публичной сети по умолчанию (public default network).

Поэтому, для подключения к СУБД через дополнительную подсеть, требуется использовать старый синтаксис (до RAC 11.2) в дескрипторе соединения, с указанием всех узлов кластера.

В качестве примера, рассмотрим настройку SQL*Net-соединения программно-аппаратного комплекса Oracle Exalogic Elastic Cloud подключенного по протоколу Infiniband к SPARC SuperCluster. На фотографии показана вся система в целом, в центре - Exadata Storage Expansion Rack

Первый вопрос который возникает: поддерживается ли протокол SDP в случае когда сервер СУБД работает на SPARC Solaris (узла внутри Sun Super Cluster), а клиент на платформе Linux x64 (узлы внутри Exalogic)?
Документация утверждает, что SDP поддерживается, но при этом ни слова не говорится о платформе (работает на всех платформах ?). Документ MOS "Sqlnet support for the Infiniband SDP protocol [ID 1352737.1]", корректирует информацию, говоря о том, что поддержка Infiniband SDP для SQL*Net есть только для Linux. Позже выяснилось, что документ этот уже устарел, и его еще не успели поправить: поддержка Infiniband SDP для SQL*Net есть также и для Sun Solaris!

По инструкции, описанной в документе "Multiple Public Networks in Private Database Clouds" в Grid Infrastructure была зарегистрирована новая подсеть для SDP и на каждом узле был создан соответствующий листенер.
Настройки листенера выглядят следующим образом (пример с 4-ого узла Super Cluster):
oracle@ssca04:~$ lsnrctl status listener_ib

LSNRCTL for Solaris: Version 11.2.0.3.0 - Production on 09-SEP-2012 21:10:56

Copyright (c) 1991, 2011, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_IB)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER_IB
Version                   TNSLSNR for Solaris: Version 11.2.0.3.0 - Production
Start Date                08-SEP-2012 20:15:19
Uptime                    1 days 0 hr. 55 min. 37 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/11.2.0.3/grid/network/admin/listener.ora
Listener Log File         /u01/app/11.2.0.3/grid/log/diag/tnslsnr/ssca04/listener_ib/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER_IB)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=sdp)(HOST=192.168.11.27)(PORT=1522)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.11.27)(PORT=1522)))
The listener supports no services
The command completed successfully
Для регистрации экземпляра в scan и локальных листенерах применяются параметры LOCAL_LISTENER и REMOTE_LISTENER. В случае, когда регистрация экземпляра необходима в нескольктих листенерах работающих в разных подсетях, нужно применять другой параметр - LISTENER_NETWORKS.

Предварительно, в файле tnsnames.ora на каждом узла кластера, были определены следующих четыре дескриптора (пример для 4-ого узла):
LISTENER_IPLOCAL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ssca04-vip)(PORT = 1521
))
  )

#LISTENER_IPREMOTE =
#  (DESCRIPTION =
#    (ADDRESS = (PROTOCOL = TCP)(HOST = ssca-scan.osc.uk.oracle.com)(PORT = 1521
))
#  )

LISTENER_IPREMOTE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 138.3.16.87)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 138.3.16.88)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 138.3.16.89)(PORT = 1521))
  )

LISTENER_IBREMOTE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ssca01-ibvip)(PORT = 1522))
    (ADDRESS = (PROTOCOL = TCP)(HOST = ssca02-ibvip)(PORT = 1522))
    (ADDRESS = (PROTOCOL = TCP)(HOST = ssca03-ibvip)(PORT = 1522))
  )

LISTENER_IBLOCAL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ssca04-ibvip)(PORT = 1522))
    (ADDRESS = (PROTOCOL = SDP)(HOST = ssca04-ibvip)(PORT = 1522))
  )
Алиасы LISTENER_IPREMOTE и LISTENER_IPLOCAL предназначены для регистрации экземпляров в обычной сети Gigabit-Ethernet. Обратите внимание, что в алиасе LISTENER_IPREMOTE указано не scan-имя кластера, а все три IP-адреса скан-листенеров!
Проблема связана с тем, что PMON НЕ производил разыименование имени в три адреса, а регистрировал экземпляр только в одном скан-листенере. Скорее всего это баг, с которым к сожалению не было времени разбираться.

Алиасы LISTENER_IBREMOTE и LISTENER_IBLOCAL предназначены для регистрации экземпляров в Infiniband SDP-сети.

Рис. 1 Infiniband-кабели подключенные к Exalogic (оранжевые провода - оптические кабели 10Gb Ethernet)

Определяем параметр LISTENER_NETWORKS, предварительно выключая параметры LOCAL_LISTENER и REMOTE_LISTENER:

SQL> alter system reset local_listener scope=both sid='*';

System altered.

SQL> alter system reset remote_listener scope=both sid='*';

System altered.
 
SQL> alter system set 
listener_networks='((NAME=network2)(LOCAL_LISTENER=LISTENER_IBLOCAL)(REMOTE_LISTENER=LISTENER_IBREMOTE))', 
                  '((NAME=network1)(LOCAL_LISTENER=LISTENER_IPLOCAL)(REMOTE_LISTENER=LISTENER_IPREMOTE))' scope=spfile sid='*';

System altered.

SQL> 

Параметр LISTENER_NETWORKS не динамический - после его изменения требуется перезагрузка всех экземпляров кластера.


Рис. 2 Exadata Storage Expansion Rack (суммарная "сырая" емкость 128Тб !)

Как уже было отмечено ранее, на узлах Exalogic, для подключения к СУБД по протоколу SDP, нужно использовать синтаксис с перечислением всех узлов (перенаправление через скан-листенер в Infiniband-сети не работает):
mydb =
  (DESCRIPTION =
    (LOAD_BALANCE=YES)
    (ADDRESS = (PROTOCOL = SDP)(HOST = 192.168.11.24)(PORT = 1522))
    (ADDRESS = (PROTOCOL = SDP)(HOST = 192.168.11.25)(PORT = 1522))
    (ADDRESS = (PROTOCOL = SDP)(HOST = 192.168.11.26)(PORT = 1522))
    (ADDRESS = (PROTOCOL = SDP)(HOST = 192.168.11.27)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

Использование протокола Infiniband SDP позволяет обеспечить очень высокую пропускную способность сети между сервером приложений и СУБД. Это дает возможность еще больше увеличить скорость работы приложений в среде программно-аппаратных комплексов Oracle.

В следующей серии: распараллеливание создания резервной копии с помощью RMAN по протоколу SDP, с всех узлов кластера.

13 июл. 2012 г.

Protect PL/SQL API by Data Vault

Опция Data Vault все время преподносится как средство для защиты БД от администратора. Однако, на самом деле, с ее помощью можно реализовывать дополнительные проверки, сделать которые стандартным функционалом невозможно.

Рассмотрим для примера такую ситуацию: PL/SQL-код приложения состоит из нескольких слоев: слой доступа к данным, слой бизнес-логики и слой обеспечивающий презентационный уровень. Одним словом, есть набор PL/SQL-пакетов и типов реализующих доступ к таблицам, есть PL/SQL-объекты которые содержат в себе бизнес-логику и есть код реализующий визуальный интерфейс приложения (например: пользовательский код в формах APEX).

При этом код, отвечающий за интерфейс пользователя, имеет право вызывать только процедуры бизнес-логики, и не может напрямую обращаться к слою доступа к данным, иначе это может привести нарушению логической целостности данных.

В настоящий момент, стандартными средствами СУБД, невозможно реализовать декларативную проверку на возможность вызова PL/SQL-процедур только в определенном месте.

Для решения этой задачи нам на помощь приходит опция Data Vault. Мы можем создать правило на команду EXECUTE и далее в функции проверки этого правила, проанализировав стек вызовов PL/SQL, разрешить или запретить вызов соответствующей процедуры.

Давайте посмотрим, как все это работает.
В моем приложении работу с репозитарием объектов инкапсулирует объектный тип TObjectRepository. К этому объектному типу непосредственно могут обращаться только следующих три объектных типа:
  • TPersistent - абстрактный тип, его наследники обладают свойством сохранять и читать свое состояние из БД;
  • TDictionary - инкапсулирует работу с справочниками, в связи с особой ролью системных справочников, может напрямую обращаться к API поддержки репозитория;
  • TGroup - инкапсулирует функционал группировки объектов в группы, тоже напрямую может работать с фабрикой объектов.

Для начала создадим функцию осуществляющую проверку возможности вызова:

create or replace function pcl4.check_valid_call return pls_integer is
begin
  if pcl_service.getWhoCallMe in ('PCL4.TPERSISTENT','PCL4.TDICTIONARY','PCL4.TGROUP') then
    return 1;
  end if;

  return 0;
end;
/
show errors;

grant execute on check_valid_call to dvsys;
где функция getWhoCallMe анализируя стек вызовов (с помощью системной функции DBMS_UTILITY.FORMAT_CALL_STACK), возвращает имя PL/SQL-объекта из которого была вызвана текущая проверяемая процедура.
Также не забываем дать права на выполнение функции проверки пользователю DVSYS, поскольку выполнение проверки будет происходит из под него.
Конечно, было бы более правильнее, если бы условие проверки в функции check_valid_call не было бы жестко зашито в код, а читалось из отдельной таблицы. Но сути примера это не меняет.

Далее, подключившись под пользователем владельцем Data Vault (его имя мы указали при установке опции DataVault) определяем правило:
SQL> connect dvpcl/*****
Connected.
SQL>
SQL> declare
  2    v_xRule_set_name  varchar2(90 char)  := 'Проверка вызова PL/SQL-объекта в разрешённом месте';
  3    v_xRule_name      varchar2(90 char)  := 'CHECK_API_LAYER';
  4  begin
  5    --Создаем набор правил
  6    dvsys.dbms_macadm.create_rule_set(rule_set_name   => v_xRule_set_name
  7                                     ,description     => null
  8                                     ,enabled         => dvsys.dbms_macutl.g_yes
  9                                     ,eval_options    => dvsys.dbms_macutl.g_ruleset_eval_all
 10                                     ,audit_options   => dvsys.dbms_macutl.g_ruleset_audit_off
 11                                     ,fail_options    => dvsys.dbms_macutl.g_ruleset_fail_show
 12                                     ,fail_message    => 'Вызов в данном месте НЕ разрешен'
 13                                     ,fail_code       => -20002
 14                                     ,handler_options => dvsys.dbms_macutl.g_ruleset_handler_off
 15                                     ,handler         => null);
 16    -- Создаем правило - указываем код проверки:
 17
 18    dvsys.dbms_macadm.create_rule(rule_name => v_xRule_name
 19                                 ,rule_expr => 'PCL4.CHECK_VALID_CALL = 1');
 20
 21    -- Добавляем вновь созданное правило к нашему набору
 22    dvsys.dbms_macadm.add_rule_to_rule_set(rule_set_name => v_xRule_set_name
 23                                          ,rule_name     => v_xRule_name);
 24
 25    -- Указываем критерии проверки: выполнение (EXECUTE) объектного типа (TOBJECTREPOSITORY) содержащегося в определенной схеме (PCL4)
 26    dvsys.dbms_macadm.create_command_rule(command         => 'EXECUTE'
 27                                         ,rule_set_name   => v_xRule_set_name
 28                                         ,object_owner    => 'PCL4'
 29                                         ,object_name     => 'TOBJECTREPOSITORY'
 30                                         ,enabled         => dvsys.dbms_macutl.g_yes);
 31    commit;
 32  end;
 33  /

PL/SQL procedure successfully completed.

SQL>

Обратите внимание, что проверка будет производится только к вызовам объектного типа TObjectRepository, место вызова остальных PL/SQL-объектов никак не проверяется!
Таким образом, мы можем явно определить PL/SQL-объекты, вызов которых возможен только в определенном месте.

Теперь попробуем обратиться к объекту из произвольной процедуры:
SQL> conn pcl4/*****
Connected.
SQL> create or replace procedure test_dv1 is
  2    v_xObject TPersistent;
  3  begin
  4    v_xObject := TObjectRepository.getObjectById(12345) ;
  5  end;
  6  /

Procedure created.

SQL> show errors;
No errors.
SQL>
SQL> exec test_dv1;
BEGIN test_dv1; END;

*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "PCL4.TOBJECTREPOSITORY", line 248
ORA-06512: at "PCL4.TEST_DV1", line 4
ORA-06512: at line 1

SQL>
Здесь важно отметить, что проверка производится именно в момент вызова, а не компиляции вызывающего PL/SQL-блока.

В общем случае, проверки не ограничиваются только командой выполнения (EXECUTE), вы можете реализовать хитроумные проверки практически для любой команды СУБД.

18 июн. 2012 г.

Oracle stored procedure on Pascal!

Всем хорошо известно, что хранимые процедуры для Oracle Database можно разрабатывать только на двух языках программирования PL/SQL и Java.

Однако ничего не мешает использовать для разработки хранимых процедур любой язык программирования, компилятор которого на выходе может генерировать байт-код виртуальной машины Java. Далее полученный class-файл или jar-файл, можно загрузить в Oracle Database Java VM и вызывать внутри базы данных !

Рассмотрим для примера компилятор языка программирования Pascal Oxygene for Java компании RemObjects. Этот компилятор транслирует исходный код на Object Pascal в байт-код виртуальной машины Java.
Кстати говоря, эта компания имеет в своем арсенале также аналогичный компилятор Oxygene for .Net, который транслирует исходник на Pascal в код исполняющей системы .Net. Этот компилятор лицензирован компанией Embarcadero и входит в состав среды разработки Delphi под названием Delphi Prism.







Итак, предположим, что у нас имеется вот такой простейший класс на Object Pascal:
namespace testPascalSP;

interface

type
  TMyClass = class
  public
    class function getHello :  String;
  end;

implementation

uses
  java.sql.*;

  class function TMyClass.getHello : String;
  begin
    var conn := DriverManager.getConnection('jdbc:default:connection:');
    var stmt := conn.createStatement();  

    var rset := stmt.executeQuery('select ''Hello World!'' from dual');

    if rset.next() then
      Result := rset.getString (1);

    rset.close();
    stmt.close();
  end;

end.
Класс TMyClass имеет одну статическую функцию getHello, которая возвращает традиционное приветствие, "извлекая" его из таблицы DUAL.
Обратите внимание, что в программе на Pascal-е используются Jаva-библиотеки (JDBC-драйвер)!

Компилятор Oxygene for Java существует в двух видах: в виде графической среды разработки которая встраивается в среду MS Visual Studio и в виде утилиты командной строки.

Компилируем исходник на Pascal-е c помощью компилятора командной строки:
C:\>Oxygene.exe testPascalSP.oxygene
RemObjects Oxygene for .NET - Version 5.2.36.1029 (BETA)
Copyright RemObjects Software 2003-2012. All rights reserved.

Source file: C:\PascalSP>Program.pas
Reference: C:\Program Files (x86)\Java\jre6\lib\rt.jar

Compilation successful, generated file ".\bin\Release\testPascalSP.jar"
Пусть вас не смущает вывод названия RemObjects Oxygene for .NET. На самом деле для .Net и Java компилятор общий, и включает в себя back-end и для .Net, и Java. С помощью опций проекта в файле test1.oxygene целевая платформа может переключаться.
Далее полученный jar-файл загружаем в СУБД:
C:\>loadjava -user scott/tiger@orcl -resolve testpascalsp.jar
Осталось создать PL/SQL-оболочку для вызова статического метода Java-класса:
C:\>sqlplus scott/tiger@orcl

SQL*Plus: Release 11.2.0.3.0 Production on Mon Jun 18 20:05:54 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create or replace function getHello return varchar2 is
  2     language java
  3       name 'testpascalsp.TMyClass.getHello() return java.lang.String';
  4  /

Function created.

SQL>
Теперь можно вызывать нашу хранимую процедуру на Pascal внутри СУБД!
SQL> exec dbms_output.put_line(getHello());
Hello World!

PL/SQL procedure successfully completed.
Какие преимущества дает использование другого языка программирования, в данном случае Object Pascal, для разработки хранимых процедур СУБД: Также back-end для JavaVM имеет другой известный компилятор языка Pascal- FreePascal.

10 мая 2012 г.

Template for Enterprise Manager Cloud Control 12c

Новые возможности Enterprise Manager Cloud Control 12c известны уже многим благодаря многочисленным материалам, опубликованным на сайте Oracle


Но для того, чтобы попробовать новые возможности, почему то не у всех получается развернуть Enterprise Manager Cloud Control 12c в своём окружении; у некоторых опускаются руки уже во время подготовки ОС и распаковки дистрибутива :-). 

12-го апреля на сайт https://edelivery.oracle.com/oraclevm был выложен шаблон виртуальной машины с предустановленным Enterprise Manager Cloud Control 12c.
Теперь, для того, чтобы познакомиться с продуктом, достаточно просто развернуть уже готовую виртуальную машину и всего лишь ответить на несколько вопросов при её запуске.

После скачивания Oracle VM Template for Enterprise Manager Cloud Control 12c Media Pack v1 for x86 (64 bit) обязательно прочитайте readme. В этом файле подробно описан процесс распаковки того что вы скачали: сначала нужно разархивировать три архива, а затем объединить полученное в один tar-файл и распаковать.

# unzip V31982-01.zip
# unzip V31983-01.zip
# unzip V31984-01.zip
# cat OVM_EM12*.tgz | tar -xzvf -

В этом же файле readme вы найдёте две инструкции по запуску виртуальной машины:
- Creating Guest Virtual Machine from Oracle VM Template using Oracle Enterprise Manager Cloud Control Console
- Creating Guest Virtual Machine from Oracle VM Template from Oracle VM server terminal

Очевидно Вам нужна вторая, т.к. консоли OEM у вас ещё нет (за исключением тех случаев, когда кто то из вас захочет развернуть в уже существующем Oracle Cloud подклауды :-)

Для разворачивания же на Oracle VM server можно использовать не только Oracle VM 3.0 , а также и OVM 2.2 .

Но тут может возникнуть новая сложность, не все ещё знакомы с OVM  или просто нет в наличии отдельной физической машины для установки OVM server.

Для таких случаев предлагаю воспользоваться другой технологией виртуализации -  Oracle VM VirtualBox. 


Сначала нужно распаковать архивы V3198*-01.zip как указано выше.
Если вы используете VirtualBox for Windows, то вместо "cat OVM_EM12*.tgz" используйте  команду copy:
copy /b OVM_EM12_1of3.tgz+OVM_EM12_2of3.tgz+OVM_EM12_3of3.tgz OVM_EM12.tgz

Полученный файл OVM_EM12.tgz распакуйте и вы получите директорию с тремя файлами:

07.03.2012  03:41    28 994 112 000 em12.img
07.03.2012  03:42     6 720 053 760 System.img
14.03.2012  10:38               305 vm.cfg
               3 File(s) 35 714 166 065 bytes

 

Теперь нужно преобразовать образы дисков виртуальной машины OEM12c к формату , понятному VirtualBox, с помощью утилиты VBoxManage:
D:\OVM_EM12>"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertdd System.img System.vdi
Converting from raw image file="System.img" to file="System.vdi"...
Creating dynamic image with size 6720053760 bytes (6409MB)...

D:\OVM_EM12>"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertdd em12.img em12.vdi
Converting from raw image file="em12.img" to file="em12.vdi"...
Creating dynamic image with size 28994112000 bytes (27651MB)...




Далее нужно просто создать в VirtualBox новую виртуальную машину, указав в качестве носителей полученные образы жёстких дисков:


После старта этой виртуальной машины вы должны будете ответить на несколько вопросов:
IP address, netmask address, hostname, default gateway IP address, DNS server IP address, password for the database account, password for the Agent secure registration, email address if you want Oracle to contact you with security updates.
После ответа на эти вопросы начнётся процесс автоматического конфигурирования всего технологического стека, необходимого для OEM 12c , по окончании которого вам достаточно зайти браузером по адресу https://<вашIP>:7779/em






1 мая 2012 г.

Columnar Compression on Axiom storage

Как вы наверное знаете, технология колоночного сжатия (Hybrid Columnar Compression) работает не только на Exadata, но, в том числе, и на дисковых массивах Pillar Axiom. Рассмотрим процесс настройки и подготовки СУБД для использования HCC на этих системах хранения. В качестве ОС на сервере СУБД был использован Oracle Linux for x86_64. Предполагаем, что на сервере были выполнены все настройки необходимые для доступа к разделам на системе хранения Axiom, то есть был установлен Oracle Linux 5U6, обновлено ядро до последнего UEK и настроен multupathing.

Исходная информация:
  • 1. Поддержка HCC на массивах Axiom есть только начиная с Oracle Database 11.2.0.3.1 и работает только на ASM.

  • 2. Дополнительно параметры совместимости дисковой группы ASM (compatibility и rdbms.compatibility) должны быть выставлены в 11.2.0.3.0

  • 3. Также на дисковой группе, на которой будут размещаться файлы табличных пространств с сжатыми таблицами, должен быть выставлен атрибут storage.type в значение "AXIOM".
Итак, приступим!

Поскольку нам необходимо получить доступ на массиве к объему дискового пространства 10Тб, приходится предварительно создать 5 LUN-ов по 2Тб. Как вы помните, ASM на системах хранения отличных от Exadata, имеет ограничение на размер диска в 2Tb.

Не забудьте создать раздел (primary partition) на каждом из созданных LUN-ов. После этого желательно перегрузить сервер, иначе из-за multipathing-а операционная система может не увидеть новые разделы.

Обычным образом устанавливаем Oracle Grid Infrastructure 11.2.0.3 и создаем дисковую группу с уровнем избыточности External (то есть зеркалирование отдаем на уровень массива) состоящую из 5 разделов. Затем стандартно устанавливаем Oracle Database 11.2.0.3.
Поскольку уже вышел PSU2 (Patch 13696251 - Oracle Grid Infrastructure 11.2.0.3 PSU2) устанавливаем именно его. Перед этим не забываем обновить утилиту OPatch (в обеих каталогах - GI_HOME и DB_HOME!).

Далее нужно создать БД или перенести уже существующую БД на ASM.

Наконец, приступаем к самой ответственной части: настройке БД и ASM.

Устанавливаем параметр compatible на СУБД в значение 11.2.0.3.0:
SQL> alter system set compatible='11.2.0.3.0' scope=spfile sid='*';
System altered.
Корректно останавливаем БД:
[oracle@myhost]$ srvctl stop database orcl

Нужно не забыть также выставить параметр совместимости для нашей вновь созданной дисковой группы ASM.

Переключаемся в окружение Grid Infrastructure:
[oracle@myhost]$ export ORACLE_HOME=/u01/app/11.2.0.3/grid
[oracle@myhost]$ export ORACLE_SID=+ASM

[oracle@myhost]$ sqlplus / as sysasm
SQL*Plus: Release 11.2.0.3.0 Production on Tue May 1 18:04:06 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Real Application Clusters and Automatic Storage Management options


SQL> alter diskgroup data_hcc set attribute 'compatible.asm'='11.2.0.3.0';

Diskgroup altered.

SQL> alter diskgroup data_hcc set attribute 'compatible.rdbms'='11.2.0.3.0';

Diskgroup altered.
И, наконец, выставляем атрибут дисковой группы storage.type в значение "AXIOM".
SQL> alter diskgroup data_hcc set attribute 'storage.type'='AXIOM';

Diskgroup altered.
Именно в этот момент происходит проверка, что дисковая группа действительно создана на системе хранения Axiom. Если при выполнении этой команды Вы получаете вот такое сообщение об ошибке:
ORA-15287: could not set disk group attribute storage.type due to incompatible disks
ORA-15285: disk '/dev/mapper/XXXXXXXX' violates disk group attribute storage.type
это означает, что по какой-то причине ASM не может прочитать название массива на котором созданы LUN-ы, либо это действительно не массив Axiom :-) .

На этом все!
Можно создавать табличное пространство на вновь созданной дисковой группе и сжимать данные ...

21 апр. 2012 г.

Ускорение "1С:Предприятие for Oracle" за счет сжатия таблиц

Кроме выступления Вадима Гусева на мероприятии "Модернизация системы управления бизнесом с помощью ERP-решений 1С с помощью инновационной технологической платформы Oracle" Андрей Забелин демонстрировал возможности OLTP-сжатия для увеличения производительности одного из бухгалтерских отчётов приложения "1С:Предприятие 8.2".



Ролик можно посмотреть здесь.

Как это ни странно на первый взгляд: при сжатии не только уменьшается объем данных на диске, но и возрастает скорость выполнения запроса !

Это происходит за счет уменьшения ввода-вывода (СУБД меньше читает и пишет на диск), а это самая ресурсоёмкая операция. И это происходит не на каком-то искусственном тесте, а в реальном приложении !



Программное окружение было аналогичным как в демонстрации Вадима.

Сервер приложений "1C:Предприятие" также работал под управлением ОС Oracle Linux x64 5U6.



Основная идея демонстрации – показать:

  • Возможности Enterprise Manager для быстрого обнаружения ресурсоёмкого SQL-запроса, который являлся причиной долгого выполнения одного из бухгалтерских отчётов приложения "1С:Предприятие 8.2";

  • Быстрота и удобство анализа плана SQL-запроса;

  • Удобство навигации от плана запроса к редактированию свойств таблицы;

  • Эффективность сжатия данных с помощью Advanced Compression, которое позволяет не только уменьшить объём данных на диске, но и значительно ускорить выполнение запроса за счёт уменьшения количества обрабатываемых блоков.



Поскольку Андрей (как и все мы впрочем) не является специалистом в бухгалтерском учёте, выбранный отчёт «Анализ субконто» и параметры этого отчёта могут показаться опытному бухгалтеру некорректными, но цель была одна - нагрузить БД таким образом, чтобы набор обрабатываемых данных был наибОльшим в тестовой БД.



К сожалению, в текущей версии "1С:Предприятие" не поддерживается настройка сжатия данных таблицы через интерфейс самой 1С, что приводит к возможной потери этой настройки при обновлении конфигурации 1С, но это уже совсем другая история ... Следите за следующими публикациями !



Приятного просмотра!

Cсылка: видео.

15 апр. 2012 г.

Updates for Oracle Linux now free!

Пришла хорошая новость по поводу поддержки Oracle Linux. Теперь скачивание обновлений для этой ОС стало бесплатным !
Раньше для этого нужно было приобретать подписку на ULN (Unbreakable Linux Network).
Для настройки обновлений воспользуйтесь инструкцией на сайте http://public-yum.oracle.com. Затем выполните команду yum update
Рис. 1 Установка обновлений на Oracle Linux


Но ведь RedHat берет за обновление деньги ... :-)

10 апр. 2012 г.

Присоединяйтесь к JavaOne & Oracle Develop 2012

To ensure delivery directly to your inbox, please add replies@oracle-mail.com to your address book today.

JavaOne and Oracle Develop 2012 Russia. 17-18 April. Russian Academy of Sciences, Moscow

Присоединяйтесь к JavaOne & Oracle Develop 2012 сегодня!

Программа JavaOne сессий уже доступна!

В этом году мы снова приглашаем Вас на JavaOne & Oracle Develop, которые опять расположатся в Российской Академии Наук. Oracle предлагает сообществу разработчиков 2 уникальных дня обучения и общения.

Не упустите возможность приобрести билет по цене 1200 рублей.

В этом году мы снова приглашаем Вас на JavaOne & Oracle Develop, которые опять расположатся в Российской Академии Наук. Oracle предлагает сообществу разработчиков 2 уникальных дня обучения и общения.


Конференция JavaOne состоит из четырех потоков Базовая платформа Java, Клиентские технологии, Java Enterprise Edition, Web-сервисы и Облачные Вычисления и Java Micro Edition, Мобильные и Встраиваемые Платформы, Java-карты. А также мастер-классов и Хак-зоны.


В треке Базовая платформа Java четыре доклада представляют инженеры по производительности компании Oracle - Алексей Шипилёв и Сергей Куксенко, которые поделятся накопленным опытом с участниками конференции. Сергей Куксенко об одном из своих докладов: Многоядерные машины стали частью сурового быта: десятком, а то и сотней логических процессоров уже мало кого удивишь. Однако мы до сих пор учимся писать быстрые и корректные программы для этих почти ручных монстриков. Этот доклад посвящён разбору типичных проблем с производительностью параллельных программ, работающих на машинах с разделяемой памятью; описанию их симптомов, а также обсуждению типичных подходов к диагностике и решению проблем


Дуглас Кларк - директор компании Oracle расскажет о настоящем и будущем персистентности в Java и готовности Java к переходу к облачным приложениям.


Направление клиентских приложений будет представлено инженерами Санкт-Петербургского центра разработок Oracle непосредственно участвующих в создании технологии JavaFX. Вы узнаете о новом языке FXML, о тонкостях создания быстрых приложений на JavaFX, увидите интеграцию JavaFX приложения с игровой приставкой, получите возможность принять участие в конкурсе и выиграть ценные призы.


Java занимает все более твердые позиции во встроенных системах. Уже сегодня вы можете прикоснуться к мобильным технологиям, которые завтра будут поддерживаться миллионами устройств по всему миру.


Не пропустите доклады от экспертов признанных сообществом Java разработчиков. Впервые в Москве выступит Бёрт Эртман – обладатель звания Java Champion и являющийся идейным вдохновителем Java User Group в Нидерландах. Берт расскажет о том нужно ли, и если да, то как перейти от Spring к JavaEE 6. Антон Архипов – один из основателей devclub.eu поделится опытом продуктивной разработки JavaEE приложений.

Больше информации на JavaOne and Oracle Develop 2012.

Региcтрация на сайте

Дополнительная информация


адрес: oracle@javaone2012.ru,


телефон: 8 (499) 391-25-72

Hardware and Software, Engineered to Work Together
Oracle Corporation

Copyright © 2012, Oracle
and/or its affiliates.

All rights reserved.

Contact Us | Legal Notices and Terms of Use | Privacy Statement


1 апр. 2012 г.

Особенности работы с сервисами в серверных пулах

Начиная с версии Oracle Database 11.2 появилась новая концепция – серверные пулы (server pools). Работа с сервисами в серверном пуле имеет свои особенности, которые нужно учитывать.
Итак, серверный пул представляет собой группу серверов в кластере, объединенных в некоторое логическое понятие (пул). В кластере могут быть определены несколько серверных пулов. При создании пула указывается набор серверов, минимальное количество серверов в пуле, максимальное количество серверов в пуле и важность (приоритет) пула. Альтернативно, при создании пула можно указать перечень входящих в него узлов.






[oracle@rac2 ~]$ srvctl add srvpool -h

Adds a server pool to the Oracle Clusterware.

Usage: srvctl add srvpool -g  [-l ] [-u ] [-i ] [-n ""] [-f]
    -g      Server pool name
    -l      Minimum size of the server pool (Default value is 0)
    -u      Maximum size of the server pool (Default value is -1 for unlimited maximum size)
    -i      Importance of the server pool (Default value is 0)
    -n ""   Comma separated list of candidate server names
    -f      Force the operation even though some resource(s) will be stopped
    -h      Print usage


При необходимости в серверный пул можно добавлять серверы или же, наоборот, удалять серверы из пула. При создании БД с помощью Database Configuration Assistant [DBCA] определяется тип конфигурации этой БД:
  • Admin-Management (экземпляры создаваемой БД будут жестко привязаны к узлам заданным при создании БД);
  • Policy-Management (экземпляры создаваемой БД НЕ будут привязаны к конкретным узлам кластера, а будут выполняются на любом из серверов пула).

Рис. 1 Создание БД в серверном пуле

Идея серверных пулов состоит в отсутствии привязки ресурсов предоставляемых пользователю в кластере (приложения и базы данных) от конкретных физических серверов. Теперь при создании БД, в ней можно указывать не конкретные серверы, как это было раньше до версии 11.2, а серверный пул. При этом, в случае отсутствия серверного пула, можно сразу же его создать в DBCA. Также при этом задается количество экземпляров БД в пуле (cardinality). Если посмотреть экземпляры БД созданной в серверном пуле, можно увидеть ннтересную картину:
[oracle@rac2 ~]$ srvctl status database -d racdb
Instance racdb_1 is running on node rac2
Instance racdb_2 is running on node rac3
Instance racdb_3 is running on node rac4
Хорошо видно, что любой экземпляр может быть запущен на любом из узлов входящем в пул, и жестко не привязан к определенному узлу, как это было до версии 11.2. Как видите, теперь в локальном каталоге ORACLE_HOME узла не хранится информация об экземпляре. Информация о пулах и о конфигурац2ии БД теперь централизованно храниться в OCR. Управление серверными пулами и ресурсами в нем осуществляется Clusterware. Попробуем добавить сервер в пул, увеличив максимальное число узлов в пуле до 4-х (эксперимент проводился на 4-х узловом кластере):
[oracle@rac2 ~]$ srvctl modify serverpool -g main -u 4 -f
[oracle@rac2 ~]$ srvctl status database -d racdb
Instance racdb_4 is running on node rac1
Instance racdb_1 is running on node rac2
Instance racdb_2 is running on node rac3
Instance racdb_3 is running on node rac4
Автоматически на новом сервере был запущен новый экземпляр, при этом для него “на лету” были созданы undo-табличное пространство и redo-поток ! Понятно, что при использовании пулов для доступа к БД мы обязаны использовать Single Access Client Name [SCAN], поскольку заранее не знаем: на каких конкретно узлах будет выполняться тот или иной экземпляр БД. Данная технология в сочетании c делегированием DNS в домен кластера (Grid Naming Service) называется Grid Plug In Play [GPnP], и позволяет изменять состав серверного пула без необходимости изменения клиентских (файл tnsnames.ora) и сетевых (DNS-сервер) настроек.

Поскольку теперь экземпляры не привязаны к конкретному узлу и могут работать на любом сервере, входящем в пул, при создании сервиса мы не можем указать списки предпочтительных и резервных узлов.

Для решения этой проблемы вводится понятие "тип сервиса", который может иметь два значения:
  • Uniform
  • Singleton
Сервисы типа iniform одновременно могут выполняться на всех узлах серверного пула, типа singleton – в каждый момент времени выполняются только на одном экземпляре внутри пула. При создании сервиса с помощью утилиты srvctl, его тип задается с помощью ключа “–c” который может иметь значения UNIFORM для сервиса одновременно работающих на всех узлах пула :
[oracle@rac2 ~]$ srvctl add service -d racdb -s dss -c uniform
[oracle@rac2 ~]$ srvctl start service -d racdb -s dss
[oracle@rac2 ~]$ srvctl status service -d racdb -s dss
Service dss is running on nodes: rac1,rac2,rac3,rac4
Очевидно, что тип сервиса можно указывать только для Policy-Management БД. Если нужно гарантировать, чтобы сервис всегда работал только одном узле, то в значении ключа указывается SINGLETON:
[oracle@rac2 ~]$ srvctl add service -d racdb -s oltp -c singleton
[oracle@rac2 ~]$ srvctl start service -d racdb -s oltp
[oracle@rac2 ~]$ srvctl status service -d racdb -s oltp
Service oltp is running on nodes: rac1
В случае, если необходимо принудительно переместить сервис с одного узла на другой, точно также применяется команда relocate service утилиты srvctl, только вместо экземпляров указывается имена серверов (hostname):
[oracle@rac2 ~]$ srvctl relocate service -s oltp -d racdb -c rac1 -n rac2 -f
[oracle@rac2 ~]$ srvctl status service -d racdb -s oltp
Service oltp is running on nodes: rac2

Где:
- параметр –c определяет сервер, на котором нужно остановить сервис;
- параметр –t определяет сервер, на котором нужно запустить сервис.
- опциональный параметр –f определяет необходимость принудительно завершить все текущие сессии на узле заданном параметром -c, в случае его отсутствия все активные сессии продолжают свою работу, а новые будут создаваться только на узле заданном параметром –n.

12 мар. 2012 г.

TAF метод SELECT

В общем случае TAF, переключив приложение на другой узел кластера, не может прозрачно продолжить работу этого приложения, поскольку у погибшей сессии был контекст который неоткуда взять (активные транзакции, значения переменных PL/SQL, параметры сессии установленне с помощью команд ALTER SESSION). Однако существуют приложения, для которых это возможно прозрачно сделать. Это DSS-приложения, то есть приложения ориентированные на получение отчетов. В процессе работы приложения этого типа в основном выполняют SQL- запросы.
В отличие от типа SESSION, при использовании метода SELECT Oracle Client помимо создания новой сессии производит восстановление открытых курсоров “погибшей” сессии.

Проверим, как работает метод SELECT, предварительно определив в файле tnsnames.ora следующий алиас:
RACDB_SELECT =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.cluster.us.oracle.com)(PORT = 1521))
    (FAILOVER = yes)
    (CONNECT_DATA =
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = BASIC)
      )
      (SERVICE_NAME = racdb.us.oracle.com)
    )
  ) 

Откроем сессию в sqlplus с помощью вышеприведенного дескриптора соединения и по традиции проверим, к какому узлу кластера мы имеем соединение:

C:\RACDD4D\v4.1>sqlplus rscott/rtiger@racdb_select
SQL*Plus: Release 11.2.0.3.0 Production on Sat Jan 28 16:58:19 2012
Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, Real Application Clusters and Automatic Storage Management options

SQL> SELECT dbms_utility.current_instance FROM dual;

CURRENT_INSTANCE
----------------
               2

Таблица accounts в схеме rscott содержит 200 тыс. записей. Поле acc_id этой таблицы было заполнено с помощью генерации последовательных значений последовательности (sequence).
SQL> SELECT COUNT(*) FROM accounts;

  COUNT(*)
----------
    200000

SQL>DESC accounts
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ACC_ID                                    NOT NULL NUMBER(6)
 ACC_NUM                                            VARCHAR2(20)
 ACC_CUR                                            VARCHAR2(3)
 ACC_BAL                                            NUMBER
 CUS_ID                                             NUMBER(6)
 ACC_STATUS                                         VARCHAR2(3)
 ACC_DATE_CREATED                                   DATE

SQL>

Запустим на выполнение простой запрос к этой таблице. После начала его выполнения подключимся непосредственно на второй узел и аварийно завершим экземпляр, на котором выполняется запрос, с помощью команды SHUTDOWN ABORT:
SQL> SELECT acc_id FROM accounts ORDER BY 1;
    151619
    151620
    151621
    151622
    151623
    151624

    ACC_ID
----------
    151625
    151626
    151627
    151628


В момент сбоя выполнение запроса “замораживается” на несколько секунд, а потом продолжается со следующей записи как ни в чем ни бывало!
151629
    151630
    151631
    151632
    151633
... ... ...
    199998
    199999
    200000

200000 rows selected.

   SQL> SELECT dbms_utility.current_instance FROM dual;

CURRENT_INSTANCE
----------------
               3


Как вы видите, с использованием типа SELECT, технология TAF позволяет помимо сессии также восстановить и состояние курсоров приложения. При этом продолжение выполнения запроса произошло абсолютно прозрачно для приложения: оно и не подозревало, что запрос завершил свое выполнение на другом (в данном случае третьем) узле.
На самом деле для того, чтобы обеспечить такую “магию”, Oracle Client производит большую работу. До момента сбоя, выполняя запрос, Oracle Client хранит в памяти клиентского компьютера:
  • текст запроса и значение его параметров (переменных привязки);
  • SCN на момент начала запроса;
  • количество прочитанных строк до момента сбоя;
  • рассчитанную контрольную сумму прочитанных строк.

Рис. 1 Иллюстрация алгоритма работы типа SELECT


После сбоя, переключившись на другой узел, Oracle Client производит следующие действия:
  • выполняет на этом узле запрос на момент времени заданный SCN на начало запроса;
  • незаметно для приложения прочитывает столько же строк результата запроса, сколько было прочитано до сбоя;
  • снова рассчитывает контрольную сумму прочитанных строк.
  • сравнивает полученную контрольную сумму с той, которая была до момента сбоя;
  • если значения старой и новой контрольных сумм совпадают, то продолжает чтение следующих строк и возвращает их приложению;
  • если значения старой и новой контрольных сумм не совпадает, то приложению выдается исключение “ORA-25408: can not safely replay call”, и выполнение запроса прерывается.
SCN на момент начала запроса нужен для того, чтобы гарантировать неизменность содержимого выборки после переключения на другой узел, поскольку за время прошедшее от начала выполнения до момента сбоя, содержимое запроса могло измениться.
Расчет контрольной суммы прочитанных строк необходим для проверки того, что порядок возвращаемых строк в запросе не изменился. Как вы помните, Oracle Database не гарантирует порядок результирующих строк запроса, если конечно это явно не определено фразой ORDER BY. Поэтому может получиться так, что после переключения, строки будут возвращены в другом порядке.

Часто и в OLTP-приложениях имеются модули формирования отчетности, поэтому применение метода SELECT также может быть востребовано и в транзакционных системах.

14 февр. 2012 г.

TAF and non failover exception

Все вы хорошо знаете технологию Transparent Application Failover [TAF],
также знаете о том, что она предназначена для защиты от сбоя текущего узла (Failover).

Стоит отметить важный момент, про который часто возникает недопонимание: технология TAF реализуется полностью клиентом СУБД, то есть соответствующая функциональность включена в Oracle Client, и предназначена только для защиты от сбоя соединения. Это означает, что TAF НЕ может защитить от ошибок возникающих в стеке ПО Oracle.

Рассмотрим небольшой интересный пример, предварительно определив в файле tnsnames.ora следующий алиас с поддержкой TAF с типом SELECT:
RACDB_SELECT =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.cluster.us.oracle.com)(PORT = 1521))
    (FAILOVER = yes)
    (CONNECT_DATA =
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = BASIC)
      )
      (SERVICE_NAME = racdb.us.oracle.com)
    )
  ) 

Откроем сессию в sqlplus с помощью вышеприведенного дескриптора соединения, и по традиции проверим, к какому узлу кластера мы имеем соединение:
C:\RACDD4D\v4.1>sqlplus rscott/rtiger@racdb_select
SQL*Plus: Release 11.2.0.3.0 Production on Sat Jan 28 16:58:19 2012
Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, Real Application Clusters and Automatic Storage Management options

SQL>SELECT dbms_utility.current_instance FROM dual;

CURRENT_INSTANCE
----------------
               3
Затем выполним запрос по большой таблице в параллельном режиме (Parallel Query), но в момент его выполнения "неожиданно" аварийно завершим экземпляр на другом узле – отличном от того, с которого был инициирован запрос. При этом на “упавшем” узле выполнялась часть подчиненных процессов (Parallel Query Slave):

SQL> alter table accounts parallel;
Table altered.

SQL> SELECT acc_id FROM accounts ORDER BY 1;
    1
    2
    3
    4
    5
    6
... ... ...

Пока наш запрос выполняется, аварийно остановим, например. четвертый экземпляр:
[oracle@rac4 ~]$ sqlplus / as sysdba

SQL> shutdown abort;
ORACLE instance shut down.
В этот момент выполнявшийся запрос неожиданно прерывается по ошибке:
ACC_ID
----------
    93925
    93926
    93927
    93928
    93929
    93930
    93931

ERROR:
ORA-12805: parallel query server died unexpectedly
В данном случае запрос прервался из-за того, что стали недоступны параллельные подчиненные процессы (Parallel Query Slave) на 4-ом узле. При этом сама сессия в полном порядке – третий узел работоспособен !
Произошла ошибка на прикладном уровне Oracle, не связанная с сбоем соединения, поэтому TAF в данном случае ничем не может нам помочь !