Показаны сообщения с ярлыком MAXL. Показать все сообщения
Показаны сообщения с ярлыком MAXL. Показать все сообщения

05 мая 2013

Восстановление БД Essbase в резервном ДЦ, не оставливая primary БД

Леонид Борчук описал в своем блоге пример восстановления БД Essbase в резервном ДЦ без остановки primary БД.

20 апреля 2013

MaxL Python Module

Essbase.py is a Python module that provides access to Oracle Essbase multi-dimensional databases using MaxL for Python programs. It is similar in function and usage to the Oracle Essbase Perl module Essbase.pm.

The Essbase Python module interfaces with Oracle Essbase using a Python ctypes module wrapper for the primary MaxL dll (essmaxl.dll or essmaxlu.dll). The ctypes module is standard in Python 2.5+. Versions of the wrapper are included for Essbase 6.5, for Essbase 7-11.1.2.1, and for Essbase 11.1.2.2.

The version 7 wrapper is operational with Essbase 9.3.1 and 11.1.2.1.

The version 11.1.2.2 wrapper is for Essbase 11.1.2.2 (and perhaps above).

Product's homepage

17 мая 2012

IBH в базе Essbase

Редко, но можно столкнуться с проблемой появления некорректных (дефектных) заголовков блоков - invalid block headers (IBH), которая описывается в логе приложения Essbase примерно так:
[Wed May 16 22:51:58 2012]Local/AppName/Cube/admin@Native Directory/Error(1006068)
Недопустимый статус транзакции для блока. Для поиска и устранения проблемы воспользуйтесь служебными программами поиска и устранения IBH.
Причинами могут быть:
  1. Какой-то сторонний процесс пытается получить доступ с блокировкой к файлам базы данных (куба) Essbase. Например, антивирус или ПО резервного копирования
  2. Служба Essbase была остановлена во время извлечения данных или выполнения расчетов. Иными словами, некорректная остановка или "падение" базы данных
  3. Проблемы с дисковой подсистемой сервера. Например, ошибки в работе RAID-массивов, bad blocks на накопителях информации
  4. Закончилось место на диске
  5. Сильная фрагментация диска
  6. Сильная фрагментация базы данных (куба)
  7. Использование Direct I/O 
  8. Слишком маленький кэш данных куба
  9. Подобные ошибки встречались в Essbase 6.х и 7.х
     
После проверки всех пунктов из списка выше для решения проблемы можно выполнить на проблемной базе данных (кубе) MaxL скрипт:
alter application 'AppName' disable connects;
alter system logout session on database 'AppName'.'Cube';
alter database 'AppName'.'Cube' validate data to local logfile 'f:\IBH.log';
alter database 'AppName'.'Cube' repair invalid_block_headers;
alter application 'AppName' enable connects;
Этот скрипт проверяет куб на наличие IBH и записывает найденные блоки в указанный лог-файл, а затем удаляет дефектные блоки из базы данных (куба).

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

UPD: Кроме того, имеет смысл иметь опцию в essbase.cfg:
IBHFIXTHRESHOLD AppName Cube 10
Эта команда говорит Essbase, что нужно проверять наличие IBH на кубе (это происходит и без указания опции в явном виде) и, в случае превышения порога 10% (пример), базу данных следует корректно остановить. Это сделано, с целью показать, что критическая масса IBH накоплена, и нужно что-то делать. Однако, в EPM 11 за работоспособность Essbase отвечает сервис OPMN, который регулярно пингует службу OLAP-сервера и может заставить запуститься приложение заново.

Наш соратник Евгений Расюк добавляет, и я его поддерживаю:
  • Всегда нужно иметь бэкап с выгруженными данными в текст. Это хоть и долго, на гораздо надежнее простого копирования файлов куба - "это видимость бэкапа" - в таком случае все проблемы (например, IBH) будут также занесены в бэкап
  • Нужно стараться проектировать модели таким образом, чтобы исключить кастом расчеты на агрегируемых уровнях

06 апреля 2012

MaxL по расписанию

