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

Администрирование InterBase: обслуживание БД

< Лекция 25 || Лекция 26: 123 || Лекция 27 >

Restore с помощью IBConsole

Если резервное копирование базы данных нужно делать как можно чаще, то восстановление ( restore ) делается изредка, по необходимости. Например, для оптимизации работы базы данных (сборка мусора, удаление повисших транзакций, пересчет индексов), при миграции на другой SQL -сервер, или при разрушении БД, что к счастью, случается нечасто. Оптимизацию желательно делать не реже, чем раз в месяц. Если же вы делаете восстановление с целью перехода, например от InterBase 6.5 на InterBase 7.1 или выше, то резервную копию нужно делать на старом сервере, а восстановление - уже на новом. Если база данных большая, то восстановление может занять какое то время.

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

Откройте IBConsole и войдите в локальный сервер (база данных first должна быть закрыта). Выберите меню " Database -> Maintenance -> Backup/Restore -> Restore". Часть параметров заполнится автоматически, однако их можно поменять. Например, можно выбрать другой файл с резервной копией, указать иной размер страниц, и т.д. Взгляните на следующий рисунок:

Восстановление БД из резервной копии

Рис. 26.2 . Восстановление БД из резервной копии

Если вы помните, в "Технические характеристики. Создание и перенос базы данных" мы создавали базу данных с размером страницы 4096. Это было сделано специально, чтобы в данной лекции продемонстрировать изменение размера страницы при восстановлении резервной копии на более подходящий размер 8192. Также в поле Overwrite (Писать поверх существующего файла) мы указали True, чтобы заменить старую БД. В реальной практике записывать восстанавливаемую БД поверх существующей рабочей версии ни в коем случае не рекомендуется. Что, если восстановление пройдет неудачно, а рабочую БД мы уже "затрем"? Поэтому рекомендуется восстанавливать базу данных в другую папку, и только в случае, если при восстановлении не выйдет ошибок, поместить ее вместо старой рабочей версии. Причем желательно на всякий случай сделать простую копию (Проводником Windows или другим файловым менеджером) и старой рабочей версии.

Теперь стоит только нажать "ОК", и восстановление базы начнется. Подробная информация о восстановлении будет выведена в отдельное окно. Закончится восстановление сообщением "Service ended at 03.01.2010 11:58:25" (у вас будут другие дата - время). После этого сообщения все окна Restore можно закрыть, а восстановленную БД - открыть и работать с ней.

Restore с помощью утилиты командной строки

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

Таблица 26.2 . Параметры gbak для восстановления БД
Параметр Описание
-bu[ffers] Устанавливает размер буфера в страницах БД для восстановления.
-c[reate_database] Выполнить восстановление БД. Обязательный параметр при восстановлении.
-i[nactive] При восстановлении БД делает индексы неактивными. Применяется обычно при ремонте БД, если обычное восстановление прошло неуспешно из-за ошибок индексов.
-k[ill] Не создавать теневые копии shadow (о теневых копиях см. ниже).
-m[ode] <доступ> Задает доступ к восстанавливаемой БД. Может быть " read_write " (по умолчанию, чтение/запись) или " read_only " (только чтение).
-n[o_validity] Не восстанавливать проверки ограничений. Применяется обычно при ремонте БД, если обычное восстановление прошло неуспешно из-за нарушений ограничений CHECK.
-o[ne_at_a_time] Восстанавливать одну таблицу за раз. Применяется обычно при ремонте БД, если база содержит разрушенные данные.
-p[age_size] <значение> Устанавливает для восстанавливаемой БД новый размер страниц. Значение может быть 1024, 2048, 4096 или 8192 (наиболее предпочтительный).
-pas[sword] <пароль> Обязательный параметр с паролем пользователя, который делает восстановление.
-r[eplace_database] Если указанная БД уже существует, она будет перезаписана при восстановлении. Если БД не существует, будет создан файл с указанным именем.
-se[rvice] <сервис> Параметр восстанавливает БД на том же ПК, где находится резервная копия (на сервере). При этом вызывается Service Manager серверного ПК. Используется, если восстановление запускается с удаленного ПК.
-use_[all_space] Параметр заставляет страницы восстанавливаемой БД заполняться на 100%, вместо 80% по умолчанию. Полезен только при восстановлении БД с параметром "-m read_only" (только для чтения), так как рабочим БД требуется место для хранения версий строк.
-user <имя_пользователя> Обязательный параметр с именем пользователя, который делает восстановление.
-v[erify] Включает подробные сообщения о том, что делает gbak при восстановлении.
-y <файл> Задает файл для вывода отчета о восстановлении. Если файл задан, а -v не был использован, то при удачном восстановлении файл будет пустым, иначе содержать отчет об ошибках. Если такой файл уже есть, восстановление не удастся.
-z Показывает версию утилиты gbak.

