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

26 сентября 2013

Myth: Usage FIX on sparse and IF on dense dims calcs only

Кто-нибудь затестил? Звучит логично))
http://www.in2hyperion.com/websites/in2hyperionblog/post/2013/09/23/Debunk-The-Myth-Always-Fix-On-Dense-Members.aspx

17 мая 2013

How-to Setup Essbase Clustering on Unix

На CEAL появилась инструкция по установке и настройке кластера Essbase 11.1.2.2 на Unix.
Матрица в оф.доках описывает возможные виды и ограничения отказоустойчивых или с распределением загрузки кластеров Essbase.

Оригинальный пост

14 мая 2013

13 мая 2013

Установка Oracle EPM 11.1.2.2 на Linux сервер в графическом режиме через SSH соединение c Windows клиента

Честно скажу, несколько раз ставил EPM на Linux. Интересно, но долго.
В этой статье расписано как можно установить EPM на Линуксовый сервер с отрисовкой X-ов на win-клиенте.

05 мая 2013

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

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

24 декабря 2012

Удаление проблемных приложений HFM, управляемых EPMA

При попытке удаления приложения HFM, управляемого EPMA, возникает сообщение The Application cannot be deleted, the state of the application is MigratePending. Оно возникает в случаях, когда приложение было создано дублированием (duplicate) в EPMA, но попытка развернуть (deploy) не была завершена.
Что делать:
  1. Остановить службы EPMA и сделать бэкап БД EPMA
  2. В таблице DS_Application в БД EPMA найти и запомнить значение i_Application_ID (например, 57)
  3. В таблице OR_Object по полю C_OBJECT_ID найти строку с «1_(i_Application_ID)» (например, 1_57)
  4. Скопировать содержимое поля X_OBJECT_DATA в текстовый файл (это бэкап)
  5. Удалить часть содержимого между тэагми PendingDeployment…./PendingDeployment, включая сами тэги
  6. Изменить статус на 2 (если приложение было хотя бы раз задеплилось успешно) или на 1 (если ни разу)
  7. Записать данные в таблице
  8. Запустить службы EPMA

19 октября 2012

Essbase on RAM Disk

Ни раз задавался вопросом, как можно улучшить производительность Essbase. В том числе, с его использованием на RAM Disk. Идея проста - создать виртуальный диск в памяти достаточного объема, благо планочки нынче не дороги, и закинуть на этот диск файлы кубов Essbase.

Один из наших соратников - Макс Кудряшов - поделился тестами такой реализации на промышленной базе:
Cравнили производительность RAM-диска и обычной дисковой полки. Результаты очень положительные: пересчет модели упал с 4.5 - 6 часов (в зависимости от нагрузки) до 2 часов ровно (причем буквально с точностью до пары секунд каждый раз). Даже учитывая, что практически весь пересчет идет в один поток, количество потребляемых IOPS доходило до 10K (но в основном 2-5K). Так что совсем не удивительно, что обычная полка не справляется - она в пике выдавала только под 400.
Есть конечно расчеты, которые слабо зависят от диска (в основном с использованием CREATENONMISSINGBLK ON), но агрегации и копирования данных просто летают.
Приложен график (в центре провал - было не оптимально написано правило).

Софт для создания RAM Disk - Primo Ramdisk
Параметры куба Essbase: BSO, Buffered I/O Access Mode, RLE Data Compression
Объем данных в кубе - 70 ГБ, индексный файл - 3ГБ

28 августа 2012

SQL запросы для получения информации о формах в Planning

Можно потратить много времени, чтобы получить информацию о формах данных в Planning: папка формы, бизнес-правила, меню и др. Можно упростить это процесс. Подробнее

13 августа 2012

Связывание windows-сервисов Hyperion

Чтобы завязать между собой сервисы EPM при запуске, essbase.ru рекомендует:
sc config “HyS9FoundationServices” depend= OracleServiceHYPFM
sc config “HyS9FinancialManagementWebSvcs” depend= OracleServiceHYPFM
sc config “HFMWebServiceManager” depend= OracleServiceHYPFM
sc config “HyS9EPMAWebTier” depend= OracleServiceHYPFM
sc config “EPMA_Server” depend= OracleServiceHYPFM
sc config “HyS9EPMADataSynchronizer” depend= OracleServiceHYPFM
sc config “HyS9CALC” depend= OracleServiceHYPFM
sc config “HyS9aifWeb” depend= OracleServiceHYPFM

