среда, 17 ноября 2010 г.

Резервное копирование Oracle EPM 11

Как говорится, ничто не делается так просто и не ценится (в нужный момент) так высоко, как резервная копия. О ней сегодня и поговорим. А точней, о ежедневных «горячих» бекапах.

В моем случае Oracle EPM 11 развернут на четырех серверах, условно назовем их server1..server4, в такой конфигурации:
  • server1: Essbase Server
  • server2: MS SQL Server
  • server3: Foundation, Provider services, Planning, Administration services
  • server4: Workspace, Reporting and Analysis, Financial Management

На каждом из четырех серверов создана следующая единая структура хранения файлов, необходимых для резервного копирования:

backup-cold\ – папка, содержащая сделанные вручную так называемые «холодные» (полные) резервные копии
backup-current\ – папка, содержащая актуальную резервную копию
backup-history\ – папка, содержащая прошлые резервные копии (не старше недели)
backup-temp\ – временная папка, существующая только в процессе создания резервной копии
logs\ – папка, содержащая логи резервного копирования
scripts\ – папка, содержащая служебные скрипты (rar.exe, postie.exe) и скрипты, непосредственно выполняющие резервное копирование
start-backup.bat – скрипт запуска резервного копирования

Общая схема выполнения резервного копирования

На каждом из серверов средствами стандартного Windows Task Scheduler каждую ночь запускается скрипт start-backup.bat, выполняющий следующие действия:

1. Перенос старых логов в архив logs\log-history.rar
2. Запуск скрипта scripts\backup-serverX.cmd (backup-serverN.msh для server):
2.1. Очистка папки backup-history от резервных копий старше недели
2.2. Перенос актуальной резервной копии из папки backup-current в папку backup-history
2.3. Создание новой резервной копии во временной папке backup-temp
2.4. Архивация резервной копии и перемещение её в папку backup-current
3. Сохранение логов выполнения резервного копирования в папку logs

Ближе к утру производится автоматическая запись содержимого папок backup-current на магнитную ленту.

Файлы start-backup.bat выглядят следующим образом:

@echo off

set BackupPath=...
set DateStamp=%date:~6,4%%date:~3,2%%date:~0,2%

%BackupPath%\scripts\rar.exe m -ep1 -idp %BackupPath%\logs\log-history.rar %BackupPath%\logs\*.log
%BackupPath%\scripts\backup-serverX.cmd %BackupPath% %DateStamp% >> %Backup-Path%\logs\%DateStamp%.batch.log

Для сервера server1, на котором развернут Essbase, исполняемый скрипт написан на MaxL, поэтому последняя команда выглядит так:

%EssbaseClientPath%\bin\startMaxL.cmd %BackupPath%\scripts\backup-server1.msh %AppName% %BackupPath% %EssbaseServerPath% >> %BackupPath%\logs\%date:~6,4%%date:~3,2%%date:~0,2%.batch.log

Из служебных скриптов ещё используется такой, для отправки уведомлений по почте:

send-email.cmd

chcp 1251
%BackupPath%\scripts\postie.exe -host:smtp -from:essbase@company.ru -to:admin@company.ru -s:%1 -msg:%2 -charset:"windows-1251"

Postie – утилита рассылки почты из командной строки, аналог BLAT.

И ещё пригодится приложение forfiles из Windows 2000 Resource Kit Tools для определения возраста файлов.

Дальше поехали, собственно, исполняемые скрипты. Сначала скрипт на server1 с Essbase, который выполняет стандартный archive to file и копирует всякие нужные файлы:

backup-server1.msh

spool stderr on to $2\\logs\\.essmsh.err ;
shell @chcp 1251 ;

shell echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Начало работы скрипта ;

shell echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Очистка архива... ;
shell forfiles /p $2\\backup-history /d -8 /c '"cmd /c del @file"' ;

shell echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Перенос последнего бекапа в архив... ;
shell move /y $2\\backup-current\\*.rar $2\\backup-history ;

