Informix Logo


Informix Magazine Russian Edition Декабрь 1997г.

Андрей Грачев,
консультант Informix Россия
тел. (095) 755-8700, e-mail andreyg@informix.com
Архивирование и восстановление баз данных Informix
Рассматриваются основные методы архивирования, используемые для этого утилиты, способы определения момента архивации и т.д.

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

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

Средства архивирования могут использоваться на уровне операционной системы, на уровне прикладной программы, на уровне СУБД. То есть, средства архивирования и восстановления данных могут работать соответственно с объектами операционной системы (файлы, диски), могут сохранять некоторые внутренние объекты прикладной программы, а могут работать и с объектами сервера базы данных (таблицами, базами данных). В этой статье рассматриваются архивация и восстановление информации именно на уровне СУБД, а, более конкретно, эти средства в Informix Dynamic Server. Рассмотрим их более подробно.

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

Что нужно архивировать

Стоит напомнить о том, как реально хранятся данные в базах данных, которые ведутся средствами Informix Dynamic Server. На диске для хранения данных выделяются чанки (chunks). Чанк - это файл, устройство прямого доступа (раздел диска без файловой системы) или их фрагменты. Чанки объединены в наборы, называемые пространствами данных (dbspace). Внутри пространств данных существует системная область для внутренней информации, хранятся таблицы с данными и логические журналы. В таблицах хранятся текущие данные, а в логические журналы записываются все изменения в таблицах (типа "пользователь Х в момент времени t поменял значение поля F с M на N").

Другими словами, существует несколько категорий объектов в базе данных. С точки зрения администратора сервера базы данных (пользователя "informix"), в базе данных существуют такие объекты, как чанки (chunks), пространства данных (dbspaces) и журналы транзакций (logical logs). С точки зрения разработчика той или иной прикладной системы, на сервере хранятся базы данных, состоящие из таблиц, хранимых процедур и т.д. Соответственно, Informix Dynamic Server предоставляет возможность для каждой каждой из указанных категорий объектов подобрать те средства архивации и восстановления, которые подходят ей.
 

Утилиты архивации и восстановления

Имеются следующие утилиты архивирования и восстановления данных, предназначеные для администратора СУБД, то есть работающими с объектами таких категорий, как журнал транзакций, пространство данных и т.д.:

    ontape
    onarchive
    onbar

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

    dbexport
    dbimport

Здесь мы рассмотрим только одну утилиту, которая, наверное, чаще всего используется для выполнения рассматриваемых здесь задач, а именно утилиту ontape.

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

  • TAPEDEV - устройство, обычно ленточное, для создания архивов, на котором будет создаваться архив (например, /dev/rmt/0m);
  • TAPEBLK - размер блока для TAPEDEV в килобайтах, то есть тот объем информации, который будет использоваться для обмена с устройством TAPEDEV (например 100);
  • TAPESIZE - емкость носителя (обычно магнитной ленты) в килобайтах на устройстве TAPEDEV, то есть сколько информации может быть сохранено на одном носителе (например, 2000000 для 4 мм-й ленты емкостью 2 ГБайт).

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

  • LTAPEDEV - устройство, обычно ленточное, для создания архивов журнала (например, /dev/rmt/1m);
  • LTAPEBLK - размер блока для LTAPEDEV в килобайтах (например 50);
  • LTAPESIZE - емкость носителя (обычно магнитной ленты) в килобайтах на устройстве LTAPEDEV.
     

В принципе, в качестве устройств (параметры TAPEDEV и LTAPEDEV) могут выступать и файлы, только надо убедиться, что пользователь informix имеет право читать и писать в данный файл и, так как утилита ontape проверяет наличие данного устройства, этот файл должен уже существовать к началу работы этой утилиты. Кроме того, ничто не мешает использовать одно и тоже устройство и для создания архива данных, и для создания архива журнала транзакций. Просто в этом случае надо быть внимательным при смене носителей в этом устройстве.
 

Создание архивов утилитой ontape

Для создания архива данных нужно выполнить команду

ontape -s

Данная команда проверит наличие и доступность устройства, специфицированного параметром TAPEDEV, а затем запросит указать уровень архива - 0, 1 или 2. Дело в том, что Informix Dynamic Server обеспечивает создание инкрементальных архивов, то есть позволяет архивировать не всю систему в целом, а только изменения.

Архив 0-го уровня - это полная копия всех данных 1), соответствующая текущему состоянию всех баз данных и всех таблиц в базах данных. Архив 1-го уровня - это архивация только изменений2), произошедших с момента создания архива 0-го уровня. Архив 2-го уровня - это архивация изменений, произошедших в системе с момента создания последнего архива 1-го уровня. Использование инкрементальных архивов позволяет существенно упростить и убыстрить процесс создания архивов.

