Резервное копирование и
восстановление из копии является одним из самых важных
процессов в администрировании базы данных 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 восстановление базы данных в уже
существующий файл;
-С восстановление базы данных в новый
файл, если файл уже существует, то процесс будет прерван
с ошибкой;
-p размер страницы (1024,2048,4196
или 8192). По умолчанию 1024;
Пример:
gbak -R –user SYSDBA –password
masterkey C:workwork.gbk C:workwork.gdb
Следует отметить один нюанс, если
запустить утилиту gbak без ключа –B или –R/-C, то будет
начат процесс резервного копирования базы
данных.
2. С помощью компонентов FIBPlus
можно также программно запускать процессы резервирования
и восстановления базы данных.
Рисунок 1.
Для резервирования базы данных
использовался компонент 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-поле:
На следующем рисунке представлена
форма с помощью, которой можно осуществить восстановление
базы данных:
Рисунок 3.
Для процесса 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;
Результат восстановления представлен
на следующем рисунке:
Рисунок 4.