среда, 8 февраля 2017 г.

Oracle XMLTABLE example

Подробный пример использования XMLTABLE я нашел в IBM Developerworks :-)
Меня конкретно интересовала обработка множественных значений для одной ячейки (column path)

суббота, 21 января 2017 г.

Быстрый старт Oracle GG IExtract or IReplicat

Для быстрого старта Integrated Replicat или Extract в Oracle GG применяли такую оптимизацию internal SQL с помощью SQLPatch

DECLARE
    sql_text      clob := 'SELECT c.capture_name,      xo.queue_owner || ''.'' || xo.queue_name 
FROM all_xstream_outbound xo,all_capture c  WHERE xo.capture_name =
c.capture_name AND        server_name = SUBSTR(UPPER(''OGG$EXIEKS''),1,
30)'
;
    hints         VARCHAR2(1000) := 'PARALLEL(4)';
    description   VARCHAR2(100) := 'GG sql patch for IE';
    name          VARCHAR2(100) := 'GG_IE_SQL_PATCH';
    output        VARCHAR2(100);
    sqlpro_attr   sys.sqlprof_attr;
BEGIN
    sqlpro_attr := sys.sqlprof_attr(
        hints
    );
    output := sys.dbms_sqltune_internal.i_create_sql_profile(
        sql_text      => sql_text,
        profile_xml   => dbms_smb_internal.varr_to_hints_xml(
            sqlpro_attr
        ),
        name          => name,
        description   => description,
        category      => 'DEFAULT',
        creator       => 'SYS',
        validate      => true,
        type          => 'PATCH',
        force_match   => true,
        is_patch      => true
    );

    dbms_output.put_line(
        output
    );
END;
/

В итоге все запрос теперь выполняются с применением патча.


SELECT c.capture_name,       xo.queue_owner || '.' || xo.queue_name   FROM all_xstream_outbound xo, all_capture c  WHERE xo.capture_name =  c.capture_name AND        server_name = SUBSTR(UPPER('OGG$EXIEKS123'), 1,  30)
2017-01-15/11:43:21
GG_IE_SQL_PATCH
SELECT c.capture_name,       xo.queue_owner || '.' || xo.queue_name   FROM all_xstream_outbound xo, all_capture c  WHERE xo.capture_name =  c.capture_name AND        server_name = SUBSTR(UPPER('OGG$EXIEKS124'), 1,  30)
2017-01-15/11:43:52
GG_IE_SQL_PATCH
SELECT c.capture_name,       xo.queue_owner || '.' || xo.queue_name   FROM all_xstream_outbound xo, all_capture c  WHERE xo.capture_name =  c.capture_name AND        server_name = SUBSTR(UPPER('OGG$EXIEKS125'), 1,  30)
2017-01-15/11:43:58
GG_IE_SQL_PATCH


 Старт IExtract вместо 30 минут выполняется за 2 минуты после создания SQLPatch. 

воскресенье, 15 января 2017 г.

PlantUML


Сегодня через плагин к идее открыл для себя PluntUML. 
Крутота!
Я и не предполагал, что можно настолько удобно "изготавливать" или проектировать (термин "рисовать" совсем не подходит) в любом ТЕКСТОВОМ редакторе.

понедельник, 9 января 2017 г.

Проблемы при обслуживании секционированных таблиц

Проблемы при обслуживании секционированных таблиц


В проекте управления архивными данными была использована опция Oracle Partition. PSU - 11.2.0.4.7 Платформа - Oracle M6. SunOS 5.11

Столкнулись со следующими проблемами:

1. Unusable index segment not removed when index become unusable after partition operations
При выполнении операции alter table truncate partition/subpartition без опции update global indexes глобальные индексы должны были быть переведены в состояние UNUSABLE и удалены сегменты этих индексов. В состояние UNUSABLE индексы переведены, но сегменты не удалены. 
После этого перестроение индекса требует дополнительного пространства в TBS, т.к. при REBUILDе "старый" сегмент удаляется только после создания "нового". 
Проблема не очень большая, если размер индексов не велик. Но у нас размер одного глобального индекса доходит до 400G. И на для таких размеров поиск дополнительного свободного места в TBS - это уже проблема. 
Можно, конечно, придумать 1000 и 1 способ перестроения с выделением и дальнейшим освобождением использованного для перестроения места, но это все - дополнительные подпрыгивания, которых можно избежать, если перед  alter table truncate partition/subpartition  сделать alter index unusable.
Добавлю, что я не смог найти способа удалить существующий сегмент у unusable-индекса. Повторное изменение состояния на unusable не приводит к удалению существующего сегмента.

PS. Такое поведение выявлено для операции alter table truncate partition у субсекционированной таблицы. Возможно будет наблюдаться и в других вариантах операций обслуживания партиций.  

2. Alter table exchange partition stopped with error ORA-01407: cannot update ("SYS"."HIST_HEAD$"."COL#") to NULL
Исключение архивных данных из оперативной базы в проекте выполняется с помощью операции обмена секциями партиции с пустой таблицей. Делается это подобной командой:
ALTER /*+ MONITOR */ TABLE IBS.Z#DOCUM_RC EXCHANGE PARTITION (R_2015_10) WITH TABLE IBS.TT_J70NXQA2GAPKVTPNMJJA INCLUDING INDEXES WITHOUT VALIDATION UPDATE GLOBAL INDEXES  PARALLEL 128
Как видите, в exchange участвуют партиции локальных индексов.
В случае, если выполняются следующие условия:
- у секционированной таблицы присутствует функциональный индекс, 
- системные имена колонок функциональных индексов секционированной таблицы и таблицы, использующейся в exchange, отличаются (можно проверить в dba_ind_columns),
- по функциональному индексу собрана статистика,
то выполнение exchange завершится с ошибкой
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01407: cannot update ("SYS"."HIST_HEAD$"."COL#") to NULL

