Gbak восстановление базы из gdb gbk

Войдите в каталог Bin в папке, куда был установлен сервер Interbase/Firebird/Yaffil. Для того, чтобы не работать с "голым" окном командной строки, рекомендуется использовать любую файловую утилиту вроде Far или Total Commander.

Проверим базу данных на наличие повреждений:

вместо gdbase.gdb укажите полный путь к своему файлу базы данных (хорошая идея: для того чтобы не обременять себя вводом длинного пути, скопировать файл базы данных непосредственно в каталог BIN). Имя сервера указывать не надо!

Если утилита отработала и не выдала ничего на экран, то с базой все нормально.

Если есть повреждения, то попытаемся исправить их:

Проверим, исправились ли все повреждения:

Если повреждения остались, то запишем информацию в Bak-файл, а потом восстановим в другой новой базе данных. Для этого последовательно выполним команды:

Здесь применены следующие ключи:

  • -b — создавать архивную копию базы;
  • -v — выводить на экран подробный лог;
  • -ig — игнорировать ошибки в данных;
  • -g — запретить сборку мусора при чтении из базы.

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

При серьезных повреждениях базы данных в некоторых таблицах могут пропасть записи из-за чего не восстановятся внешние ссылки на эти таблицы. Или наоборот, появятся "фантомные" записи, нарушающие условия уникальности первичного ключа. В таких случаях на стадии восстановления базы данных из архива на экране будут отображены сообщения об ошибках и процесс восстановления прервется.

Спасти базу можно следующим образом: сначала восстановить ее без внешних ссылок (индексов) с помощью команды:

Затем, с помощью любой оболочки, например IBExpert, один за одним активизировать внешние ключи с целью выявить поврежденные таблицы. По мере выявления следует, либо удалить записи которые содержат ссылки на несуществующие записи, либо добавить несуществующие записи, либо обнулить ссылки. Здесь, хорошим подспорьем может стать наличие пусть и устаревшего, но неповрежденного архива этой же базы.

Если база повреждена настолько, что одной деактивации индексов недостаточно, то можно попробовать ключи -n (отключение проверок целостности данных) и -o (комит данных после каждой таблицы при восстановлении).

Пример команды с вышеупомянутыми ключами:

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

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

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

О том, что периодическая процедура резервирования и последующего восстановления данных положительно сказывается на размере и производительности базы данных 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. Пример вызова:

if errorlevel 1 goto exit1

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

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

if errorlevel 1 goto exit1

  • -shut -force — форсированный режим отключения;
  • 10 — ждем 10 секунд отключения пользователей, потом отрубаем.

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

-v -g
if errorlevel 1 goto exit2

  • -b — делать бэкап;
  • -g — не собирать мусор, очень полезный ключ может значительно сократить время бэкапа;
  • -v — выводить лог операций, ну просто приятно когда надписи бегут по экрану .

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

-v
if errorlevel 1 goto exit3

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

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

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

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

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

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

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

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

Резервное копирование и восстановление из копии является одним из самых важных процессов в администрировании базы данных InterBase/FireBird.

Резервное копирование — один из самых надежных способов сохранить и предохранить свои данные от потери или порчи. Процесс резервного копирования также делается в профилактических целях, для увеличения производительности базы данных — это достигается за счет того, что в момент копирования происходит считывание последних версий всех записей, старые же версии в копию никогда не попадают. Здесь важно заметить, что недостаточно одного лишь резеврного копирования, нужно иногда проверять восстанавливаемость базы данных из резеверной копии, потому что бывают случаи, что база данных работает в режиме 24*7, то есть 24 часа в сутки и 7 дней в неделю, backup базы данных может происходит нормально, но в силу определенных причин база данных не восстанавливается, последствия могут быть плачевными для всех данных.

Причины могут следующими: в базе данных есть ограничения, такие как NOT NULL поля, внешние ключи, уникальность, а существующие данные в базе данных этим ограничениям не соответствуют по каким-либо причинам. Такие данные могут мирно существовать до тех пор, пока они не будут задействованы в операциях редактирования или удаления. В процессе восстановления "прощупываются" все данные — в первую очередь создаются ограничения и затем заливаются данные, в этот момент и происходит ошибка. Для профилактики следует восстанавливать базу данных в тестовую, и лишь при успешном завершении процесса восстановления, делать Restore в текущую базу. В случае возникновения ситуации с поврежденным файлом backup"а следует найти в базе данных несоответствия и исправить их.

Рассмотрим два способа резервирования/восстановления базы данных с помощью утилиты gbak и компонентов FIBPlus:

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

    Резервирование

