RACChecker

Тема разработки и адаптации приложений под RAC очень обширна и многогранна и затрагивает практически все аспекты создания прикладного ПО для СУБД Oracle Database.
Но, тем не менее, для того чтобы гарантировать что ваше приложение корректно будет работать в RAC, необходимо убедиться, что оно не использует технологии и механизмы которые в RAC в не работают.
Вот перечень этих технологий:

  • каналы (пакет DBMS_PIPE) - не синхронизируются между узлами кластера;

  • глобальные контексты приложений - также не синхронизируются между узлами кластера;

  • сигналы (пакет DBMS_ALERT) - сигналы тоже не синхронизируются между узлами кластера;

  • задания управляемые через пакет DBMS_JOB - крайне не рекомендуется использовать в RAC, поскольку задания этого пакета не поддерживают сервисы, и привязка заданий может быть задана только жестко к узлам, при привязке задания к узлу оно не переживает failover текущего экземпляра, при отсутствии привязки задание может выживать после падения узла (начиная с 10.2.0.3) но запускается при этом на произвольном узле.


    Методы борьбы с вышеперечисленными технологиями мы подробно рассматриваем на нашем семинаре RAC Deep Dive for Developers

    Довольно часто приложение имеет большие объемы PL/SQL-кода (сотни тысяч и даже миллионы строк кода), и вспомнить о том, в каком месте используется тот же DBMS_PIPE крайне сложно: код давно отлажен и работает, а его автор уже давно не работает в компании.
    Для того, что облегчить анализ серверной части кода (хранимых процедур PL/SQL) я разработал утилиту RACChecker. Эта утилита поможет быстро ответить на вопрос: готово ли, в минимальной степени, ваше приложение при переходе в RAC.
    RACChecker анализирует ваш исходный код и находит объекты и строки кода, где вы используете технологии, которые в RAC не работают.

C:\RAC\Utils\RACChecker>RACChecker.exe help=y

RAC Checker for ISV: Release 0.0.1 - Development on 14.09.2008 23:29:23

Utility for check correctly PL/SQL for Oracle RAC

Copyright (c) 2008, Igor Melnikov. All rights reserved.


You can control how RACChecker runs by entering the RACChecker command followed
by various arguments. To specify parameters, you use keywords:

Format: RACChecker parameter=value TYPE=value

Example: RACChecker USERID=scott/tiger@orcl TYPE=PIPE
RACChecker USERID=demo/demo@demo TYPE=ALL

Keyword Description (Default)
--------------------------------------------------
SCHEMAS schemas in which check ALL-for all schemas (ALL)
HELP print this message: Y/N (N)
TYPE object type: PIPE,ALERT,CONTEXT,JOB,ALL (ALL)
REPORT_FILE file name for output report
SEQUENCES Show all user sequences (Y)
USERID Oracle connection string


Я думаю, из списка параметров очевидно их назначение.
Следует обратить внимание лишь на следующие моменты:

  • пользователь в строке подключения (параметр USERID) должен иметь права на чтение словаря (dictionary);

  • утилита опционально может находить некэшируемые последовательности (с ними тоже возможны проблемы в RAC);

  • пока не поддерживается анализ зашифрованного кода (с помощью утилиты wrap), т.е. код должен быть скомпилирован в открытом виде;

  • для своей работы утилита требует установленной среды выполнения .NET Framework 3.5, а также ODP.NET Provider 11.1.0.6.21 - рекомендуется установить версию поставляемую с Instant Client - она небольшая по размеру.


Конечно никакого волшебства в работе этой утилиты нет: она всего лишь анализирует соответствующие представления словаря.
Уже есть история успеха (Success Story :-) ):
с помощью этой утилиты мне за пару минут удалось быстро проанализировать 750 тыс. строк кода в приложении нашего партнера-разработчика и определить модули и строки которые вызовут проблемы в RAC.

Надеюсь с помощью RACChecker вы быстро определите проблемные места при переходе в RAC!

Ссылка для скачивания: RACChecker.

P.S. Приветствуются рекомендации и замечания по функционалу ...