Очевидный баг работы со словарем, но в саппорте найти патча для этой операции не удалось.

Лечится удалением статистики с колонок функционального индекса перед операцией exchange. В моем случае пилюлька выглядит так:
exec                                       dbms_stats.delete_column_stats(ownname=>'IBS',tabname=>'Z#DOCUM_RC',colname=>'SYS_NC00169$');
exec                                       dbms_stats.delete_column_stats(ownname=>'IBS',tabname=>'Z#DOCUM_RC',colname=>'SYS_NC00168$');
exec                                       dbms_stats.delete_column_stats(ownname=>'IBS',tabname=>'TT_J70NXQA2GAPKVTPNMJJA',colname=>'SYS_NC00169$');
exec                                       dbms_stats.delete_column_stats(ownname=>'IBS',tabname=>'TT_J70NXQA2GAPKVTPNMJJA',colname=>'SYS_NC00170$');

3. Alter table exchange partition stopped with error ORA-19728: data object number conflict
Еще одна проблема с exchange. Возникает в случае одинаковых идентификаторов data_object_id у обменивающихся объектов.
В нас в проекте проблема возникла следующим образом:
- Была база данных с секционированным объектом.
- Создали копию этой базы и назвали ее архивом.
- Прошло какое-то время и теперь надо через transportable tbs перенести данные из оперативной БД в архив.
- В оперативной БД создаем "транспортную" таблицу и делаем exchange архивируемой партиции с этой таблицей. При exchange мы же просто делаем обмен сегментами, И в этом случае data_object_id у объекта не меняется. Т.о. мы получили транспортную таблицу с тем же самым data_object_id, что и соответствующая партиция в архивной БД.
- "Транспортную" таблицу мы не двигаем в другое TBS. (Заранее спроектировали хранение так, чтобы все лежало отдельно и не надо было заморачиваться с отделением архивных данных для переноса).
- Делаем экспорт TTBS в оперативной БД и импорт TTBS в архивной БД.
- Пытаемся "подключить" партицию в архивной БД в соответствующую таблицу с помощью exchange и получаем
ALTER /*+ MONITOR */ TABLE IBS.Z#MBK_ACQ EXCHANGE PARTITION (R_2016_04) WITH TABLE IBS.TT_8ZINLFCFCLIF2L1RFJNG INCLUDING INDEXES WITHOUT VALIDATION;
ERROR at line 1:
ORA-19728: data object number conflict between table TT_8ZINLFCFCLIF2L1RFJNG and partition R_2016_04_C_000 in table Z#MBK_ACQ 

Способов решения проблемы много. Все они сводятся к изменению data_object_id либо у партиции, либо у "транспортной" таблицы. 
Можно сделать move.
Но я выбрал truncate partition в архивной таблице, т.к. эти данные мне уже не нужны. Они будут замещены данными из транспортной таблицы. И к тому же в партиция архивной таблицы большая и Move будет выполняться долго.
Но для truncate пришлось на время отключить FK на таблицу, в которой делал truncate partition.
Кроме этого, если делаем truncate пустой партиции, то data_object_id не меняется. Парни в Oracle тоже не хотят делать лишние движения. Так что для "надежности" после truncate я еще и move таки делаю.
То что после truncate и move становятся unusable глобальные индексы, меня не волнует.  Я так и так собираюсь их перестраивать после exchange. 

4. TX-index contention or index unformated blocks after delete operation
У операции exchange, выполняемой с опцией update global indexes, нашлась еще одна БОЛЬШАЯ проблема. И выражается эта проблема либо в возникновении TX-index contention после выполнения exchange, либо в лавинообразном росте сегмента глобального индекса таблицы с высококонкурентной вставкой.
Но это слишком сложная тема для первого рабочего дня в новом году. Опишу чуть позже.  

вторник, 28 июля 2015 г.

DBMS_SQLPA. Число запусков SQL Statement

В последнее время мне очень много приходится работать над вопросами оптимизации работы Oracle Database и оценивать эффект от предлагаемых рекомендаций.
Существует множество инструментов для подобного рода оценок. Это и родные инструменты Oracle, собранные в пакет Oracle Real Application Testing. И сторонние инструменты проведения нагрузочного тестирования -HP LoadRunner и т.п.
Хочу поделиться одним наблюдением, сделанным во время тестов с использованием SQL Performance Analyzer.
С использованием пакета DBMS_SQLPA можно сформировать тестовый набор sql-выражений и запускать их в различных тестовых базах данных, сравнивая результаты запусков и оценивая эффект от изменений окружения. Так можно тестировать переход на новые версии Database, операционных систем, оценивать эффект от изменения параметров Oracle DB или параметров хранения объектов.
Я с помощью SPA оценивал эффект от партиционирования объектов. И при выполнении запросов обратил внимание, что реальное время выполнения запроса сильно отличается от статистических данных, которые появляются в dba_advisor_sqlstats.
Например запрос выполнялся 20 мин, а во вьюхе появляется значение elapsed_time - 98 сек.
Никак не мог понять, как такое возможно.
Оказалось, что в версии 11.2 при выполнении тестового набора каждый запрос выполняется ни один, а несколько раз. Это поведение регулируется параметром DISABLE_MULTI_EXEC
В версии 11.2 по умолчанию значение этого параметра равно FALSE.
В зависимости от времени выполнения запроса, он (запрос) может выполняться от 2 раз (для long running SQL statement) до 10 раз (соответственно для FAST Running SQL statement). При этом первое выполнение используется для разогрева buffer cache и не учитывается в статистике выполнения запроса.
Данные о числе запусков каждого запроса можно посмотреть в представлении DBA_ADVISOR_SQLSTATS.
TESTEXEC_TOTAL_EXECSNUMBERTotal number of executions during test execute
 

