Опубликован: 07.05.2010 | Уровень: специалист | Доступ: платный
Лекция 27:

Программное администрирование баз данных InterBase

< Лекция 26 || Лекция 27: 12345 || Лекция 28 >

Реализация восстановления из резервной копии

Определимся с задачей. Нам нужно:

  1. Получить имя файла резервной копии, из которой будем делать восстановление.
  2. Выбрать необходимые параметры восстановления.
  3. Произвести само восстановление. Причем восстанавливать будем в отдельную папку, например C:\DataBases\Restore, которая уже должна существовать на диске. Восстанавливаемой БД перед именем присвоим префикс из даты и времени, как и у резервного копирования, также будем создавать лог-файл. Если восстановление будет успешным, потом администратор сможет переименовать полученную БД и перенести ее в рабочую папку средствами Windows или файловым менеджером.

Для восстановления базы данных сделаем новую вкладку. Выделите компонент PC1 ( PageControl ). Чтобы выделить именно компонент, а не страницу на нем, нужно щелкать правее ярлычка вкладки. Щелкнем по нему правой кнопкой и выберем команду New Page. В свойстве Name новой вкладки вместо TabSheet1 напишем TSh2, а в свойстве Caption - "Восстановление базы". Внешний вид вкладки представлен на рисунке ниже:

Вкладка "Восстановление базы"

Рис. 27.2. Вкладка "Восстановление базы"

Здесь у нас будет:

  • Одна простая панель Panel.
  • Три компонента Label.
  • Один Edit.
  • Одна панель GroupBox.
  • Шесть флажков CheckBox.
  • Один SpinEdit.
  • Один ComboBox.
  • Две простых кнопки.
  • Компонент Memo.
  • Компонент IBRestoreService из вкладки InterBase Admin. Компонент предназначен для восстановления базы данных InterBase из резервной копии. Имеет достаточно широкие возможности настроек.
  • Диалог OpenDialog.

Сделаем дизайн вкладки, как на рисунке 27.2. Вначале ставим панель Panel, свойство Align = alTop, свойство Caption очищаем, высоту делаем немного меньше половины страницы.

На панель сверху устанавливаем Label, Edit и Button. В свойстве Caption компонента Label выводим текст "Выберите резервную копию, из которой будем восстанавливать БД:", свойство Text компонента Edit1 очищаем. Кнопку делаем квадратной, размерами под Edit1: Height = Width = 21. В свойстве Caption помещаем "…". Свойство Name переименуем в bOpenBak.

Ниже на панель помещаем панельку GroupBox, в свойстве Caption которой напишем "Параметры восстановления". Внутрь GroupBox1 поместим шесть компонентов CheckBox, которые назовем соответственно CB1CB6 (сверху - вниз по первой колонке, и сверху - вниз по второй). В свойстве Caption этих флажков поместим соответственно текст:

"Отключить индексы"

"Отключить теневые копии"

"Отключить проверку внеш.ключей"

"Записывать данные для таблиц отдельно"

"Создать новую БД"

"Заполнить страницы на 100%"

Подгоните размеры компонентов, как на рисунке. У флажка CB5 свойство Checked переводим в True, так как нам по умолчанию нужно создать новую базу данных. Кроме того, включим еще и флажок CB2, чтобы не восстанавливать теневые копии, если они уже есть. Когда база данных будет восстановлена, ей всегда можно назначить новую теневую копию. А попытка восстановления БД с теневой копией приведет к ошибке, если сначала не удалить этот shadow -файл.

Ниже помещаем Label с текстом "Размер буфера страницы:", а рядом помещаем SpinEdit, свойство Name которого переименуем в SE3. В справочнике Delphi размер буфера страницы у компонента IBRestoreService указан как 3000 килобайт. Не будем спорить с производителями Delphi и по умолчанию установим именно этот размер. Для этого сделаем следующие настройки SE3:

MinValue = 1000 (минимальное значение)
MaxValue = 5000 (максимальное значение)
Increment = 100 (шаг приращения/убывания)
Value = 3000 (текущее значение)