shell echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Создание временных директорий... ;
shell md $2\\backup-temp\\bin ;
shell md $2\\backup-temp\\app\\$1\\Plan1 ;
shell md $2\\backup-temp\\app\\$1\\Plan2 ;
shell md $2\\backup-temp\\app\\$1\\Plan3 ;

shell echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Копирование служебных файлов... ;
shell copy $3\\bin\\essbase.sec $2\\backup-temp\\bin ;
shell copy $3\\bin\\essbase.bak* $2\\backup-temp\\bin ;
shell copy $3\\bin\\essbase*.cfg $2\\backup-temp\\bin ;
shell copy $3\\app\\$1\\$1.* $2\\backup-temp\\app\\$1 ;

shell echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Копирование файлов приложений... ;
shell copy $3\\app\\$1\\Plan1\\*.otl $2\\backup-temp\\app\\$1\\Plan1 ;
shell copy $3\\app\\$1\\Plan1\\*.csc $2\\backup-temp\\app\\$1\\Plan1 ;
shell copy $3\\app\\$1\\Plan2\\*.otl $2\\backup-temp\\app\\$1\\Plan2 ;
shell copy $3\\app\\$1\\Plan2\\*.csc $2\\backup-temp\\app\\$1\\Plan2 ; 
shell copy $3\\app\\$1\\Plan3\\*.otl $2\\backup-temp\\app\\$1\\Plan3 ;
shell copy $3\\app\\$1\\Plan3\\*.csc $2\\backup-temp\\app\\$1\\Plan3 ;

login usr pwd on server1;

shell echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Выгрузка базы Plan1... ;
alter database $1.Plan1 force archive to file "$2\\backup-temp\\app\\$1\\Plan1.arc" ;
iferror "Error" ;

shell echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Выгрузка базы Plan2... ;
alter database $1.Plan2 force archive to file "$2\\backup-temp\\app\\$1\\Plan2.arc" ;
iferror "Error" ; 

shell echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Выгрузка базы Plan3... ;
alter database $1.Plan3 force archive to file "$2\\backup-temp\\app\\$1\\Plan3.arc" ;
iferror "Error" ;

goto "Ok" ;

define label "Error" ;
shell $2\\scripts\\send-email.cmd '"Ошибка архивации Essbase App DB" "В процессе архивации возникла ошибка. Подробности – в логе \\\\server1\\C$\\BACKUP\\logs\\.essmsh.err"' ;

define label "Ok" ;

shell echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Сжатие резервной копии... ;
shell $2\\scripts\\rar.exe m -r -ep1 -idp $2\\backup-current\\%date:~6,4%%date:~3,2%%date:~0,2%.server1.rar $2\\backup-temp\\ ;

logout ;

shell rd $2\\backup-temp ;

shell echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Готово! ;

spool off;
exit;

Теперь server2 с MS SQL. Здесь два файла, один из которых – sql-скрипт для экспорта баз.

backup-server2.cmd

@echo off
chcp 1251

:: %1 BackupPath
:: %2 DateStamp

set SqlcmdPath=C:\Program Files\Microsoft SQL Server\90\Tools\Binn

echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Начало работы скрипта

echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Очистка архива...
forfiles /p %1\backup-history /d -8 /c "cmd /c del @file"

echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Перенос последнего бекапа в архив...
move /y %1\backup-current\*.rar %1\backup-history && echo.
md %1\backup-temp

echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Создание резервных копий БД...
"%SqlcmdPath%\sqlcmd.exe" -S server2 -U usr -P pwd -i %1\scripts\backup-server2.sql -o %1\logs\%2.mssql.log

echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Сжатие резервных копий... 
%1\scripts\rar.exe m -r -ep1 -idp %1\backup-current\%2.server2.rar %1\backup-temp\
rd %1\backup-temp

echo. && echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Готово!

backup-server2.sql

