назад к списку статей

Автоматическое резервное сохранение базы данных IBM DB2

резервное сохранение DB2Система управления базами данных IBM DB2 - не самая популярная в России, и найти информацию по ней на русскоязычных сайтах крайне сложно. Хотя несколько крупных компаний успешно используют ее. Среди них Газпром, ПФР, РЖД и другие. Кстати, правильно произносить "ди-би ту", а не "ди-би два".

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

В промышленном режиме такой подход не применим. Нужен контроль за количеством актуальных копий, старые копии нужно удалять либо сохранять на внешний носитель. Также резервные копии должны храниться на сервере, отличном от сервера базы данных, иначе при поломке сервера с СУБД уничтожится сама база данных и все ее резервные копии. Для экономии места на диске копию БД нужно архивировать.

Задача состоит в следующем: написать скрипт db2 backup database, который делает резервную копию базы данных IBM DB2 v8.2, архивирует ее и сохраняет на удаленный сервер. При невозможности скопировать на удаленный сервер, хранит копию на сервере базы данных. На удаленном сервере хранит только N последних резервных копий.

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

Итак, у нас есть база данных MYBASE и пользователь MYBASEUSER, который имеет права на создание резервной копии. На сервере, где расположена база данных и где мы будем запускать скрипт, должен быть предустановлен архиватор WinRar. Можно использовать любой другой архиватор, поддерживающий синтаксис командной строки, но тогда придется немного модифицировать скрипт. На удаленном сервере, где будут храниться копии БД, нужно создать папку общего доступа BackupMYBASE, и создать в ней каталог с именем Day. В каталоге c:\BackupMYBASE\Day на сервере базы данных создаем два файла:

  • backupMYBASE.db2 - скрипт по созданию резервное копии базы данных;
  • backupMYBASEDay.bat - скрипт, обеспечивающий запуск скрипта backupMYBASE.db2, архивирование полученной копии, передачу архива на удаленный сервер и удаление "старых" копий.

Содержимое файла backupMYBASE.db2:

CONNECT TO MYBASE user MYBASEUSER using passwordUser;
QUIESCE DATABASE IMMEDIATE FORCE CONNECTIONS;
CONNECT RESET; 
BACKUP DATABASE MYBASE user MYBASEUSER using passwordUser TO 
"c:\BackupMYBASE\Day" WITH 2 BUFFERS BUFFER 1024 PARALLELISM 1 WITHOUT PROMPTING; 
CONNECT TO MYBASE user MYBASEUSER using passwordUser;
UNQUIESCE DATABASE;
CONNECT RESET;
TERMINATE;

Содержимое файла backupMYBASEDay.bat:

REM формирование текущей даты
for /f "tokens=1-4 delims=/-\. " %%a in ('date /t') do (
  set mjour=%%a
  set mmois=%%b
  set mannee=%%c
)
set mydate=%mannee%%mmois%%mjour%
                        
REM количество одновременно хранящихся копий
set nbhisto=7
 
if /I "%mjour%" GTR "%nbhisto%" (
  set /a mjour=1%mjour%-1%nbhisto%
) else (
  if /I "%mmois%" == "01" (
    set /a mannee=%mannee%-1
    set /a mmois=12
  ) else (
    set /a mmois=%mmois%-1
    )
  set /a mjour=1%mjour%+30-1%nbhisto%
)
if %mjour% LSS 10 ( set mjour=0%mjour%)
  set delmax=%mannee%%mmois%%mjour%
                        
REM destdir - путь, где будет лежать резервная копия
set destdir=c:\BackupMYBASE\Day
set db2backupdir=%destdir%\MYBASE.0\DB2\NODE0000\CATN0000
 
echo "Запускаем копирование БД"
REM запуск файла backupMYBASE.db2
db2cmd /c /w /i db2 -v -t -f%destdir%/backupMYBASE.db2 -z%destdir%/backupMYBASE.log
 
if not %errorlevel% == 0 (
  echo "Ошибка при создании резервной копии: Уровень=%errorlevel%"
  goto fin
)
 