Ниже разместим еще один Label с текстом "Размер страницы:", а правее поместим ComboBox. Переименуем его свойство Name в CBox1, откроем редактор свойства Items и впишем построчно следующие возможные размеры страниц в InterBase:

1024
2048
4096
8192

В свойство Text поместим рекомендованное значение 8192.

Правее этих компонентов поместим обычную кнопку, в свойстве Caption которой напишем "Начать восстановление БД", а свойство Enable переведем в False (мы сделаем кнопку доступной, когда пользователь выберет какую-нибудь резервную копию, из которой требуется сделать восстановление). Свойство Name кнопки переименуйте в bStartRestore.

Ниже панели Panel поместим Memo (оставим имя по умолчанию Memo2 ). Свойство Align переведем в alClient, в свойстве ScrollBars выберем ssVertical, чтобы появилась вертикальная прокрутка, а также очистим текст в свойстве Lines.

Займемся не визуальными компонентами. OpenDialog переименуем в OD1. Откроем редактор свойства Filter и в столбец Filter Name впишем "Резервные копии БД", а в столбец Filter - "*.gbk". В свойстве InitialDir укажем папку с нашими резервными копиями "C:\DataBases\Backup". Также в свойстве DefaultExt укажем расширение файлов по умолчанию "gbk" (без точки).

Перейдем к компоненту IBRestoreService. Для краткости обращений переименуем его свойство Name в IBRS. Как видите, этот компонент также имеет сложное раскрывающееся свойство Options, в котором можно настроить следующие переключатели:

Таблица 27.2 . Переключатели свойства Options компонента IBRestoreService
Переключатель Описание
DeactivateIndexes Сделать индексы в базе данных неактивными.
NoShadow При восстановлении БД не восстанавливать ее теневые копии.
NoValidityCheck Отключить проверку внешних ограничений ( Foreign Key ). Делать это нужно осторожно, предварительно сделав копию метаданных.
OneRelationAtATime Восстановить метаданные и данные для каждой таблицы по одной записи за раз. Бывает полезно, если обычное восстановление не получается из-за разрушенных данных или нарушенных внешних ограничений.
Replace При значении True можно будет восстанавливать копию поверх существующей базы данных. Крайне не рекомендуется.
CreateNew При True создается новый файл базы данных.
UseAllSpace При восстановлении заполнять страницы базы на 100%, вместо положенных по умолчанию 80%. Чтобы не ухудшить производительность БД, делать это стоит лишь с базами "только для чтения".

Для шести из семи этих переключателей у нас имеются соответствующие компоненты ComboBox, мы опустили только переключатель Replace, так как восстанавливать резервную копию, затирая существующую базу данных, не рекомендуется. Кроме того, имя восстанавливаемой БД, благодаря префиксу, будет уникальным, так что восстановить копию поверх БД все равно не получится. Если программа не предусматривает настройки параметров восстановления, то эти параметры можно было бы указать прямо в свойстве Options компонента. Однако наша программа предусматривает настройку, поэтому параметры восстановления будем устанавливать программно, в зависимости от того, какие CheckBox включены.

Займемся кодированием. Сгенерируйте процедуру нажатия на кнопку "…". Ее код:

{Щелкнули по кнопке "..."}
procedure TfMain.bOpenBakClick(Sender: TObject);
begin
   //если диалог состоялся:
   if OD1.Execute then begin
      //укажем выбранный файл
      Edit1.Text:= OD1.FileName;
      //делаем доступной кнопку "Начать восстановление БД"
      bStartRestore.Enabled:= True;
   end; //if
end;

Остается реализовать само восстановление. Сгенерируйте процедуру нажатия на кнопку "Начать восстановление БД". Ее код:

{Щелкнули по кнопке "Начать восстановление БД"}
procedure TfMain.bStartRestoreClick(Sender: TObject);
var st: String;
begin
  //получим префикс для восстановленной БД и лога:
  st := GetName();
  //Очистим Memo2:
  Memo2.Clear;
  //устанавливаем начальные параметры:
  IBRS.ServerName:= 'MyServ';
  IBRS.LoginPrompt:= False;
  IBRS.Params.Add('user_name=sysdba');
  IBRS.Params.Add('password=masterkey');
  IBRS.Active:= True;
  //начинаем восстановление
  try
    IBRS.Verbose:= True; //вести лог
    IBRS.Options:= []; //очистим свойство Options
    //далее мы включаем в Options переключатель,
    //если его ComboBox включен:
    if CB1.Checked then IBRS.Options :=
           IBRS.Options + [DeactivateIndexes];
    if CB2.Checked then IBRS.Options :=
           IBRS.Options + [NoShadow];
    if CB3.Checked then IBRS.Options :=
           IBRS.Options + [NoValidityCheck];
    if CB4.Checked then IBRS.Options :=
           IBRS.Options + [OneRelationAtATime];
    if CB5.Checked then IBRS.Options :=
           IBRS.Options + [CreateNewDB];
    if CB6.Checked then IBRS.Options :=
           IBRS.Options + [UseAllSpace];
    //устанавливаем размер буфера страницы:
    IBRS.PageBuffers:= SE3.Value;
    IBRS.PageSize:= StrToInt(CBox1.Text); //размер самой страницы
    //очищаем свойство с именем БД, которая должна получиться:
    IBRS.DatabaseName.Clear;
    //устанавливаем новое имя с префиксом:
    IBRS.DatabaseName.Add('c:\DataBases\Restore\' + 
st + 'first.gdb');
    //очищаем свойство с именем резервной копии:
    IBRS.BackupFile.Clear;
    //устанавливаем новое имя из OpenDialog:
    IBRS.BackupFile.Add(OD1.FileName);
    //стартуем восстановление:
    IBRS.ServiceStart;
    //параллельно ведем лог, пока не наступит конец восстановления:
    while not IBRS.Eof do
      Memo2.Lines.Add(IBRS.GetNextLine);
  finally
    IBRS.Active:= False; //деактивируем компонент
  end; //try
  //запишем полученный лог в файл:
  Memo2.Lines.SaveToFile('c:\DataBases\Restore\' + 
st + 'first.log');
  //теперь очистим Edit1 и снова сделаем кнопку недоступной:
  Edit1.Text:= '';
  bStartRestore.Enabled:= False;
end;

Как видно из листинга, работа компонента IBRestoreService мало отличается от работы IBBackupService, который мы рассматривали достаточно подробно. Имеется два новых свойства компонента: PageBuffers и PageSize. Первое свойство устанавливает буфер страницы - размер кэша, или размер оперативной памяти, который будет использоваться для считывания данных. Если размер данных окажется больше, чем размер буфера, программа будет обращаться к жесткому диску. В справочнике Delphi в примере работы компонента IBRestoreService указан размер буфера 3000 килобайт.

Свойство PageSize устанавливает размер страниц восстанавливаемой базы данных. Как уже говорилось в прошлых лекциях, при восстановлении БД из резервной копии можно изменить размер страниц этой БД. Например, если старая версия БД имела размер 4096, то при восстановлении можно установить размер страниц 8192.

Код процедуры подробно комментирован, и в дополнительных пояснениях не нуждается. Сохраните проект, скомпилируйте его и попробуйте сделать восстановление из какой-нибудь резервной копии БД, которую делали ранее. Восстановление закончится, когда в Memo2 появится строка " gbak: finishing, closing, and going home ", а в папке C:\DataBases\Restore появятся два файла: восстановленная база данных и лог-файл.

< Лекция 26 || Лекция 27: 12345 || Лекция 28 >
Евгений Медведев
Евгений Медведев

В лекции №2 вставляю модуль данных. При попытке заменить name на  fDM выдает ошибку: "The project already contains a form or module named fDM!". Что делать? 

Анна Зеленина
Анна Зеленина

При вводе типов успешно сохраняется только 1я строчка. При попытке ввести второй тип вылезает сообщение об ошибке "project mymenu.exe raised exception class EOleException with message 'Microsoft Драйвер ODBC Paradox В операции должен использоваться обновляемый запрос'. 

Назерке Сейтсаданова
Назерке Сейтсаданова
Казахстан, Усть-Каменагорск, ВКГУ им. С.Аманжолова
Наталья Статченко
Наталья Статченко
Россия, Благовещенск