21 нояб. 2011 г.

"1C:Enterprise" now work on Exadata


Произошло эпохальное событие: "1C:Предприятие" поддерживает Exadata!

Как вы помните 1С уже достаточно давно поддерживает Oracle Database 11.2.0.2 на платформе Linux x64. Для запуска 1С на данной платформе необходимо установить три патча: 10094732, 11724916, 9620994.
Собственно узлы БД (database node) Exadata и работают под управлением Oracle Database 11.2.0.2 и Linux x64.

Сейчас ошибки (баги), которые исправляют вышеописанные патчи, были устранены и на Exadata.
Итак: "1С:Предприятие" работает на Exadata при условии установки на database node двух патчей:
    - Exadata Bundle Patch 9
    - Patch 13251038

Огромная благодарность за помощь в получении патчей и масштабное тестирование "1С:Предприятие" на Exadata сотрудникам компании "Fors" !

16 нояб. 2011 г.

22 ноября: Москва: OTN Developer Day 2011


22 ноября в гостинице «Бородино» по адресу ул. Русаковская д. 13/2 (недалеко от метро Красносельская) в рамках Oracle Technology Network Developer Day Database пройдут

Мастер-классы по разработке приложений для Oracle Database 11g.


Мероприятие пройдет в формате двух параллельных мастер-классов:
  • разработка приложений с помощью Oracle Application Express (APEX)
  • pазработка .NET-приложений с помощью Oracle Data Provider for .NET (ODP .Net)
Участие в мероприятии бесплатно при условии предварительной регистрации здесь. Обращаем Ваше внимание на то, что все материалы мастер-классов предоставляются на английском языке.

Для участия в мероприятии Вам необходимо иметь с собой ноутбук, удовлетворяющий следующим техническим требованиям:
  • операционная система Windows, Linux или Mac
  • минимум 2 ГБ оперативной памяти
  • минимум 20 ГБ свободного дискового пространства
  • VirtualBox 4.1.6
По всем вопросам регистрации просим обращаться к Екатерине Ивкиной по электронной почте ekaterina.ivkina в домене oracle.com или по телефону +74956411400.

Update 1:

Огромная благодарность всем участникам за проявленный интерес !!!

Материалы семинара доступны по ссылкам ниже: Инструкции к лабораторным работам доступны на сайте Oracle Learning Library (oracle.com/oll).
Рекомендую сделать все предложенные нами лабораторные работы, если возникнут какие-либо вопросы - пишите в коментарии к этому посту или по адресу andrey.zabelin в домене oracle.com .

Виртуальная машина, использовавшаяся на треке APEX, доступна на странице Developer Day - Hands-on Database Application Development.

Update 2:


Как выяснилось на мероприятии на компах с процессором AMD необходимо выполнить дополнительные настройки для запуска виртуальной машины. Проблема заключается в управлением энергопотреблением APIC под Linux на процессорах AMD.
Linux зависает при старте, перед запуском виртуальной машины нужно снять галку в свойствах (см. скриншот) .

На работоспособность APEX внутри виртуальной машины эта настройка не влияет ;-)

Есть другой вариант - отредактировать файл /grub/boot/menu.lst и добавить опцию "noapic nolapic acpi=off" в секцию boot в гостевой операционной системе Linux.

6 нояб. 2011 г.

Database As Service. Part1 (Создание шаблона БД)

На прошедшем Oracle Day я рассказывал презентацию про подготовку инфраструктуры для облачных вычислений. Была затронута тема предоставления заказчикам базы данных как сервиса - Database As Service [DBaaS].
Тема эта относительно новая, и мне хотелось бы рассмотреть ее более подробно.

Введение
DBaaS - это копцепция БД которая представляет собой ресурс в облаке. Пользователь не знает, где физически находится эта БД. Как и любой другой ресурс в облаке, эта база данных автоматически создается по запросу пользователя.
Затем заказчик работает с этой БД обычным образом: работает с ней через приложение или использует для задач разработки или тестирования. Также пользователь, если в этом возникла необходимость, может удалить ресурс - БД при этом автоматически удаляется.

Очень часто в организациях постоянно требуется создавать БД типовых конфигураций используемых в компании. Иногда эти БД нужны на определенное время, например для задач тестирования. Эта рутинная работа ложится на плечи DBA, которые и так, особенно в крупных компаниях, сильно перегружены. Идея DBaaS состоит в автоматизации получения готовой типовой БД, чтобы, как и для любого другого ресурса в облаке, БД создавалась по запросу пользователя и автоматически производился учет и оплата ее использования.

Концептуально, в иерархии ресурсов облака, DBaaS лежит между уровнями "Инфраструктура как сервис" [IaaS] и "Платформа как сервис" [PaaS]. В качестве инфраструктуры база данных может использовать непосредственно железо сервера, то есть может быть установлена непосредственно на операционной системе аппаратного сервера, либо может работать в виртуальной машине.

DBaaS обеспечивает следующие преимущества:

10 окт. 2011 г.

15 сент. 2011 г.

Oracle Cloud File System

Сейчас я занимаюсь подготовкой демонстрации ACFS для семинара по Облачным вычислениям. Часть демонстрации посвящена шифрованию. Многие  знают, что для закрытия конфиденциальной информации на уровне Oracle Database есть механизмы TDE (Transparent Data Encryption). Показать, что все работает, в этом случае, достаточно просто: включить шифрование, добавить записи в таблицу, взять любой «просмоторщик» бинарных файлов, открыть файл БД и показать, что данные  нечитабельны.

Замечательно! А как быть, если TDE включено для  файловой системы? Если у вас нет прав на объект, то вы не получаете доступ. Если доступ есть, то TDE абсолютно прозрачно и расшифровывает данные налету для вас независимо от приложений, при любом доступе к файлу который хранится на диске. При копировании на незащищенный диск автоматически происходит расшифровка. Т.е. в процессе тестирования ACFS Security вела себя абсолютно прагматично: есть права - получите, нет прав - до свидания и have a nice day! :-)
Пример команд. Действительно, просто без погружения в Realms :)

Тем не менее, способ есть. Можно производить поиск информации на уровне тома (volume), например из под root выполнив: dd, strings  и т.д.. Также не стоит забывать про файловый кэш (для очиски в Linux, например можно использовать команду "sync"). Т.к. блоки файлов пользователя шифруются при «переливке» с кеша на диск. В итоге, все удалось решить.

Кроме этого, ACFS (маркетинговое название - Cloud FS) позволяет организовать репликацию файлов между серверами в рамках одного ЦОД или нескольких площадок. Многие знают, что для защиты данных БД от катастроф, как правило, используется Oracle Data Guard. Но как быть с файлами приложений или бинарными файлами Oracle Homes?  Как раз для решения такой задачи Cloud FS Replication может помочь, причем, передача данных идет по обычным IP каналам.
Демонстрация будет прадставлена на следующем семинаре ....


Самое главное ! 20-ого сентября, в офисе Oracle будет проходить мероприятие для партнеров - «Облачные вычисления. Построение дата центров нового поколения». Партнеры, приходите, будет много интересного!

Информация  о регистрации  и детали мероприятия здесь.


9 сент. 2011 г.

ЦФТ - переход на 11.2

Как и обещал: выкладываю свою презентацию по переходу на 11g R2 с семинара "Миграция банковских комплексов ЦФТ на СУБД Oracle 11g"

Ссылки для скачивания:
презентация
Полный вариант

5 сент. 2011 г.

Database 11g XE released!

Наконец-то вышел в релиз Oracle Database 11g Express Edition. Поддерживаются только две платформы: win32 и linux_x64. Почти все ограничения остались прежними (RAM - максимум 1Gb, используется только 1CPU), кроме одного: объем пользовательских данных может теперь составлять 11Gb !

Создан Database XE 11g на основе кодовой базы 11.2.0.2:


C:\>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on Mon Sep 5 11:16:23 2011

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


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production

SQL>

Ccылка на скачивание: Oracle Database Express Edition 11g Release 2

P.S. К сожалению внутри Database XE установлен APEX старой версии (4.0.2) - нужно вручную устанавливать новую версию - Application Express 4.1

28 авг. 2011 г.

TAF Failover and commit

На очередном семинаре "RAC is simple" был получен интересный вопрос о странном поведении TAF в ситуации Failover (автоматического переключения сессии при сбое текущего узла) в случае, когда приложение выдает фиксацию транзакции (делает commit).