Читать дальше...

Your.Open.World - 3

Главная новость - это HP Oracle Database Machine, комплексное решение, включающее hardware & software, для построения хранилищ данных. HP обеспечивает поставку & hardware support, Oracle отвечает за продажу решения.

Собственно решение состоит из двух частей:

1) Grid из 8 Intel серверов, 64 Core, Oracle Interprise Linux

2) HP Exadata Storage Server + Oracle Exadata Storage Software, 14 серверов, до 168 Tb данных.

Просмотреть полную спецификацию. Если я правильно понял, пока решение поддерживает только Linux Grid Cluster (RAC).

Объяснение, зачем все это нужно, на примитивном уровне звучит так: объем данных растет гораздо быстрее чем, пропускная способность. Дисковый массив передает огромный массив данных, который затем обрабатывает сервер БД. Узкое место - здесь передача даных от массива на сервер.

Теперь вашему дисковому массиву не нужно передавать на сервер БД все блоки данных, а только результат. Дисковый массив стал "разумным", благодаря специальному ПО, для того, чтобы понимать, что нужно на самом деле серверу БД.

Как это работает на самом деле ? Что за software поставили на дисковый массив ? Я не знаю. Из вышеприведенных ссылок следует, что в состав exadata storage software входит ASM. Поскольку ASM инстанс всегда нес в себе полный набор кода базы данных, ничего не мешало, скажем, научить этот экземпляр разбираться с sql запросами. Последнее утверждение - моя личная догадка.

Вдумайтесь, это уже факт, Oracle начинает продавать hardware ! Мне кажется это революционный шаг. Очень рекомендую посмотреть презентацию Larry Ellison.

PS На фотографии, Database Mashine, крупным планом. Интересно, что Google нашел первую ссылку, посвещенную событию уже через 11 минут после завершения конференции.



Читать дальше...

Your.Open.World - 2

На Open World начинаются анонсы новых продуктов/версий/возможностей.

Charles Phillips представил Oracle Beehive, рассказал про патч 11.1.0.7 для Linux 32/64, новый интерфейс metalink.

Bob Thome, наш директор по разработке RAC рассказал про свое видение Grid 2.0, добавив, что RAC 10.2.0.4 теперь сертифицирован под Oracle VM. Возможно на metalink эта информация дойдет позже, но это уже факт. Подробности я доложу на своем семинаре по Oracle VM 16 октября (здесь будет ссылка на регистрацию). Ребята из HQ поделились со мной презентацией, причем доделали ее прямо на моих глазах. Так что, пожалуйста приходите на семинар, будет интересно.

Не пугайтесь, улышав слова Oracle Cloud Computing : это возможность хостить БД на платформе Amazon Elastic Compute Cloud. Насколько я понял там своя виртуальная платформа, поэтому и свои правила лицензирования. Опять таки, насколько я понял, виртуальная машина должна быть загружена на площадку Amazon, Вы имеете доступ к ней через internet.

Основную новость мы все ожидаем услышать на презентации нашего CEO, Larry Ellison 24 числа. Все пока держится в очень строгом секрете.


Читать дальше...

Your.Open.World.

Сегодня первый полный день конференции OpenWorld. San Francisco полностью захвачен Oracle'истами. Везде в центре города люди с беджейками конференции. Основной удар в первый же день принял на себя Tom Kyte, прочитавший аж два доклада, практически подряд. Оба, конечно, вызвали интерес большого кол-ва слушателей. Материалы он обещал разместить на своем блоге.











На фотографии - Tom Kyte, в новом в обществе Сергея Данилова и меня, Дмитрия Волкова. Tom услышав, что мы из России, сразу же пошутил "Как же знаю эту страну. У Вас богатый язык.. Вы еще сделали перевод моей книги. Когда мне ее показали, я удивился, что она такая большая. Но мне сказали что это только первый том". Не буду скрывать, что воспользовался растерянностью Tom'а и пожал ему руку. Чем очень горжусь.