gbak [-B] [ключи] файл_базы_данных файл_резервной_копии Значение ключей:
-g не собирать мусор во время резервного копирования;
-l игнорировать лимбо-транзакции;
-m резервирование только метаданных;
-user имя пользователя;
-password пароль пользователя;
-v показать протоколирование во время выполнения процесса;
-z показать версию gbak.

gbak -b -user SYSDBA -password masterkey C:workwork.gdb C:workwork.gbk
Восстановление:

gbak [-R/-С] [ключи] файл_базы_данных файл_резервной_копии

Значение ключей:
-R восстановление базы данных в уже существующий файл. Использовать этот ключ не рекомендуется, т.к. можно испортить работающую БД и это будет несовместимо с Firebird 2.0;
-С восстановление базы данных в новый файл, если файл уже существует, то процесс будет прерван с ошибкой;
-p размер страницы (1024,2048,4196 или 8192). Если ключ не указан, то база данных создается с тем размером страницы, который записан в бэкапе.

gbak -c -user SYSDBA -password masterkey C:workwork.gbk C:workwork_new.gdb

Следует отметить один нюанс, если запустить утилиту gbak без ключа -B или -R/-C, то будет начат процесс резервного копирования базы данных.

2. С помощью компонентов FIBPlus можно также программно запускать процессы резервирования и восстановления базы данных.

Для резервирования базы данных использовался компонент TpFIBBackupService, для начала процесс нужно заполнить определенные поля в компоненте:

fibBackUp.DatabaseName := edBackUpPath.Text; // указываем путь к базе данных
fibBackUp.ServerName := ‘localhost’; //имя сервера
// создаем и указываем имя будущего файла резервной копии базы данных
fibBackUp.BackupFile.Add(frmMain.CurrentBackUpPath + ExtractFileName(edBackUpPath.Text)
+ ‘_’ + DateToStr(now) + ‘.gbk’);
fibBackUp.Params.Add(‘user_name=SYSDBA’);
fibBackUp.Params.Add(‘password=masterkey’);

fibBackUp.Active := True; // активируем процесс
try
Screen.Cursor := crSQLWait;
fibBackUp.ServiceStart; // и стартуем его
mBackup.Lines.Add(‘**************** Резервное копирование начато базы: ‘ +
dBackUpPath.Text + ‘****************’ );
mBackup.Lines.Add(‘ );
<пока не завершится процесс выводим логии о процессе, для того чтобы логии отображались нужно свойство Verbose поставить в значение TRUE>
while not (fibBackUp.Eof) do
begin
mBackup.Lines.Add(fibBackUp.GetNextLine);
end;
mBackup.Lines.Add(‘*************** Резервное копирование закончено ***************’);
fibBackUp.Active := false; //закрываем процесс
Screen.Cursor := crDefault;
except
MessageDlg(‘Ошибка при резервном копировании базы данных’, mtError,[mbOk],0);
end;

Результат бекапа будет выведен в Memo-поле:

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

Для процесса restore использовался компонент TpFIBRestoreService, в листинге показаны часть настроек, которые необходимо установить перед запуском процесса восстановления.

//восстанавливаем базу данных в новый указанный файл
if chNewDB.Checked then
fibRestore.Options := [CreateNewDB];
//перезаписываем базу данный при restore
if chReplace.Checked then fibRestore.Options := [Replace];
fibRestore.BackupFile.Add(edPathGBK.Text); //указываем GBK файл
fibRestore.DatabaseName.Add(edDirGDB.Text); //указываем файл базы данных
fibRestore.PageSize := StrToInt(cxComboBox1.Text); //размер страницы
fibRestore.ServerName := ‘localhost’;
fibRestore.Params.Add(‘user_name=SYSDBA’);
fibRestore.Params.Add(‘password=masterkey’);
try
Screen.Cursor := crSQLWait;
fibRestore.Active := True;
fibRestore.ServiceStart;
mRestore.Lines.Add(‘**************** Начат процесс восстановления: ‘ +
edPathGBK.Text + ‘****************’);
mRestore.Lines.Add(»);
while not (fibRestore.Eof) do
mRestore.Lines.Add(fibRestore.GetNextLine);
mRestore.Lines.Add(»);
mRestore.Lines.Add(‘**************** Восстановление закончено ****************’);
fibRestore.Active := false;
Screen.Cursor := crDefault;
except
MessageDlg(‘Ошибка при восстановление базы данных’,mtError,[mbOk],0);
end;

Результат восстановления представлен на следующем рисунке:


[an error occurred while processing the directive]
Карта сайта