Действительно, есть особенность поведения TAF связанная с тем, что оператор COMMIT, помимо выдачи исключения ORA-25405, дополнительно еще и сбрасывает маркер активной транзакции на клиенте - собственно начинает новую транзакцию.

Но обо все по порядку...

Как вы хорошо знаете, при сбое текущего узла Oracle Client (конечно если была включена поддержка TAF в дескрипторе в файле tnsnames.ora), прозрачно для приложения открывает новую сессию на другой узел.
Если сессия до сбоя имела некоторый контекст либо активную транзакцию, то при обращении к Oracle Call Interface возникает исключение. Этих исключений несколько - все они начинаются с префикса ORA-254xx.
Самый распространенный случай - на клиенте была активная транзакция; в этом случае приложение получает исключение "ORA-25402 transaction must rollback".

Используем вот такой дескриптор соединения в tnsnames.ora
racdb_taf =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(host = rac-scan)(PORT = 1521))
      (FAILOVER = true)
    )
    (CONNECT_DATA =
      (failover_mode=
        (type=session)
        (method=basic)
        (retries=2)
      )
     (SERVICE_NAME = racdb.rac.com)
    )
  )


Подключаемся к кластеру по алиасу racdb_taf:
[oracle@racc ~]$ sqlplus rscott/rtiger@racdb_taf

SQL*Plus: Release 11.2.0.2.0 - Production on Sun Aug 28 19:07:27 2011

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

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

SQL> select dbms_utility.current_instance from dual;

CURRENT_INSTANCE
----------------
               1
SQL>rem Мы подключены к первому узлу


Выполняем вставку записей, но НЕ фиксируем транзакцию:
SQL> insert into taf_demo values(1);

1 row created.

SQL>
Подключаемся напрямую на узел, на котором "живет" наша сессия (в данном случае на первый узел), и аварийно завершаем экземпляр:
rac2-> ssh rac1
Last login: Sun Aug 28 18:38:50 2011 from 192.168.1.95
rac1-> sqlplus / as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on Sun Aug 28 19:13:45 2011

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


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

SQL> shutdown abort;
ORACLE instance shut down.
SQL>

Возвращаемся в нашу сессию, которая была подключена к "погибшему" узлу, и пытаемся продолжить работу:
SQL> insert into taf_demo values(2);
insert into taf_demo values(2)
*
ERROR at line 1:
ORA-25402: transaction must roll back

SQL> select * from taf_demo;
select * from taf_demo
*
ERROR at line 1:
ORA-25402: transaction must roll back

SQL>


Все происходит согласно теории: маркер активной транзакции был установлен, но сессии уже нет, вернее есть (TAF автоматически произвел переключение на другой узел), - это уже другая сессия!

Попробуем сделать то, что сделал слушатель семинара: выдадим операцию commit:
SQL> commit;
commit
*
ERROR at line 1:
ORA-25405: transaction status unknown

SQL>

Мы получили другое исключение! Все верно - статус транзакции не определён, поскольку клиент имел незавершенную транзакцию и, незавершив ее, переключился на другой узел.
Теперь самое интересное: выдадим какой-нибудь DML-оператор:
SQL> insert into taf_demo values(2);

1 row created.

SQL> select * from taf_demo;

        ID
----------
         2

SQL> select dbms_utility.current_instance from dual;

CURRENT_INSTANCE
----------------
               2
SQL>rem Мы автоматически переключились к второму узлу

SQL>


После оператора commit работа может быть продолжена!
То есть оператор commit, помимо выдачи исключения, производит то, что он обычно делает - начинает новую транзакцию.

Поэтому, если в TAF после сбоя текущего узла первым будет выполнен оператор commit, то нужно обрабатывать другое исключение, и при этом делать rollback уже НЕ обязательно!

26 авг. 2011 г.

Oracle VM 3.0 released!

Наконец-то произошло это эпохальное событие: вышел OracleVM 3.0 !
Список новых возможностей можно почитать здесь.

Ключевое новшество, на мой взгляд, - это переход на ветку кода Xen 4.0, и все вытекающие отюда преимущества.

Скачать дистрибутив можно здесь.
Обращаю ваше внимание, что Oracle VM 3.0 поддерживает только x86_64 платформу, хотя сами виртуальные машины могут быть и 32-х битными!

И в очередной раз стоит напомнить, что OracleVM - это бесплатный продукт, платная только поддержка (приобретается если необходима).

15 авг. 2011 г.

dbms_session.is_session_alive in RAC

На семинаре RAC is simple один из слушателей заявил, что функция is_session_alive из пакета dbms_session не работает в RAC. Неужели есть еще один функционал, который не работает в RAC, и нужно будет добавлять новую проверку в утилиту RACChecker ?
Давайте проверим !

rac1-> sqlplus rscott/rtiger@racdb2

SQL*Plus: Release 11.2.0.3.0 Beta on Sun Aug 14 21:21:54 2011

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

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


SQL> set serveroutput on
SQL> --Наша сессия открыта на втором узле:
SQL> exec dbms_output.put_line(dbms_utility.current_instance);
2

PL/SQL procedure successfully completed.

SQL> --Выясняем id нашей сессии:
SQL> exec dbms_output.put_line(dbms_session.unique_session_id);
002A00630002

PL/SQL procedure successfully completed.

SQL> --запускаем некую активность в этой сессии:
declare
  k number;
begin
  for i in 1..20000000
  loop
    dbms_lock.sleep(300);
    k := i;
  end loop;
end;
/

Оставив эту сессию выполняться, подключаемся к другому узлу кластера
(к первому узлу - к экземпляру racdb1), и пытаемся проверить статус нашей активной сессии:
rac1-> sqlplus rscott/rtiger@racdb1

SQL*Plus: Release 11.2.0.3.0 Beta on Sun Aug 14 21:24:21 2011

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

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


SQL> set serveroutput on
SQL> --Наша сессия открыта на первом узле:
SQL> exec dbms_output.put_line(dbms_utility.current_instance);
1

PL/SQL procedure successfully completed.

SQL> begin
  if dbms_session.is_session_alive('002A00630002') then
    dbms_output.put_line('Session active !');
  else
    dbms_output.put_line('Session not active !');
  end if;
end;
/
Session active !

PL/SQL procedure successfully completed.

SQL> 
Как Вы видите, в сессии на первом узле прекрасно виден статус активности другой сессии,
которая выполняется на другом узле !

Таким образом вызов dbms_session.is_session_alive полностью поддерживает RAC!

Возможно проблема была связана с Bug 6440088 DBMS_SESSION.IS_SESSION_ALIVE does not work properly in RAC
Этот баг был устранен в 10.2.0.5.


P.S.
На фото - новое издание бестселлера Тома Кайта "Oracle для профессионалов" на русском языке, переработанное с учетом технологий Oracle 11g.

8 авг. 2011 г.

Oracle Linux 5 Update 7 released

Анонсирован выпуск Oracle Linux 5 Update 7

Oracle Linux 5.7 содержит исправление ошибок, а также обновление 18-ти сетевых драйверов и 12-ти драйверов для систем хранения данных.

Oracle Linux 5.7 доступен для загрузки на странице http://edelivery.oracle.com/linux (требуется регистрация).
Список изменений - здесь.




29 июл. 2011 г.

Будни PL/SQL-хакера (Часть 1)

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

Том Кайт "Oracle для профессионалов"

Мы начинаем цикл лекций глав из жизни PL/SQL-хакера. PL/SQL-хакер - это собирательный образ человека, который долгие годы серьезно программирует на PL/SQL и решает сложные задачи стараясь "выжать" из PL/SQL максимум. В своей работе он часто сталкивается с сложными задачами, которые наверняка приходилось решать и вам. Думается многим из вас будут интересны оригинальные решения сложных задач реализованные PL/SQL-хакером!




PL/SQL-хакер всю свою сознательную жизнь программировал на PL/SQL, и старался избегать использования других языков программирования. Сегодня заказчик "подкинул" ему задачу, для решения которой никак не получалось ограничиться только PL/SQL-процедурой.
Нужно было по окончании обработки данных в БД, выполнить командную утилиту на сервере, на котором работает база. Эта командная утилита для каждой платформы была своя, и предварительно ее нужно было скопировать на сервер.