вторник, 8 апреля 2014 г.

Установка Oracle RAC 11.2.0.3 на Oracle Linux x64 6.4 (VirtualBox)

1. Заморачивался и развертывал DNS
2. При создании ASM DiskGroup есть проблема. Мне никак не установить совместимость для ADVM. Без него я не могу создать ASFS.
Оказывается - это баг. Его надо фиксить... Фикс бага буду делать после установки базы, чтобы проверить процесс накатки патчей.
Create ASM diskgroup using asmca
--> ADVM Compatibility is greyed and not selectable
Check OS version and kernel release
# uname -r
2.6.39-300.17.2.el6uek.x86_64
# cat /etc/oracle-release 
Oracle Linux Server release 6.3
# lsmod | grep ora
oracleasm              53352  1
See: Bug 12983005  Linux: ADVM/ACFS is not supported on OS version '2.6.39-100.7.1.el6uek.x86_64'
--> Missing driver for oracleacfs, oracleadvm , oracleoks
Fix : Install clusterware patch 11.2.0.3.3 or higher
For a detailed 11.2.0.3.4 patch install please read the following link.

3. При выполнении cluvfy постоянно получал проблемы с DNS. 
runcluvfy failed with PRVF-5636
 Решилось с помощью настройки в DNS
The warning is for not resolvable queries so the proper test is to run
time nslookup idontexist

if that takes more than 15 secs then:

If you are using your own bind DNS server try to edit /etc/named.conf

and change

zone "." in {
type hint;
file "root.hint";
};

to

zone "." in {
type hint;
file "/dev/null";
};

суббота, 8 июня 2013 г.

Компания "Балтрос"

Сегодня - мой последний рабочий день в компании "Балтрос", в которой я проработал более 13 лет.
Я  хочу сказать СПАСИБО всем своим коллегам, которые все это время были со мной рядом. Я очень благодарен Вам за работу, которая была проделана вместе с Вами, и за то время, когда мы вместе отдыхали.
Я не собираюсь терять с Вами связь, но мне будет не хватать ежедневного общения с Вами.
 Еще раз - БОЛЬШОЕ ВАМ СПАСИБО!

пятница, 29 марта 2013 г.

New SOA Suite 11g Database Performance Tuning White Paper

Опубликованы новые статьи о нстройке производительности SOA Suite и BPM Suite.

Доступны здесь http://www.oracle.com/technetwork/middleware/soasuite/learnmore/psrsoadbperformance-1919499.pdf
http://www.oracle.com/technetwork/middleware/bpm/learnmore/bpm11gperftuning-1912340.pdf

Пока провести какие-то эксперименты и посчитать повышение производительности при выполнении SOAComposite не удалось.

пятница, 22 марта 2013 г.

Oracle JDeveloper & Oracle MapViewer

Сегодня мне потребовалось поизучать возможности Oracle JDeveloper и ADF по отображению геоинформации.
Изучал я эти технологии, как архитектурную альтернативу уже существующему нашему геоинформационному решению, примененному нами при разработке РГИС СПб http://rgis.spb.ru/map/

Не углубляясь в полученные результаты, хотел бы предупредить, что при попытке в JDeveloper подключения к Oracle MapViewer, можно получить сообщение
Failed to retrieve data from Mapview server
в окне Create geographic map

И это происходит, несмотря на то, что на предыдущем шаге соединение с сервером MavViewer установлено успешно.


Это происходит из-за того, что пока не создан ни один Tile Layer


Как только Вы в консоли управления MapViewer создадите хотя бы один слой Tile, ошибка пропадет.

понедельник, 18 марта 2013 г.

Прохождение границы из Эстонии в Россию в Нарве

Немного не по теме блога, но надо рассказать.
Вчера ездил с друзьями отдохнуть в Эстонию. Ехать из Питера недалеко и мы обычно ездили на один день. Приедем в Нарву, сходим в СПА (отель Мерессу), пообедаем в кафе, сходим в Призму за продуктами и домой. Выезжаем в 7 утра и в 19 обычно уже дома.
До вчерашнего дня все было хорошо....
Для того, чтобы выехать из Эстонии на машине, необходимо либо забронировать выезд на определенное время, либо встать в живую очередь. Скорость движения в живой очереди, которая движется в том случае, если есть возможность пропустить транспорт В ДОПОЛНЕНИЕ к транспорту, который забронировал выезд.
Раньше утром, въехав в Эстонию, мы ехали на площадку ожидания (Нарва, Раху,4) и бронировали выезд на этот же день на то время, которое удобно. Обычно в 16-17 мы уже получали пропуск на выезд и в 18 часов проходили границу.