BACKUP DATABASE [HS] TO DISK = N'C:\BACKUP\backup-temp\HS.bak' WITH NOFORMAT, NOINIT, NAME = N'HS_FullDatabaseBackup', SKIP, NOREWIND, NOUNLOAD
GO
BACKUP DATABASE [HS_HSS] TO DISK = N'C:\BACKUP\backup-temp\HS_HSS.bak' WITH NOFORMAT, NOINIT, NAME = N'HS_HSS_FullDatabaseBackup', SKIP, NOREWIND, NOUNLOAD
GO
BACKUP DATABASE [ODI_MASTER] TO DISK = N'C:\BACKUP\backup-temp\ODI_MASTER.bak' WITH NOFORMAT, NOINIT, NAME = N'ODI_MASTER_FullDatabaseBackup', SKIP, NOREWIND, NOUNLOAD
GO
BACKUP DATABASE [ODI_WORK] TO DISK = N'C:\BACKUP\backup-temp\ODI_WORK.bak' WITH NOFORMAT, NOINIT, NAME = N'ODI_WORK_FullDatabaseBackup', SKIP, NOREWIND, NOUNLOAD
GO
BACKUP DATABASE [APP] TO DISK = N'C:\BACKUP\backup-temp\APP.bak' WITH NOFORMAT, NOINIT, NAME = N'APP_FullDatabaseBackup', SKIP, NOREWIND, NOUNLOAD
GO

Далее server3:

backup-server3.cmd

@echo off
chcp 1251

:: %1 BackupPath
:: %2 DateStamp

set HssPath=C:\Hyperion\products\Foundation\server
set LcmPath=C:\Hyperion\common\utilities\LCM\9.5.0.0
set PlanningPath=C:\Hyperion\products\Planning

echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Начало работы скрипта && echo.
echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Очистка архива...
forfiles /p %1\backup-history /d -8 /c "cmd /c del @file"

echo. && echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Перенос последнего бекапа в архив... && echo.
move /y %1\backup-current\*.rar %1\backup-history

md %1\backup-temp\hss
md %1\backup-temp\lcm
md %1\backup-temp\planning\lib\
md %1\backup-temp\planning\config\

echo. && echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Резервное копирование OpenLDAP... && echo.
call %HssPath%\scripts\backup.bat %1\backup-temp\hss

echo. && echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Резервное копирование метаданных Planning APP... && echo.
call %LcmPath%\bin\Utility.bat %1\scripts\lcm\planning-app.xml

echo. && echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Резервное копирование метаданных Shared Services... && echo.
call %LcmPath%\bin\Utility.bat %1\scripts\lcm\shared-services.xml

echo. && echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Резервное копирование файлов .properties... && echo.
xcopy %PlanningPath%\lib\*.properties %1\backup-temp\planning\lib\ /Y /C /I /E
xcopy %PlanningPath%\config\*.properties %1\backup-temp\planning\config\ /Y /C /I /E

echo. && echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Сжатие резервных копий... 
%1\scripts\rar.exe m -r -ep1 -idp %1\backup-current\%2.server3.rar %1\backup-temp\

echo. && echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Копирование логов LCM Backup Utility... && echo.
copy %LcmPath%\logs\*%date:~6,4%_%date:~3,2%_%date:~0,2%*_0.log %1\logs\

rd %1\backup-temp

echo. && echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Готово!

Здесь надо остановиться поподробней. Метаданные Shared Services и приложения Planning выгружаются из Lifecycle Management через xml-описания экспорта, подробней о подготовке которых можно прочитать в Shared Services Lifecycle Management Guide.

Если вкратце, то делаются они так:

1. Открываем LCM
2. В дереве слева выбираем нужный компонент
3. В окне справа отмечаем необходимые для экспорта артефакты и жмём Define Migration
4. Оставляем во всех фильтрах *
5. Задаём полный путь к файлу экспорта (или только название файла, который будет размещен в папку \Hyperion\common\import_export\username@directory )
6. Жмём Save Migration Definition