Хорошо, - выполнить консольную утилиту на сервере из PL/SQL не проблема: можно использовать например External table preprocessing, но ведь предварительно придется вручную скопировать туда эти утилиту, да еще и не забыть передать их заказчику.
Да еще наверняка студент-админ, по ошибке, скопирует на сервер файл не для нужной платформы !

Нельзя ли как нибудь скопировать бинарный файл утилиты с клиентской машины прямо из PL/SQL-процедуры, и потом выполнить его?
- Стоп!
- Откуда она его скопирует?
- Ведь PL/SQL-процедура (или скрипт SQL+) это всего лишь текст, откуда он скопирует бинарный файл ?

Задача выглядела неразрешимой ...

Но PL/SQL-хакер не привык отступать. Как часто его раздражали программисты, пишущие код на новомодных Java и C#, которые "рожали" тысячи строк кода, когда как на PL/SQL это можно реализовать парой десятков строк.

Вопрос выглядел безумным: может ли исходный текст PL/SQL-процедуры нести в себе бинарный файл ?

Ничего не приходило в голову.
Привычным движением руки PL/SQL-хакер взял с полки нетленную книгу Стива Ферстайна "Oracle PL/SQL. Для профессионалов".
Нет - ничего не получалось.

Подошел конец рабочего дня. Поставив на закачку очередной GI PSU Patch 11.2.0.2.3, PL/SQL-хакер засобирался домой. "Патчи у оракла становятся все жирнее и жирнее", - подумал он, залочив компьютер.

Cтоя в метро он начал перелиcтывать распечатку документации, вчитываясь в описания системных пакетов.
Неожиданно внимание PL/SQL-хакера привлекла девушка в красном платье. Платье плотно облегало ее тело, подчеркивая достоинства фигуры. Взгляд PL/SQL-хакера машинально переводился с документации на эту девушку и обратно.

Мысленно поругав себя за то что отвлекся, PL/SQL-хакер повернулся к девушке спиной, и снова принялся читать документацию.
И тут его осенило: он дошел до описания пакета UTL_ENCODE
Этот пакет позволял декодировать BASE64-строки в бинарный эквивалент.
Поэтому прямо в PL/SQL-коде можно получить из BASE64-строки соответствующий поток байтов и получившийся BLOB уже копировать на файловую систему.
PL/SQL-хакеру не терпелось быстрее добраться до дома и проверить эту идею. Дома его ждал недавно собранный мощный компьютер на основе процессора с ядром Intel Sandy Bridge, 16Гб оперативной памяти и SSD-диском.

Первым шагом нужно было написать утилиту, которая переведет бинарный файл в BASE64-строку, и далее вставить эту строку в PL/SQL_процедуру в виде varchar2-константы.
Придя домой и наскоро поужинав, PL/SQL-хакер принялся за работу.
После часа работы и банки пива такая утилитка была написана:
C:\Work\Projects\plslsq_hacker>plsql_base64.exe girlInRed.jpg girlInRed.sql

Base64 for PL/SQL converter: Release 1.0.0.0.0 - Production on 16.07.2011 12:56:50
Utility for generation sql-file for binary files
Copyright (c) 2011, PL/SQL-hacker.  All rights reserved.

Usage:  plsql_base64.exe <input filename> <output filename> [PL/SQL Variable name]

Examples:
        plsql_base64.exe logo.gif logo.sql

 Read file "girlInRed.jpg" ...
 Done.

Program finished.


На выходе эта утилита генерировала текстовый файл с константой в виде BASE64-строки соответствующей бинарному файлу:
v_xGirlInRed := 'UEVSRk9STUVSICJEaWdpdGFsIEVtb3Rpb25zIg0KVElUTEUgIjEyMiINCkZJTEUgIkZvbmFyZXZf
........
NjoyODo0OQ0K';

Код PL/SQL-функции конвертации BASE64-строки в BLOB получился тривиальным:
function  getBlob(v_pBase64Str in out nocopy varchar2) return blob is
    v_xRes  blob;
    v_xRaw  raw(32000);
  begin
    dbms_lob.createtemporary(v_xRes, true);

    v_xRaw := utl_raw.cast_to_raw(v_pBase64Str);
    v_xRaw := utl_encode.base64_decode(v_xRaw);
    dbms_lob.write(lob_loc => v_xRes,
                   amount  => dbms_lob.getlength(v_xRaw),
                   offset  => 1,
                   buffer  => v_xRaw);
    return v_xRes;
  end;


"Теперь нужно написать функцию сохранения BLOB-а в файл" - подумал PL/SQL-хакер, дожевывая засохшую воблу и запивая ее противным теплым пивом. Такая функция уже была когда-то им написана для другого заказчика, осталось просто вставить ее исходник в итоговый скрипт (для записи в файл использовался пакет UTL_FILE):
procedure saveBlobToFile(v_pBlob          in blob,
                             v_pDirectoryName in varchar2, 
                             v_pFileName      in varchar2) is
      v_xFile                      utl_file.file_type;
      v_xWrittenSofar              pls_integer := 0;     
      v_xChunkSize        constant pls_integer := 4096;
      v_xBuf                       raw(4096);
      v_xBytesToWrite              pls_integer;
      v_xLobLen                    pls_integer;
    begin
      v_xLobLen := dbms_lob.getlength(v_pBlob);
      v_xFile   := utl_file.fopen(v_pDirectoryName, v_pFileName, 'WB');
    
      while (v_xWrittenSofar + v_xChunkSize < v_xLobLen)
      loop 
        v_xBytesToWrite := v_xChunkSize;
        dbms_lob.read(v_pBlob,v_xBytesToWrite,v_xWrittenSofar+1,v_xBuf);
        utl_file.put_raw(v_xFile,v_xBuf);
        v_xWrittenSofar := v_xWrittenSofar + v_xChunkSize;
      end loop;
    
      v_xBytesToWrite := v_xLobLen - v_xWrittenSofar;
      dbms_lob.read(v_pBlob,v_xBytesToWrite,v_xWrittenSofar+1,v_xBuf);
      utl_file.put_raw(v_xFile,v_xBuf);
      utl_file.fclose(v_xFile);
    end;

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

Поэтому было решено оптимизировать его размер с помощью сжатия: BASE64-строка получается из бинарного файла предварительно упакованного утилитой gzip. Далее в PL/SQL коде, после получения соответствующего BLOB-а, производится его распаковка встроенным пакетом UTL_COMPRESS, и только затем полученный таким образом BLOB сохраняется в файл:

...  ...  ...
  -- Extract BASE64-string to blob
  v_xCompressedBlob := getBlob(v_xBase64Str);

  -- Uncompress blob ...
  v_xBlob := utl_compress.lz_uncompress(v_xCompressedBlob); 

  -- Save blob to file ...
  saveBlobToFile(v_xBlob,:v_gExecutionDir, 'bin_exec.exe');
  ...  ...  ...

Для того, чтобы не засорять library cache лишним кодом, в компилируемый исходник включается только одна BASE64-константа - для нужной платформы. Для этого используется условная компиляция, символ который вычисляется предварительно "на лету" в отдельном анонимном блоке и выставляется в нативном динамическом SQL c помощью DDL-команды alter session ccflags=.

Удовлетворенно нажав Ctrl-S в текстовом редакторе, PL/SQL-хакер отправил итоговый скрипт заказчику и лег спать. В сне ему приснилась девушка из метро, в этот раз она просто шла по улице. Она смотрела на PL/SQL-хакера и улыбалась. На ней была одета футболка, спереди которой характерным шрифтом графического SQL+ была напечатана надпись "PL/SQL procedure successfully completed."

Рабочий скрипт, проделывающий эти манипуляции, любезно предоставлен PL/SQL-хакером и его можно посмотреть здесь. Консольная программа заменена на программу, которая просто выдает на экран "Hello World &имя_платформы". Для уменьшения размера скрипта поддерживаются только платформы Win32, Win_x64, Solaris x64, Linux_x86 и Linux_x64.

PL/SQL в очередной раз доказал свою мощь и эффективность!

Каким образом решена проблема установки выполняемого бита из PL/SQL для сохраненного файла на Unix-платформе ? Для решения этой проблемы пришлось применить Java для вызова chmod x+, - здесь, к сожалению, только средствами PL/SQL не удалось обойтись.

На очереди у PL/SQL-хакера уже была другая интересная задача - обфускация кода PL/SQL. Об этом он обещал рассказать потом...

27 июл. 2011 г.

Client Load Balancing in RAC 11.2 (Update 1 - LOAD_BALANCE=YES нужен!)

