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

backup настроек obiee сервера

Наконец то нашел время написать резеврное копирование натроек BI сервера. Backup написан для UNIX платформы, для корректной работы планировщик надо настроить на ежедневный запуск скрипта.
Такое копирование, может быть крайне полезно при переносе сервера на другую платформу, оно содержит основные необходимые настройки. Так же, его можно использовать для отката отдельных настроек, репозитория или каталога при необходимости.
Чтобы подробно не описывать содержимое настроек и процедуру их переноса, дам  ссылку на удачное русскоязычное описание.
Нечто подобное я уже проделывал вручную несколько раз когда необходимо было срочно сменить сервер, на котором находился OBIEE. Теперь половина этой нехитрой, но очень кропотливой работы автоматизирована. Возможно когда нибудь автоматизирую и вторую половину, но это уже плюшечки, так как пока нет необходимости запуска в постоянную работу копии сервера.
Хочу добавить что копируемые настройки не позволяют "клонировать" сервер, они позволяют сохранить основные изменения (НЕ ВСЕ), внесенные в стандартную конфигурацию OBIEE, а так же сохранить каталог и репозиторий.

Скрипт сохраняет ежедневные копии за последнюю неделю и еженедельные копии за год. Все копии перезаписываются ежегодно, поэтому проблемы со свободным не возникнут. По моим подсчетам годовой backup у меня будет занимать не более 2 Гб.
Итак
#!/bin/bash
#инициализируем пути, для верности используем полные пути
HOME_DIR_PATH=/bi_home
BACKUP_DIR_PATH=/backup/config_backup
DIRN=$BACKUP_DIR_PATH/everyday/`date +%u`
LOG_FILE_NAME=$DIRN/reports_backup.log
CAT_PATH=/bi_home/obiee/instances/instance_prd/bifoundation/OracleBIPresentationServicesComponent/coreapplication_obips1/catalog/SampleAppLite
REP_PATH=/bi_home/obiee/instances/instance_prd/bifoundation/OracleBIServerComponent/coreapplication_obis1/repository
RESOURCE_PATH=/bi_home/obiee/instances/instance_prd/bifoundation/OracleBIPresentationServicesComponent/coreapplication_obips1/analyticsRes
POLICE_PATH=/bi_home/obiee/user_projects/domains/prd_domain/config/fmwconfig
INSTANCECONFIG_PATH=/bi_home/obiee/instances/instance_prd/config/OracleBIPresentationServicesComponent/coreapplication_obips1
NQSCONFIG_PATH=/bi_home/obiee/instances/instance_prd/config/OracleBIServerComponent/coreapplication_obis1
WLST_HOME_PATH=/bi_home/obiee/wlserver_10.3/common/bin
#удаляем каталог если он уже существует
rm -rf $DIRN
#создаем каталог заново
mkdir $DIRN
#пишем в лог, архивируем
echo `date` >> $LOG_FILE_NAME
#
#архивируем каталог
tar cfE - $CAT_PATH/* | gzip -9 >$DIRN/bi_catalog.tar.gz
#читаем код возврата
RCODE=$?
#пишем в лог
if [ $RCODE==0 ]; then
echo 'archive ' $DIRN/bi_catalog.tar.gz ' succesful created from ' $CAT_PATH >> $LOG_FILE_NAME
else
echo 'ERROR creating archive ' $DIRN/bi_catalog.tar.gz ' from ' $CAT_PATH 'with code' $RCODE >> $LOG_FILE_NAME
fi
#
#архивируем ресурсы
tar cfE - $RESOURCE_PATH/* | gzip -9 >$DIRN/bi_analytic_res.tar.gz
#читаем код возврата
RCODE=$?
#пишем в лог
if [ $RCODE==0 ]; then
echo 'archive ' $DIRN/bi_analytic_res.tar.gz ' succesful created from ' $RESOURCE_PATH >> $LOG_FILE_NAME
else
echo 'ERROR creating archive ' $DIRN/bi_analytic_res.tar.gz ' from ' $RESOURCE_PATH ' with code ' $RCODE >> $LOG_FILE_NAME
fi
#
#архивируем репозиторий
tar cfE - $REP_PATH/* | gzip -9 >$DIRN/bi_repository.tar.gz
#читаем код возврата
RCODE=$?
#пишем в лог
if [ $RCODE==0 ]; then
echo 'archive ' $DIRN/bi_repository.tar.gz ' succesful created from ' $REP_PATH >> $LOG_FILE_NAME
else
echo 'ERROR creating archive ' $DIRN/bi_repository.tar.gz' from ' $REP_PATH ' with code ' $RCODE >> $LOG_FILE_NAME
fi
#
#копируем политики приложения
cp $POLICE_PATH/system-jazn-data.xml $DIRN/system-jazn-data.xml
#читаем код возврата
RCODE=$?
#пишем в лог
if [ $RCODE==0 ]; then
echo  $DIRN/system-jazn-data.xml  ' succesful created from ' $POLICE_PATH/system-jazn-data.xml >> $LOG_FILE_NAME
else
echo 'ERROR creating a ' $DIRN/system-jazn-data.xml ' from ' $POLICE_PATH/system-jazn-data.xml ' with code ' $RCODE >> $LOG_FILE_NAME
fi
#
#копируем конфигурацию NSQ сервера
cp $NQSCONFIG_PATH/NQSConfig.INI $DIRN/NQSConfig.INI
#читаем код возврата
RCODE=$?
#пишем в лог
if [ $RCODE==0 ]; then
echo  $DIRN/NQSConfig.INI  ' succesful created from ' $NQSCONFIG_PATH/NQSConfig.INI >> $LOG_FILE_NAME
else
echo 'ERROR creating a ' $DIRN/NQSConfig.INI ' from ' $NQSCONFIG_PATH/NQSConfig.INI ' with code ' $RCODE >> $LOG_FILE_NAME
fi
#
#копируем конфигурацию NSQ сервера
cp $INSTANCECONFIG_PATH/instanceconfig.xml $DIRN/instanceconfig.xml
#читаем код возврата
RCODE=$?
#пишем в лог
if [ $RCODE==0 ]; then
echo  $DIRN/instanceconfig.xml  ' succesful created from ' $INSTANCECONFIG_PATH/instanceconfig.xml >> $LOG_FILE_NAME
else
echo 'ERROR creating a ' $DIRN/instanceconfig.xml ' from ' $INSTANCECONFIG_PATH/instanceconfig.xml ' with code ' $RCODE >> $LOG_FILE_NAME
fi
#
#пишем командный файл для сохранения weblogic identity store LDAP
echo "connect('weblogic','password', 'localhost:7001')" >> $HOME_DIR_PATH/policysave.py
echo "domainRuntime()" >> $HOME_DIR_PATH/policysave.py
echo "cd('/DomainServices/DomainRuntimeService/DomainConfiguration/prd_domain/SecurityConfiguration/prd_domain/DefaultRealm/myrealm/AuthenticationProviders/DefaultAuthenticator')" >> $HOME_DIR_PATH/policysave.py
echo "cmo.exportData('DefaultAtn','"$DIRN"/export.ldif', Properties())" >> $HOME_DIR_PATH/policysave.py
#выполняем командный файл для сохранения weblogic identity store LDAP
$WLST_HOME_PATH/wlst.sh $HOME_DIR_PATH/policysave.py  >> $DIRN/wlst.log
rm -rf $HOME_DIR_PATH/policysave.py
echo  $DIRN/export.ldif  ' succesful created from WLST' >> $LOG_FILE_NAME
#
#пишем еженедельный архив
#если номер дня единица
if [ $DIRN == $BACKUP_DIR_PATH/everyday/1 ]; then
    #проверяем что такой недели еще нет, если есть удаляем
    rm -rf $BACKUP_DIR_PATH/everyweek/`date +%U`
    mkdir $BACKUP_DIR_PATH/everyweek/`date +%U`
    #копируем первый день в неделю
    cp $BACKUP_DIR_PATH/everyday/1/* $BACKUP_DIR_PATH/everyweek/`date +%U`/
fi

воскресенье, 13 апреля 2014 г.

Создать индекс таблицы oracle по функции TO_DATE

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

CREATE INDEX Имя_Индекса ON Имя_таблицы
(LPAD("Имя_столбца,5,'0'))

Часто бывают случаи (например при загрузке данных из файлов xml, txt и других) когда дата в таблице лежит в текстовом формате наряду с остальной текстовой информацией. При больших объемах во время сортировки таких данных, поиска по дате  могут возникнуть трудности со скоростью выполнения запросов.
Примечательно что индекс по функции TO_DATE в субд oracle создать нельзя. Причина этого - дата варьируется в зависимости от TIMEZONE установленной сессией. Но если (как в моем случае) вы пишите приложение для конкретного предприятия, которое не имеет разбросанных филиалов, то этим ограничением можно пренебречь и закэшировать дату. Делается это следующим образом:
1. Для начала необходимо создать нестандартную функцию преобразования TO_DATE которая будет содержать волшебное слово DETERMINISTIC.
TO_DATE_FNC(p_date   VARCHAR , p_date_format VARCHAR)
return date
DETERMINISTIC
is
begin
return TO_DATE(p_date, p_date_format);
end;

2. Теперь смело создаем индекс на нашу функцию, где прописываем формат в котором дата лежит в таблице.
CREATE INDEX Имя_индекса ON Имя_таблицы
("TO_DATE_FNC"("Имя_столбца",'dd.mm.rrrr hh24:mi:ss'))
3. Теперь напишем запрос, использующий наш индекс. Для достоверности отойду от условных названий и сделаю запрос к реальной таблице.
select * from XX_ETW.DISLOCATION_CARS where "XX_BI"."TO_DATE_FNC"("DATA_OPERACII",'dd.mm.rrrr hh24:mi:ss') between sysdate-5 and sysdate
4. Смотрим план запроса. Заметим что индекс сработал. На рисунке он выделен желтым


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

Надеюсь моя статья окажется полезной.