Бэкап и восстановление базы Interbase/Firebird

© 2005 Сергей Тулаев

О том, что периодическая процедура резервирования и последующего восстановления данных положительно сказывается на размере и производительности базы данных Interbase/Firebird написано во многих FAQ. Совершенно с этим согласен. Попробую рассказать, как этот процесс организован у меня.

В данное время я являюсь администратором небольшой базы (примерно 300Mb), которая довольно активно используется (примерно 1 миллион транзакций в день). При этом цикл backup/restore производятся ежедневно. Последние пару лет серьезных сбоев и поломок базы не наблюдалось.

Для автоматического резервирования и восстановления написан bat-файл. Используется утилита командной строки gbak и пару программок собственной разработки.

Обычно при backup/restore базы требуется выполнить следующие действия:

  1. Отключить всех пользователей от базы;
  2. Если все отключены запустить процедуру бэкапа в файл BACKUP.GBK;
  3. Если бэкап прошел, то запустить процедуру восстановления BACKUP.GBK в новый файл базы NEW.GDB;
  4. Если восстановление успешно, переименовать файл рабочей базы WORK.GDB в OLD.GDB;
  5. Если переименование успешно, то переименовать новый файл NEW.GDB в WORK.GDB;
  6. Скопировать BACKUP.GBK на другой диск, а лучше на другой компьютер, добавив в имя файла дату и время бэкапа.

Теперь подробнее по шагам.

Шаг 1. Выгнать пользователей из базы можно по хорошему, закрыв все программы работающие с базой. Чтобы узнать есть ли подключенные пользователи и кто они, я написал утилиту IbCheck.exe. Пример вызова:

IbCheck  <WORK.GDB>  <USER_IB>  <PASSWORD_IB>
if errorlevel 1 goto exit1

параметры:
Утилита возвращает код 0 при отсутствии соединений к базе, или код 2 и список подключенных пользователей.

Или по плохому, отрубив оставшиеся соединения командой

gfix -shut –force 10 -user  <USER_IB> -pass  <PASSWORD_IB>  <WORK.GDB>
if errorlevel 1 goto exit1
ключи:
При этом я сталкивался с такой проблемой. Иногда при принудительном отрубании пользователей Windows не давала возможность переименовать файл рабочей базы на шаге 4. Приходилось останавливать и перезапускать Interbase, чтобы "освободить" файл.

Шаг 2. Бэкапим базу WORK.GDB в файл BACKUP.GBK

gbak -b -user  <USER_IB> -pass  <PASSWORD_IB> -v -g  <WORK.GDB>  <BACKUP.GBK>
if errorlevel 1 goto exit2
ключи:

Шаг 3. Восстанавливаем базу в файл NEW.GDB

gbak -r -user  <USER_IB> -pass  <PASSWORD_IB> -v  <BACKUP.GBK>  <NEW.GDB>
if errorlevel 1 goto exit3
ключи:

Шаг 4. Переименовываем рабочую WORK.GDB базу в OLD.GDB. Не забываем сначала удалить OLD.GDB, этот файл остался с прошлого бэкапа!

del  <OLD.GDB>
ren  <WORK.GDB>  <OLD.GDB>
if errorlevel 1 goto exit4

Шаг 5. Переименовываем только что восстановленную базу NEW.GDB в WORK.GDB

ren  <NEW.GDB>  <WORK.GDB>
if errorlevel 1 goto exit5

Шаг 6. Основная работа сделана, теперь надо скопировать бэкап файл на другой физический диск, а лучше на другой компьютер. Еще, хорошо бы хранить не только последнюю копию базы, а все копии за последнюю неделю, месяц, год… сколько позволяет размер винчестера. Но для этого, как минимум, названия бэкап файлов должны содержать дату и возможно время создания. Для этих целей я использую утилиту InsDatew.exe. В качестве параметра ей требуется передать имя пакетного bat-файла. Это файл будет выполнен, а в окружении будут созданы переменные с номером года, месяца, дня и т. д. Внутри самого скрипта это можно использовать так:

Copy  <BACKUP.GBK>  <COPY_PATH>%_YEAR%_%_MONTH%_%_DAY%.GBK
Создаст копию файла под именем YYYY_MM_DD.GBK в каталоге <COPY_PATH>

Кстати, можно сразу сжимать бэкап файл каким либо архиватором. Но это уже другая история .

Как видите все достаточно просто.

А в заключение предлагаю желающим bat-файл и утилиты с исходными текстами:

br.bat - bat-файл для автоматического backup/restore. Все названия баз, пути, пароли и т. д. настраиваются. Скрипт нужно запускать на той же машине, где находится база данных. Утилиты IbCheck и InsDatew лучше положить рядом с bat-файлом.
IbCheck - консольная утилита проверки подключенных пользователей (163K; с исходным кодом на Delphi).
InsDateW - консольная утилита вставки даты и времени в переменные окружения (28.2K; с исходным кодом на Delphi).

Copyright© 2005 Сергей Тулаев  Специально для Delphi Plus


Пожалуйста, оцените статью
Отлично
Хорошо
Средне
Плохо
Очень плохо