Возникает много вопросов по поводу балансировки на стороне клиента в Real Application Cluster 11.2. Ведь с использованием Single Client Access Name ее как-бы нет, поскольку в tnsnames.ora на клиенте указывается лишь один адрес.

Небольшой экскурс в историю. До версии 11.2 в описании алиса в файле tnsadmin.ora на клиентской машине, то есть на компьютере c установленным ПО Oracle Client, и на котором работает приложение, перечислялись все узлы кластера, а также указывался параметр LOAD_BALANCE=TRUE|ON|YES. Например (для 4-х узлового кластера):



OLTP = 
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip.us.oracle.com)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip.us.oracle.com)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac3-vip.us.oracle.com)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac4-vip.us.oracle.com)(PORT = 1521))
    (LOAD_BALANCE = YES)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oltp.us.oracle.com)
    )
  )

При подключении, Oracle Client случайным образом выбирает один из адресов (в вышеописанном примере - один из четырех) и делает по нему попытку подключения.
В случае сбоя, например если выбранный узел кластера в настоящий момент неработоспособен, процесс подключения повторяется среди оставшихся узлов.
Стоить отметить, что этот алгоритм полностью прозрачен для приложения, то есть оно не подозревает, что работает балансировка, а получает соединение так, как если бы это был обычный некластерный сервер БД (Single Instance).

Все просто и логично: в результате работы клиентской балансировки, запросы на открытие сессии равномерно распределяются по всем узлам кластера (если быть точнее - по узлам перечисленным в файле tnsnames.ora).

Так было до версии 11.2, теперь же нужно указывать всего лишь один, так называемый scan-адрес

OLTP=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = scan.cluster.us.oracle.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oltp.us.oracle.com)
    )
  )

Обратите внимание, что в имени появился новый поддомен (subdomain) кластера, но об этом в следующей серии ...

Получается, что теперь серверной балансировки нет, и мы сразу попадаем на scan-листенер ?
Нет - это не так, поскольку имени scan-адреса в DNS соответствует три IP-адреса. В Grid Infrastructure имеется три scan-листенера с своими виртуальными IP-адресами (Virtual IP address), и в DNS-сервере этому имени должны быть поставлены в соответствие эти три VIP-адреса.

На Рисунке 1 вы видите, что вывод команды dig scan.cluster.us.oracle.com показывает, что это имя в DNS соответствует трем адресам.



Рис. 1 Имени scan-адреса соответствует три адреса в DNS


Дальше все очень просто: Oracle Client извдекает из DNS адреса scan-листенеров и далее процесс повторяется так, как если бы вы указали в tnsnames.ora три адреса. Использование технологии SCAN позволяет избавиться от необходимости изменения файлов tnsnames.ora на всех клиентских машинах при удалении/добавлении узлов кластера.

На Рис. 2 приведен вывод трассировочного файла Oracle Client, на котором виден процесс разыменовывания scan-имени в три адреса.


Рис. 2 Извлечение адресов scan-листенеров в Oracle Client


Таким образом, клиентская балансировка в 11.2 есть, но работает только между тремя scan-листенерами. Это, как и в предыдущих версиях, позволяет защитить scan-листенеры от "шторма" сессий. Ведь задача этих прослушивающих процессов состоит лишь в осуществлении серверной балансировки, то есть в перенаправлении запросов на соединение на локальный листенер наименее загруженного узла.
Поэтому трех листенеров в большинство случаев вполне достаточно, чтобы защититься от "шторма" сессий. Если же в кластере много узлов и scan-листенеры страдают от шторма сессиий то есть возможность их добавить, то есть создать новые с помощью команды srvctl add scan_listener.

Для того, чтобы прозрачно использовать SCAN, рекомендуется при переходе на RAC 11.2 так же обновить и версию Oracle Client, поскольку старые версии клиента Oracle не "понимают" такое составное разыменование. В этом случае можно порекомендовать использовать балансировку через DNS, то есть чтобы сам DNS-сервер возвращал один из трех адресов случайным образом. Разумеется DNS-сервер должен поддерживать такую возможность.

Литература:
    OTN: Single Client Access Name

Update 1
Исследования показали, что даже в случае использования scan-имени параметр LOAD_BALANCE=YES все-таки нужен!
Oracle Client всего-лишь производит разыменование в адреса scan-листенеров, но автоматически НЕ производит балансировку.
В случае если не указать параметр LOAD_BALANCE, то соединение всегда будет происходить на первый scan-листенер в списке.



Рис. 3 Oracle Client делает соединение по первому scan-листенеру в списке


Если же задать параметр LOAD_BALANCE=YES|TRUE|ON в описании соединения, то все работает как надо: scan-листенер выбирается случайным образом.

OLTP=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = scan.cluster.us.oracle.com)(PORT = 1521))
    (LOAD_BALANCE=YES)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oltp.us.oracle.com)
    )
  )


Рис. 4 Oracle Client выбирает scan-листенер случайным образом


Итак, не забудьте указать LOAD_BALANCE=YES, даже если Вы используете scan-имя!

P.S. Согласно документации значение по умолчания ON для параметра LOAD_BALANCE устанавливается только если он указан для тэга DESCRIPTION_LIST.

26 июл. 2011 г.

Готовые образы виртуальных машин

Многие не знают, что сейчас c сайта OTN вы можете скачать виртуальные машины с установленными продуктами Oracle.
Образы виртуальных машин созданы в формате VirtualBox.
Обратите внимание, что в виртуальные машины установлены самые свежие версии продуктов.
Например ВМ для разработчика приложений баз данных включает в себя, помимо другого ПО, установленные Oracle Database 11.2.0.2, APEX 4.0.2 и TimesTen 11.2.1.8.0 !
Также внутри образа установлены все лабораторные работы по соответствующей тематике.

Скачать можно здесь.

P.S. Другое новшество, которое Вы заметите, пройдя по вышеописанной ссылке, - OTN "заговорил" по-русски!
:-)

21 июл. 2011 г.

Семинар "RAC is simple" - лабораторная работа по TAF


Недавно в Партнерской академии Форс прошел второй семинар "RAC is simple"

Особенность этого семинара в том, что он предназначен как для разработчиков, так и для администраторов. На мой взгляд, это было правильное решение - объединить контент как для DBA, так и для разработчиков, поскольку сложно разделить материал и, тем более, он одновременно полезен обеим категориям слушателей.

Это очень мощный семинар, - длится три дня и насыщен лабораторными работами. Если Вы планируете стать серьезным "раководом", то, определенно Вам нужно посетить этот семинар.

Чтобы попасть на семинар, Вам нужно обратиться в Партнерскую Академию Форс, либо непосредственно к разработчику семинара - Дмитрию Кучугурову (dmitry.kuchugurov at gmail.com).

С любезного согласия Дмитрия (второй справа на фото) публикую методичку лабораторной работы по Transparent Application Failover .

P.S. Не случайно групповое фото участников сделано на фоне Exadata - внутри у нее тот же самый Real Application Cluster !

20 июл. 2011 г.

VMWare linux guest optimization for Oracle

Я хотел бы немного затронуть тему использования ПО Oracle Database внутри виртуальных машин VMWare с точки зрения их оптимальной настройки.
Многие заказчики используют гипервизоры VMWare - это конечно безусловный лидер рынка виртуализации на платформе x86, и мне часто приходится сталкиваться с темой "медленной работы оракла на VMWare".

Вот перечень рекомендаций по использованию ПО Oracle в виртуальной машине VMWare.




Диски виртуальной машины

1. Рекомендуется в гостевой машине сделать отдельные диски для ОС, файла подкачки (swap), временных файлов (temp), выполняемых файлов Oracle (каталогов ORACLE_HOME), файлов данных БД (oradata), и (по необходимости) для FRA.
Наличие отдельных дисков позволит:
- гибко расширять диски, если вдруг неожиданно виртуальный диск переполнится, например: когда при установке патча у Вас не хватило места, вы можете пересоздать виртуальный диск бОльшего размера и "перелить" на него данные;
- распределить vmdk-файлы по разным дискам (контроллерам) для балансировки ввода-вывода на хост-машине, например: вы можете положить swap-файл на SSD-диск.

2. Желательно чтобы имена файлов дисков виртуальных машин (vmdk-файлы) имели "говорящие" названия, например: system.vmdk, swap.vmdk, temp.vmdk, orahome.vmdk, oradata.vmdk, fra.wmdk.