Ну и наконец последний server4.

backup-server4.cmd

@echo off
chcp 1251

:: %1 BackupPath
:: %2 DateStamp

set HyperionPath=C:\Hyperion

echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Начало работы скрипта && echo.
echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Очистка архива...
forfiles /p %1\backup-history /d -8 /c "cmd /c del @file"

echo. && echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Перенос последнего бекапа в архив... && echo.
move /y %1\backup-current\*.rar %1\backup-history

:: md %1\backup-temp\logs\
md %1\backup-temp\common\workspacert\9.5.0.0\wsearch\
md %1\backup-temp\products\Foundation\workspace\data\
md %1\backup-temp\deployments\WebLogic9\servers\Workspace\data\
md %1\backup-temp\deployments\WebLogic9\servers\Workspace\logs\
md %1\backup-temp\deployments\WebLogic9\servers\WebAnalysis\data\
md %1\backup-temp\deployments\WebLogic9\servers\WebAnalysis\logs\
md %1\backup-temp\deployments\WebLogic9\servers\FinancialReporting\data\
md %1\backup-temp\deployments\WebLogic9\servers\FinancialReporting\logs\

echo. && echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Начало резервного копирования... && echo.

:: xcopy %HyperionPath%\logs\* %1\backup-temp\logs\ /Y /C /I /E
xcopy %HyperionPath%\common\workspacert\9.5.0.0\wsearch\* %1\backup-temp\common\workspacert\9.5.0.0\wsearch\ /Y /C /I /E
xcopy %HyperionPath%\products\Foundation\workspace\data\* %1\backup-temp\products\Foundation\workspace\data\ /Y /C /I /E
xcopy %HyperionPath%\deployments\WebLogic9\servers\Workspace\data\* %1\backup-temp\deployments\WebLogic9\servers\Workspace\data\ /Y /C /I /E
xcopy %HyperionPath%\deployments\WebLogic9\servers\Workspace\logs\* %1\backup-temp\deployments\WebLogic9\servers\Workspace\logs\ /Y /C /I /E
xcopy %HyperionPath%\deployments\WebLogic9\servers\WebAnalysis\data\* %1\backup-temp\deployments\WebLogic9\servers\WebAnalysis\data\ /Y /C /I /E
xcopy %HyperionPath%\deployments\WebLogic9\servers\WebAnalysis\logs\* %1\backup-temp\deployments\WebLogic9\servers\WebAnalysis\logs\ /Y /C /I /E
xcopy %HyperionPath%\deployments\WebLogic9\servers\FinancialReporting\data\* %1\backup-temp\deployments\WebLogic9\servers\FinancialReporting\data\ /Y /C /I /E
xcopy %HyperionPath%\deployments\WebLogic9\servers\FinancialReporting\logs\* %1\backup-temp\deployments\WebLogic9\servers\FinancialReporting\logs\ /Y /C /I /E

echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Сжатие резервной копии... 
%1\scripts\rar.exe m -r -ep1 -idp %1\backup-current\%2.server4.rar %1\backup-temp\

rd %1\backup-temp

echo. && echo [%date:~0,2%.%date:~3,2%.%date:~6,4% %time:~0,2%:%time:~3,2%:%time:~6,2%] - Готово!

Вот и всё. Подробности смотрите в Backup and Recovery Guide.

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

А о восстановлении из резервной копии вы узнаете в следующих сериях...
Следите за обновлениями!

2 комментария:

  1. Добрый День.
    Пробую делать backup по Вашей статье. У меня при вызове startMaxL.cmd вылетает ошибка:
    Error initializing localization module.
    Не подскажите в чем дело?

    ОтветитьУдалить
  2. Добрый день, я не занимался этим уже более двух лет) Лучшего, чем поискать решения здесь – http://goo.gl/aszma – я сейчас посоветовать не могу.

    ОтветитьУдалить