Delphi-Help

Главная Статьи FireBird/Interbase Копирование и восстановление базы данных в InterBase / Firebird

Копирование и восстановление базы данных в InterBase / Firebird

Оцените материал
(7 голосов)


Копирование и восстановление базы данных в InterBase / Firebird

Базу данных рекомендуется регулярно копировать (back up) и восстанавливать (restore). При этом происходит переупорядочивание индексов, сборка мусора, более компактное использование дискового пространства. В процессе восстановления базы данных с резервной копии вы можете изменить размер страницы, количество и размер файлов базы данных. Для этих целей может использоваться как утилита командной строки gbak, так и программа графического интерфейса, например: IBExpert или BlazeTop (он же SQLHammer). Вы также можете написать собственную программу для выполнения копирования и восстановления базы данных.

Базу данных может копировать только владелец базы данных или пользователь SYSDBA.

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

Если база данных используется в сети несколькими клиентами, то во избежание разрушения данных бывает полезным выполнить ее останов (shut down) перед восстановлением, чтобы закрыть доступ клиентам к базе данных на время выполнения операции. После выполнения необходимых действий базу данных можно опять перевести в оперативное состояние (on line).

В данной статье мы рассмотрим копирование и восстановление баз данных при помощи утилиты gbak и программы IBExpert. Мы также напишем собственную программу для выполнения этих действий, используя компоненты FIBPlus .

Копирование и восстановление базы данных утилитой командной строки gbak

Создание резервной копии

Для выполнения копирования базы данных утилитой gbak нужно вызвать окно командной строки и перейти в каталог \Bin корневого каталога инсталляции сервера базы данных, например:

c: 
cd \Program Files\Firebird\Firebird_1_5\Bin 

Запустите утилиту gbak :

gbak -backup_database -verbose -user wizard -password master d:\BestDatabase\work.fdb d:\BestDatabase\work.fbk 

Переключатели утилиты для создания резервной копии представлены в табл. 1.

Внимание. В документации по InterBase 6 неверно указаны сокращения для некоторых переключателей утилиты.

Таблица 1. Переключатели утилиты gbak , используемые при создании резервной копии

Переключатель

Назначение

-b[ackup_database]

Задает операцию резервного копирования базы данных.

-pas[sword]

Пароль пользователя.

-user

Идентификатор пользователя.

-v[erbose]

Задает отображение утилитой протокола выполняемых ею действий.

-se[rvice]

Копирует базу данных на ту машине в локальной сети, где размещается база данных. При этом используется Service Manager .

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

Следует напомнить, что копировать базу данных может только ее владелец (пользователь, который создал базу данных) или пользователь SYSDBA.

Если требуется создание многофайловой копии, то в конце командной строки перечисляются файлы копии с указанием их размера:

файл размер[k|m|g]

Файл — это полный путь к файлу и имя файла.

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

Это связано с особенностями реализации сервера базы данных.

Размер — размер файла копии. Может задаваться в байтах (суффикс отсутствует), в килобайтах (суффикс k), мегабайтах (m) или гигабайтах (g). Минимальный размер 2048 байтов.

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

gbak -backup_database -verbose -user wizard -password master d:\BestDatabase\work.fdb d:\BestDatabase\work.fb1 2k d:\BestDatabase\work.fb2 2k 

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

Для последнего файла копии размер можно не задавать, однако его задание не приводит к ошибке.

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

Останов и запуск базы данных

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

Останов базы данных можно выполнить при помощи утилиты gfix. Синтаксис останова:

gfix – sh [ ut ] {- at [ tach ] <целое> | - tr [ an ] <целое> | - force <целое>} 

Переключатель – attach предотвращает новые соединения с базой.

  • tran предотвращает запуск новых транзакций.
  • force останавливает базу данных через указанное количество секунд.

В строку также нужно включить имя пользователя (переключатель – user ), пароль (- pa [ ssword ]) и полный путь к первичному файлу базы данных. Например :

gfix –sh –force 10 –user sysdba –pa masterkey d:\BestDatabase\work.fdb 

База данных будет остановлена через 10 секунд.

Для перевода базы данных в активное состояние используется gfix – o [ nline ]. Например :

gfix –online –user sysdba –pa masterkey d:\BestDatabase\work.fdb 

В IBExpert также можно выполнить останов и запуск базы данных. Для останова нужно выбрать в меню Services | Database Shutdown. В появившемся окне из выпадающего списка выбрать одну из зарегистрированных в IBExpert баз данных или набрать имя файла базы данных. Выбрать режим: Forced, Deny Transaction или Deny Attachment, задать время ожидания и щелкнуть по кнопке Shutdown.

Чтобы перевести базу данных в активное состояние нужно выбрать в меню Services | Database Online, в появившемся окне выбрать из списка или ввести вручную имя файла базы данных и щелкнуть по кнопке Bring Online.