3. Не рекомендуется делать thin-диски для файлов данных БД.
Поскольку, как правило, файлы данных табличных пространств делают autoextend и происходит "двойное" расширение vmdk-файлов: на первом шаге расширяется vmdk-файл, на втором - tablespace-файл внутри виртуальной машины. Что замедляет работу ВМ.
Варианта два:
- напрямую отдать под виртуальный диск раздел хост-машины (этот вариант конечно предпочтительный, но не всегда есть такая возможность);
- при создании виртуального диска заранее распределить место в vmdk-файле,
для расширения такого раздела можно использовать LVM гостевой системы, либо ASM (что предпочтительее);


Рис.1 Создание виртуального диска c предварительным выделением пространства


4. Для хранения файлов данных рекомендуется использовать ASM. ASM исключает уровень файловой системы при работе с файлами БД, что благотворно влияет на производительность СУБД. Дополнительно ASM обеспечивает функции Volume Manager.

5. Установка VMWare Tools является обязательной. Рекомендуется установить самую последнюю версию!

6. Для дисков виртуальных машин, которые планируется использовать для Oracle (orahome,oradata, fra) рекомендуется использовать паравиртуальные SCSI-контроллеры VMWare. Это самое последнее поколение виртуальных контроллеров VMWare, которые обеспечивает наивысшую производительность.
Для использования паравиртуальных SCSI-контроллеров в VMWare Player и VMWare Workstation (в VMWare VSphere для этого есть GUI-интерфейс) после создания диска нужно:
- переместить виртуальный диск на отдельный свободный SCSI-контроллер, например с SCSI0 на SCSI1;
- вручную открыть файл конфигурации ВМ (vmx-файл) и в нем для выбранного контроллера указать тип pvscsi, например: меняем строку
scsi1.virtualDev = "lsilogic"
на
scsi1.virtualDev = "pvscsi"

Рис.2 Перемещение виртуального диска на свободный SCSI-контроллер

Внимание: перевод на VMWare Paravirtual SCSI контроллеры осуществляется только после установки VMWare Tools, поскольку соответствующие драйвера в виртуальную машину устанавливаются именно с ними.

7. Рекомендуется сделать выравнивание дисков виртуальных машин. То есть обеспечить совпадение границ кластеров на файловой системы гостевой ОС и файловой системе VMware хост-машины (VMFS). Для этого в виртуальной машине при создании раздела на виртуальном диске с помощью утилиты fdisk проделайте следующие действия:
- запустите fdisk указав в качестве параметра соответствующее устройство, например
fdisk /dev/sdg
- наберите команду "n" для создания нового раздела;
- укажите "p" для создания primary-раздела;
- укажите "1" для номера раздела;
- нажмите два раза клавишу Enter для принятия параметров по умолчанию значений первого и последнего цилиндра диска (под раздел отводится целиком весь диск);
- введите конмадну "t" для указания типа раздела
- далее введите команду "fb" для того чтобы вновь созданный раздел имел тип "VMware VMFS volume";
- перейдите в расширенный режим (expert mode) утилиты fdisk введя команду "x";
- введите команду "b" для задания первого блока;
- укажите номер раздела "1";
- укажите начальный блок "128"
- и, наконец, введите команду "w" для записи изменений на диск.

Создание файловой системы на созданном таким образом разделе осуществляется обычным образом, например: mkfs -t ext3 /dev/sdg1


Рис.3 Выравнивание раздела на виртуальном жестком диске


8. После окончания настройки и установки ПО Oracle, рекомендуется сделать сжатие (shrink) системного и oracle_home дисков виртуальных машин.
Для этого в виртуальной машине вывовите управляющую утилиту VMWare Tools, набрав команду vmware-toolbox &
Далее перейдите на вкладку "Shrink" и, выбрав нужный диск, нажмите кнопку "Shrink"


Рис.4 Сжатие виртуального диска


9. В завершениие, рекомендуется дефрагментировать диски виртуальной машины средствами гипервизора.


Рис.5 Дефрагментация диска виртуальной машины в VMware Player


Настройка сети виртуальной машины
В качестве сетевых виртуальных интерфейсов рекомендуется использовать паравиртуальные драйвера VMWare VMxnet. (в VMWare VSphere для этого есть GUI-интерфейс). Для этго вручную откройте vmx-файл виртуальной машины и поменяйте тип сетевого адаптера на "vmxnet3", например:
меняем
ethernet0.virtualDev= "e1000"
на
ethernet0.virtualDev = "vmxnet3"


Настройка ПО внутри виртуальной машины
Внутри виртуальной машины Linux отключите службы НЕ нужные для работы ПО Oracle, такие как: anacron, apmd, atd, autofs, cups, cupsconfig, gpm, isdn, iptables, kudzu, netfs и portmap.

После окончания настройки и установки ПО Oracle, рекомендуется перевести Linux на виртуальной машине в 3-й режим загрузки (чтобы не грузилась графическая оболочка). Для этого в файле /etc/initab нужно поменять строку id:5:initdefault: на id:3:initdefault:


Литература
Vmware: Recommendations for Aligning VMFS Partitions
Vmware: Performance Comparison of Virtual Network Devices
Vmware: Oracle Databases on VMware Best Practices Guide
Quest Software: Tips for Optimal Virtualized Oracle Databases

18 июл. 2011 г.

MOS 1335999.1 Russia abandons DST in 2011

Как вы хорошо знаете, в России, начиная с этого года отменено летнее время.
Соответственно, если в вашей БД используются данные с типом TIMEZONE, то вам нужно заранее озаботится этой проблемой. Очень подробный документ на сайте Oracle Support целиком посвященный этой теме - 1335999.1 "Russia abandons DST in 2011". Крайне рекомендуется к прочтению.

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

Мне в документе больше всего понравилось вот это предложение:
"For Questions/official statements about the DST change itself, please contact the Russian Government"
:-)

Update 1
Отдельный респект в создании этого документа инженеру EMEA Mission Critical Services Сергею Качановскому !

14 июл. 2011 г.

Combo patches

Начиная с версии 11.2.0.2.0 Oracle начал предоставлять так называемые combo-патчи, которые содержат как online-патч, так и offline-патч для исправления определённого бага.

Online патч - это патч, который устанавливается, пока экземпляр БД находится в запущенном состоянии. Таким образом online-патч, модифицирует образ Oracle в памяти (т.е. экземпляр), при этом сами бинарные файлы не модифицируются!

Установка патча в online рекомендуется для того, чтобы избежать лишней остановки работы пользователей БД (тем самым уменьшая unplanned downtime).

Устанавливаетя combo-патч в online c помощью следующего вызова утилиты opatch:
opatch apply online -connectString SID:USERNAME:PASSWORD
или в случае c RAC:
opatch apply online -connectString SID:USERNAME:PASSWORD:NODE1,SID2:USERNAME:PASSWORD:NODE2,...


Обрати внимание что при установке патча в online нужно указывать экземпляр, так в
общем случае нужно знать на какой из них накатывать патч !

Как обычно, команда
opatch lsinventory
отображает информацию о установленных патчах в том числе и об online-патчах.

После установки online-патча файлы .pch (это бинарный файл online патча - представляет из себя специальную разделяемую библиотеку) находятся в каталоге $ORACLE_HOME/hpatch/ .
Информация о том, какие online патчи установлены для экземпляра, содержится в файле
$ORACLE_HOME/hpatch/orapatch$ORACLE_SID.cfg
После перезагрузки экземпляра все online-патчи, описанные в этом файле, снова применяются к экземпляру.

Откатывается online-патч также на лету (без останова экземпляра):
opatch rollback -id PATCHID -connectString SID:USERNAME:PASSWORD 
или в случае c RAC:
opatch rollback -id PATCHID -connectString SID:USERNAME:PASSWORD:NODE1,SID2:USERNAME:PASSWORD:NODE2, ... 

