24.1. SQL Дамп#

24.1. SQL Дамп

24.1. SQL Дамп #

Идея этого метода дампа заключается в создании файла с SQL-командами, которые, когда они будут переданы обратно на сервер, воссоздадут базу данных в том же состоянии, в котором она была на момент дампа. Tantor BE предоставляет утилиту pg_dump для этой цели. Основное использование этой команды следующее:

pg_dump dbname > dumpfile

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

pg_dump - это обычное приложение-клиент Tantor BE (хотя и особенно умное). Это означает, что вы можете выполнять процедуру резервного копирования с любого удаленного хоста, который имеет доступ к базе данных. Но помните, что pg_dump не работает с особыми разрешениями. В частности, ему необходимо иметь доступ на чтение ко всем таблицам, которые нужно сохранить, поэтому для резервного копирования всей базы данных вам почти всегда нужно запускать его от имени суперпользователя базы данных. (Если у вас недостаточно привилегий для резервного копирования всей базы данных, вы все равно можете создавать резервные копии частей базы данных, к которым у вас есть доступ, используя такие опции, как -n schema или -t table).

Для указания сервера базы данных, с которым должен связаться pg_dump, используйте параметры командной строки -h host и -p port. По умолчанию используется локальный хост или значение переменной среды PGHOST. Аналогично, порт по умолчанию указывается переменной среды PGPORT или, при отсутствии такой, используется значение по умолчанию, заданное при компиляции. (Удобно, что сервер обычно имеет то же значение по умолчанию, заданное при компиляции).

Как и любое другое клиентское приложение Tantor BE, pg_dump по умолчанию подключается с именем пользователя базы данных, которое совпадает с именем текущего операционной системы пользователя. Чтобы изменить это, указывайте опцию -U или устанавливайте переменную среды PGUSER. Помните, что подключения pg_dump подвержены обычным механизмам аутентификации клиента (которые описаны в разделе Глава 19).

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

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

24.1.1. Восстановление дампа #

Текстовые файлы, созданные pg_dump, предназначены для чтения программой psql с использованием ее настроек по умолчанию. Общая форма команды для восстановления текстового дампа:

psql -X dbname < dumpfile

где dumpfile — это файл, созданный командой pg_dump. База данных dbname не будет создана этой командой, поэтому вы должны создать ее самостоятельно из template0 перед выполнением psql (например, с помощью createdb -T template0 dbname). Чтобы psql работал с настройками по умолчанию, используйте опцию -X (--no-psqlrc). psql поддерживает параметры, аналогичные pg_dump для указания сервера базы данных, к которому нужно подключиться, и имени пользователя. Смотрите справочную страницу psql для получения дополнительной информации.

Дамп файлов, не являющихся текстовыми, следует восстанавливать с помощью утилиты pg_restore.

Перед восстановлением SQL-дампа все пользователи, которые владеют объектами или имеют разрешения на объекты в дампе базы данных, должны уже существовать. Если их нет, восстановление не сможет воссоздать объекты с исходным владением и/или разрешениями. (Иногда это то, что нужно, но обычно это не так).

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

psql -X --set ON_ERROR_STOP=on dbname < dumpfile

В любом случае, у вас будет только частично восстановленная база данных. В качестве альтернативы, вы можете указать, что весь дамп должен быть восстановлен как одна транзакция, так что восстановление будет либо полностью завершено, либо полностью отменено. Этот режим можно указать, передавая параметры командной строки -1 или --single-transaction в psql. При использовании этого режима, имейте в виду, что даже незначительная ошибка может откатить восстановление, которое уже выполнялось много часов. Однако, это может быть предпочтительнее, чем вручную очищать сложную базу данных после частично восстановленного дампа.

Возможность pg_dump и psql записывать или считывать данные из каналов позволяет выполнять прямую выгрузку базы данных с одного сервера на другой, например:

pg_dump -h host1 dbname | psql -X -h host2 dbname

Важно

Дампы, создаваемые приложением pg_dump, относятся к базе данных template0. Это означает, что любые языки, процедуры и т. д., добавленные через template1, также будут включены в дамп, создаваемый pg_dump. В результате, при восстановлении, если вы используете настроенную базу данных template1, вы должны создать пустую базу данных из template0, как показано в приведенном выше примере.

После восстановления резервной копии рекомендуется запустить ANALYZE на каждой базе данных, чтобы оптимизатор запросов имел полезную статистику; см. Раздел 23.1.3 и Раздел 23.1.6 для получения дополнительной информации. Для получения дополнительных советов по эффективной загрузке больших объемов данных в Tantor BE обратитесь к Раздел 14.4.

24.1.2. Использование pg_dumpall #

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

pg_dumpall > dumpfile

Результатирующий дамп можно восстановить с помощью psql:

psql -X -f dumpfile postgres

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

pg_dumpall работает путем генерации команд для воссоздания ролей, таблиц пространств и пустых баз данных, а затем вызывает pg_dump для каждой базы данных. Это означает, что хотя каждая база данных будет внутренне согласованной, снимки разных баз данных не синхронизированы.

Кластерные данные можно выгрузить отдельно с помощью опции pg_dumpall --globals-only. Это необходимо для полного резервного копирования кластера при выполнении команды pg_dump для отдельных баз данных.

24.1.3. Обработка больших баз данных #

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

Используйте сжатые дампы.  Вы можете использовать свою любимую программу сжатия, например gzip:

pg_dump dbname | gzip > filename.gz

Перезагрузить с помощью:

gunzip -c filename.gz | psql dbname

или:

cat filename.gz | gunzip | psql dbname

Используйте команду split Команда split позволяет разделить вывод на более мелкие файлы, которые имеют приемлемый размер для базовой файловой системы. Например, чтобы создать файлы размером 2 гигабайта:

pg_dump dbname | split -b 2G - filename

Перезагрузить с помощью:

cat filename* | psql dbname

Если используется GNU split, можно использовать его вместе с gzip:

pg_dump dbname | split -b 2G --filter='gzip > $FILE.gz'

Это можно восстановить с помощью команды zcat.

Используйте пользовательский формат дампа pg_dump Если Tantor BE была построена на системе с установленной библиотекой сжатия zlib, формат пользовательского дампа будет сжимать данные при записи их в выходной файл. Это позволит получить размеры файлов дампа, сравнимые с использованием gzip, но с тем преимуществом, что таблицы могут быть восстановлены выборочно. Следующая команда выполняет дамп базы данных с использованием пользовательского формата дампа.

pg_dump -Fc dbname > filename

Пользовательский формат дампа не является скриптом для psql, а должен быть восстановлен с помощью pg_restore, например:

pg_restore -d dbname filename

См. страницы справки pg_dump и pg_restore для получения подробной информации.

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

Используйте функцию параллельного резервного копирования pg_dump Для ускорения выгрузки большой базы данных вы можете использовать параллельный режим pg_dump. Это позволит выгружать несколько таблиц одновременно. Объем параллельной обработки данных можно контролировать с помощью параметра -j. Параллельные выгрузки поддерживаются только для формата архива "directory".

pg_dump -j num -F d -f out.dir dbname

Вы можете использовать команду pg_restore -j для параллельного восстановления дампа. Это будет работать для любого архива в режиме "custom" или "directory", независимо от того, был ли он создан с помощью команды pg_dump -j.