Восстановление базы данных с резервной копии

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

Для восстановления базы данных запустите утилиту gbak:

gbak -create_database -verbose -user wizard -password master d:\BestDatabase\work.fbk d:\BestDatabase\work2.fdb 

Здесь мы восстанавливаем базу данных с резервной копии, задавая ей другое имя — WORK 2. FDB. Чтобы перезаписать существующую базу данных, нужно первым переключателем указать – r.

Переключатели утилиты для восстановления базы данных с резервной копии представлены в табл. 2.

Таблица 2. Переключатели утилиты gbak , используемые при восстановлении базы данных с резервной копии

Переключатель

Назначение

-c[reate_database]

Задает операцию восстановления базы данных во вновь создаваемый файл. Файл базы данных должен отсутствовать на диске.

-r[eplace_database]

Задает операцию восстановления базы данных во вновь создаваемый файл или при перезаписи существующего файла.

-pas[sword]

Пароль пользователя.

-pa[ge_size] n

Размер страницы восстанавливаемой базы данных.

-user

Идентификатор пользователя.

-v[erbose]

Задает отображение утилитой протокола выполняемых ею действий.

-se[rvice]

Создает восстанавливаемую базу данных на той машине в локальной сети, где размещается резервная копия. При этом используется Service Manager .

Последние аргументы в командной строке задают путь к файлам резервных копий и путь к файлам базы данных. Если выполняется восстановление базы данных на другом компьютере в сети, то файлы резервных копий должны размещаться на диске с разрешенным доступом. Для каждого файла восстанавливаемой базы данных (кроме последнего) нужно указать размер файла в страницах базы данных. Минимальным размером является 200 страниц. Если вы укажете меньшее количество, утилита предупредит об этом и все равно выполнит восстановление, установив размер файла 200 страниц.

При восстановлении базы данных из копии, состоящей из нескольких файлов, необходимо указать все файлы копии в том порядке, в каком создавалась копия.

В следующем примере восстанавливается база данных, состоящая из двух файлов. Копия включает в себя три файла:

gbak -c -user wizard -password master –pa 1024 D:\Test\W.fd1 200 D:\Test\W.fb2 D:\Copy\W.fk1 D:\Copy\W.fk2 D:\Copy\W.fk3 

При восстановлении задается размер страницы 1024 байта, размер первичного файла устанавливается в 200 страниц.

Если копия базы данных находится на другой машине в локальной сети, то можно использовать переключатель – service, после которого указать имя Service Manager. При использовании протокола TCP / IP для восстановления копии на той же машине в сети можно задать следующее:

gbak -c -verbose -user wizard -password master -service Server:service_mgr d:\BestDatabase\work.fbk d:\BestDatabase\work.fdb 

Здесь Server — имя другой машины в сети, где располагается копия и куда нужно восстановить базу данных.

Использование Service Manager является единственным способом создавать копию базы данных на диске с запрещенным доступом средствами gbak. В IBExpert все гораздо проще.

Копирование и восстановление базы данных в IBExpert

Создание резервной копии

Для выполнения копирования базы данных запустите IBExpert. База данных должна быть зарегистрирована в программе. В окне Database Explorer щелкните мышью по строке вашей базы данных:

0007_01

Рис.1.Окно Database Explorer. Выбор базы данных

В меню Services выберите Backup Database. Появится окно Database Backup, в котором в закладке Backup Files уже установлены некоторые необходимые значения. Вы можете изменить имя файла копии и его размер.

0007_02

Рис. 2. Окно Database Backup

В нижней части экрана в разделе Output из выпадающего списка выберите вариант On Screen, чтобы протокол копирования выводился на экран в закладке Output.

Щелкните по кнопке Start Backup. Текущей станет закладка Output, в которой будут отображены все сообщения копирования.

Вы можете выполнить копирование в произвольное количество файлов копии. Для этого на панели инструментов щелкните по кнопке Append file и в появившейся строке установите нужные характеристики файла копии.

Восстановление базы данных с резервной копии

Для восстановления базы данных в меню Services выберите Restore Database. Появится окно Database Restore. В закладке Files уже установлены все необходимые значения. В поле Restore into указано Existing database.

0007_03

Рис. 3. Окно Database Restore

Щелкните по строке File Name. В правой части поля появится кнопка с тремя точками. Щелкните по этой кнопке и в диалоговом окне открытия файла выберите файл копии. Отметьте флажком поле Replace existing database (заменять существующую базу данных). Вы можете также изменить размер страницы базы данных, выбрав его из выпадающего списка Page Size.

Щелкните по кнопке Start Restore. Появится окно ввода имени и пароля пользователя. Вы можете выполнить восстановление в качестве пользователя SYSDBA. База данных будет восстановлена с резервной копии.

