29 июл. 2016 г.

RACChecker - check application for RAC compatible

Тема разработки и адаптации приложений под RAC очень обширна и многогранна и затрагивает практически все аспекты создания прикладного ПО для СУБД Oracle Database. Но, тем не менее, для того чтобы гарантировать что ваше приложение корректно будет работать в RAC, необходимо убедиться, что оно не использует технологии и механизмы которые в RAC в не работают, либо работают с особенностями. Подробно требования к приложению описаны в документе "Oracle RAC Database aware Applications - Developer’s Checklist". Вот перечень этих технологий:
  • каналы (пакет DBMS_PIPE) - не синхронизируются между узлами кластера;

  • объекты БД типа DIRECTORY (каталоги в файловой системе) должны располагаться на разделяемом сторадже и должны быть видны всем узам кластера;

  • вместо V$-представлений нужно использовать соответствующие GV$-представления;

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


    Методы борьбы с вышеперечисленными технологиями мы подробно рассматривали на культовом семинаре "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: Release 12.2.0.1.0 - Production on 15.04.2015 11:07:13

Utility for check support Oracle DB for RAC and Exadata

Copyright (c) 2016 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,JOB,ALL (ALL)
REPORT_FILE      file name for output report
PARFILE          parameter file name
SEQUENCES        Show NON-cached sequences (Y)
MIN_SEQ_CACHE    Check for sequences on minimum cache size (20)
SEQ_ORDERED      Check for sequences which are ordered (N)
SAVE_SOURCE      Save sources for "bad" objects (N)
DIR_SOURCE       Directory where sources will be save
SEQ_DDL_OPT      Generate sequence ddl-optimization for RAC: CACHE,ORDER,BOTH,NONE (NONE)
CHECK_DIRS       Check directory objects (for shared dir issue) (N)
CHECK_V$VIEWS    Check v$-views usage (Y)
USERID           Oracle connection string


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

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

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

  • возможна выгрузка DDL-скриптов для плохих объектов с помощью параметра SAVE_SOURCE=Y;

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

Конечно, никакого волшебства в работе этой утилиты нет: она всего лишь анализирует соответствующие представления словаря.

Утилита может находить факт использования неработающих в RAC технологий (например: пакет DBMS_PIPE), даже если PL/SQL-код зашифрован (wrapped). Утилита на "лету" определяет что код зашифрован, и в этом случае анализирует не исходный код, а зависимости от пакетов dbms_pipe,dbms_job.
Утилита НЕ может обнаружить факт использования этих пакетов только в одном случае: если они используются через динамический PL/SQL (EXECUTE IMMEDIATE или DBMS_SQL) и код зашифрован.

Утилита определяет факт использования пакетов внутри однострочных коментариев. Это не приводит к ложному срабатыванию. Многострочные комментарии, к сожалению, не поддерживаются. При анализе последовательнойстей можно задать минимальный размер их кеша (параметр MIN_SEQ_CACHE). В этом случае будут выведены все последовательности, размер кэша которых меньше этого минимума.

За время своего существования утилита RACChecker постоянно развивалась, и помогла очень многим заказчикам перенести свои существующие приложения в среду Oracle Real Application Cluster.

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

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