Online-патчи увеличивают объём используемой памяти PGA, что в конечном счёте также влияет и на скорость запуска процессов.
Расчитать требуемый дополнительный объём оперативной памяти можно по этой формуле:
memory overhead = ( # of processes +1) x size of ( .pch file)

Offline-патчи - это обычные, хорошо знакомые вам патчи, которые требует останова экземплыра и пересборки (relink) RDBMS.

Поскольку Online-патчи имеют накладные расходы на использования памяти, следует в ближайшее удобное для downtime время, откатить-online патч и накатить offline-патч.

Ещё одно из применение online патчей - когда администратору БД необходимо быстро выполнить на тестовом окружении проверку, решает ли данный патч возникшую проблему или нет. Быстро, без перезагрузки тестового экземпляра и без долгого ожидания перелинковки бинарников, как это происходит при накате обычных offline-патчей.

Демонстрацию установки патчей в online можно посмотреть здесь.
Демонстрация выполнена на примере патча 9620994 (это combo-патч), необходимого для установки 1С на 11.2.0.2

Обновление бинарного приложения на лету - феноменально сложная задача. И то что это было сделано для такого сложного приложения как Oracle RDBMS, по-моему просто фантастика !

13 июл. 2011 г.

1C support 11.2.0.2 on Linux

Медленно, но верно продолжает развиваться "1С:Предприятие" на платформе Oracle Database.
В очередной версии "1C:Предриятие" 8.2.14 анонсирована поддержка Oracle Database 11.2.0.2.

Пока поддержка есть только для Oracle на платформе Linux x86/x86_64. Также перед установкой необходимо установить на СУБД три патча: 10094732, 11724916, 9620994.

29 июн. 2011 г.

Trigger vs Change Notification

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

У меня сразу же возникли два возражения:
1) Отправка нотификации это внешний сервис, то есть НЕ является составной частью жизненного цикла документа.
2) Отработка триггера будет замедлять работу приложения сервисной операцией.

Для решения этой задачи есть более подходящий, на мой взгляд, способ - использовать технологию Database Change Notification.
Эта технология позволяет подписаться на сообщение об изменение данных, и получив это уведомление, выполнить некоторую обработку. Возможен вариант обработки как на сервере (в виде PL/SQL-процедуры), либо на клиенте - в виде callback-процедуры на клиенте.

Самое главное отличие технологии Change Notification от триггеров состоит в том, что callback-процедура обработки сообщения об изменении выполняется в асинхронном режиме к изменению - проще говоря выполняется в отдельном потоке (специализированном однократном job-е), и значит не замедляет работу приложения.

Собственно как это делается.
На первом шаге пользователю нужно дать две привилегии:
1) на сервисный системный пакет dbms_cq_notification -
grant execute on dbms_cq_notification to rscott;

2) собственно права на получение нотификации об изменениях -
grant change notification to rscott;

После этого нужно создать PL/SQL-процедуру, которая автоматическм будет "зажигаться" при изменении данных.
--процедура обработки в виде статического метода объектного типа:
  static procedure StateChangeHandler(ntfnds in cq_notification$_descriptor) is
    v_xNumRows        number;
    v_xOperationType  number;
    v_xRowIdStr       varchar2(2000 char);
    v_xRowId          rowid;
    v_xDocument       TDocumentOfRegistration;
  begin
    if (ntfnds.event_type = dbms_cq_notification.event_querychange) then
      v_xOperationType := ntfnds.query_desc_array(1).table_desc_array(1).Opflags;

      --реагируем только на операции UPDATE
      if v_xOperationType = dbms_cq_notification.UpdateOp then
      
        if (bitand(v_xOperationType, dbms_cq_notification.all_rows) = 0) then
          --определяем количество строк которые затронули изменения в родительской транзакции
          v_xNumRows := ntfnds.query_desc_array(1).table_desc_array(1).numrows;
          
          for k in 1..v_xNumRows 
          loop 
            --извлекаем rowid строк, которые изменились
            v_xRowIdStr := ntfnds.query_desc_array(1).table_desc_array(1).row_desc_array(k).row_id;
            v_xRowId    := chartorowid(v_xRowIdStr);
            
            --читаем документ:
            v_xDocument := new TDocumentOfRegistration(v_xRowId); 
              
            --отправляем письмо по email об изменении:
            v_xDocument.sendStateChangeLetter();

            v_xDocument.destroy;
          end loop;
        end if;
      end if;
    end if;

    commit;
  end;

Наконец, регистрируем наш обработчик:
declare
  v_xRegInfo          cq_notification$_reg_info;
  v_xNotificationQoS  simple_integer    := dbms_cq_notification.qos_query +
                                           dbms_cq_notification.qos_rowids;
  v_xCallback         varchar2(64 char) := 'rscott.TDocumentOfRegistration.StateChangeHandler';
  v_xCursor           sys_refcursor;
  v_xRegId            number;
begin
  v_xRegInfo := new cq_notification$_reg_info(callback          => v_xCallback,
                                              qosflags          => v_xNotificationQoS,
--нотификация посылается для всех операций
                                              operations_filter => 0, 
--регистрация существует вечно, до тех пока явно не будет удалена
                                              timeout           => 0, 
--нотификация посылается немедленно после фиксации транзакции
                                              transaction_lag   => 0);
  v_xRegId := dbms_cq_notification.new_reg_start(v_xRegInfo);

  open v_xCursor for 
    select 
      Id 
    from 
      documents 
    where 
      State = 'ACTIVE';

  close v_xCursor;

  dbms_cq_notification.reg_end;
end;
/

Как Вы видите, наш обработчик будет вызываться только если изменение затронуло документы находящиеся в состоянии 'ACTIVE'.

В заключение, небольшой FAQ.
1) Вопрос: требуется ли дополнительная настройка для работы Database Change Notification ?
Ответ: Необходимо лишь установить в ненулевое значение параметр job_queue_processes.

2) Вопрос: Если транзакция, в которой генерировались изменения, была незавершена (например был явный rollback) ?
Ответ: В этом случае никакого сообщения отправлено НЕ будет - нотификация отправляется только после фиксации транзакции.

3) Вопрос: Я искал в документации описание этой технологии, но никак не могу найти.
Ответ: Описание технологии Database Change Notification "запрятано" в Oracle Database Advanced Developet Guide

4) Вопрос: Правильно ли я понял, что подписка происходит на изменение результатов запроса, а не всей таблицы в целом.
Ответ: Именно так! Хотя при регистрации можете указать, что Вас интересует изменение всей таблицы в целом.

20 июн. 2011 г.

Новые правила лицензирования Oracle Database в Amazon Cloud

Компания Amazon – наиболее известный и крупный Cloud провайдер в мире. До недавних пор, пользователи или компании, кто размещал свои решения (Oracle Database), должны были покупать лицензии самостоятельно через партнеров или напрямую у Oracle. Теперь, стало возможно лицензирование Oracle Database с тарификацией по часам в Amazon Cloud.
Полный текст статьи здесь: http://aws.amazon.com/rds/oracle/?ref_=pe_8050_20231810

Сейчас поддерживается две модели лицензирования: “License Included” and “Bring-Your-Own-License (BYOL)”. Первая модель, она же новая, включает в себя лицензии на ПО Oracle. Например, для Oracle Database Standard Edition One в конфигурации Small нужно платить 0,16 центов в час за предоставленную виртуальную машину(On-Demand DB Instance). При наличии уже купленных лицензий, метод BYOL, стоимость будет 0,11 в час для той же конфигурации виртуальной машины. Также существует возможность оплатить и первый и второй вариант за 1-2-3 лет, что существенно выгоднее по деньгам.

Oracle Database Editions, что важно, цитата:
Amazon RDS currently supports multiple Oracle Database Editions. Support for a given edition varies by licensing model. See pricing for more information on the licensing models offered by Amazon RDS for Oracle:

  • Standard Edition One: License Included, Bring-Your-Own License
  • Standard Edition: Bring-Your-Own-License
  • Enterprise Edition: Bring-Your-Own-License

Т.е. Amazon берет на себя обязательство и предоставляет сервис с лицензиями Oracle DB только для редакции Oracle Database Standard Edition One!!! Это важно.

Далее я попытался понять, а сколько будут стоить лицензии Oracle DB SE One за один год аренды.

Конфигурация SMALL Reserved DB Instances:
345$-227.50$ = 117,5$
*Small DB Instance: 1.7 GB memory, 1 ECU (1 virtual core with 1 ECU), 64-bit platform, Moderate I/O Capacity

Конфигурация Extra Large (High Memory) DB Instances:
1,850$ - 1,325$ = 525$
*High-Memory Extra Large Instance 17.1 GB memory, 6.5 ECU (2 virtual cores with 3.25 ECUs each), 64-bit platform, High I/O Capacity

С виду, размещение в Amazon Cloud выглядит заманчиво, но не стоит забывать про дополнительные затраты, за которые также придется заплатить: трафик, I/O, …