Конечно же мы обсуждали новый семинар Database Options Details и предложили выделить Tom'у любое удобное ему время для выступления. Он обещал подумать :)

PS На заднем фоне Bryn Llewellyn, наш PL/SQL product manager со своей презентацией про правила разработки на pl/sql.


Читать дальше...

Материалы семинара DATABASE OPTIONS DETAILS

Семинар был проведен в 18 сентября в отеле "Катерина".

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

Однако прошу Вас внимательно прочитать этот абзац, перед тем как скачать семинар. Пожалуйста, скачайте семинар только, если Вы не рассчитываете на него попасть в ближайшие пол-года. Слайды не дают полного представления о том, что происходит в зале. Одним из самых интересных моментов являются вопросы слушателей, которые, конечно, остаются вне рамок собранного архива. Если Вы планируете зарегистрироваться на "версию 2" семинара (или уже зарегистрировались на 1 версию), убедительно просим Вас не скачивать материалы. Вы не сможете получить от него удовольствие. "Версия 2" состоится предположительно 20 ноября. Вне всякого сомнения мы учтем в ней полученный опыт и серьезно ее улучшим.

Сами материалы вы можете скачать по этой ccылке
. Материалы семинара версии 1 больше недоступны. Регистрируйтесь на версию 2. Следите за новостями в этом блоге

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


Читать дальше...

Семинар DATABASE OPTIONS DETAILS

Те, кто из Вас регистрировались на семинар DATABASE OPTIONS DETAILS должны были получить от нас письмо. Если в письме в subject стоит Good News, приходите, мы Вас ждем. Если BAD News - мы Вас также ждем, но позже, 20 ноября, на второй версии семинара.

Из-за большого кол-ва заявок нам пришлось выбрать алгоритм, по которому мы отсеивали участников. В частности, мы приняли решение пускать не более 2-х человек из компании. Конечно, принимая в расчет, что компании бывают очень разных размеров, это не слишком справедливо. Но, зато, внутри компании, Вы сами можете выбрать 2-х самых достойных представителей - т.е. мы не будет проверять, что из компании пришли именно те, кому мы разослали Good News письма. Досточно принести нам подтверждение, присланное вашему коллеге, который не смог, или не захотел прийти. Но помните, что 2 человека от компании - это 2 человка от компании :)

В программе произошли небольшие изменения - мы добавили Выступление Евгения Горбоконенко (RDTEX) - "Использование опций для миграции в среду RAC".

Если мероприятие пройдет удачно и понравиться Вам, мы предполагаем продолжить практику с семинара RACDD4D, когда после массовых мероприятий семинары проводились специально по просьбе отдельных парнеров.

PS.
Большая просьба указывать при регистрации свой рабочий email, а не личный почтовый ящик на mail.ru, yandex, или gmail. Пожалуйста укажите также свой телефон, мобильный или рабочий, чтобы мы смогли с Вами связаться. Пока это просьба, но в будущем, я надеюсь, мы будем учитывать корректность заполнения при определении кандидатур на семинары.


Читать дальше...

RAC PL/SQL API

Часто у PL/SQL-разработчиков возникают вопросы при программировании в среде RAC. Ниже я попытаюсь на них ответить.

1) Как программно определить: выполняется ли мой PL/SQL-код в RAC-database или в Single Node ?

Ответ: для этого в пакете DBMS_UTILITY есть логическая функция IS_CLUSTER_DATABASE; она возвращает значение ИСТИНА, если выполнение происходит в БД запущенной в кластере.


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

SQL> begin
2 if dbms_utility.is_cluster_database then
3 dbms_output.put_line('I am in cluster');
4 end if;
5 end;
6 /
I am in cluster
2) Как программно определить узел, на котором в данный момент времени выполняется мой PL/SQL-код?
Ответ: Для этого можно применить функцию CURRENT_INSTANCE из того же пакета DBMS_UTILITY. Эта функция просто возвращает номер экземпляра БД, на котором работает ваша сессия.
SQL> exec dbms_output.put_line(dbms_utility.current_instance);
1
Есть второй способ: прочитать значение переменной INSTANCE из стандартного контекста сессии USERENV.
Ну а как прочитать это значение, вы прекрасно знаете - с помощью вызова SYS_CONTEXT('USERENV','INSTANCE')