Часто бывает необходимым поставить выполнение MaxL скрпита в расписание. Причем этот скрипт создан в EAS Console и хранится на сервере. Я решил эту задачу созданием batch файла, который ставится в расписание Windows Server:
@echo off
rem - Input parameter is a name of MaxL script (only name w/out extension)
Входящим параметром является имя MaxL скрпита без расширения.
setlocal
cls

Rem Set Variables
SET ESSSETENV=F:\Oracle\Middleware\user_projects\epmsystem1\EssbaseServer\essbaseserver1\bin\setEssbaseEnv.bat
SET SERVER=EssbaseServerNameOrIP
SET USER=Ess_admin_name
SET PASSWORD=Ess_password
Rem See more info about Encyption on https://forums.oracle.com/forums/thread.jspa?threadID=1021677
SET PKE=set_your_Public_Key_for_Encryption
SET PKD=set_your_Private_Key_for_Decryption
SET MaxLPath=F:\Oracle\Middleware\EPMSystem11R1\products\Essbase\eas\storage\mxlscripts\%USER%
SET EADMaxl=%MaxLPath%\%1
Вся информация сохранится в логе, имя файла которого задается переменной EXECLOG.
SET EXECLOG=AutoStartMaxL-%1.log
SET RunMaxl=AutoStartMaxL.mxl
SET CurrDir=%CD%

echo Started: %date% @ %time% > %CurrDir%\%EXECLOG%
Поскольку в консоли вход и подключение производить не нужно, а внешним скриптом - необходимо, добавляем строки входа (login) и завершения работы (logout и exit).
Rem - Generate MaxL Script - Start
echo login '%USER%' '%PASSWORD%' on '%SERVER%'; > %CurrDir%\%RunMaxl%
Сам скрипт считываем из исходного файла на сервере.
Rem - Read original MaxL
For /F "eol=; delims=/" %%i In (%EADMaxl%) Do (
    echo %%i ) >>  %CurrDir%\%RunMaxl%

echo logout; >> %CurrDir%\%RunMaxl%
echo exit; >> %CurrDir%\%RunMaxl%
Rem - Generate MaxL Script - Finish

Rem Set Essbase Env
call %ESSSETENV%
Сам скрипт запускаем в шифрованном виде. 
Rem Encrypt MaxL Script
essmsh -E %CurrDir%\%RunMaxl% %PKE% > nul
Rem Del Original MaxL Script
del %CurrDir%\%RunMaxl% > nul
Rem Run Encrypted MaxL Script with LOG
essmsh -D %CurrDir%\%RunMaxl%s %PKD% >> %CurrDir%\%EXECLOG%

echo ... >>  %CurrDir%\%EXECLOG%
echo Script: >>  %CurrDir%\%EXECLOG%
For /F "eol=; delims=/" %%i In (%CurrDir%\%RunMaxl%s) Do (
    echo %%i ) >>  %CurrDir%\%EXECLOG%
echo ... >>  %CurrDir%\%EXECLOG%

Rem Del Encrypted MaxL Script
del %CurrDir%\%RunMaxl%s >> %CurrDir%\%EXECLOG%

echo Finished: %date% @ %time%  >> %CurrDir%\%EXECLOG%
Добавляем в расписание (Task Scheduler) задачу на выполнение нашего bat-файла с параметром - именем MaxL скрпита.
 


26 марта 2012

Скользкие формы Planning