04 июля 2012

KScope 2012 - презентации


В Сети начали появляться в свободном доступе презентации c Oracle Development Tools User Group Conference (ODTUG) Kscope Conference 2012. Их главное достоинство в том, что за 5-10 минут изучения презентации можно получить опыт, накопленный коллегами по цеху годами: http://www.in2hyperion.com/websites/in2hyperionblog/post/2012/07/02/KScope-2012-Wrap-Up.aspx

UPD 2012-07-26: http://www.emergenow.com/KSCOPE-Twelve-Presentations (John A. Booth; 2 презентации по Essbase)

UPD 2012-08-29: Еще несколько презентаций:

23 апреля 2012

Настройка сервера и клиента для работы со SmartView

В ходе эксплуатации системы во время работы, SmartView (над Planning/Essbase) может "обрадовать" пользователя сообщениями вроде:
  • The request timed out. Contact your administrator to increase netRetrycount and netRetryInterval
  • Request grid size is more than allowed limit
Чтобы избежать первой проблемы, связанной с сетевыми параметрами, необходимо корректно настроить как серверную, так и клиентскую стороны системы:
  1. Прописываем сетевые параметры на сервере в essbase.cfg (или через EAS Console):
  1. В соответствии с рекомендацией Oracle "The Combined Parameters of NETDELAY and NETRETRYCOUNT" [ID 877432.1] произведение параметров NETDELAY и NETRETRYCOUNT не должно превышать 10 минут. На этот лимит и будем всё настраивать. Пример расчета:
1000 for NETDELAY
600  for NETRETRYCOUNT
1000 x 600 = 600000
Divide by 1000 = 600
Divide by 60 = 10 minutes
  1. Перезапускаем сервер Essbase (службу OPMN), чтобы изменения вступили в силу.
  2. Готовим изменения реестра операционных систем на клиентских станциях (на базе Windows XP; Windows 7), используя параметры: 
    • KeepAliveTimeout (интервал проверки активности HTTP-соединений) и ServerInfoTimeout, причем второй нам понадобится, т.к. значение первого превысит 2 минуты; значение второго параметра идентично значению первого
    • ReceiveTimeout (ограничение на время возврата данных от сервера)
  3. В соответствии с рекомендацией Oracle "Smart View Error: The request timed out. Contact your administrator to increase netRetrycount and netRetryInterval" [ID 744559.1] и "FDM Timeout on Import When Using Internet Explorer 7" [ID 1246294.1] получаем файл (*.reg) для внесения изменений в реестр на клиентской станции:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"ReceiveTimeout"=dword:000927c0
"ServerInfoTimeout"=dword:000927c0

"KeepAliveTimeout"=dword:000927c0
где 000927c0 - это 600000 мсек в HEX-представлении
  1. Этот файл необходимо применить на клиентской станции и перезагрузить ее, чтобы изменения вступили в силу.
Для решения второй проблемы, связанной с ограничением количества запрашиваемых из SmartView у сервера ячеек данных, необходимо настроить только серверную часть:
  1. Прописываем параметр на сервере в essbase.cfg (или через EAS Console):
MAX_REQUEST_GRID_SIZE EssbaseAppName 5000000
  1. В соответствии с рекомендацией Oracle "When Executing MDX Query Network Error Occurs: "[10054] Cannot Send Data" [ID 1071407.1] необходимо также настроить сетевые параметры на сервере. Это мы уже сделали, борясь с первой проблемой :)
  2. Перезапускаем сервер Essbase (службу OPMN), чтобы изменения вступили в силу.

16 апреля 2012

Списки пользователей в Excel

Как и обещал, начинаю выкладывать некоторые "секреты" подготовки материалов к аудиту моей теперешней промышленной системы (FDM, HFM, Planning 11.1.2.00).
Для начала аудиторы запросили список существующих и удаленных пользователей системы. Используя вот эту подсказу вендора (структура и описание реляционных БД продуктов EPM), накидал 2! вьюхи в СУБД (MS SQL Server), в которых отразил все необходимые данные. К сожалению, FDM/HFM слабо интегрированы с HSS, поэтому вьюх и оказалось две.