Если вы хотите восстановить резервную копию в базу данных с другим именем, то в выпадающем списке Restore into нужно выбрать New database, в поле Database File нужно ввести полный путь к новому (или существующему) файлу базы данных, в поле File Name нужно ввести путь к файлу резервной копии или воспользоваться кнопкой обзора для выбора этого файла.

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

Создание собственных программ копирования и восстановления базы данных с использованием компонентов FIBPlus

Программа резервного копирования базы данных

В Delphi или в C ++ Builder создадим форму, разместив на ней необходимые компоненты. Положим на форму компонент ListBox. В него будем помещать данные о файлах копии. В нижней части формы поместим компонент Memo. В него будут выводиться сообщения о процессе копирования.

0007_04

Рис. 4. Программа копирования базы данных

Компонент TpFIBErrorHandler позволит нам выдавать сообщения об ошибках в процессе создания резервной копии. Для компонента в свойстве Options установите в True значения всех подсвойств. Напишите следующий обработчик ошибок в базе данных.

procedure TFormMain.ErrorHandler1FIBErrorEvent(Sender: TObject;
 ErrorValue: EFIBError; KindIBError: TKindIBError; var DoRaise: Boolean);
begin
 Application.MessageBox(PAnsiChar('Error by batabase backup' + #10#13 +
  'IBErrorCode: ' + IntToStr(ErrorValue.IBErrorCode) + #10#13 +
  'IBMessage: ' + ErrorValue.IBMessage),
  'Error', MB_OK + MB_ICONSTOP);
end;

При использовании этого компонента вам нужно явно указать включение в программу модуля FIB. Для Delphi его нужно задать в предложении uses.

Полный путь к первичному файлу базы данных, которую мы хотим копировать, помещается в поле Database. Пути к файлам копии помещаются в поле Copy file. Размер файла копии задается в поле Length (byte). При щелчке по кнопке Add Backup в ListBox помещается строка с описанием файла копии. Строка содержит путь к файлу, знак равенства и размер файла копии. В нашем случае размер указывается только в байтах. Обработчик щелчка по этой кнопке:

procedure TFormMain.BAddBackupClick(Sender: TObject); 
begin 
 ListBox1.Items.Add(TBackup.Text + '=' + TLength2.Text); 
 ListBox1.ItemIndex := ListBox1.Items.Count - 1; 
end ;

Следует предусмотреть возможность удаления из списка отдельных файлов копии. Для этого нужно написать обработчик события щелчка по кнопке Delete Backup:

procedure TFormMain.BDeleteBackupClick(Sender: TObject); 
var I: Integer; 
begin 
 I := ListBox1.ItemIndex; 
  if I <> -1 then 
  ListBox1.Items.Delete(I); 
  ListBox1.ItemIndex := I; 
   if (ListBox1.ItemIndex > ListBox1.Items.Count - 1) or 
   (ListBox1.ItemIndex < 0) then 
    ListBox1.ItemIndex := ListBox1.Items.Count - 1; 
end ;

Копирование выполняет обработчик события щелчка по кнопке Backup:

procedure TFormMain.BBackupClick(Sender: TObject); 
var I: Integer; 
OldCursor: TCursor; 
begin 
 OldCursor := Screen.Cursor; 
 Screen.Cursor := crHourGlass; 
 BackupService1.DatabaseName := TDatabase.Text; 
  if Trim(CBServerName.Text) <> '' then 
   begin 
    BackupService1.ServerName := CBServerName.Text; 
    case CBProtocol.ItemIndex of 
    0: BackupService1.Protocol := Local; 
    1: BackupService1.Protocol := NamedPipe; 
    2: BackupService1.Protocol := SPX; 
    3: BackupService1.Protocol := TCP;  
   end ; 
end 
else 
begin 
  BackupService1.ServerName := ''; 
  BackupService1.Protocol := Local; 
end ; 
BackupService1.Params.Clear; 
BackupService1.Params.Add('user_name=' + TUserName.Text); 
BackupService1.Params.Add('password=' + TPassword.Text); 
BackupService1.BackupFile.Clear; 
for I := 0 to ListBox1.Items.Count - 1 do 
 BackupService1.BackupFile.Add(ListBox1.Items[I]); 
Memo1.Clear; 
try 
 BackupService1.Active := True; 
 BackupService1.ServiceStart; 
except 
 BackupService1.Active := False; 
 Screen.Cursor := OldCursor; 
exit; 
end ; 
BExit.Enabled := False; 
BBackup.Enabled := False; 
Memo1.Lines.Add( 
'==================== Backup begins ===================='); 
while not (BackupService1.Eof) do 
Memo1.Lines.Add(BackupService1.GetNextLine); 
BackupService1.Active := False; 
BExit.Enabled := True; 
BBackup.Enabled := True; 
Memo1.Lines.Add( 
'=================== Backup ends ======================='); 
Screen.Cursor := OldCursor; 
end ;