Встала передо мной задача: построить формы в Planning таким образом, чтобы на форме был текущий месяц (Period Dim) и пару месяцев назад. Естественно, каждый раз перестраивать ручками формы лень, а есть ситуации, когда нужно "заглянуть" на 1-2 мес в прошлый год. Вот и получаются у нас "скользящие" формы.
К сожалению, сами формы данных, в отличие от отчетов FinReporting, построить с использование ссылающихся функций (вроде Prior) нельзя. Ответ нашелся на форуме: https://forums.oracle.com/forums/thread.jspa?messageID=9454665 Да, и так понятно, что это единственный вариант - через переменные подстановки в Essbase. Прекрасно, приступим к реализации:
  1. Определяемся с набором переменных. Для каждого "специфического" периода может быть нужен свой год. Например, в моем случае: в январе текущего понадобятся еще ноябрь и декабрь прошлого года, а в феврале - только декабрь прошлого года и январь нынешнего:
    • CurrYearFor - текущий год
    • CurrPerFor - текущий период для Прогнозирования
    • Prev1PerFormFor - предыдущий период
    • Prev1YearFormFor - год для предыдущего периода (Prev1PerFormFor)
    • Prev2PerFormFor - пред-пердыдущий период
    • Prev2YearFormFor - год для пред-предыдущего периода (Prev2PerFormFor)
  2. Создаем эти переменные подстановки в кубе приложения Essbase. Либо ручками (операция по сути - разовая), либо MaxL-скриптиком с использованием команд на нужной БД (кубе) Essbase:
    alter database sample.basic add variable CurMnth 'Jan';
    таким синтаксисом мы создаем переменную для куба приложения. Есть еще варианты для одного приложения:

    alter application sample add variable CurMnth 'Jan';

    или инстанса Essbase:
    alter system add variable CurMnth 'Jan';
  3. Настраиваем формы данных на использование этих переменных. Здесь придется отказаться от выбора года и периода в срезе, потому что придется эти измерения "зашивать" в таблицы данных.
  4. Готовим скрипт (bat для Windows env.) для обновления переменных по мере необходимости:
    @echo off
    setlocal
    cls

    Rem Set Variables
    SET ESSSETENV=F:\Oracle\Middleware\user_projects\epmsystem1\EssbaseServer\essbaseserver1\bin\setEssbaseEnv.bat
    SET SERVER=epm_server_name
    SET USER=ess_admin
    SET PASSWORD=ess_password
    Ниже укзаываются Public Key for Encryption и Private Key for Decryption. Это необходимо для шифрования учетных записей пользователя для исполнения MaxL скрипта. Подробности
    SET PKE=
    SET PKD=
    SET App=AppName
    SET Cube=PlanName
    SET OuputMaxl=EssVarsUpdate.maxl
    В EssVarsUpdate_AutoExec.log будем сохранять лог основных операций, а в %LogDate%_EssVarsUpdate.log исполняемый MaxL.
    SET EXECLOG=EssVarsGenerator_Auto.log
    SET CurrDir=%CD%
    SET LogSubDir=%CurrDir%\LOGS
    SET CurrYear=%date:~12%
    SET /A PrevYear=%CurrYear% - 1
    SET Day=%date:~7,2%
    SET Month=%date:~4,2%
    SET LogDate=%CurrYear%-%Month%-%Day%
    if '%Month:~0,1%'=='0' set Month=%Month:~1,1%

    Не забудьте проверить значения переменных CurrYear, Month. Зависят от используемой на сервере локали.
    Rem LOG
    echo Генератор переменных БД Essbase по Прогозу для построения "скользящих" форм >> %LogSubDir%\%EXECLOG%
    echo Started: %date% @ %time% >> %LogSubDir%\%EXECLOG%
    echo Params: CurrMonth:%Month%; CurrYear:%CurrYear%; PrevYear:%PrevYear% >> %LogSubDir%\%EXECLOG%

    Rem Checkin' Input Parameter
    IF %Month% LSS 1 GOTO :error
    IF %Month% GTR 12 GOTO :error 
    Ниже - список базовых элементов измерения Period
    Rem Input Parameter Converter
    IF %Month%==1 SET TempMonth='January'
    IF %Month%==2 SET TempMonth='February'
    IF %Month%==3 SET TempMonth='March'
    IF %Month%==4 SET TempMonth='April'
    IF %Month%==5 SET TempMonth='May'
    IF %Month%==6 SET TempMonth='June'
    IF %Month%==7 SET TempMonth='July'
    IF %Month%==8 SET TempMonth='August'
    IF %Month%==9 SET TempMonth='September'
    IF %Month%==10 SET TempMonth='October'
    IF %Month%==11 SET TempMonth='November'
    IF %Month%==12 SET TempMonth='December'

    Rem Create MAXL script
    echo spool on to '%LogSubDir%\%LogDate%_EssVarsUpdate.log'; > %CurrDir%\%OuputMaxl%
    echo login '%USER%' '%PASSWORD%' on '%SERVER%'; >> %CurrDir%\%OuputMaxl%

    Rem Set Current Period and Year, Start Period for Forecast calculations
    echo alter database '%App%'.'%Cube%' set variable 'CurrYearFor' 'FY%CurrYear%'; >> %CurrDir%\%OuputMaxl%
    echo alter database '%App%'.'%Cube%' set variable 'CurrPerFor' %TempMonth%; >> %CurrDir%\%OuputMaxl%
    echo alter database '%App%'.'%Cube%' set variable 'StartPerFor' %TempMonth%; >> %CurrDir%\%OuputMaxl%

    Rem Set Previous Period and Year
    SET /A Mon = 100%Month% %% 100
    SET /A PriorMonth=%Mon% - 1
    SET Prev1YearFormFor='FY%CurrYear%'
    IF %PriorMonth% == 0 SET Prev1YearFormFor='FY%PrevYear%'
    IF %PriorMonth% == 0 SET PriorMonth=12
    IF %PriorMonth%==1 SET TempMonth='January'
    IF %PriorMonth%==2 SET TempMonth='February'
    IF %PriorMonth%==3 SET TempMonth='March'
    IF %PriorMonth%==4 SET TempMonth='April'
    IF %PriorMonth%==5 SET TempMonth='May'
    IF %PriorMonth%==6 SET TempMonth='June'
    IF %PriorMonth%==7 SET TempMonth='July'
    IF %PriorMonth%==8 SET TempMonth='August'
    IF %PriorMonth%==9 SET TempMonth='September'
    IF %PriorMonth%==10 SET TempMonth='October'
    IF %PriorMonth%==11 SET TempMonth='November'
    IF %PriorMonth%==12 SET TempMonth='December'
    echo alter database '%App%'.'%Cube%' set variable 'Prev1PerFormFor' %TempMonth%; >> %CurrDir%\%OuputMaxl%
    echo alter database '%App%'.'%Cube%' set variable 'Prev1YearFormFor' %Prev1YearFormFor%; >> %CurrDir%\%OuputMaxl%

    Rem Set Pre-Previous Period and Year
    SET /A PriorMonth=%Mon% - 2
    SET Prev2YearFormFor='FY%CurrYear%'
    IF %PriorMonth% == 0 SET Prev2YearFormFor='FY%PrevYear%'
    IF %PriorMonth% == -1 SET Prev2YearFormFor='FY%PrevYear%'
    IF %PriorMonth% == 0 SET PriorMonth=12
    IF %PriorMonth% == -1 SET PriorMonth=11
    IF %PriorMonth%==1 SET TempMonth='January'
    IF %PriorMonth%==2 SET TempMonth='February'
    IF %PriorMonth%==3 SET TempMonth='March'
    IF %PriorMonth%==4 SET TempMonth='April'
    IF %PriorMonth%==5 SET TempMonth='May'
    IF %PriorMonth%==6 SET TempMonth='June'
    IF %PriorMonth%==7 SET TempMonth='July'
    IF %PriorMonth%==8 SET TempMonth='August'
    IF %PriorMonth%==9 SET TempMonth='September'
    IF %PriorMonth%==10 SET TempMonth='October'
    IF %PriorMonth%==11 SET TempMonth='November'
    IF %PriorMonth%==12 SET TempMonth='December'
    echo alter database '%App%'.'%Cube%' set variable 'Prev2PerFormFor' %TempMonth%; >> %CurrDir%\%OuputMaxl%
    echo alter database '%App%'.'%Cube%' set variable 'Prev2YearFormFor' %Prev2YearFormFor%; >> %CurrDir%\%OuputMaxl%
    echo logout; >> %CurrDir%\%OuputMaxl%
    echo spool off; >> %CurrDir%\%OuputMaxl%
    echo exit; >> %CurrDir%\%OuputMaxl%

    Rem Set Essbase Env
    call %ESSSETENV%
    Rem Encrypt MaxL Script
    essmsh -E %CurrDir%\%OuputMaxl% %PKE% > nul
    Rem Del Original MaxL Script
    del %CurrDir%\%OuputMaxl% >> %LogSubDir%\%EXECLOG%
    Rem Run Encrypted MaxL Script
    essmsh -D %CurrDir%\%OuputMaxl%s %PKD% > nul
    Rem Del Encrypted MaxL Script
    del %CurrDir%\%OuputMaxl%s >> %LogSubDir%\%EXECLOG%

    echo MaxL log U can find here: %LogSubDir%\%LogDate%_EssVarsUpdate.log >> %LogSubDir%\%EXECLOG%
    GOTO :fine

    :error
    set ERRORLEVEL=-1
    echo Wrong input parameter '%Month%' (Num. of month) :( >> %LogSubDir%\%EXECLOG%
    echo Input value must be in range [1..12] >> %LogSubDir%\%EXECLOG%
    GOTO :end

    :fine
    set ERRORLEVEL=0
    echo Essbase Variables has been updated successfully =) >> %LogSubDir%\%EXECLOG%
    GOTO :end

    :end
    echo Finished: %date% @ %time% >> %LogSubDir%\%EXECLOG%
    echo ... >> %LogSubDir%\%EXECLOG%
  5. Автоматизируем запуск этого файла, вставляя задачу в Task Scheduler. Сначала я готовил батничек для ручного режима с менюшкой для ответственного пользователя, но пришел к выводу, что могу автоматизировать процесс такого обновления переменных: я знаю, что пользователи полезут в систему к 1-му числу, значит числа 25 могу смело обновлять переменные. 