После того, как для команды ontape -s будет задан уровень создаваемлого архива, данная команда откроет на запись устройство TAPEDEV и последовательно начнет выводить на данное устройство данные из базы данных. После того, как носитель в данном устройстве будет заполнен (исходя из значений конфигурационных параметров TAPEBLK и TAPESIZE) данная команда запросит смену носитель в устройстве.

Уровень создаваемого архива можно задать и из командной строки, указав в команде ontape опцию -L:

ontape -s -L <уровень архива>

Например, создание архива 1-го уровня выполняется командой:

ontape -s -L 1

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

Создавать архивы журналов транзакций с помощью утилиты ontape можно двумя разными способами. Первый способ - это автоматическое архивирование всех заполненных журналов. Для этого выполняется команда

    ontape -a

Данная команда выводит на устройство LTAPEDEV все полностью заполненные и еще незаархивированные журналы транзакций. Кроме того, она спрашивает, не нужно ли заархивировать и текущий журнал, который заполнен только частично. Если администратор соглашается, то сервер будет переключен на следующий журнал (выполнится команда onmode -l) и последний частично использованный журнал тоже будет заархивирован.

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

    ontape -c

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

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

Только пользователь informix или root имеет право выполнять команду ontape. Архивация утилитой ontape может выполняться тогда, когда Informix Dynamic Server находится в рабочем состоянии (режим online), а также тогда, когда сервер находится в режим е одного пользователя (режим quiescent).
 

Восстановление из архивов утилитой ontape

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

    1. последний архив 0-го уровня;

    2. последний архив 1-го уровня, сделанный после указанного в пункте 1 архива 0-го уровня (если таковой есть);

    3. последний архив 2-го уровня, сделанный после указанного в пункте 2 архива 1-го уровня (если таковой есть);

    4. все архивы логических журналов, сделанные после последнего архива из пунктов 1,2,3 (если таковые есть).

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

Возможны случаи, когда надо восстанавливать не всю информацию, а только ее часть. Утилита ontape позволяет, в частности, восстановить отдельные пространства данных. Но это возможно только в том случае, когда не погибло корневое пространство (rootdbs). Для получения информации о частичном восстановлении следует обратиться к Руководству по администрированию Informix Dynamic Server. Здесь частичное восстановление рассматриваться не будет.

Для того, чтобы начать полное восстановление системы необходимо иметь Informix Dynamic Server в той же конфигурации, что и на момент создания архивов. Под конфигурацией имеется в виду количество и размеры журналов транзакций, пространства данных и составляющие их чанки, такие критичные параметры, как имя и номер сервера, параметры разделяемой памяти3 и т.д. В любом случае, используемый Informix Dynamic Server должен быть идентичен тому, на котором формировались архивы (должны совпадать платформа, версия ОС, версия самого сервера). Сервер при этолм должен находиться в выключенном состоянии (offline).

Если данные условия выполнены, то инициировать восстановление можно командой

    ontape -r

После запуска данная утилита запросит установку в устройство архива нулевого уровня. Затем будут запрошены архивы 1-го и 2-го уровней. Затем команда укажет номер логического журнала и попросит установить носитель с требуемыми журналами. По завершению восстановления сервер будет переведен в однопользовательский режим (quiescent). Для продолжения нормального функционирования системы сервер должен быть переведен в рабочее состояние (online). Для этого надо воспользоваться или утилитой администратора onmonitor (пункты меню Mode->On-Line), или командой

    onmode -m

 
Как узнать "когда"?

Восстанавливать данные из архивов надо только тогда, когда или нет другого способа заставить работать систему после какого-либо события, или требуется вернуться в некоторое прежнее состояние. Создавать архивы надо регулярно. Например, возможен такой график создания архивов: по понедельникам в 8:00 создается полный архив системы (архив 0-го уровня), а каждый рабочий день кроме понедельника - архив 1-го уровня. При этом производится постоянное архивирование журналов транзакций.

Для того, чтобы узнать, когда выполнялись архивы системы (если для этого использовалась команда ontape), надо запустить утилиту администратора onmonitor и выбрать пункты меню Status->Archive:

В приведенном выше примере видно, что 28-го октября был сделан архив 0-го уровня, в этом архиве хранятся все изменения данных, которые зафиксированы в журналах транзакций под номерами 1..428.

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