3) Как программно определить список "живых" узлов кластера ?
Ответ: Для этого в замечательном пакете DBMS_UTILITY есть процедура ACTIVE_INSTANCES, которая через out-переменные возвращает список активных в данный момент узлов кластера.

SQL> begin
2 v_xTable dbms_utility.instance_table;
3 v_xCount pls_integer;
4 begin
5 dbms_utility.active_instances(v_xTable,
6 v_xCount);
7
8 for v_xIndex in 1..v_xCount
9 loop
10 dbms_output.put_line(v_xTable(v_xIndex).inst_number ||
11 ' => ' ||
12 v_xTable(v_xIndex).inst_name);
13 end loop;
14 end;
15 /
1 => rac1.us.oracle.com:racdb1
2 => rac2.us.oracle.com:racdb2
Обратите внимание, что в список попадут только "живые" узлы. Второй момент: имя узла возвращается в таком виде: полное имя хоста c именем экземпляра через символ двоеточия.

3) Если я включу в свои хранимые PL/SQL-процедуры RAC-specific код, то мне нужно каждый раз переключаться между двумя ветками кода через IF-оператор и вызовы IS_CLUSTER_DATABASE. Это замедлит быстродейстивие и приведет к раздуванию кода ! Если же я сделаю два варианта хранимой процедуры: один - для Single Node, второй - для RAC, то это означает что мне одновременно придется поддерживать две версии моего кода.
Есть какое-нибудь решение этой проблемы ?

Ответ: Решение есть, и очень элегантное. Для этого используется условная компиляция.
Сначала вы создаете символ условной компиляции в виде логической константы спецификации пакета:

create or replace package RAC_SERVICE is
Is_RAC_Database constant boolean := true;
end;


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

create or replace procedure create_my_pipe
x number;
begin
$if RAC_SERVICE.Is_RAC_Database $then
x := rac_pipe.create_pipe('MY_PIPE');
$else
x:= dbms_pipe.create_pipe('MY_PIPE');
$end
end;

Преимущества:

  • не нужно сопровождать две версии исходного кода и устраняются проблемы связанные с этим;
  • переключение кода в Single Node производится простой заменой константы Is_RAC_Database в пакете RAC_SERVICE, с последующей его перекомпиляцией; "реинкарнацию" остального кода в Single Node - режим автоматически будет произведена самой СУБД;
  • в выполняемый код PVM (PL/SQL Virtual Machine) будут скомпилированы только те исходные тексты, которые специфичены для текущего режима работы (Single Instance или RAC).


Читать дальше...

Service support in Datapump 11g

При работе в RAC много вопросов вызывает Datapump.
Вот только некоторые из них:
- на каком узле кластера будет формироваться dmp-файл ?
- на каком или на каких узлах кластера будут выполняться задания (job-ы) Datapump ?
- не нарушит ли работа Datapump распределение нагрузки спланированное с помощью сервисов ?

Наконец-то многие вопросы в 11g сняты:
Datapump в Oracle Database 11g поддерживает сервисы!

То есть теперь, при выполнении экспорта/импорта, вы можете привязать процессы Datapump к определенному сервису.
С помощью сервиса вы можете, например, жестко привязать процессы экспорта/импорта к определенному узлу, или же ограничить объем необходимых ресурсов с помощью Resource Consumer Group.

Единственная тонкость: данная возможность доступна только через Datapump API (т.е. через пакет DBMS_DATAPUMP). В утилитах expdp/impdp нет возможности указать имя сервиса. :-)

Для привязки к сервису, в процедуре DBMS_DATAPUMP.START_JOB, добавился новый параметр: service_name. Вот небольшой пример выполнения экспорта через API (т.е. прямо из приложения), при этом экспорт выполняется в рамках сервиса:


declare
v_xHandle number;
v_cDmpFileName constant varchar2(64) := 'apexdemo.dmp';
v_cLogFileName constant varchar2(64) := 'apexdemo.log';
v_cDirectory constant varchar2(64) := 'DATA_PUMP_DIR';
begin
v_xHandle := dbms_datapump.open(operation => 'EXPORT',
job_mode => 'SCHEMA',
job_name => 'APEXDEMO_EXPORT',
version => 'COMPATIBLE');

dbms_datapump.metadata_filter(handle => v_xHandle,
name => 'SCHEMA_EXPR',
value => 'IN (''APEXDEMO'')');

dbms_datapump.add_file(handle => v_xHandle,
filename => v_cLogFileName,
directory => v_cDirectory,
filetype => 3);

dbms_datapump.add_file(handle => v_xHandle,
filename => v_cDmpFileName,
directory => v_cDirectory,
filetype => 1);

dbms_datapump.start_job(Handle => v_xHandle,
service_name => 'DP_SERVICE');
dbms_datapump.detach(v_xHandle);
end;


Читать дальше...

Clusterware Cloning

О том, что поставить кластер не очень просто я уже писал ранее. А вот что делать, если нужно их поставить скажем десяток-другой ?

- Можно ставить их все через Universal Installer, не забывая затем накатывать все полагающие патчи (10.2.0.4, CPU)
- Можно записать responce file. Будет чуть проще чем предыдущий вариант, но патчи все равно накатывать вручную придется.
- Можно использовать Provisioning Pack из состава Oracle Enterprise Manager. Если Вы его купили.
- Можно использовать clone.pl. Об этом способе и пойдет дальше речь.

Итак, нам необходимо

1. Установить Clusterware и накатить все патчи.
2. Остановить его
crsctl stop crs
3. Почистить от мусора
[root@node1 crs]# rm –rf ./log/ <= is name of cluster
[root@node1 crs]# find . -name '*.ouibak' -exec rm {} \;
[root@node1 crs]# find . -name '*.ouibak.1' -exec rm {} \;
[root@node1 crs]# rm –rf ./cdata/*
[root@node1 crs]# rm –rf root.sh*
[root@node1 crs]# cd cfgtoollogs
[root@node1 cfgtoollogs]# find . -type f -exec rm -f {} \;

4. Свернуть (tar+gzip) и развернуть на узлах нового кластера. Версия и патчи OS конечно же должны совпадать с оригинальным кластером. Также должны быть заведен пользователь oracle и все необходимые группы.

5. Запустить clone.pl У clone.pl всего 11 параметров - 3 переменные окружения и 8 параметров которые передаются инсталлеру.


ORACLE_BASE=/opt/oracle
E01=ORA_CRS_HOME=/opt/oracle/product/10gR2/crs
E02=ORACLE_HOME=${ORA_CRS_HOME}
E03=ORACLE_HOME_NAME=OraCrs10g
#C00="-O'-debug'"
C01="-O's_clustername=crscluster'"
C02="-O'INVENTORY_LOCATION=/opt/oracle/oraInventory'"
C03="-O'sl_tableList=\"{node1:node1int:node1vip:N:Y,node2:node2int:node2vip:N:Y}\"'"
C04="-O'ret_PrivIntrList=\"{eth0:144.25.212.0:1,eth1:10.10.10.0:2}\"'"
if [ ${VOTEMIRROR} -eq 0 ]; then
C05="-O'n_storageTypeVDSK=2'"
C06="-O's_votingdisklocation=/dev/sdc1'"
else
C05="-O'n_storageTypeVDSK=1'"
C06="-O's_votingdisklocation=/dev/sdc1' -O's_OcrVdskMirror1RetVal=/dev/sdd1'
-O's_VdskMirror2RetVal=/dev/sde1'"
fi
if [ ${OCRMIRROR} -eq 0 ]; then
C07="-O'n_storageTypeOCR=2'"
C08="-O's_ocrpartitionlocation=/dev/sdc2'"
else
C07="-O'n_storageTypeOCR=1'"
C08="-O's_ocrpartitionlocation=/dev/sdc2' -O's_ocrMirrorLocation=/dev/sdd2'"
fi
perl $ORA_CRS_HOME/clone/bin/clone.pl $E01 $E02 $E03 $C01 $C02 $C03 $C04 $C05 $C06 $C07 $C08


