Автоматическое восстановление базы данных — различия между версиями

Материал из wiki.standart-n.ru
Перейти к: навигация, поиск
Строка 30: Строка 30:
  
 
echo * Определяем в какую директорию установлен Firebird
 
echo * Определяем в какую директорию установлен Firebird
if exist "c:\Program Files\Firebird\Firebird_2_5\firebird.conf" (
+
if exist "c:\Program Files\Firebird\Firebird_2_5\bin\gfix.exe" (
 
   set gfix="c:\Program Files\Firebird\Firebird_2_5\bin\gfix.exe"
 
   set gfix="c:\Program Files\Firebird\Firebird_2_5\bin\gfix.exe"
 
) else (
 
) else (
   if exist "c:\Program Files (x86)\Firebird\Firebird_2_5\firebird.conf" (
+
   if exist "c:\Program Files (x86)\Firebird\Firebird_2_5\bin\gfix.exe" (
 
     set gfix="c:\Program Files (x86)\Firebird\Firebird_2_5\bin\gfix.exe"
 
     set gfix="c:\Program Files (x86)\Firebird\Firebird_2_5\bin\gfix.exe"
 
   )  
 
   )  
Строка 48: Строка 48:
 
   set %%i=%%j
 
   set %%i=%%j
 
)
 
)
echo * "%dbname%"
 
echo *
 
 
 
rem Определяем путь к файлу
 
rem Определяем путь к файлу
 
For /F "Delims=: tokens=1,2,3" %%A In ("echo %dbname%") Do Set dbfile=%%~B:%%~C
 
For /F "Delims=: tokens=1,2,3" %%A In ("echo %dbname%") Do Set dbfile=%%~B:%%~C
Строка 59: Строка 56:
 
rem Определяем текущее время
 
rem Определяем текущее время
 
For /F "Delims=: tokens=1,2,3" %%A In ('echo %time%') Do Set T=%%~A_%%~B
 
For /F "Delims=: tokens=1,2,3" %%A In ('echo %time%') Do Set T=%%~A_%%~B
 +
 +
set dbname="%dbname%"
 +
echo * %dbname%
 +
echo *
  
 
timeout 10
 
timeout 10
Строка 73: Строка 74:
  
 
   echo * Делаем shutdown базы
 
   echo * Делаем shutdown базы
   %gfix% -shut -force 0 "%dbname%"
+
   %gfix% -shut -force 0 %dbname%
 
   echo *
 
   echo *
  
 
   timeout 10
 
   timeout 10
 
   echo *
 
   echo *
 +
 +
  
 
   echo * Делаем проверку базы на ошибки
 
   echo * Делаем проверку базы на ошибки
 
   echo *
 
   echo *
   set valid=%gfix% -v -full "%dbname%"
+
   %gfix% -v -full %dbname% >valid.log
   For /F "Delims=" %%I In (%valid%) Do Set V=%%~I
+
 
 +
   For /F "usebackq tokens=* delims=" %%i In ("valid.log") Do Set V=%%i
 +
 
 
   Echo !V!
 
   Echo !V!
 
   echo *
 
   echo *
Строка 96: Строка 101:
 
     echo * Делаем файловую копию базы
 
     echo * Делаем файловую копию базы
 
     echo *
 
     echo *
     copy "%dbfile%" "original_base_!D!_!T!.fdb"
+
     copy "%dbfile%" original_base_!D!_!T!.fdb
  
 
     timeout 10
 
     timeout 10
Строка 103: Строка 108:
 
     echo * Делаем менд базы
 
     echo * Делаем менд базы
 
     echo *
 
     echo *
     set mend=%gfix% -mend "%dbname%"
+
     %gfix% -mend %dbname% >mend.log
     For /F "Delims=" %%I In (%mend%) Do Set M=%%~I
+
 
 +
     For /F "usebackq tokens=* delims=" %%i In ("mend.log") Do Set M=%%i
 +
 
 
     Echo !M!
 
     Echo !M!
 
     echo *  
 
     echo *  
Строка 113: Строка 120:
 
     echo * Поднимаем базу
 
     echo * Поднимаем базу
 
     echo *
 
     echo *
     %gfix% -online "%dbname%"