Так было раньше. (((
Теперь (с 26 декабря) нельзя забронировать выезд за срок, меньший чем 24 часа. Если я буду выезжать завтра -пожалуйста, бронируй. Если сегодня -вставай в живую очередь. Мы вчера стояли 6 часов.

Теперь уже и не знаю, когда в следующий раз соберусь в Эстонию. Или в следующий раз буду переходить границу пешком. В Ивангороде это можно сделать.

среда, 20 февраля 2013 г.

Повторение учебного примера "Getting Started with Oracle BPM Suite11gR1". Часть 2

В этой части я расскажу о проблеме, которая возникла у меня при повторении учебного примера, приведенного в разделе 13  книги "Getting Started with Oracle BPM Suite11gR1".
В этом разделе предполагается, что читатель создаст два бизнес-индикатора и настроит информационную панель для их просмотра. 
Раздел называется "Tutorial: Using standard and custom dashboards for the Request Quote process".

Все прекрасно получалось и соответствовало учебному примеру до момента создания custom dashboard. Информационную панель, в соответствии с рекомендациями книги, я создал, но данные, которые я ожидал там увидеть, в ней не отображались.

ТУ проблему, на которую я натолкнулся, можно обойти несколькими способами, НО ... Ведь по документации должно работать и так... Из-за этого я настойчиво копал и разбирался с проблемой. Заключается эта проблема в следующем:

1. Для BPMпроцесса можно определить бизнес-индикаторы, которые измерения (dimension) и факты (Measure) 




Процедура создания бизнес-индикаторов подробно описана в учебном примере. 
Как я понял, смысл этих индикаторов - подготовка интересующих пользователя или аналитика данных, которые расчитываются на том или ином этапе процесса и сохранение этих данных в специальных таблицах базы данных. 
А поооотооом..., когда возникнет необходимость получить ту или иную количественную информацию о процессе или о результатах работы процесса, аналитик (не сам конечно, а с помощью средств анализа) обратиться уже к подготовленным данным, записанным в таблицы базы данных, вместо того, чтобы лазить по XMLданным, хранящимся в экземплярах выполненных или выполняющихся процессом. 
Вроде бы все просто.

2. Далее, после того, как мы определили индикаторы, нам необходимо выбрать место в процессе, где они будут заполняться.
Для этого создается шаг процесса, в котором производится заполнение измерений и фактов
Вот этот  шаг

А вот заполнение измерений и фактов.


3. Далее в учебном примере предлагают создать measurement mark
Из описания я для себя понял, что measurement mark - это "такая штука", нужная ВОТ для чего... 
Аналитические данные процесса (то, что пишется в базу данных) по умолчанию (умолчание конечно можно изменить) не захватываются после автоматических активностей. На рисунке ниже видно свойство активности, с помощью которого можно управлять генерацией аналитических данных после выполнения активности.


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


4. Прекрасно... Теперь (по моим ожиданиям) можно создать информационную панель (custom dashboards) и с наблюдать за изменением индикатора В ТОТ МОМЕНТ, когда выполниться операция заполнения индикатора.
Параметры созданной панели приведены ниже.


5. Панель я создал, но данных НИКАКИХ не увидел.
И только после того, как выполнил НЕАВТОМАТИЧЕСКУЮ активность после активности, в которой присваиваются значения бизнес-индикаторам, я увидел график в инфопанели.


Первой мыслью моей было -"блин, опять я где-то не тот флажек поставил или еще что-то пропустил"... Два дня я искал причину такого поведения, но так ничего найти и не смог ((((
Вроде бы все четко написано, "ЧТОБЫ ДАННЫЕ БЫЛИ ЗАХВАЧЕНЫ, НАДО УСТАНОВИТЬ measurement mark". Но данные не захватываются и не отображаются в дашбоарде, пока не выполняется следующая после measurement mark неавтоматическия активность. Обойти эту проблему можно так:
    - присвоить значения бизнес-индикаторам на выходе из активности "Enter Quote Details". Тогда они сразу появятся в инфо-панели (проверял, работает)
    - установить у автоматической активности признак генерации аналитических данных (проверял, работает).
Но, если эту проблему обходить, то ЗАЧЕМ ТОГДА НУЖНА measurement mark??? Непонятно...

Как я проверял, что правильно все сделал...:
- сначала я решил проверить процесс. Дошел ли он до нужной точки и выполнил ли он требуемые активности. Мало ли... Может какая-то ошибка возникла при выполнении активности "Assign Indiсators". Заглянул в EM... Посмотрел... Нет. Вроде все нормально


- потом я решил посмотреть, что записывается в базу данных при выполнении активностей. Что происходит при захвате значений бизнес-индикаторов? Для process analytics в схеме SOAINFRA существуют специальные таблицы с префиксом BPM_CUBE...
Интересующая меня информация записывается в таблицу BPM_CUBE_TASKPERFORMANCE.
Если посмотреть, что содержится в таблице по интересующему меня процессу, то можно можно увидеть примерно следующее:
 SELECT t2.processname, t1.activityname, t1.activitytype, t1.label, t0.FLEXSTRING01,
         t0.FLEXNUMBERRANGE01,
         t0.FLEXNUMBER02 
    FROM BPM_CUBE_TASKPERFORMANCE t0, BPM_CUBE_PROCESS t2, BPM_CUBE_ACTIVITY t1
   WHERE      t1.PROCESSID = t2.PROCESSID
          and t0.PROCESSID = t1.PROCESSID
          AND t0.ACTIVITYID = t1.ACTIVITYID
          and componentinstanceid=50007

Результаты получились следующие:


Видно, что данные в measurement mark захвачены. Нужная мне информация сохранена в трех последних колонках. 
Можно сделать вывод, что (скорее всего) данные для анализа подготовлены правильно.
Остается только попробовать разобраться с дашбоардом. Только как с ним разобраться, если он представляет собой закрытую систему?

- Разборки с дашбоардом. 
Я решил попробовать так... Если дашбоард отображает сведения из базы данных, то должен он это делать на основе результатов какого-то запроса. И запрос этот можно найти в V$SQLAREA

select sql_text, executions from v$sqlarea where parsing_schema_name = 'SOA_SOAINFRA' 
and sql_text like '%BPM_CUBE_TASKPERFORMANCE%' order by executions;

Я помотрел результаты приведенного выше запроса, потом несколько раз обновил информационную панель и еще раз выполнил запрос. После этого по разнице в поле EXECUTIONS я нашел тот запрос, результаты которого отображатся в интересующей меня информационной панели.
ВОТ ОН

  SELECT t0.FLEXSTRING01,
         t0.FLEXNUMBERRANGE01,
         AVG (t0.FLEXNUMBER02),
         COUNT (t0.FLEXNUMBER02)
    FROM BPM_CUBE_TASKPERFORMANCE t0, BPM_CUBE_PROCESS t2, BPM_CUBE_ACTIVITY t1
   WHERE (    (    (    (    (t2.UNDEPLOYDATE IS NULL)
                         AND (t0.DISCRIMINATOR IS NULL))
                    AND (t1.ACTIVITYTYPE NOT IN (:1, :2, :3, :4, :5)))
               AND (    (    (    (    (t2.DOMAINNAME = :6)
                                   AND (t2.COMPOSITENAME = :7))
                              AND (t2.SCALABEL = :8))
                         AND (t2.REVISION = :9))
                    AND (t2.PROCESSNAME = :10)))
          AND (    (t1.PROCESSID = t2.PROCESSID)
               AND (    (t0.PROCESSID = t1.PROCESSID)
                    AND (t0.ACTIVITYID = t1.ACTIVITYID))))
GROUP BY t0.FLEXSTRING01, t0.FLEXNUMBERRANGE01
ORDER BY t0.FLEXSTRING01 ASC, t0.FLEXNUMBERRANGE01 ASC



Условие, которое меня заинтересовало, выделено в запросе жирным шрифтом. 

Значения bindпеременных были мной получены из представления V$SQL_BIND_CAPTURE
select * from V$SQL_BIND_CAPTURE where sql_id = '6nj6tuy59tv9f'


И выяснилось, что в качестве переменных 1, 2, 3, 4, 5 в запрос подставляются значения
'MEASUREMENT_START',
'MEASUREMENT_STOP',
'MEASUREMENT_START_STOP',
'MEASUREMENT_COUNTER',
'SUBPROCESS'


С такими параметрами, естественно, в результатах запроса будут отсутствовать данные, полученные в указанной мною measurement mark.
Более того, все данные, которые получаются в ЛЮБОЙ measurement mark, будут исключаться из результатов dashboard.

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


пятница, 15 февраля 2013 г.

Повторение учебного примера "Getting Started with Oracle BPM Suite11gR1". Часть 1

Работая над одним проектом, я уже несколько лет проектирую SOA-системы. До недавнего времени я использовал Oracle SOA Suite, а конкретно - Oracle BPEL Server.
В начале 2013 года у меня появилось немног освободного времени, которое я посвятил изучению еще одного ораклового сьюта, используемого при разработке SOAприложений - Oracle BPM Suite.
Для самостоятельного "поверхностного" ознакомления с этой платформой написана неплохая книга - "Getting Started with Oracle BPM Suite 11gR1" Heidi Buelow, Manoj Das, Manas Deb, Prasen Palvankar, Meera Srinivasan ISBN 978-1-849681-68-1
С ее помощью можно за несколько дней получить начальные навыки проектирования, имитационного моделирования и развертывания бизнес-процессов.
Однако, даже имея подробные пошаговые инструкции в книге, без "грабель" пройти весь путь мне не удалось. Ну и чтобы не получать по носу второй раз, развертывая в будущем (если понадобиться) инфраструктуру BPM Suite уже для разработки или для исполнения бизнес-процессов у Заказчика, я решил сохранить перечень "граблей".

1. Установка маппингов между ролью BPMN и ролью LDAP (Mapping swim lane roles to LDAP roles).
При пропытке связать роль BPM с объектом LDAP (группой, пользователем или APPролью) я столкнулся с проблемой получения информации от  LDAP, встроенного в Weblogic-сервер.
В окне IdentytyLookup при выборе сервера приложений не отображался Realm...



  
Как ни странно, но оказалось, что для получения данных о пользователях и группах нужен запущенный managed server SOA. А он у меня, как раз был застоплен и был запущен только AdminServer.
 
2. Перенос спроектированного процесса в репозитарий MDS для работы с проектом в BPM Composer 

Для переноса проекта в репозитарий MDS необходимо настроить BPM MDS Connection
Однако, при нормально настроенном соединении SOA MDS, тестирование BPM MDS Connection приводило к ошибке.
Я разворачивал SOA и BPM Suite на виртуальной машине и для виртуальных машин нашел на оракловом форуме рекомендацию, в соответствии с которой необходимо настроить Listen Address для soa_server в консоли WLS.
После выполнения этой рекомендации и рестарта soa_server тест при создании соединения прошел и удалось экспортировать проект в BPM MDS.


Рекомендации на форуме Oracle

Что впечатлило:
1. Результаты симуляции (simulation results)
Сравнение стоимости по ролям - наглядно видно, кто РАБОТАЕТ, а кто находится в ОЖИДАНИИ. Диаграмма стоимости ресурсов наглядно показывает этот факт.



Все остальное, включая этапы Implementation & Deploy прошли без особых проблем.
Пока я остановился на главе 13  "Process Analytics and Business Activity Monitoring".
Впечатленими о следующих частях книги и проблемами (если они возникнут)  поделюсь в следующей записи.
Остались главы:

Chapter 13: Process Analytics and Business Activity Monitoring
Chapter 14: Using Business Rules
Chapter 15: Using Human Task Patterns and Other Concepts
Chapter 16: User Interface Development for Human Tasks
Chapter 17: Events and Exception Handling
Chapter 18: Customizing and Extending Process Spaces
Chapter 19: Administering the BPM Environment


вторник, 25 декабря 2012 г.

Яблоки и BMW X5

Добрый день!
Заканчивается год... На работе все текущие задачи выполнены, контракты закрыты. Неожиданно появилось немного свободного времени и я решил описать случай, который реально произошел со мной и моим директором этой осенью.
Он не имеет никакого отношения ни к BI, ни управлению собственностью, ни к IT-технологиям. Но события, которые произошли, достаточно веселые и, я надеюсь, помогут кому-то на минуту отвлечься и поднять настроение перед Новым Годом.
Как Вы думаете, могут ли яблоки (их не пихали в выхлопную трубу) стать причиной поломки BMW X5?...
Могут.
Итак, события развивались так....

Не знаю, как у других, а у моей мамы на даче  Ленинградской области в этом году урожай яблок существенно превысил потребительские способности нашей семьи.
Поэтому яблоки распространялись абсолютно бесплатно и по всем знакомым.
Я взял за правило пару раз в неделю привозить пакет с яблоками на работу. В нашей компании работает около 40 человек. И пакет яблок съедался еще до обеда.
Так мы съели урожай ранних яблок (белый налив). А потом созрели осенние сорта. Этих яблонь на даче у моей мамы не одна, а четыре. Объемы существенно возросли, и коллеги уже не справлялись.
Тогда кому-то в голову пришла мысль, что не обязательно поедать все на работе. Можно же утащить домой и дома накормить жену, детей, сварить компот или варенье.
Эта мысль мне понравилась. Такой подход избавлял меня от необходимости есть все самому (я уже был близок к "яблочной аллергии").
В выходные я съездил на дачу и набрал 6-7 коробок яблок, чтобы раздать на работе желающим.
В понедельник все притащили на работу и раздали желающим. А одну коробку я уговорил взять своего директора. Он был рад и перегрузил эту коробку на заднее сиденье своего X5,
чтобы не таскать коробку в офис и из офиса.
Перегрузили мы ее утром и оставили в машине.
Вечером он выходит с работы как обычно, часов в 21. Садиться, заводит и не может тронуться с места. Вернее тронуться-то он может, но руль повернуть не может. Он поворачивается, но буквально на миллиметры. Вообщем, ехать он может, но только по прямой. А дорога домой изобилует поворотами)). Делать нечего, время уже позднее, сервисы закрыты. Машина оставляется у работы, вызывается такси и директор едет домой. Без машины и без яблок.

Компания у нас небольшая, какого-то своего специалиста, который бы мог посмотреть внутрь машины и решить, что лучше делать, просто нет. Поэтому следующее утро начинается со звонка на сервис.
Механики на сервисе, естественно, по телефону лечить отказываются. Говорят, что нам туда (внутрь высокотехнологичной техники) соваться не следует. Следует вызвать эвакуатор и бережно доставить машину к ним для обследования и ремонта. Делать нечего...
Яблоки извлекаются из машины директора и перегружаются мне обратно в машину. Решаем, что я их немного покатаю, пока директорский транспорт в ремонте.
Эвакуатор увозит машину на ремонт в сервис. На следующее утро смена механиков на сервисе должна ее взять в ремонт, а директор уезжает в Москву на день в командировку.

На следующий день (третий день эпопеи) звонит мне из Москвы директор...
И со смехом говорит, что только что разговаривал с механиком.
А он поведал ему страшную историю... Дело было так.
Во дворе стояла машина с яблоками. Они так вкусно пахли, что не оставили равнодушной крысу, которая шла мимо по своим делам. Она решила залезть в машину за яблоками, но никаких дырок, кроме дырок в моторный отсек не нашла. Полезла через него. Дальше не понятно. Толи она застряла, толи просто так совпало. Вышел директор, сел в машину и завел ее. Крыса попала между ремнем усилителя руля и шкивом, и своим телом скинула ремень со шкива.
В результате - усилитель не работает, руль не повернуть.
Крысу внутри измолотило в капусту... Я даже не представляю, что испытывали механики на фирменном BMWшном сервисе, когда чистили моторный отсек от крысиных останков ))... Я видел их ремонтные боксы... Многие больницы могут позавидовать их чистоте и стерильности. И сколько это стоило, я тоже не знаю ))

В итоге, коробка яблок обошлась компании в 6000р. (2 на такси и 4 за эвакуатор). Сколько стоил ремонт, я не спрашивал )))

