Самоучитель по SQL-сервер в Linux



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

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

В этом разделе описаны два общих способа архивации данных. В первом варианте приложение pg_dump, входящее в комплект поставки PostgreSQL, генерирует набор команд SQL для полной архивации базы данных. Второй вариант основан на архивации файловой системы сервера.

Приложение pg_dump

Приложение pg_dump запускается в режиме командной строки и строит серию команд SQL. Выполнение этих команд в указанном порядке позволяет полностью воссоздать базу данных.

Синтаксис приложения pg_dump:

pg_dump [ параметры ]база_данных

Параметр база_данных определяет имя базы данных, для которой генерируются команды SQL. Строка параметров имеет такой же формат, как у других утилит управления базами данных (например, createdb). В ней чаще всего передается ключ - f для определения файла, в котором сохраняются сгенерированные команды.

ПРИМЕЧАНИЕ

Если флаг -f не указан, сгенерированные команды SQL вместо записи в файл выводятся в поток stdout.

Ниже приведен полный список ключей приложения pg_dump.

  • -а, - -data_only. Приложение генерирует только команды SQLCOPY и INSERT(B зависимости от того, установлен ли ключ -d). В результате архивируются только данные, хранящиеся в базе, но не объекты базы данных. Если ключ -а указывается без ключа -d, сгенерированные команды COPY копируют все данные из stdi n (то есть записи буквально сохраняются в выходном файле). В противном случае записи представляются последовательными командами INSERT.
  • -b, --blobs. Большие двоичные объекты архивируются наряду с обычными данными. Также должен быть установлен ключ - F с форматом t или с. По умолчанию данные больших двоичных объектов не архивируются.
  • -с, - -clean. Командам SQL, создающим объекты базы данных, должны предшествовать команды удаления этих объектов. Ключ обычно используется при повторной инициализации существующей базы данных (вместо ее удаления и создания на пустом месте).
  • -С, --create. В выходные данные включается команда SQL для создания базы данных (CREATE DATABASE).
  • -d, --inserts. Для записей генерируются команды INSERT вместо используемых по умолчанию команд COPY. Этот вариант безопаснее, так как одна поврежденная запись приводит к сбою всей команды COPY, но процесс восстановления занимает гораздо больше времени.
  • -D, - -attribute_inserts. Ключ -D, как и -d, генерирует команды INSERT, но в каждую команду INSERT перед секцией VALUES включается список полей в круглых скобках.
  • -f файл, --т"11е=0айл. Результаты работы pg_dump направляются в заданный файл вместо потока stdout. Пользователь, запускающий pg_dump, должен иметь системные права записи в этот файл.
  • -F { с | t р }, --format { с | t | p }. Формат выходного файла (приложение pg_restore обычно используется для работы с файлами, созданными в форматах с или t — соответственно gzip или tar):
    • с (сжатие gzip) — файл .tar, сжатый утилитой gzip (то есть .tar.gz); о t — файл .tar;
    • р (простой текст) — выходной файл генерируется в простом текстовом формате (режим используется по умолчанию).
  • -h хост, --bost=xocm. Хост, с которым устанавливается связь вместо хоста local host. Используется в тех случаях, когда архивируемая база данных находится на другом сервере.
  • -i, - -ignore-version. Запрет сравнения версии pg_dump с текущей версией PostgreSQL. Ключ следует использовать лишь в крайних случаях, поскольку различия в структуре системных каталогов разных версий с большой вероятностью приведут к возникновению ошибок. Обычно версия pg_dump должна соответствовать версии архивируемой базы данных.
  • -n, - -no_quotes. Идентификаторы заключаются в кавычки только при наличии недопустимых символов (пробелов, символов верхнего регистра и т. д.).
  • - N, - - quotes. Все идентификаторы обязательно заключаются в кавычки. Используется в pg_dump по умолчанию, начиная с PostgreSQL 6.4.
  • -о, - -old. Вместе с данными записей архивируются OID (идентификаторы объектов). Ключ очень важен в приложениях, которые так или иначе осмысленно используют OID.
  • -0, - -no-owner. При создании архива не учитывается принадлежность базы данных. Объекты, созданные в результате восстановления данных, будут принадлежать пользователю, выполняющему эту операцию.
  • -р порт, --port=nopm. Порт, по которому должно производиться подключение к серверу, вместо порта по умолчанию (обычно 5432, хотя при компиляции PostgreSQL можно задать другой порт при помощи флага - -with-pgport).
  • -R, - -no-reconnect. Подавляет все команды \connect, которые обычно обеспечивают сохранение прав владельцев при восстановлении из архива. На практике ключ аналогичен ключу -0, но он также исключает возможность использования ключа -С, поскольку после создания новой базы необходимо заново установить подключение.
  • - s, - - schema - on! у. Генерируются только команды SQL для архивации таких объектов, как таблицы, последовательности, индексы и представления, а хранящиеся в таблицах данные игнорируются. Ключ может использоваться для копирования общей структуры базы данных с компьютера разработчика на компьютер, на котором база будет реально эксплуатироваться.
  • -t таблица, . В заданной базе данных архивируется только заданная таблица.
  • -u, --password. Запрос имени пользователя и пароля. В PostgreSQL 7.1.x этот ключ был единственным средством указания другого имени пользователя. Если пароль не задан (NULL), то в ответ на запрос можно просто нажать клавишу Enter.
  • -v, --verbose. Вывод функций pg_dump направляется в поток stderr, а не, как обычно, в поток stdout!
  • -х, --no-acl. Подавление команд GRANT и REVOKE, обычно используемых для сохранения прав, действующих на момент архивации. Ключ используется в том случае, если при восстановлении базы данных из архива не нужно восстанавливать существовавшие ранее права или ограничения.
  • -Z,--compress {0-9 }. Уровень сжатия (0 — минимальный, 9 — максимальный) при использовании с ключом -F с.