rem архивируем копию с помощью WinRAR
set arcpath=c:\Program Files\WinRar
set dbpath=MYBASE.0\DB2\NODE0000\CATN0000
del /S %dbpath%\%mydate%\BackUp.rar
"%arcpath%\Rar.exe" a -df -ep %dbpath%\%mydate%\BackUp.rar %dbpath%\%mydate%\*.001
 
if not %errorlevel% == 0 (
  echo "Ошибка при архивировании: Уровень=%errorlevel%"
  goto fin
)
 
echo "удаляем предыдущие копии БД до %delmax%"
db2cmd /c /w /i db2 -v CONNECT TO MYBASE
db2cmd /c /w /i db2 -v prune history %delmax% and delete
db2cmd /c /w /i db2 -v CONNECT RESET
db2cmd /c /w /i db2 -v TERMINATE
if not %errorlevel% == 0 (
  echo "Ошибка при удалении старых копий: Уровень=%errorlevel% "
  goto fin
)
 
echo "удаляем предыдущие файлы копий БД до %nbhisto%"
for /f "skip=%nbhisto%" %%i in ('dir "%db2backupdir%" /b /o:-n') do (
  rmdir /Q/S "%db2backupdir%/%%i"
  if not %errorlevel% == 0 (
    echo "Ошибка при удалении старых копий: Уровень=%errorlevel%"
  )
)
 
:fin
if %errorlevel% == 0 (
  echo " Резервное сохранение выполнено, дата=%mydate% " 
  ) else (
    echo " Ошибка при резервном сохранении, дата=%mydate% " 
    )
                        
rem копируем архив с резервной копией на удаленный сервер
rem db2backupdir - каталог на удаленном сервере для хранения резервных копий
rem вместо nameserver нужно вписать имя сервера, на котором будут храниться копии БД
set destdir=\\nameserver\BackupMYBASE\Day
set db2backupdir=%destdir%\MYBASE.0\DB2\NODE0000\CATN0000
                        
rem db2backupdirfrom - каталог с резервной копией
set destdirfrom=c:\BackupMYBASE\Day
set db2backupdirfrom=%destdirfrom%\MYBASE.0\DB2\NODE0000\CATN0000
                        
rem ищем самый свежий файл...
for /f %%i in ('dir "%db2backupdirfrom%" /b /o:-n') do (
  set folder="%%i"
  GOTO L1
  if not %errorlevel% == 0 (
    echo "Ошибка при копировании на удаленный сервер: Уровень=%errorlevel% "
  )
)
                        
:L1
rem ...и копируем его на удаленный сервер
xcopy /S /Y /I "%db2backupdirfrom%\%folder%" "%db2backupdir%\%folder%"
if not %errorlevel% == 0 ( goto exit )
                        
rem При успешном копировании на удаленный сервер удаляем старые бэкапы на нем
for /f "skip=%nbhisto%" %%i in ('dir "%db2backupdir%" /b /o:-n') do (
  rmdir /Q/S "%db2backupdir%\%%i"
  if not %errorlevel% == 0 (
    echo "ERROR: Backup Error, deleteHisto RC=%errorlevel% "
  )
)
                        
rem При успешном копировании на удаленный сервер удаляем старые бэкапы на сервере БД
for /f "skip=%nbhisto%" %%i in ('dir "%db2backupdirfrom%" /b /o:-n') do (
  rmdir /Q/S "%db2backupdirfrom%\%%i"
  if not %errorlevel% == 0 (
    echo "ERROR: Backup Error, deleteHisto RC=%errorlevel% "
  )
)
                        
:exit

Логи выполнения db2-скрипта записываются в файл backupMYBASE.log в том же каталоге, где расположен скрипт backupMYBASE.db2.

Примечание: данный скрипт годится для баз данных, использующий СУБД IBM DB2 v8.2. Для DB2 v9.x резервные копии создаются без вложенной системы каталогов и данный скрипт придется "допиливать" под данную особенность.

назад к списку статей

Поделитесь этой страницей со своими друзьями:

Нравится


I'mon Google+ .