Для кого это полезно:
• Для стартап проектов, когда неизвестно, сколько по времени проект буде существовать
• Для разработчиков - проведение нагрузочного испытания или тестирования системы
• Для администраторов, если нужно собрать стенд из нескольких серверов
• Для небольших компаний – Small Business
• Для защиты данных ЦОД от катастроф
• И т.д.

CLOUD наступает!

28 мая 2011 г.

Как рассчитать ширину канала между двумя ЦОД для решения Oracle Data Guard?

Материалов на эту тему достаточно много: документация, WP, форумы... Есть интересные ссылки на документы от Oracle, на форумах обсуждается магический “REDO RATE”. Но, как вычислить этот Redo Rate ? Есть мнение: http://forums.oracle.com/forums/thread.jspa?messageID=4556370&tstart=0
Required bandwidth = ((Redo rate bytes per sec. / 0.7) * 8) / 1,000,000 = bandwidth in Mbps

Тем не менее, пошаговой инструкции или рецепта так и не нашел. Основной документ, который я использовал: «Data Guard Redo Transport & Network Best Practices
Oracle Database 10g Release 2» http://www.oracle.com/technetwork/database/features/availability/maa-wp-10gr2-dataguardnetworkbestpr-134557.pdf

В нем раскрываются основные принципы и подход по расчету. Основной раздел так и называется «How Much Bandwidth is Enough?». Информация в документе актуальна и для 11g.

Итак, переходим непосредственно к расчету. Расчет производим в два шага:
1) Определение среднего объема REDO/sec и перевод его в Mbit/sec.
2) Учет пиковых значений по генерации REDO, удаленности ЦОД-ов – влияет на задержки и т.д.

Шаг 1
1) Собираем AWR отчет за сутки или более (зависит от топологии работы приложения)
2) Беру значение "redo blocks written" в колонке "per Second"
3) Не забываем, что размер REDO блока 512 байт (на HP-UX 1KB)
4) Далее переводим в Mbit/sec , используя формулу.
1 мегабит = 1048576 бит = 131072 байт = 128 КБайт
итого, в моем случае: «значение из AWR отчета» * (512) / 131072 = «искомое значение» Mbit/sec

Шаг 2
Этот шаг является необязательным и ведет к увеличению требований к каналу связи между дата центрами. В результате, как правило, стоимость канала увеличивается. Далее, вы должны принять для себя решение будете ли учитывать пики нагрузки и задержки сети при значительном удалении ЦОД-ов. Цена, в большинстве проектов, является ключевым фактором для принятия решения.

PS:
Также, в AWR отчете есть значение "Redo size" в колонке "per Second", раздел "Load Profile" в байтах. Но это абсолютное значение для REDO, без учета того, что блок, записанный на диск с REDO информацией может быть не обязательно заполненным на 100%. Поэтому рекомендуется использовать способ описанный выше.

Дополнительные ссылки по теме: «Data Guard Redo Apply and Media Recovery Best Practices
Oracle Database 10g Release 2»
http://www.oracle.com/technetwork/database/features/availability/maa-wp-10gr2-recoverybestpractices-131010.pdf
Описание параметров в AWR отчете: http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/stats002.htm#i375475

20 мая 2011 г.

Shadow-сервисы в Oracle RAC 11.2

В Real Application Cluster версии 11.2 появился интересный тип сервисов - так называемые preconnect-сервисы. Мне больше нравится определение их как "теневых" (shadow).

Теневой сервис автоматически создается при создании основного сервиса, если вы укажете ключ -P PRECONNECT:

rac1-> srvctl add service -d racdb -s OLTP -P PRECONNECT -r "racdb1" -a "racdb2"


После создания сервиса OLTP автоматически будет создан сервис OLTP_PRECONNECT:

rac1-> crs_stat -p | grep oltp
NAME=ora.racdb.oltp.svc
NAME=ora.racdb.oltp_preconnect.svc
rac1->


Теневой сервис, при старте основного сервиса, автоматически запускается на резервных узлах. Поэтому shadow-сервис может существовать только тогда, когда у основного сервиса определены и "живы" резервные узлы:

rac1-> crs_stat
... ... ...
NAME=ora.racdb.oltp.svc
TYPE=ora.service.type
TARGET=ONLINE
STATE=ONLINE on rac1

NAME=ora.racdb.oltp_preconnect.svc
TYPE=ora.service.type
TARGET=ONLINE
STATE=ONLINE on rac2

... ... ...

Теперь проделаем интересный эксперимент: принудительно переместим наш сервис OLTP на узел rac2

rac1-> srvctl relocate service -d racdb -s OLTP -i racdb1 -t racdb2 -f
rac1-> crs_stat
... ... ...
NAME=ora.racdb.oltp.svc
TYPE=ora.service.type
TARGET=ONLINE
STATE=ONLINE on rac2

NAME=ora.racdb.oltp_preconnect.svc
TYPE=ora.service.type
TARGET=ONLINE
STATE=ONLINE on rac1
... ... ...

обратите внимание, что теневой сервис oltp_preconnect переехал на узел rac1, то есть произошел своеобразный "Switсh Over"!
При остановке основного сервиса, теневой сервис также автоматически останавливается.

Как использовать теневые сервисы на клиенте ?
К сожалению, пока клиент не понимает их наличие и нужно его явно конфигурировать в backup-соединении в файле tnsnames.ora:
OLTP =
  (DESCRIPTION =
    (FAILOVER=YES)
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))
  (CONNECT_DATA =
    (SERVICE_NAME = oltp.rac.com)
    (FAILOVER_MODE=
      (BACKUP=OLTP_PRECONNECT)
      (TYPE=SELECT)
      (METHOD=PRECONNECT)
    )
  )
)


OLTP_PRECONNECT =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = oltp_preconnect.rac.com)
    )
  )


Сделаем тестовое соединение и проверим как распределяются сессии:

C:\Work\RACDD4D\v3.1>sqlplus rscott/rtiger@oltp

SQL*Plus: Release 11.2.0.2.0 Production on Fri May 20 21:55:45 2011

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

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

SQL> SELECT inst_id FROM gv$session WHERE username='RSCOTT' and program='sqlplus.exe';

INST_ID
----------
1
2
SQL> select dbms_utility.current_instance from dual;

CURRENT_INSTANCE
----------------
1


Как видите, соединение было сделано к основному сервису (первый узел), а резервное - к теневому сервису (второй узел).

19 мая 2011 г.

srvctl support TAF

В версии Oracle Database 11.2 утилита srvctl стала поддерживать определение TAF-policy на уровне сервиса, то есть теперь при создании сервиса вы также сразу можете определить политики TAF:


rac1-> srvctl add service -help
... ... ...
-P {NONE | BASIC | PRECONNECT} TAF policy specification
-l Role of the service (primary, physical_standby, logical_standby, snapshot_standby)
-y Management policy for the service (AUTOMATIC or MANUAL)
-e Failover type (NONE, SESSION, or SELECT)
-m Failover method (NONE or BASIC)
-w Failover delay
-z Failover retries
-j Connection Load Balancing Goal (SHORT or LONG). Default is LONG.
-B Runtime Load Balancing Goal (SERVICE_TIME, THROUGHPUT, or NONE)

... ... ...

Обратите внимание что вы также можете сразу задать Runtime-балансировку для сервиса!

Создаем сервис (SELECT и BASIC):

rac1-> srvctl add service -d racdb -s DSS -e SELECT -p BASIC -w 5 -z 3 -r "racdb1,racdb2"
rac1-> srvctl start service -d racdb -s DSS



На клиенте в файле tnsnames.ora определяем алиас для сервиса DSS (ни слова про настройки TAF - все берется из серверной политики!):

DSS =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dss.rac.com)
)
)


подключаемся к БД по данному сервису и проверяем TAF-политику:

[oracle@racc ~]$ sqlplus rscott/rtiger@dss

SQL*Plus: Release 11.2.0.2.0 - Production on Wed May 18 18:59:27 2011

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


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

SQL> select FAILOVER_TYPE, FAILOVER_METHOD from v$session where sid=sys_context ('userenv', 'sid');

FAILOVER_TYPE FAILOVER_M
------------- ----------
SELECT        BASIC
SQL>


Все работает !

13 мая 2011 г.

Ускорение "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сылка: видео.

9 мая 2011 г.

Условная компиляция в SQL+