По умолчанию приложение pg_dump может запускаться любым системным пользователем, но пользователь, подключающийся к PostgreSQL, должен обладать правом выборки для всех объектов в архивируемой базе данных. В листинге 9.20 приведен пример использования программы pg_dump пользователем manager для базы данных booktown. Ключ -С включает в архив команду CREATE DATABASE. Эта команда включается не всегда, поскольку в некоторых случаях база данных создается заранее в нестандартной конфигурации.

Листинг 9.20. Использование приложения pg_dump

[jworsley@booktown -]$ pg_dump -u -C -f booktown.sql booktown

Username: manager Password:

[jworsley@booktown -]$ Is -1 booktown.sql

-rw-rw-r-- 1 jworsley jworsley 46542 Sep 13 16:42 booktown.sql

Приложение pg_dump поддерживает стандартные параметры хостовых соединений (ключи -h, -u и -р), что позволяет выполнять удаленную архивацию с любого хоста, которому разрешено удаленное подключение в соответствии с содержимым файла pgjiba.conf (более подробная информация приведена в главе 8).

В листинге 9.21 производится подключение с удаленного сервера к серверу booktown.commandprompt.com для создания архивного файла в формате gzip (ключ -F с) с именем booktown.sql.tar.gz.

Листинг 9.21. Удаленный запуск pg_dump

[jworsley@cmd ~]$ pg_dump -u -h booktown.commandprompt.com \

-F с -f booktown.sql.tar.gz booktown

Username: manager

Password:

[jworsley@cmd -]$ Is -1 booktown.sql.tar.gz

-rw-rw-r-&th1nsp:- 1 jworsley jworsley 45909 Sep 13 17:12 booktown.sql.tar.gz

Если архивный файл должен содержать большие двоичные объекты, воспользуйтесь форматом tar (t) или gzip (с), потому что текстовый формат не дает такой возможности. В остальных случаях обычных текстовых архивов бывает вполне достаточно.