UPD: Макс, спасибо за помощь в вопросах корректного запуска essmsh и шифрования учетных данных!

07 мая 2011

Batch Sequence via MaxL

Занимаюсь старинной версией Hyperion Planning 3.5/Essbase 7.1
Приложение HBRules (для создания и управления бизнес-правилами; современный аналог - CalcManager) имеет ряд неприятных ограничений. В этот раз меня разозлил момент, связанный с тем, что невозможно создавать длинные последовательности (sequences). А именно такая задача и стояла, озаглавленная как «Полный пересчет модели».
Итак, один большой сиквенс сделать невозможно. Разбить на несколько – неудобно, потому что пересчеты возможно запускать только по ночам. Да, еще хочется иметь лог для оценки времени (для поиска узких мест и дальнейшей их оптимизации) и статуса завершения расчетов.

Итак, пришел к такому варианту:

1. Переводим (Export) нужные правила в Essbase, чтобы иметь возможность запускать их через MaxL. Минус очевиден: мы теряем связь правила, которое будет портировано в Essbase, и оригинального правила в HBRules, которое может измениться. Лучшее, что я придумал – создать таблицу соответствий имен правил HBRules – Essbase. При изменении правила в HBRules необходимо экспортировать его в Essbase-правило с тем же именем.

2. Готовим список правил Essbase, которые нужно запускать. Располагаем их в необходимом порядке запуска:
FC-1-01
FC-1-02
FC-2-01
Список сохраним в ascii-файлик RulesList.txt.