Такая вот история.

PS. А коробка с яблоками после долгих путешествий все-таки досталась директору. Только у себя в машине он их уже не оставлял ))








среда, 26 сентября 2012 г.

Oracle BI 11g. nQSError: 59021


На днях разрабатывал один отчет.
На тестовой инфраструктуре (MS Win x86) все работало отлично.
А вот после переноса на Production (Oracle Linux x64) при выполнении одного отчета стали появляться ошибки

[nQSError: 59021] CASE conditional expressions have mismatching data types. [[
[nQSError: 43119] Query Failed:

Долго не мог понять проблему... Тем более, что нигде CASE не использовал. И в конце концов выявил источник...))
Оказалось, что проблема кроется в использовании LOOKUP в логической модели.
Краткая инструкция и польза от использования  lookup tables описана в блоге RittmanMead  http://www.rittmanmead.com/2010/08/oracle-bi-ee-11g-lookup-tables-sparse-and-dense-lookups/

Так вот... Оказалось, что ошибка возникает в случае, если я возвращаю поле с типом DATETIME, а в качестве DefaultValue в Sparse lookups возвращаю null.

Выглядела функция примерно так:

LOOKUP
(
SPARSE
"Модель".."Реестр"."Дата отправки",
null,
"Модель".."Запрос"."ProcessUnid"
)