+
     %gfix% -online %dbname%
  
 
     timeout 10
 
     timeout 10
Строка 135: Строка 142:
 
     echo * Поднимаем базу
 
     echo * Поднимаем базу
 
     echo *
 
     echo *
     %gfix% -online "%dbname%"
+
     %gfix% -online %dbname%
  
 
     timeout 10
 
     timeout 10

Версия 19:44, 27 апреля 2016

Алгоритм работы скрипта

  • Берет настройки подключения из файла ServiceMngr.ini
  • Перезапускает Firebird
  • Делает shutdown базы
  • Делает проверку базы на ошибки
  • Если в базе найдены ошибки
    • Делает файловую копию базы
    • Делает mend базы
    • Поднимает базу
    • Запускает сжатие/восстановление спомощью сервис-менеджера
  • Если ошибок нет
    • Поднимает базу обратно


Установка

Сохраняем ниже следующий текст в файл service.bat, ставим кодировку 866 и кладем на компьютере с базой в папку ServiceMngr, которая настроена на нужную базу. Затем запускаем.

@echo off
SetLocal EnableExtensions EnableDelayedExpansion

@chcp 866

SET ISC_USER=SYSDBA
SET ISC_PASSWORD=masterkey

set options=ServiceMngr.ini
set gfix=null

echo *

echo * Определяем в какую директорию установлен Firebird
if exist "c:\Program Files\Firebird\Firebird_2_5\bin\gfix.exe" (
  set gfix="c:\Program Files\Firebird\Firebird_2_5\bin\gfix.exe"
) else (
  if exist "c:\Program Files (x86)\Firebird\Firebird_2_5\bin\gfix.exe" (
    set gfix="c:\Program Files (x86)\Firebird\Firebird_2_5\bin\gfix.exe"
  ) 
)

echo * %gfix%
echo *

timeout 10
echo *

echo * Берем настройки подключения к базе данных
for /f "eol=# delims== tokens=1,2" %%i in (%options%) do (
  set %%i=%%j
)
rem Определяем путь к файлу
For /F "Delims=: tokens=1,2,3" %%A In ("echo %dbname%") Do Set dbfile=%%~B:%%~C

rem Определяем текущую дату
For /F "Delims=. tokens=1,2,3" %%A In ('echo %date%') Do Set D=%%~A_%%~B_%%~C

rem Определяем текущее время
For /F "Delims=: tokens=1,2,3" %%A In ('echo %time%') Do Set T=%%~A_%%~B

set dbname="%dbname%"
echo * %dbname%
echo *

timeout 10
echo *

if %gfix% Neq "null" (

  echo * Перезапускаем Firebird
  echo * 
  net stop "Firebird Guardian - DefaultInstance"
  net start "Firebird Guardian - DefaultInstance"

  echo *

  echo * Делаем shutdown базы
  %gfix% -shut -force 0 %dbname%
  echo *

  timeout 10
  echo *



  echo * Делаем проверку базы на ошибки
  echo *
  %gfix% -v -full %dbname% >valid.log

  For /F "usebackq tokens=* delims=" %%i In ("valid.log") Do Set V=%%i

  Echo !V!
  echo *

  timeout 10
  echo *

  If "!V!" Neq "" (

    echo * В базе найдены ошибки
    echo * 

    echo * Делаем файловую копию базы
    echo *
    copy "%dbfile%" original_base_!D!_!T!.fdb

    timeout 10
    echo *

    echo * Делаем менд базы
    echo *
    %gfix% -mend %dbname% >mend.log

    For /F "usebackq tokens=* delims=" %%i In ("mend.log") Do Set M=%%i

    Echo !M!
    echo * 

    timeout 10
    echo *

    echo * Поднимаем базу
    echo *
    %gfix% -online %dbname%

    timeout 10
    echo *

    echo * Запускаем бэкап-ресторе через сервис-менеджер
    echo * 
    start ServiceMngr.exe restore

    timeout 10
    echo *

  ) else (

    echo Ошибки в базе НЕ найдены
    echo * 

    timeout 10
    echo *

    echo * Поднимаем базу
    echo *
    %gfix% -online %dbname%

    timeout 10
    echo *

  )

) else (

  echo * Firebird не установлен
  echo *

  timeout 10
  echo *

)