3. Пишем batch-скрипт, который будет генерить(!) MaxL-скрипт для полного расчета:
@echo off
echo =======================================================
echo Batch AutoCalc Essbase App Script by Antun Kulkov, 2011
echo See more at http://silw.blogspot.com
setlocal
rem ------ Settings -------
set year=%date:~6%
set month=%date:~3,2%
set day=%date:~0,2%
set hour=%time:~0,2%
if '%hour:~0,1%'==' ' set hour=0%time:~1,1%
set minute=%time:~3,2%
set tdate=%year%-%month%-%day%-%hour%%minute%
set STARTPATH=D:\Hyperion\AutoCalc
set ESSMSH=%ARBORPATH%\bin\essmsh.exe
set SERVER=essbase_server_name_or_ip
set USER=ess_admin
set PASSWORD=ess_admin_password
set APPNAME=app_name
set FILE_MAXL=%STARTPATH%\%APPNAME%_script.maxl
set FILE_LOG=%STARTPATH%\logs\AutoCalc_%APPNAME%_%tdate%.log
rem ------ End settings -------
echo Start: %tdate%

echo spool on to '%FILE_LOG%'; > %FILE_MAXL%
echo login '%USER%' '%PASSWORD%' on '%SERVER%'; >> %FILE_MAXL%
echo alter application '%APPNAME%' enable startup; >> %FILE_MAXL%
for /f %%i in (%STARTPATH%\RulesList.txt) do (
echo execute calculation '%APPNAME%'.'Plan1'.'%%i'; >> %FILE_MAXL%
)
echo logout; >> %FILE_MAXL%