Обычное восстановление утилитой gbak с выводом информации на экран может быть выполнено командой (сначала перенесите существующий first.gdb на другое место):

gbak -user sysdba -pas masterkey -c -v c:\databases\03012010.gbk  c:\databases\first.gdb

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

Если при восстановлении БД мы хотим изменить размер страниц, укажем их в параметре - p:

gbak -user sysdba -pas masterkey -c -p 8192 -v c:\databases\03012010.gbk  c:\databases\first.gdb

Теневые (Shadow) копии

Сервер InterBase имеет механизм теневого ( shadow ) копирования базы данных. Такое копирование создает "зеркало" базы данных на случай какого-либо аппаратного или сетевого сбоя, или случайного удаления или повреждения базы данных операционной системой. В этом случае имеется возможность вручную или даже автоматически перейти с основной базы данных на теневую копию, и продолжить работу системы. Однако теневое копирование ни в коем случае не может заменить резервное копирование утилитой gbak, так как все ошибки и мусор, присутствующие в основной базе данных, будут присутствовать и в ее теневой копии. Shadow - файлы являются дополнительным средством безопасности данных, но никак не панацеей от всех возможных бед. Теневые копии можно создавать и в другой папке того диска, на котором находится основная база данных, однако при этом теряются все преимущества использования shadow копий. Обычно такие копии создают на другом жестком диске, физически подключенном к серверному ПК.

Создание и удаление теневых копий происходит посредством команд DDL (часть SQL ), которые можно вводить разными способами, например, с помощью IBConsole. Для примера создадим теневую копию для нашей базы данных first.gdb. Эту копию мы поместим по адресу D:\DataBases\ , однако если у вас на компьютере нет диска D:, то просто создайте другую папку, например, C:\DataBases2\ и соответственно меняйте адрес в примерах ниже на собственный. На момент создания теневой копии указанная папка должна существовать.

Запустите сервер InterBase, если он не работает, и загрузите IBConsole. Войдите в локальный сервер пользователем SYSDBA (также на создание теневой копии имеет право владелец (создатель) базы данных, если ее создавал не SYSDBA ). Далее откройте базу данных first. Теневая копия при создании привязывается к той базе данных, для которой она создается, поэтому база данных должна быть открыта. А при удалении теневой копии из БД удаляются и ссылки на нее.

Итак, нажмем кнопку " SQL ", открывающую окно Interactive SQL, и в окне запросов введем следующий оператор:

CREATE SHADOW 1 AUTO 'D:\DATABASES\First.shd';

Затем нажмем кнопку " Execute Query ", чтобы выполнить запрос. Вы можете открыть указанную папку Проводником или любым файловым менеджером, и убедиться, что файл с теневой копией создан. Чтобы полноценно связать shadow файл с базой данных и наполнить его данными, придется закрыть IBConsole, или хотя бы прервать контакт с базой данных ( disconnect ). Как только это случится, теневая копия наполнится данными, и будет иметь такой же размер, как основная БД. При следующем открытии базы и работе с ней все изменения также будут производиться и в теневой копии.