Я совсем забыл, что по умолчанию значение NULL имеет тип varchar и его надо преобразовывать.
После того, как я изменил функцию и добавил явное преобразование, все заработало

LOOKUP
(
SPARSE
"Модель".."Реестр"."Дата отправки",
to_datetime(null, 'dd.mm.yyyy'),
"Модель".."Запрос"."ProcessUnid"
)

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





понедельник, 24 сентября 2012 г.

Перенос репозитария BI

Каждый раз, перенося репозитарий со среды разработки на production, я мучительно ищу главу, в которой описывается процедура upgrade guid пользователей.
Сегодня чаша моего терпения иссякла.
И я решил записать для себя ссылку - http://docs.oracle.com/cd/E21764_01/core.1111/e10105/testprod.htm#BABFIHFJ 

To refresh the user GUIDs:
  1. Open the NQSConfig.INI file for editing. For information, see "Where are Configuration Files Located?" in Oracle Fusion Middleware System Administrator's Guide for Oracle Business Intelligence Enterprise Edition.
  2. Locate the setting FMW_UPDATE_ROLE_AND_USER_REF_GUIDS = NO and change its value to YES.
  3. Modify the instanceconfig.xml file to instruct Presentation Services to refresh GUIDs on restart. Edit the file to add the last line in the following instruction.
    <ps:Catalog xmlns:ps="oracle.bi.presentation.services/config/v1.1">
    <ps:UpgradeAndExit>false</ps:UpgradeAndExit>
    <ps:UpdateAccountGUIDs>UpdateAndExit</ps:UpdateAccountGUIDs>
    
  4. From a terminal window, stop and restart the managed processes using the opmnctl parameters stopall and startall. You can use the parameter status to verify process status throughout.
    The following components are involved: Presentation Services, Oracle BI Server, Oracle BI Scheduler, Oracle BI Cluster Controller, and Oracle BI JavaHost.
    For information about using opmnctl commands, see "Using the OPMN command line to Start and Stop Oracle Business Intelligence System Components" in Oracle Fusion Middleware System Administrator's Guide for Oracle Business Intelligence Enterprise Edition.
  5. Edit the NQSConfig.INI file to reset the FMW_UPDATE_ROLE_AND_USER_REF_GUIDS = YES to NO and restart the Oracle BI Servers.
  6. Remove, set to none, or comment out the last line added to the instanceconfig.xml file (that instructs Presentation Services to refresh GUIDs on restart, as specified in Step 3).
    <ps:Catalog xmlns:ps="oracle.bi.presentation.services/config/v1.1">
    <ps:UpgradeAndExit>false</ps:UpgradeAndExit>
    <ps:UpdateAccountGUIDs>none</ps:UpdateAccountGUIDs>
    
  7. Restart Presentation Services for the instanceconfig.xml file that was updated.
  8. Ensure that Oracle WebLogic Server and the system components are also running. If they are not running, then restart them.
    For information, see "Starting and Stopping the Oracle Business Intelligence Components" in Oracle Fusion Middleware System Administrator's Guide for Oracle Business Intelligence Enterprise Edition.