Архивы в формате tar нередко более чем в два раза превышают по объему свои текстовые прототипы, даже если они не содержат двоичных объектов. Дело в том, что в формат tar включается иерархическое оглавление файлов .dat. В этом оглавлении хранится информация, необходимая для распаковки формата tar соответствующей командой pg_restore; дополнительные инструкции занимают лишнее место на диске. Поскольку tar архивирует файлы без сжатия, был предусмотрен формат с, обеспечивающий автоматическое сжатие tar-файлов в формат gzip.

Приложение pg_dumpall

В PostgreSQL также существует приложение pg_dumpall, которое является своего рода «оболочкой» для вызова программы pg_dump. Основная функция этого приложения заключается в одновременной архивации всего кластера баз данных PostgreSQL в системе без вызова pg_dump для всех баз данных по очереди. Синтаксис команды pg_dumpaTl, выводимый с флагом - -help:

pg_dumpall [ -с ] [ -h хост ] [ -р порт ] [ -д ]

Приложение pg_dumpall получает те же параметры подключения, что и приложение pg_dump. Ниже перечислены ключи pg_dumpall.

  • -с. Командам SQL, создающим глобальные объекты, должны предшествовать команды удаления этих объектов.
  • -h хост, - -host=.roaw. Хост, с которым устанавливается связь вместо хоста local host или хоста, определяемого переменной среды PGHOST. Используется в тех случаях, когда архивируемая база данных находится на другом сервере.
  • -р порт, --port=nopm. Порт, по которому должно производиться подключение к серверу, вместо порта по умолчанию (обычно 5432).
  • -g, --globals-only. Архивируются только глобальные объекты. Обычно этот режим используется при воссоздании пользователей и групп, а также их дублирования на другом компьютере (архив переносится на другой компьютер и восстанавливается). При установке ключа -д перед выполнением команд CREATE из таблицы pg_shadow автоматически удаляются все пользователи. Будьте внимательны!

ВНИМАНИЕ

Не выполняйте команду pg_dumpall с ключом -?. Это приведет к тому, что ключ будет передан приложению pg_dump для каждой базы и выходные данные займут гораздо больше места, чем можно предположить. Для получения справки о команде pg_dumpall используется ключ --help.

Обратите внимание: в PostgreSQL 7.1.x возможности сценария pg_dumpall несколько ограничены по сравнению с обычным сценарием pg_dump. Например, ключ -и не позволяет передать другое имя пользователя и пароль, а ключ -F не может задать другой формат, кроме простого текста (архивы создаются в текстовом виде независимо от выбранного формата). Отсюда следует, что ключ -Ь тоже не может передаваться программе pg_dumpall, поскольку для него необходимы другие форматы, кроме текстового.

Хотя приложению pg_dump можно передать имя файла при помощи ключа -f, полученный архив будет неполным, поскольку глобальные данные pg_dumpall все

равно направляются в поток stdout. Проблемы с ключом ^решаются перенаправлением вывода pg_dumpall в файл средствами командного интерпретатора (>).

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

В листинге 9.22 приведена простая команда bash для определения временной переменной среды PGUSER при вызове клиента PostgreSQL Хотя необходимость в таких переменных возникает редко, это полезный прием, о котором следует помнить в некоторых специфических случаях — например, при работе со сценарием pg_dumpall. В листинге 9.22 переменная PGUSER обеспечивает создание одного архивного файла для всех баз данных.

Листинг 9.22. Использование команды pg_dumpall

[jworsley@booktown -]$ PGUSER=postgres pg_dumpall > all.sql

Первая часть команды, приведенной в листинге 9.22, присваивает временной переменной PGUSER значение postgres. Переменная создается на время работы pg_dumpall и прекращает свое существование при завершении программы.

ПРИМЕЧАНИЕ

В общем случае приложение pg_dumpall должно выполняться суперпользователем PostgreSQL. Это связано с тем, что команда pg_dumpall обращается к системным каталогам PostgreSQL, поскольку наряду с объектами баз данных она архивирует глобальные объекты.

Команду pg_dumpal 1 также можно выполнять в удаленном режиме, хотя для этого следует задать значения всех необходимых переменных среды. Процедура сильна зависит от настройки удаленного хоста в файле pg_hba.conf.

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




Книжный магазин