Здесь устанавливаются значения свойств компонента TpFIBBabkupService: имя первичного файла базы данных, вид протокола, параметры соединения с базой данных (имя пользователя и пароль). Формируется список файлов копии в свойстве BackupFile, которое является объектом класса TStrings.

Процесс копирования начинается при вызове метода ServiceStart компонента TpFIBBabkupService. Информационные сообщения о выполняемом копировании программой помещаются в поле Memo. Очередная строка получается при использовании метода GetNextLine компонента TpFIBBabkupService. Когда процесс завершается, свойству Eof присваивается значение True.

При работе в локальной сети используя эту программу можно копировать базу данных, находящуюся на дисковых устройствах, к которым запрещен доступ с других компьютеров сети. Точно также файлы копии могут размещаться на дисках с запрещенным доступом. Такое возможно, потому что компоненты FIBPlus используют при копировании и при восстановлении баз данных Services Manager.

Программа восстановления базы данных с резервной копии

В Delphi или в C ++ Builder создадим новую форму. Положим на форму компонент PageControl с двумя закладками. На вторую закладку положим только компонент Memo, куда будем выводить сообщения о процессе восстановления. На первую закладку положим два компонента ListBox. В них будем помещать данные о файлах копии и файлах базы данных.

0007_05

Рис. 5. Программа восстановления базы данных

Обработчики различных событий формы и ее компонентов похожи на то, что было в предыдущей программе. Главная работа — выполнение восстановления:

procedure TFormMain.BRestoreClick(Sender: TObject); 
var I: Integer; 
OldCursor: TCursor; 
begin 
 OldCursor := Screen.Cursor; 
 Screen.Cursor := crHourGlass; 
  if Trim(CBServerName.Text) <> '' then 
   begin 
    RestoreService1.ServerName := CBServerName.Text; 
    case CBProtocol.ItemIndex of 
    0: RestoreService1.Protocol := Local; 
    1: RestoreService1.Protocol := NamedPipe; 
    2: RestoreService1.Protocol := SPX; 
    3: RestoreService1.Protocol := TCP; 
   end ; 
end 
else 
begin 
 RestoreService1.ServerName := ''; 
 RestoreService1.Protocol := Local; 
end ; 
RestoreService1.DatabaseName.Clear; 
for I := 0 to ListBox1.Items.Count - 1 do 
 RestoreService1.DatabaseName.Add(ListBox1.Items[I]); 
 RestoreService1.Params.Clear; 
 RestoreService1.Params.Add('user_name=' + TUserName.Text); 
 RestoreService1.Params.Add('password=' + TPassword.Text); 
 RestoreService1.BackupFile.Clear; 
for I := 0 to ListBox2.Items.Count - 1 do 
RestoreService1.BackupFile.Add(ListBox2.Items[I]); 
Memo1.Clear; 
try 
 RestoreService1.Active := True; 
 RestoreService1.ServiceStart; 
except 
RestoreService1.Active := False; 
Screen.Cursor := OldCursor; 
exit; 
end ; 
Memo1.Lines.Add( 
'==================== Restore begins ===================='); 
while not (RestoreService1.Eof) do 
 Memo1.Lines.Add(RestoreService1.GetNextLine); 
 RestoreService1.Active := False; 
 BExit.Enabled := True; 
 BRestore.Enabled := True; 
 Memo1.Lines.Add( 
'=================== Restore ends ======================='); 
Screen.Cursor := OldCursor; 
end ;

Компонент TpFIBRestoreService содержит свойства BackupFile и DatabaseName, являющиеся экземплярами класса TString и предназначенные для хранения списков файлов копий и файлов базы данных, соответственно. В программе эти свойства заполняются данными, введенными пользователем (и хранящимися в компонентах ListBox). Обратите внимание, что в отличие от программы IBExpert здесь мы можем восстанавливать копию и в многофайловую базу данных.

Восстановление начинается при обращении к методу ServiceStart.

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

Заключение

Мы научились копировать и восстанавливать базу данных при помощи утилиты gbak и программы графического интерфейса IBExpert. Мы также написали вполне приличные фрагменты программ, которые с успехом можем использовать и в промышленных разработках.

Перед восстановлением базы данных поверх существующей следует остановить базу данных — перевести ее в состояние shutdown, а затем снова сделать ее доступной всем клиентам. Однако лучшим решением будет удалить базу данных перед ее восстановлением.

В именах файлов, как базы данных, так и файлов копии, не используйте букв кириллицы.

Описание средств создания и изменения баз данных см. в статье на нашем сайте: «Создание и изменение базы данных в InterBase/ Firebird».

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

Прочитано 16175 раз

Авторизация



Счетчики