6. Дальше нам нужно на всех узлах запустить /opt/oracle/oraInventory/orainstRoot.sh

7. Дальше $ORA_CRS_HOME/root.sh

8. $ORA_CRS_HOME/cfgtoollogs/configToolAllCommands


И все было бы волшебно, но описанный в документации метод вызова clone.pl для платформы Windows не вполне правильный. Читайте Note:444617.1


И я кажется забыл про базу данных ? Действительно, было бы неплохо ее переименовать - см Note:464922.1. И не забудьте внести изменения в listener.ora.

Я также уверен что database control не переживет таких изменений. Вам придется пересоздать репозиторий. Хотя конечно, управлять несколькими кластерами следует через Database Grid Control.

Spatial Thanks to Philip Newlan, Oracle Corp, RAC PACK team.


Читать дальше...

Внутренняя статистика

Несколько занимательных цифр:

51% всех загрузок Oracle Database с otn.oracle.com приходится на платформу Windows
Для Windows кол-во загрузок 11g стало превышать кол-во загрузок 10g.
Для Linux кол-во загрузок 11g & 10g примерно равны.

Oracle SQL Developer скачивает каждый второй, из тех, кто скачивает Database.

Среди стран, заметно участвующих в загрузке продуктов США, Индия и Китай. Англия, Германия и Бразилия догоняют. Нас не видно. Стыдно должно быть, товарищи. Идите и скачайте что-нибудь немедленно ! :)

Абсолютное лидерство по кол-ву SR занимет 10g. 9i заметно сдал позиции. 11g вышел на некоторый, уже заметный уровень. Тенденция однако.



PS
Абсолютных цифр я, конечно же, приводить не буду :)


Читать дальше...

Oracle | Linux | Virtualization

Понравилась подборка ссылок:

Oracle Linux Home Page: http://oracle.com/linux
Linux Technology Center: http://www.oracle.com/technology/tech/linux/
Unbreakable Linux Network: https://linux.oracle.com
Unbreakable Linux Network: An Overview: http://www.oracle.com/technologies/linux/uln-whitepaper.pdf
Oracle VM Home Page: http://oracle.com/virtualization
Virtualization Technology Center: http://www.oracle.com/technology/tech/virtualization/
Oracle VM Wiki: http://wiki.oracle.com/page/Oracle+VM?t=anon
Oracle VM templates http://www.oracle.com/technology/products/vm/templates.html


Читать дальше...

10.2.0.4 for Windows

Возможно вы заметили, что в июле обновился патч 10.2.0.4 for Windows. Беспокоится не надо, объяснение в Note 726418.1. Старый патч перетирал sqlnet.ora, теперь это исправили. Кажется это все изменения.


Читать дальше...

Мне удалось вернуться из небольшого отпуска. На этот раз в Киргизии. Было достаточно приколько после +30 в Бишкеке попасть под снег на высоте порядка 3000 метров. Я весь обхохотался прям в своем спальнике весом 1.2 кг рассчитаном на плюсовую температуру :)))

В Киргизии в горной части много иностранцев. Удалось поболтать с французами. На французском между прочем. Итальянская пара с гордостью показала мне что они уже проехали 8,500 км на своем landrover'е и им еще предстоит возвращаться домой. Дедуля голландец на велосипеде посетовал, что почему-то в горах нет магазинов и мы подарили ему лепешку хлеба, после того как закончили хохотать - до близжайшего магазина было 200 км....

Все фотографии с отпуска

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

За отпуск я получил много писем - на все отвечу в течении этой недели. Не волнуйтесь.

Как Вы наверно заметили, во время моего отпуска продолжилась публикация в блоге благодаря Игорю Мельникову. Надеюсь, что благодаря совместной деятельности этот блог станет еще интересенее....


Читать дальше...