Бэкап и восстановление базы 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

параметры:
  • WORK.GDB - полный путь к рабочей базе данных;
  • USER_IB - имя пользователя Interbase/Firebird, обычно это SYSDBA или создатель базы;
  • PASSWORD_IB - пароль пользователя.
Утилита возвращает код 0 при отсутствии соединений к базе, или код 2 и список подключенных пользователей.

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

gfix -shut –force 10 -user  <USER_IB> -pass  <PASSWORD_IB>  <WORK.GDB>
if errorlevel 1 goto exit1
ключи:
  • -shut -force - форсированный режим отключения;
  • 10 - ждем 10 секунд отключения пользователей, потом отрубаем.
При этом я сталкивался с такой проблемой. Иногда при принудительном отрубании пользователей 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
ключи:
  • -b - делать бэкап;
  • -g - не собирать мусор, очень полезный ключ может значительно сократить время бэкапа;
  • -v - выводить лог операций, ну просто приятно когда надписи бегут по экрану .

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

gbak -r -user  <USER_IB> -pass  <PASSWORD_IB> -v  <BACKUP.GBK>  <NEW.GDB>
if errorlevel 1 goto exit3
ключи:
  • -r - восстанавливаем базу;
  • -v - выводить лог операций.

Шаг 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


Пожалуйста, оцените статью

Отлично
Хорошо
Средне
Плохо
Очень плохо

Сделайте бэкап пока не поздно.
2011123456789101112
2010123456789101112
2009123456789101112
2008123456789101112
2007123456789101112
2006123456789101112
2005123456789101112
2004123456789101112
2003123456789101112
2002123456789101112
2001123456789101112
2000123456789101112
1999123456789101112

Последние статьи
Литература