Отчет по доступу к подсистеме бюджетирования на базе Planning/Essbase был получен таким образом из БД HSS:

SELECT DISTINCT TOP (100) PERCENT
dbo.CSS_USERS.NAME, dbo.CSS_USERS.FIRSTNAME, dbo.CSS_USERS.LASTNAME, dbo.CSS_USERS.DESCRIPTION, dbo.CSS_USERS.EMAIL, dbo.CSS_USERS.ACCOUNTSTATUS, dbo.CSS_GROUPS.NAME AS HSS_GROUP
FROM dbo.CSS_PROVISIONING_INFO CROSS JOIN
dbo.CSS_GROUP_MEMBERS INNER JOIN
dbo.CSS_GROUPS ON dbo.CSS_GROUP_MEMBERS.LOWER_GROUP_IDENTITY = dbo.CSS_GROUPS.LOWER_IDENTITY_ID INNER JOIN
dbo.CSS_USERS ON dbo.CSS_GROUP_MEMBERS.LOWER_MEMBER_IDENTITY = dbo.CSS_USERS.LOWER_IDENTITY_ID
ORDER BY dbo.CSS_USERS.NAME, HSS_GROUP

Отчет по доступу к подсистеме подготовки МСФО отчетности на базе FDM/HFM был получен из БД HSS + HSV_ProductionHFMAppName_SECCACCESS:
SELECT DISTINCT TOP (100) PERCENT
hyp11hss.dbo.CSS_USERS.NAME, hyp11hss.dbo.CSS_USERS.FIRSTNAME, hyp11hss.dbo.CSS_USERS.LASTNAME, hyp11hss.dbo.CSS_USERS.DESCRIPTION, hyp11hss.dbo.CSS_USERS.EMAIL, hyp11hss.dbo.CSS_USERS.ACCOUNTSTATUS,  dbo.HSV_ProductionHFMAppName_SECCLASSES.Label AS SecClass
FROM dbo.HSV_ProductionHFMAppName_SECCACCESS INNER JOIN
dbo.HSV_ProductionHFMAppName_SECCLASSES ON dbo.HSV_ProductionHFMAppName_SECCACCESS.ItemID = dbo.HSV_ProductionHFMAppName_SECCLASSES.ItemID INNER JOIN
hyp11hss.dbo.CSS_USERS ON dbo.HSV_ProductionHFMAppName_SECCACCESS.UserSID = hyp11hss.dbo.CSS_USERS.LOWER_IDENTITY_ID
ORDER BY hyp11hss.dbo.CSS_USERS.NAME
где hyp11hss - имя БД HSS, HSV_ProductionHFMAppName_SECCLASSES - имя таблицы с классами безопасности FDM/HFM.

Таким образом, подключившись к созданным вьюшкам из Excel, свободно получаем данные для формирования отчетов по безопасности.

Отмечу, что пользователей мы декативируем, а не удаляем, сохраняя таким образом целостность аудита. По полю ACCOUNTSTATUS устанавливаем фильтр: где 1 - активный пользователь; 2 - "мертвая душенка".


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 и шифрования учетных данных!

23 января 2012

Оптимизация БД EPMA для EPM 11.1.x

Со временем сильно увеличивается БД EPM Architect, что негативно сказывается на скорости работы этого компонента. А в некоторых случаях, веб-сервер не успевает получить ответ в установленный таймаут, и возникает проблема, когда приложение (наример, Planning) может остаться в подвешенном состоянии.