echo MaxL script has been generated and run:
echo %FILE_MAXL%
echo See details of calc execution in:
echo %FILE_LOG%
%ESSMSH% %STARTPATH%\%APPNAME%_script.maxl
echo =======================================================
где STARTPATH – директория запуска данного скрипта,
SERVER, USER, PASSWORD – задают сервер Essbase и его пользователя с администраторскими правами,
APPNAME – имя приложения (скажу, что работал с одним кубом Plan1, поэтому прописал его жестко в скрипте). Не забываем брать в кавычки значения переменных, которые содержат пробелы!

Принцип работы:
В папке с этим batch-скриптом генрим MaxL-скрипт (APPNAME_script.maxl), получая имена правил из файла RulesList.txt. И выполняем этот MaxL-скрипт, на всякий случай запуская приложение в Essbase. Лог выполнения MaxL-скрипта пишется в APPNAME_AutoCalc_{дата-время}.log. Все прозрачно!

Замечание: Для правил, использующих переменные с вводом данных (например, предела ставки начисления ЕСН), необходимо установить необходимые значения как дефолтные!

4. Добавляем наш batch-скрипт в расписание, если нужно.

Enjoy!

UPD: Альтернативный (несколько более сложный, но более функциональный) вариант описан у Романа Удальцова здесь

05 июля 2008

Фрагментация и производительность

Сейчас ощутил на собственной шкуре, насколько сильно фрагментация BSO-куба влияет на производительность.

Расчет, который до зепуска реструктуризации куба выполнялся полтора часа теперь выполняется меньше 9 минут, это просто потрясающе!!

Так что мой вам совет - после больших загрузок данных обязательно делайте

alter database appl_name.db_name force restructure;

24 июня 2008

Backup

А как же без того, чтобы потерять данные?:-)

Как и во всех проектах, где я принимал участие, бекапы начинали делаться только тогда, когда один-два раза данные исчезают. Вот и сейчас 5 гигов кануло:-) Но поводов для уныния особо нет - на то она и опытная эксплуатация. Главное, что родился скрипт на MAXL:
login your_login your_password on your_essbase_host;
set timestamp on;
alter application $1 disable commands;
alter system kill request on application $1;
alter system logout session on application $1;
alter database $1.Plan1 unlock all objects;
alter database $1.Plan2 unlock all objects;
drop lock on application $1;
alter system kill request on application $1;
alter database $1.Plan1 begin archive to file "tmp1.txt";
alter database $1.Plan2 begin archive to file "tmp2.txt";
shell XCOPY D:\\Hyperion\\AnalyticServices\\app\\$1 E:\\Essbase_Backups\\$1_%date:~0%_%time:~0,2%.%time:~3,2% /e /c /i /h /k /y;
alter database $1.Plan1 end archive;
alter database $1.Plan2 end archive;
alter application $1 enable commands;
logout;
exit;
Особая благодарность Максиму Кудряшову за проделанную работу.

P.S. Логично, в принципе, заменить XCOPY на gzip - время работы скрипта не сильно увеличивается, а вот бекапы занимают раз в 20 меньше места.