четверг, 12 января 2012 г.

Перечень "личных" проблем

Странный заголовок... Не правда, ли
Но это действительно так.
Здесь я хочу обозначить перечень проблем в областях ORACLE SOA & BI, решить которые мне пока не удается. Наверняка, эти проблемы возникают передо мной в силу либо собственных неправильных действий, либо в связи с неправильным пониманием используемого инструментария, либо из-за несоответствующего применения инструментария.

Однако, проблемы существуют. И когда-нибудь я их обязательно решу и о решении напишу здесь.
1. Проблема долгого логина при внешней авторизации в ORACLE BI 11g.
В нашей системе мы используем авторизацию пользователей, построенную на основе хранения сведений о пользователях в таблицах Oracle DB.
Настройка авторизации на базе внешних таблиц описана здесь. Но при применении данного способа авторизации у нас СУЩЕСТВЕННО упала производительность операций с webservice BIPublisher.

2. Проблема переноса курсива в таблицах отчетов BIPublisher для пустого значения
Наблюдаю странное поведение BIP.
Есть отчет rtf. В нем таблица. Одна из колонок этой таблицы (поле результирующего набора) выделяется курсивом.
Так   вот...
ЕСЛИ мы будем формировать отчет в формате rtf, и в результирующем наборе значение поля, которое выделяется курсивом, имеет значение NULL,
ТО после NULLового поля вся оставшаяся таблица становится курсивом.
Такой эффект наблюдается ТОЛЬКО для КУРСИВА и ТОЛЬКО при формировании отчета в формате RTF.
Если формируем HTML, PDF и прочее - все ОК. Курсив не распространяется далее по таблице.
Если в шаблоне курсив меняем на BOLD или на подчеркивание, то при формировании отчета в RTF тоже все OK. Просто чудеса какие-то.


3. Как тестировать BPELпроцесс

4. Функции преобразования даты в текст в BIPublisher уменьшают дату на один день.


PS. Может кто-то сможет мне помочь?

понедельник, 7 ноября 2011 г.

Oracle Enterprise Manager 12c

Месяц назад (3.10.2011) на сайте OTN был размещен новый релиз средства управления информационной инфраструктурой Oracle - Enterprise Manager 12c.

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

В результате мне удалось запустить EM на своей рабочей станции в среде VirtualBox.
Я выделил виртуальной машине 3 процессора (на хосте у меня Intel Core i3 -2100) и 4 Gb оперативной памяти.