Удалить теневую копию можно также в Interactive SQL при подключенной БД командой

DROP SHADOW 1;

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

Разберем синтаксис создания и удаления Shadow -копий.

CREATE SHADOW <номер> [AUTO | MANUAL] [CONDITIONAL]
'спецификация-файла' 
[LENGTH [=] <целое> [PAGE[S]]] [<вторичный-файл>];

Здесь:

<номер> - любое целое число, идентификатор shadow -копии.

[ AUTO ] - автоматический режим, устанавливается по умолчанию. Этот режим позволяет базе данных работать в случае, если теневая копия по каким-то причинам станет недоступной, или если недоступной станет рабочая база данных при доступной теневой копии. Если недоступной станет рабочая база данных, InterBase заменит ее теневой копией и восстановит соединение. В таком случае выводится окно с сообщением, чтобы проинформировать администратора о случившемся.

[ MANUAL ] - ручной режим. При выборе этого режима, если вдруг теневая копия становится недоступной, то доступ к базе данных прекращается. Чтобы возобновить доступ, администратору необходимо вручную удалить испорченную теневую копию, и создать новую.

[ CONDITIONAL ] - этот режим является дополнением к [ AUTO ], и подразумевает, что при разрушении базы данных InterBase автоматически заменит базу данных теневой копией и восстановит соединение. Но если при режиме [ AUTO ] администратору придется заново создавать новую теневую копию, то в случае [ CONDITIONAL ] InterBase сделает это сам. Режим AUTO CONDITIONAL является наиболее предпочтительным для создания бесперебойной работы системы.

'спецификация-файла' описывает адрес и имя файла теневой копии. По традиции принято таким копиям назначать расширение *.shd

[ LENGTH ] - необязательный параметр, который используется при создании многофайловой теневой копии. Атрибут <целое> - это целое число, указывающее размер первичного и вторичного файлов в страницах.

Синтаксис удаления теневой копии еще проще:

DROP SHADOW <номер>

Где номером является идентификатор shadow -копии. Как узнать этот номер, если мы создавали копию давным-давно, и уже его не помним? Давайте создадим еще одну CONDITIONAL -теневую копию:

CREATE SHADOW 3 CONDITIONAL 'd:\DataBases\first.shd';

Затем прервем соединение с базой данных, и вновь соединимся с ней, чтобы наполнить копию данными. Теперь выделим в IBConsole базу данных first и выберем команду меню "Database -> View Metadata". Откроется окно, показывающее, как создавалась БД:

Метаданные базы first

Рис. 26.3 . Метаданные базы first

Как видно из рисунка, в числе прочего указано и создание теневой копии вместе с ее адресом и идентификатором.

Создание многофайловой теневой копии имеет смысл, если размеры базы данных становятся огромными, по 2 и более гигабайта. Тогда может случиться, что на диске, выделенном под теневую копию, не хватит для нее места. В этом случае ее можно разбить на несколько частей, создавая каждую часть на своем диске. Пример создания многофайловой теневой копии (если у вас нет записывающих дисков D:, E: и F:, то можете просто указать другую папку на диске C:):

CREATE SHADOW 4 CONDITIONAL 'd:\DataBases\first1.shd' LENGTH 15000
FILE 'e:\DataBases\first2.shd' LENGTH 15000
FILE 'f:\DataBases\first3.shd';

В этом случае создастся три файла. Первый файл будет наполняться, пока его размер не достигнет 15 тысяч страниц БД, затем начнет наполняться второй файл теневой копии. Как только размер второго файла достигнет 15 тысяч страниц, начнет наполняться третий файл. Можете удалить теневую копию №4, она нам больше не нужна.

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

В лекции №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 В операции должен использоваться обновляемый запрос'. 

Денис Попов
Денис Попов
Россия, Оренбург, Оренбургский государственный университет, 2015
Рустам Кадыров
Рустам Кадыров
Россия, Тирлян, Тирлянская школа №5, 2003