Оказывается с помощью хитрого трюка с переменными замены SQL*Plus (substitution variables) можно делать условную компиляцию не только на сервере - в движке PL/SQL, но и на клиенте:





--Включаем трассировку
define is_client_trace="--"

begin
&is_client_trace
dbms_output.put_line('Код включаемый для трассировки');
--*/

dbms_output.put_line('Оcновная логика ...');
end;

В чем разница по сравнению с PL/SQL Conditional Compilation ?
В данном случае код просто будет в виде комментария.


--Выключаем трассировку
define is_client_trace=/*
begin
&is_client_trace
dbms_output.put_line('"Этот код будет в виде комментария');
--*/

dbms_output.put_line('Оcновная логика ...');
end;



К сожалению, подобное можно сделать только в блоке PL/SQL, но не в потоке DDL-команд: SQL+ обрабатывает переменные замены только в составе какого-либо оператора. Если Вы знаете как это обойти, пожалуйста дайте мне знать об этом!
:-)

На фото - до боли знакомый графический SQL+, как его нам не хватает сегодня в 11g ...
:-)

5 мая 2011 г.

Защита "1С:Предприятие" с помощью Oracle Clusterware

Не так давно (27 апреля 2011), состоялось мероприятие «Модернизация системы управления бизнесом с помощью ERP-решений 1С с помощью инновационной технологической платформы Oracle». На нем я показывал возможность защиты приложения "1С:Предприятие 8.2" с помощью Oracle Clusterware.

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






Программное обеспечение, которое было использовано в демонстрации:
  • Oracle Enterprise Linux 5U6 x86
  • Oracle Database 11gR2 (11.2.0.2)
  • Oracle Enterprise Manager Database Control 11gR2
  • 1C:Предприятие 8.2 for Oracle

Все ПО работало в виртуальной инфраструктуре от Oracle:
  • Oracle VM Server 2.2.1
  • Oracle VM Manager

Основная идея – показать возможности Oracle Clusterware для защиты приложений. В качестве испытуемого приложения было "1С:Предприятие".

Демонстрация разбита на две части. Первая, где показывается возможности Failover для Базы данных Oracle и 1C. Вторая - в ней показано поведение клиентского приложения в случае сбоя. Оба сервиса управлялись Oracle Clusterware.

Посмотрев ролик до конца, вы заметите, что при Failover сервиса 1С, или переезде экземпляра БД на другой узел (я использовал Oracle RAC One Node, а не Failover Cluster), пользователю приходилось заново рестартовать клиентское приложение.

Да,- к сожалению, в текущей версии 1С:Предприятие не обрабатывается потеря текущей транзакции при TAF, но важно другое: работоспособность системы, к тому моменту, когда пользователь создает новое соединение, уже восстановлена. Т.е. данная конфигурация , прежде всего, создана для снижения времени простоя самого приложения и БД.

Особенности конфигурации:
Бинарные файлы Oracle (ORACLE_HOME) и 1С расположены на разделяемом разделе ASM File System.
При настройке Oracle Clusterware я использовал зависимости между ресурсами. Для того, чтобы была возможность запускать на различных узлах кластера экземпляр БД и приложение 1С , я создал два виртуальных IP-адреса [VIP]. При описании ресурса , установил HARD DEPENDENCY на старт application-ресурса.

Демонстрация готовилась вместе с Андреем Забелиным, за что ему большое спасибо.
Приятного просмотра!
Cсылка: видео.

4 мая 2011 г.

OPatch 11.2.0.1.5 Automation

Очень полезная возможность появилась в утилите установки патчей - OPatch: теперь она может за один проход читать информацию из inventory и "накатывать" патчи на несколько ORACLE_HOME-ов, при этом конечно-же проверяется сама возможность установки патча.

На одном из моих серверов (под управлением Oracle Linux 5U6 x64) установлено два каталога $O_H:
       - Grid Infrastructure 11.2.0.2 (ASM и Oracle Restart)
       - Database 11.2.0.2

Согласно своей стратегии патчинга я решил установить на него Grid Infrastructure 11.2.0.2.2 PSU (включает в себя Database PSU 11.2.0.2.2).
Патч кстати, довольно серьезный - весит 740 Mb.

0) Делаем полную копию БД и всех ORACLE_HOME-s (включая inventory)

1) Скачиваем и устанавливаем OPatch 11.2.0.1.5
[oracle@ais3 ~]$ cd /u01/app/oracle/product/11.2.0/dbhome_1/
[oracle@ais3 ~]$ rm -rf OPatch/
[oracle@ais3 ~]$ cp /mnt/p6880880_112000_Linux-x86-64.zip ./
[oracle@ais3 ~]$ unzip p6880880_112000_Linux-x86-64.zip

[oracle@ais3 ~]$ cd /u01/app/11.2.0/grid/
[oracle@ais3 ~]$ rm -rf OPatch/
[oracle@ais3 ~]$ cp /mnt/p6880880_112000_Linux-x86-64.zip ./
[oracle@ais3 ~]$ unzip p6880880_112000_Linux-x86-64.zip


2) Скачиваем и распаковываем Grid Infrastructure 11.2.0.2.2 PSU

[oracle@ais3]$ cd /u01/app/oracle/install/
[oracle@ais3]$ cp /mnt/p12311357_112020_Linux-x86-64.zip ./
[oracle@ais3]$ unzip p12311357_112020_Linux-x86-64.zip


3) Создаем response file для Oracle Configuration Manager [OCM].
Если Вы уже используете OCM то вы можете пропустить шаг. Утилита OPatch в любом случае запросит этот rsp-файл.

[oracle@ais3]$ /u01/app/11.2.0/grid/OPatch/ocm/bin/emocmrsp
OCM Installation Response Generator 10.3.4.0.0 - Production
Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.

Provide your email address to be informed of security issues, install and
initiate Oracle Configuration Manager. Easier for you if you use your My
Oracle Support Email address/User Name.
Visit http://www.oracle.com/support/policies.html for details.
Email address/User Name: [ENTER]

You have not provided an email address for notification of security issues.
Do you wish to remain uninformed of security issues ([Y]es, [N]o) [N]: Y
The OCM configuration response file (ocm.rsp) was successfully created.
[oracle@ais3 ~]$ ls /home/oracle
dbenv dbenv~ gienv gienv~ ocm.rsp oradiag_oracle


4) Останавливаем БД.

[oracle@ais3~]$ srvctl stop database -d ais3


5) Накатываем патч сразу на все ORACLE_HOME-ы (как пользователь root!)

[oracle@ais3~]$ su - root
Password: oracle
[root@ais3]# export PATH=/u01/app/11.2.0/grid/OPatch:$PATH
[root@ais3 ~]# opatch auto /u01/app/oracle/install/
Executing /usr/bin/perl /u01/app/11.2.0/grid/OPatch/crs/patch112.pl -patchdir /u01/app/oracle -patchn install -paramfile /u01/app/11.2.0/grid/crs/install/crsconfig_params
opatch auto log file location is /u01/app/11.2.0/grid/OPatch/crs/../../cfgtoollogs/opatchauto2011-05-04_22-21-07.log
Detected Oracle Restart install
Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params
OPatch is bundled with OCM, Enter the absolute OCM response file path:
/home/oracle/ocm.rsp
patch /u01/app/oracle/install/12311357/custom/server/12311357 apply successful for home /u01/app/oracle/product/11.2.0/dbhome_1
patch /u01/app/oracle/install/11724916 apply successful for home /u01/app/oracle/product/11.2.0/dbhome_1
Successfully unlock /u01/app/11.2.0/grid
patch /u01/app/oracle/install/12311357 apply successful for home /u01/app/11.2.0/grid
patch /u01/app/oracle/install/11724916 apply successful for home /u01/app/11.2.0/grid
ACFS-9300: ADVM/ACFS distribution files found.
ACFS-9312: Existing ADVM/ACFS installation detected.
ACFS-9314: Removing previous ADVM/ACFS installation.
ACFS-9315: Previous ADVM/ACFS components successfully removed.
ACFS-9307: Installing requested ADVM/ACFS software.
... ... ... ... ... ... ... ... ... ... ... ...
CRS-4123: Oracle High Availability Services has been started.
[root@ais3 ~]#


Обратите внимание, что мне не пришлось останавливать компоненты Clusterware: все автоматически проделала утилита OPatch
OPatch продолжает развиваться и стал значительно умнее!
:-)