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.