Press ESC to return to the Status Menu.  
Use arrow keys to move the cursor.  
ARCHIVE INFORMATION  
Level of      Date and Time            Logical Log Used  
Archive         of Archive               at Time of Archive 
     0                   Mon Oct 28                    429  
                     14:13:30 1996  
     1                       0  
     2                       0  

 

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

    ontape -c

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

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

    ontape -l

Данная команда выдаст информацию о состоянии физических журналов и журналов транзакций. Физические журналы в данный момент нас не интересуют, а информация о состоянии журналов транзакций (раздел Logical Logging) - это как раз то, что нам нужно:
 

informix(/usr/informix) > onstat -l  
Logical Logging  
Buffer bufused bufsize numrecs numpages numwrits recs/pages pages/io  

L-2

0

16

7029

199

28

35.3

7.1

address

number

flags

uniqid

begin

size

used

%used

a0dd084

1

U-B--

903

100233

500

500

100.00

a0dd0a0

2

U-B--

904

100427

500

500

100.00

a0dd0bc

3

U-B--

905

10061b

500

500

100.00

a0dd0d8

4

U-B--

906

10080f

500

500

100.00

a0dd0f4

5

U-B--

907

100a03

500

500

100.00

a0dd110

6

U-B--

908

100bf7

500

500

100.00

a0dd12c

7

U-B--

909

100deb

500

500

100.00

a0dd148

8

U-B--

910

100fdf

500

500

100.00

a0dd164

9

U-B--

911

6036b9

500

500

100.00

a0dd180

10

U--C-L

912

6038ad

1000

363

36.30

informix(/usr/informix) > 

 
По результатам работы данной команды видно, что в этот момент в данном экземпляре Informix Dynamic Server имеется 10 журналов транзакций (их номера от 1 до 10). Все журналы уже были в использовании (каждый журнал помечен флажком "U" - used). Журналы с 1 по 9 уже заархивированы (помечены флажком "B" - backed up), и, следовательно, свободны для дальнейшего использования. Журнал под номером 10 является текущим (стоит флажок "C" - current), то есть проходящие в данный момент транзакции фиксируются именно в нем. Этот же журнал содержит и последнюю контрольную точку (флажок "L" - last).

Другой способ получить информацию о журналах транзакций -это запустить утилиту администратора onmonitor и выбрать пункты меню Status->Logs:

Press ESC to return to the Status Menu.
Use arrow keys to move the cursor.

PHYSICAL LOG:

Buffer

Bufsize

Bufused

Numpages

Numwrites

pages/IO

P-1

16

0

455

34

13.38

Phybegin

Physize

Phypos

Phyused

%

Used

10003f

500

454

0

0.00

 

LOGICAL LOG:

Buffer

Bufsize

Bufused

Numrecs

Numpages

Numwrites

Recs/Pages

Pages/IO

L-2

16

0

7029

199

28

35.32

7.11

INDIVIDUAL LOG FILES:

Number

Flags

Uniqid

Dbspace

Pages

Used

%Used

7

U-B--

909

rootdbs

500

500

100.00

8

U-B--

910

rootdbs

500

500

100.00

9

U-B--

911

rootdbs

500

500

100.00

10

U--C-L

912

rootdbs

1000

363

36.30

 
По полученной нами таким образом информации, можно сделать вывод, что в данном случае все нормально - практически все журналы транзакций свободны5), и можно нормально работать. Если бы ситуация была менее благоприятная, то есть большинство журналов были бы заняты на 100% и при этом не были заархивированы:
 

address

number

flags

uniqid

begin

size

used

%used

a0dd084

1

U---

903

100233

500

500

100.00

a0dd0a0

2

U---

904

100427

500

500

100.00

a0dd164

9

U---

911

6036b9

500

500

100.00

a0dd180

10

U--C-L

912

6038ad

000

363

36.30

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

В Informix Dynamic Server существует возможность отслеживать разные события и выполнять связанные с ними нужные вам действия. Среди таких события есть и "заполнение журнала транзакций". Например, в случае заполнения очередного журнала можно посылать ссобщение электронной почтой администратору СУБД (пользователю "informix"). Для того, чтобы сделать это, надо написать программу-обработчик событий. Данная программа будет автоматически запускаться при возникновеннии любого события6. На вход данной программе будет передаваться 5 параметров. Первый параметр - это код серьезности события, второй параметр - класс события. Остальные три перадаваемых параметра - это текстовые пояснительные сообщения. Для события "заполнение очередной журнал транзакций" класс события равен 23. Следовательно, программа-скрипт для ОС Unix, которая будет реагировать на данное событие и посылать почту администратору базы данных будет выглядеть так:

if [$2 -e 23] ; then
mail informix <!!!
Attention! Logical log complete!
!!!
fi

Для того, чтобы установить эту программу (пусть она хранится в файле "my_prog.sh") следует переустановить конфигурационный параметр ALARMPROGRAM в полное имя (с указанием полного пути) этой программы. Для того, чтобы это изменение возымело действие, надо перезапустить сервер базы данных.

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

onmode -l

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

В стандартной поставке Informix Dynamic Server (в директории $INFORMIXDIR/etc) есть файл logevent.sh, содержащий программу, реагрующую на важные события и выполняющую некоторые полезные действия, в том числе и автоматическую архививацию очередного заполненного журнала. Для установки данной программы в качестве обработчика событий надо установить параметр ALARMPROGRAM в logevent.sh (так как директория $INFORMIXDIR/etc обычно не входит в переменную окружения PATH, то следует указать полный путь к данной программе, например
   /usr/informix/etc/logevent.sh

Рассмотренные здесь средства ручного и автоматического контроля позволят минимизировать шанс пропустить нужный момент дляч архивации.
 

Практические советы

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

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

onstat -a

Данная команда выдает значение всех конфигурационных параметров. Результат выдачи данной команды можно сохранить в файл, например, такой командой:

onstat -a > my_config.txt

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

Здесь есть, однако, два момента, которыми надо обязательно учитывать. Первое - это то, что носитель для архива - это, как правило, ленточное устройство, которое по умолчанию при каждой новой записи полностью переписывает свое содержимое. Поэтому запись на магнитную ленту файла с конфигурацией надо проводить на ленточном устройстве без перемотки (обычно имя такого ленточного устройства в ОС Unix заканчивается на символ "n", например /dev/rmt/0mn). А при последующей записи архива на эту ленту следует использовать это же устройство, но с перемоткой ленты (например, /dev/rmt/0m). Пример скрипта, который будет выполнять запись конфигурационного файла на ленту, а затем дописывать в конец ленты архив базы (при условии, что конфигурационный параметр TAPEDEV установлен в /dev/rmt/0m):

onstat -a > /dev/rmt/0mn
ontape -s -L 0

Второй момент - это объем носителя. Если в начало ленточки будет записаны еще и конфигурационные параметры, то реальный объем ленточки, который можно будет использовать непосредственно для хранения архива, естественно, уменьшится. Нужно не забыть зафиксировать это изменением параметра TAPESIZE. Типичный размер выдаваемой командой onstat -a информации составляет около 30 КБайт в символьном виде, и, следовательно, выделение под конфигурационные параметры 100-200 КБайт заведомо будет достаточным. Учитывая, что типичная емкость магнитной ленты - около 1ГБайта, потеря емкости в размере около 0.1% не представляет особых проблем, но приносит существенное удобство - на одном носителе и конфигурация, и собственно архив.

Надо сделать еще одно очень важное замечание. Следует иметь два комплекта магнитных лент для хранения архивов и использовать их "по кругу". Дело в том, что неприятность (короткое замыкание в компьютере, например) может произойти как раз в тот момент, когда вы делаете архив. И если у вас только один комплект манитных лент, то вы потеряете и то, что есть в базе данных, и то, что есть на магнитной ленте.

Хранить же архивные ленты следует как можно дальше от компьютера, так как при возникновении пожара или наводнения меньше вероятность того, что погибнет и компьютер, и ленты. Ну и конечно, следует иметь копию дистрибутива (стандартное лицензионное соглашение разрешает это) и копию ваших прикладных программ.

1 ) Точнее говоря, копия всех используемых страниц из всех пространств данных, имеющихся в данном экземпляре сервера Informix Dynamic Server (прим. автора).

2 ) Точнее говоря, измененных страниц (прим. автора).

3 ) Допускается, что некоторые параметры могут и отличаться, но существуют строгие правила того, как рассчитывать возможные значения этих параметров. В любом случае, создание архива 0-го уровня после изменения существенных параметров должно считаться правилом хорошего тона.

4) Формат выдачи и набор флажков может меняться от версии к версии, поэтому точную интерпретацию выдачи данной команды следует уточнить в "Руководстве по администрированию". Прим. автора.

5 ) Пусть вас не вводят заблуждение колонка Used и значение в 100% для журналов 1..9 - это означает, что в процессе последнего использования они были заполнены на все 100%.

6 ) Более подробное описание обработки событий имеется в документации


Украинская баннерная сеть
 

[Home]

Сайт поддерживается группой пользователей Информикс на Украине.

Hosted by NO-more.