Установка прошла без каких-либо проблем. Точнее они у меня были, но возникали они по причине моей низкой компетенции в Linux. Но блогодаря гуглу и помощи админов на работе, процесс установки завершился.
Хочу отметить, что по моему субъективному мнению, это наверное наилучший инсталлер Ораклового продукта, которым я пользовался. Все требования к предварительным установкам и настройкам, критичным для дальнейшего процесса, проходят проверку. И если возникает какая-то проблема, то тут же в логе а экране указывается способ решения этой проблемы - это очень удобно, хотя и не избавляет от чтения документации :-)

Вообщем, через какое-то время я получил работающую систему.
На виртуалке EM у меня работает достаточно шустро.
После этого я выполнил необходимые настройки (Proxy setting) и сохранил характеристики аккаунта для доступа к металинку.
Надо отметить, в новом релизе 12с принципиально изменилась стратегия установки программного обеспечения агентов. Их нельзя скачать с сайта OTN, как для OEM 11g. Их можно скачать только используя SelfUpdate

На этом шаге меня и настигло разочарование...
К сожалению, агенты существют в настоящий момент только для Linux x86 и Linux x64.
А у меня все тестовые сервера (DB, SOA, BI) под Windows.

Планы Oracle по дальнейшему развитию OEM12c представлены в doc 793512.1 на сайте http://support.oracle.com

Про Windows x64 в этом документе сказано, что ожидать интересующий меня релиз можно в 4 квартале 2012 года. (((

Похоже, придется-таки переводить тестовые сервера на linux.
Ну не пропадать же выполненной работе по развертыванию EM?




пятница, 21 октября 2011 г.

Oracle BI EE 11.1.1.5 и Oracle Linux 6.1 x64

Сегодня я хочу рассказать о своих приключениях, вызванных решением развернуть Oracle BI EE 11.1.1.5 на Oracle Linux.

Получил я для этих экспериментов в распоряжение такую машину....

Установка BI прошла без особых проблем (это, наверное, я так считаю, потому что занимался этим наш админ :-))

Мне оставалось только перенести RPD и Catalog с виндовой машины, на эту.
Задача достаточно тривиальная:
- копируем RPD
- копируем Catalog
- c помощью консоли http://localhost:7001/em указываем новый репозитарий и каталог (если распаковывали не в SampleAppLite, а куда-то рядом)
- перегружаем сервер
- выполняем операции по Refresh GUID (кстати, надо бы озаботиться и понять, как можно синхронизировать встроенный LDAP двух разных серверов Weblogic, чтобы не заниматься этой ерундой каждый раз при переносе Заказчику измененного RPD)

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

Но более детальное изучение dashboards привело меня в замешательство.
Вообщем проблема была в следующем:
1. Я имею основной Answer, в котором есть агрегированные показатели.
2. Этот answer отображает всякие русские наименования продуктов, товаров, услуг, отделов и прочей чепухи.
3. Далее, как и во всех аналитических системах, мы хотим детализироваться по продукту или подразделению. С помощью фильтров переходим на следующий детальный отчет и в нем получаем сообщение.

Я перепроверил ВСЕ, до чего дотянулись руки...:
- смотрел фильтры,
- смотрел детальный отчет,
- смотрел nqquery.log (по логу в сервер баз данных уходил нормальный правильный запрос, в ответ на который возвращалось 0 строк).

После всех этих проверок у меня мелькнула мысль о КОДИРОВКЕ, но дальнейшего развития она не получила, т.к. в результатах answer я прекрасно вижу все наименования по-русски.

Быстро решить проблему не удалось. Пришлось создавать простейшую тестовую ситуацию, чтобы исключить возможные приобретенные проблемы от переноса репозитария и каталога с Win на Linux.
Пришлось делать следующее:
1. Восстановить репозитарий и каталог на те примеры, которые были созданы в ходе установки.
2. Созать в репозитарии connection к базе данных, работа с которой вызывала у меня проблемы.
3. Создаю простейший answer на основе прямого запроса к базе.


4. Получаю предсказуемые результаты.

5. Меняю English на Русский.. И не получаю ничего...
На экране выглядит это "ничего" так -


6. Я решаю убрать условие и вижу, что вместо слова 'РУССКИЙ', сервер BI показывает мне '???????'.
Таким образом, все-таки где-то проблемы с кодировкой.
При этом, что меня больше всего поразило, что эти проблемы возникают только при передаче данных от сервера приложений в сервер базы данных. Если я просто считываю данные из базы данных, то кирилица отображается без каких-либо проблем.

В итоге, вылечилось все выполнением следующих операций в терминале сервера LINUX.

opmnctl stopall
NLS_LANG=RUSSIAN_CIS.UTF-8
export NLS_LANG
echo $NLS_LANG
opmnctl startall

пятница, 7 октября 2011 г.

Перенос базы iTunes на другой компьютер

Вчера пришло сообщение о смерти сооснователя Apple. Жаль... Был действительно гениальный человек.
А я вчера еще раз смог ощутить то, что приложения и устройства Apple созданы людьми и для людей, а не программистами для программистов )))
Короче, на вчера поменял свой рабочий компьютер. А на нем была вся медиатека, с которой синхронизирован рабочий iPad. Потребовалось перенести всю медиатеку вместе с покупками из Appstore, скачаными и прослушанными подкастами, iTunesU учебниками и прочей пользовательской дребеденью.
Оказалось, что сделать это не просто, а очень просто.
Помогла мне статья здесь - http://www.apple-iphone.ru/forum/viewtopic.php?t=10377
Надеюсь, что поможет и другим.

А я продолжаю сожалеть о Стиве и с удовольствием пользоваться продукцией Apple.

пятница, 23 сентября 2011 г.

Показатели производительности BI EE 11i

Где-то вчера наткнулся на ссылку, с  помощью которой можно получить доступ с статистическим показателям, характеризующим производительность сервера Oracle BI.

В результате в браузере получим следующую информацию