Ниже представлено решение этой проблемы для EPM 11.1.3+
  1. Остановить службу EPMA Process Manager
  2. Сделать полный бэкап БД EPM Architect
  3. Запустить службу EPMA Process Manager
  4. Запустить утилиту database_cleanup_utility.exe, которая находится
    либо здесь для 11.1.1.x: \Hyperion\products\Foundation\BPMA\AppServer\DimensionServer\ServerEngine\bin\
    либо здесь для 11.1.2.x: \Oracle\Middleware\EPMSystem11R1\products\Foundation\BPMA\AppServer\DimensionServer\ServerEngine\bin
  5. Использовать администраторский логин/пароль EPM
  6. Запустить очистку для записей старше 45-60 дней
  7. Либо почистить БД EPM Architect скриптом (пример для Oracle DB 10g+):
    SELECT TO_CHAR(SYSDATE,'Dy DD-Mon-YYYY HH24:MI:SS') AS "Current Time 1" FROM DUAL;

    CREATE TABLE tmp_DS_MaxTransactions NOLOGGING AS
    SELECT a.i_application_id, MAX(i_transaction_id) AS i_transaction_id
      FROM DS_Transaction_History a
      JOIN DS_Application b
      ON a.i_library_id = b.i_library_id
      AND a.i_application_id = b.i_application_id
      JOIN DS_Library c
      ON a.i_library_id = c.i_library_id
      WHERE c.b_master = 1
      AND a.i_application_id IS NOT NULL
      AND (b.i_first_deploy_transaction_id IS NOT NULL OR b.b_master = 1)
      AND i_transaction_id >= COALESCE(b.i_last_deployed_transaction_id, b.i_first_deploy_transaction_id, 0)
      AND e_transaction_action = 'OrderChildren'
      GROUP BY a.i_application_id;
    COMMIT;

    SELECT TO_CHAR(SYSDATE,'Dy DD-Mon-YYYY HH24:MI:SS') AS "Current Time 2" FROM DUAL;

    -- Keep newest OrderChildren row for each application.  Logging resumes for this table
    -- after it is created and populated by this statement.
    CREATE TABLE tmp_DS_Transaction_History NOLOGGING AS
      SELECT a.* FROM DS_Transaction_History a
        JOIN tmp_DS_MaxTransactions b
        ON a.i_transaction_id = b.i_transaction_id;
    COMMIT;

    SELECT TO_CHAR(SYSDATE,'Dy DD-Mon-YYYY HH24:MI:SS') AS "Current Time 3" FROM DUAL;

    DROP TABLE tmp_DS_MaxTransactions;

    SELECT TO_CHAR(SYSDATE,'Dy DD-Mon-YYYY HH24:MI:SS') AS "Current Time 4" FROM DUAL;

    ALTER TABLE tmp_DS_Transaction_History NOLOGGING;

    SELECT TO_CHAR(SYSDATE,'Dy DD-Mon-YYYY HH24:MI:SS') AS "Current Time 5" FROM DUAL;

    -- Add back all non-OrderChildren rows.
    INSERT INTO tmp_DS_Transaction_History
      SELECT * FROM DS_Transaction_History
      WHERE e_transaction_action != 'OrderChildren';
    COMMIT;

    SELECT TO_CHAR(SYSDATE,'Dy DD-Mon-YYYY HH24:MI:SS') AS "Current Time 6" FROM DUAL;

    DROP TABLE DS_Transaction_History;

    SELECT TO_CHAR(SYSDATE,'Dy DD-Mon-YYYY HH24:MI:SS') AS "Current Time 7" FROM DUAL;

    RENAME tmp_DS_Transaction_History TO DS_Transaction_History;

    SELECT TO_CHAR(SYSDATE,'Dy DD-Mon-YYYY HH24:MI:SS') AS "Current Time 8" FROM DUAL;

    ALTER TABLE DS_Transaction_History
      ADD CONSTRAINT PK_TranHist PRIMARY KEY (i_transaction_id, i_detail_id);

    SELECT TO_CHAR(SYSDATE,'Dy DD-Mon-YYYY HH24:MI:SS') AS "Current Time 9" FROM DUAL;

    CREATE INDEX IdxTranHist01 ON DS_Transaction_History(i_library_id, i_dimension_id, i_member_id);

    SELECT TO_CHAR(SYSDATE,'Dy DD-Mon-YYYY HH24:MI:SS') AS "Current Time 10" FROM DUAL;

    CREATE INDEX IdxTranHist02 ON DS_Transaction_History(i_library_id, d_created);

    SELECT TO_CHAR(SYSDATE,'Dy DD-Mon-YYYY HH24:MI:SS') AS "Current Time 11" FROM DUAL;

    ALTER TABLE DS_Transaction_History LOGGING;

    SELECT TO_CHAR(SYSDATE,'Dy DD-Mon-YYYY HH24:MI:SS') AS "Current Time 12" FROM DUAL;