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
Итак, объвлен новый тип кластера - 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 работал только в пределах одного кластера);
Также прошла большая сессия посвященная новым технологиям по работе с памятью. В настоящий момент это действительно проблема: сейчас серверы имеют большой объем оперативной памяти и флеш-памяти, и эффективно его задействовать это не тривильная задача.
В новой версии появилось ряд новых технологий для ее использования.
На фотографии слайд с выступдения 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
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-функций. Применяется когда вызывающий имеет более высокие права чем создатель и нужно ограничить в правах такую функцию.
1 окт. 2012 г.
Oracle Database новой версии объявлена !
Среди новых возможностей была анонсирована технология Pluggable Database:
- несколько баз данных могут работать в рамках одного набора фоновых процессов и SGA (да-да: имеем несколько табличных пространств system и словарей в рамках одного instance !);
- применяется данная технология для консолидации нескольких БД на одной машине.
- переход на 8-ми ядерные процессоры Intel E2690 в узлах БД;
- увеличение объема памяти в узлах БД до 128Гб (с возможностью апгрейда до 256Гб);
- увеличение объема памяти в ячейках хранения до 64 Гб;
- увеличение объема флеш-памяти в ячейках хранения в 4 раза (до 1600Гб);
- увеличение быстродействия флеш-памяти на 40% за счет перехода на новые карты памяти.
- отложенная запись на жесткие диски с помощью флеш-памяти;
- работает начиная с версии Storage Software 11.2.3.2.0 (Exadata X3 работает только с этой версией и выше);
- владельцы прежних версий Exadata могут воспользоваться этой технологией просто обновив софт в ячейках);
- на узлы БД требуется установка Exadata Bundle Patch 9 (или выше).
9 сент. 2012 г.
SQL*Net and Infiniband SDP for highspeed network
Подробно процедура настройки сети описана в документе
Multiple Public Networks in Private Database Clouds.
При попытке претворить эту идею в жизнь вдруг выясняется (раздел 8.2 вышеприведенного документа), что scan-листенер поддерживает перенаправление запросов на соединение
только внутри публичной сети по умолчанию (public default network).
Поэтому, для подключения к СУБД через дополнительную подсеть, требуется использовать старый синтаксис (до RAC 11.2) в дескрипторе соединения, с указанием всех узлов кластера.
Первый вопрос который возникает: поддерживается ли протокол 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-сети.
Определяем параметр LISTENER_NETWORKS, предварительно выключая параметры LOCAL_LISTENER и REMOTE_LISTENER:
Параметр LISTENER_NETWORKS не динамический - после его изменения требуется перезагрузка всех экземпляров кластера.
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>
Как уже было отмечено ранее, на узлах 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
Рассмотрим для примера такую ситуацию: PL/SQL-код приложения состоит из нескольких слоев: слой доступа к данным, слой бизнес-логики и слой обеспечивающий презентационный уровень. Одним словом, есть набор PL/SQL-пакетов и типов реализующих доступ к таблицам, есть PL/SQL-объекты которые содержат в себе бизнес-логику и есть код реализующий визуальный интерфейс приложения (например: пользовательский код в формах APEX).
При этом код, отвечающий за интерфейс пользователя, имеет право вызывать только процедуры бизнес-логики, и не может напрямую обращаться к слою доступа к данным, иначе это может привести нарушению логической целостности данных.В настоящий момент, стандартными средствами СУБД, невозможно реализовать декларативную проверку на возможность вызова PL/SQL-процедур только в определенном месте.
Для решения этой задачи нам на помощь приходит опция Data Vault. Мы можем создать правило на команду EXECUTE и далее в функции проверки этого правила, проанализировав стек вызовов PL/SQL, разрешить или запретить вызов соответствующей процедуры.
Давайте посмотрим, как все это работает.В моем приложении работу с репозитарием объектов инкапсулирует объектный тип TObjectRepository. К этому объектному типу непосредственно могут обращаться только следующих три объектных типа:
- TPersistent - абстрактный тип, его наследники обладают свойством сохранять и читать свое состояние из БД;
- TDictionary - инкапсулирует работу с справочниками, в связи с особой ролью системных справочников, может напрямую обращаться к API поддержки репозитория;
- TGroup - инкапсулирует функционал группировки объектов в группы, тоже напрямую может работать с фабрикой объектов.
Для начала создадим функцию осуществляющую проверку возможности вызова:
где функция getWhoCallMe анализируя стек вызовов (с помощью системной функции DBMS_UTILITY.FORMAT_CALL_STACK), возвращает имя PL/SQL-объекта из которого была вызвана текущая проверяемая процедура.
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;
Также не забываем дать права на выполнение функции проверки пользователю DVSYS, поскольку выполнение проверки будет происходит из под него.
Конечно, было бы более правильнее, если бы условие проверки в функции check_valid_call не было бы жестко зашито в код, а читалось из отдельной таблицы. Но сути примера это не меняет.
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!
Однако ничего не мешает использовать для разработки хранимых процедур любой язык программирования, компилятор которого на выходе может генерировать байт-код виртуальной машины 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, для разработки хранимых процедур СУБД:- В организации существуют большие объемы бизнес-логики реализованные на Delphi, которые можно относительно легко перенести с стороны клиента на сторону СУБД;
- В организации много разработчиков, которые хорошо знают Delphi, но до этого не работали с PL/SQL;
- Хотите использовать для разработки мощный и современный язык программирования поддерживающий аспектно-ориентированное программирование и контрактное программирование;
- Если Вы просто любите язык программирования Object Pascal!
10 мая 2012 г.
Template for 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 V31983-01.zip
# unzip V31984-01.zip
В этом же файле readme вы найдёте две инструкции по запуску виртуальной машины:
- 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
Исходная информация:
- 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" за счет сжатия таблиц
Ролик можно посмотреть здесь.
Как это ни странно на первый взгляд: при сжатии не только уменьшается объем данных на диске, но и возрастает скорость выполнения запроса !
Это происходит за счет уменьшения ввода-вывода (СУБД меньше читает и пишет на диск), а это самая ресурсоёмкая операция. И это происходит не на каком-то искусственном тесте, а в реальном приложении !
Программное окружение было аналогичным как в демонстрации Вадима.
Сервер приложений "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!
Раньше для этого нужно было приобретать подписку на ULN (Unbreakable Linux Network).
Для настройки обновлений воспользуйтесь инструкцией на сайте http://public-yum.oracle.com. Затем выполните команду yum update
Но ведь 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.
|
1 апр. 2012 г.
Особенности работы с сервисами в серверных пулах
Итак, серверный пул представляет собой группу серверов в кластере, объединенных в некоторое логическое понятие (пул). В кластере могут быть определены несколько серверных пулов. При создании пула указывается набор серверов, минимальное количество серверов в пуле, максимальное количество серверов в пуле и важность (приоритет) пула. Альтернативно, при создании пула можно указать перечень входящих в него узлов.
[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 (экземпляры создаваемой БД НЕ будут привязаны к конкретным узлам кластера, а будут выполняются на любом из серверов пула).
Идея серверных пулов состоит в отсутствии привязки ресурсов предоставляемых пользователю в кластере (приложения и базы данных) от конкретных физических серверов. Теперь при создании БД, в ней можно указывать не конкретные серверы, как это было раньше до версии 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
[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
В отличие от типа 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 на момент начала запроса;
- количество прочитанных строк до момента сбоя;
- рассчитанную контрольную сумму прочитанных строк.
После сбоя, переключившись на другой узел, Oracle Client производит следующие действия:
- выполняет на этом узле запрос на момент времени заданный SCN на начало запроса;
- незаметно для приложения прочитывает столько же строк результата запроса, сколько было прочитано до сбоя;
- снова рассчитывает контрольную сумму прочитанных строк.
- сравнивает полученную контрольную сумму с той, которая была до момента сбоя;
- если значения старой и новой контрольных сумм совпадают, то продолжает чтение следующих строк и возвращает их приложению;
- если значения старой и новой контрольных сумм не совпадает, то приложению выдается исключение “ORA-25408: can not safely replay call”, и выполнение запроса прерывается.
Расчет контрольной суммы прочитанных строк необходим для проверки того, что порядок возвращаемых строк в запросе не изменился. Как вы помните, Oracle Database не гарантирует порядок результирующих строк запроса, если конечно это явно не определено фразой ORDER BY. Поэтому может получиться так, что после переключения, строки будут возвращены в другом порядке.
Часто и в OLTP-приложениях имеются модули формирования отчетности, поэтому применение метода SELECT также может быть востребовано и в транзакционных системах.
14 февр. 2012 г.
TAF and non failover exception
также знаете о том, что она предназначена для защиты от сбоя текущего узла (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 в данном случае ничем не может нам помочь !