pg_restore accepts the following command line arguments.
filename
-
Specifies the location of the archive file (or directory, for a directory-format archive) to be restored. If not specified, the standard input is used.
-a
--data-only
-
Restore only the data, not the schema (data definitions). Table data, large objects, and sequence values are restored, if present in the archive.
This option is similar to, but for historical reasons not identical to, specifying
--section=data
. -c
--clean
-
Before restoring database objects, issue commands to
DROP
all the objects that will be restored. This option is useful for overwriting an existing database. If any of the objects do not exist in the destination database, ignorable error messages will be reported, unless--if-exists
is also specified. -C
--create
-
Create the database before restoring into it. If
--clean
is also specified, drop and recreate the target database before connecting to it.With
--create
, pg_restore also restores the database’s comment if any, and any configuration variable settings that are specific to this database, that is, anyALTER DATABASE ... SET ...
andALTER ROLE ... IN DATABASE ... SET ...
commands that mention this database. Access privileges for the database itself are also restored, unless--no-acl
is specified.When this option is used, the database named with
-d
is used only to issue the initialDROP DATABASE
andCREATE DATABASE
commands. All data is restored into the database name that appears in the archive. -d
dbname
--dbname=
dbname
-
Connect to database
dbname
and restore directly into the database. Thedbname
can be a connection string. If so, connection string parameters will override any conflicting command line options. -e
--exit-on-error
-
Exit if an error is encountered while sending SQL commands to the database. The default is to continue and to display a count of errors at the end of the restoration.
-f
filename
--file=
filename
-
Specify output file for generated script, or for the listing when used with
-l
. Use-
for stdout. --filter=
filename
-
Specify a filename from which to read patterns for objects excluded or included from restore. The patterns are interpreted according to the same rules as
-n
/--schema
for including objects in schemas,-N
/--exclude-schema
for excluding objects in schemas,-P
/--function
for restoring named functions,-I
/--index
for restoring named indexes,-t
/--table
for restoring named tables or-T
/--trigger
for restoring triggers. To read fromSTDIN
, use-
as the filename. The--filter
option can be specified in conjunction with the above listed options for including or excluding objects, and can also be specified more than once for multiple filter files.The file lists one database pattern per row, with the following format:
{ include | exclude } { function | index | schema | table | trigger }
PATTERN
The first keyword specifies whether the objects matched by the pattern are to be included or excluded. The second keyword specifies the type of object to be filtered using the pattern:
-
function
: functions, works like the-P
/--function
option. This keyword can only be used with theinclude
keyword. -
index
: indexes, works like the-I
/--indexes
option. This keyword can only be used with theinclude
keyword. -
schema
: schemas, works like the-n
/--schema
and-N
/--exclude-schema
options. -
table
: tables, works like the-t
/--table
option. This keyword can only be used with theinclude
keyword. -
trigger
: triggers, works like the-T
/--trigger
option. This keyword can only be used with theinclude
keyword.
Lines starting with
#
are considered comments and ignored. Comments can be placed after an object pattern row as well. Blank lines are also ignored. See Patterns for how to perform quoting in patterns. -
-F
format
--format=
format
-
Specify format of the archive. It is not necessary to specify the format, since pg_restore will determine the format automatically. If specified, it can be one of the following:
c
custom
-
The archive is in the custom format of pg_dump.
d
directory
-
The archive is a directory archive.
t
tar
-
The archive is a
tar
archive.
-I
index
--index=
index
-
Restore definition of named index only. Multiple indexes may be specified with multiple
-I
switches. -j
number-of-jobs
--jobs=
number-of-jobs
-
Run the most time-consuming steps of pg_restore — those that load data, create indexes, or create constraints — concurrently, using up to
number-of-jobs
concurrent sessions. This option can dramatically reduce the time to restore a large database to a server running on a multiprocessor machine. This option is ignored when emitting a script rather than connecting directly to a database server.Each job is one process or one thread, depending on the operating system, and uses a separate connection to the server.
The optimal value for this option depends on the hardware setup of the server, of the client, and of the network. Factors include the number of CPU cores and the disk setup. A good place to start is the number of CPU cores on the server, but values larger than that can also lead to faster restore times in many cases. Of course, values that are too high will lead to decreased performance because of thrashing.
Only the custom and directory archive formats are supported with this option. The input must be a regular file or directory (not, for example, a pipe or standard input). Also, multiple jobs cannot be used together with the option
--single-transaction
. -l
--list
-
List the table of contents of the archive. The output of this operation can be used as input to the
-L
option. Note that if filtering switches such as-n
or-t
are used with-l
, they will restrict the items listed. -L
list-file
--use-list=
list-file
-
Restore only those archive elements that are listed in
list-file
, and restore them in the order they appear in the file. Note that if filtering switches such as-n
or-t
are used with-L
, they will further restrict the items restored.list-file
is normally created by editing the output of a previous-l
operation. Lines can be moved or removed, and can also be commented out by placing a semicolon (;
) at the start of the line. See below for examples. -n
schema
--schema=
schema
-
Restore only objects that are in the named schema. Multiple schemas may be specified with multiple
-n
switches. This can be combined with the-t
option to restore just a specific table. -N
schema
--exclude-schema=
schema
-
Do not restore objects that are in the named schema. Multiple schemas to be excluded may be specified with multiple
-N
switches.When both
-n
and-N
are given for the same schema name, the-N
switch wins and the schema is excluded. -O
--no-owner
-
Do not output commands to set ownership of objects to match the original database. By default, pg_restore issues
ALTER OWNER
orSET SESSION AUTHORIZATION
statements to set ownership of created schema elements. These statements will fail unless the initial connection to the database is made by a superuser (or the same user that owns all of the objects in the script). With-O
, any user name can be used for the initial connection, and this user will own all the created objects. -P
function-name(argtype [, ...])
--function=
function-name(argtype [, ...])
-
Restore the named function only. Be careful to spell the function name and arguments exactly as they appear in the dump file’s table of contents. Multiple functions may be specified with multiple
-P
switches. -R
--no-reconnect
-
This option is obsolete but still accepted for backwards compatibility.
-s
--schema-only
-
Restore only the schema (data definitions), not data, to the extent that schema entries are present in the archive.
This option is the inverse of
--data-only
. It is similar to, but for historical reasons not identical to, specifying--section=pre-data --section=post-data
.(Do not confuse this with the
--schema
option, which uses the word “schema” in a different meaning.) -S
username
--superuser=
username
-
Specify the superuser user name to use when disabling triggers. This is relevant only if
--disable-triggers
is used. -t
table
--table=
table
-
Restore definition and/or data of only the named table. For this purpose, “table” includes views, materialized views, sequences, and foreign tables. Multiple tables can be selected by writing multiple
-t
switches. This option can be combined with the-n
option to specify table(s) in a particular schema.Note
When
-t
is specified, pg_restore makes no attempt to restore any other database objects that the selected table(s) might depend upon. Therefore, there is no guarantee that a specific-table restore into a clean database will succeed.Note
This flag does not behave identically to the
-t
flag of pg_dump. There is not currently any provision for wild-card matching in pg_restore, nor can you include a schema name within its-t
. And, while pg_dump‘s-t
flag will also dump subsidiary objects (such as indexes) of the selected table(s), pg_restore‘s-t
flag does not include such subsidiary objects.Note
In versions prior to PostgreSQL 9.6, this flag matched only tables, not any other type of relation.
-T
trigger
--trigger=
trigger
-
Restore named trigger only. Multiple triggers may be specified with multiple
-T
switches. -v
--verbose
-
Specifies verbose mode. This will cause pg_restore to output detailed object comments and start/stop times to the output file, and progress messages to standard error. Repeating the option causes additional debug-level messages to appear on standard error.
-V
--version
-
Print the pg_restore version and exit.
-x
--no-privileges
--no-acl
-
Prevent restoration of access privileges (grant/revoke commands).
-1
--single-transaction
-
Execute the restore as a single transaction (that is, wrap the emitted commands in
BEGIN
/COMMIT
). This ensures that either all the commands complete successfully, or no changes are applied. This option implies--exit-on-error
. --disable-triggers
-
This option is relevant only when performing a data-only restore. It instructs pg_restore to execute commands to temporarily disable triggers on the target tables while the data is restored. Use this if you have referential integrity checks or other triggers on the tables that you do not want to invoke during data restore.
Presently, the commands emitted for
--disable-triggers
must be done as superuser. So you should also specify a superuser name with-S
or, preferably, run pg_restore as a PostgreSQL superuser. --enable-row-security
-
This option is relevant only when restoring the contents of a table which has row security. By default, pg_restore will set row_security to off, to ensure that all data is restored in to the table. If the user does not have sufficient privileges to bypass row security, then an error is thrown. This parameter instructs pg_restore to set row_security to on instead, allowing the user to attempt to restore the contents of the table with row security enabled. This might still fail if the user does not have the right to insert the rows from the dump into the table.
Note that this option currently also requires the dump be in
INSERT
format, asCOPY FROM
does not support row security. --if-exists
-
Use
DROP ... IF EXISTS
commands to drop objects in--clean
mode. This suppresses “does not exist” errors that might otherwise be reported. This option is not valid unless--clean
is also specified. --no-comments
-
Do not output commands to restore comments, even if the archive contains them.
--no-data-for-failed-tables
-
By default, table data is restored even if the creation command for the table failed (e.g., because it already exists). With this option, data for such a table is skipped. This behavior is useful if the target database already contains the desired table contents. For example, auxiliary tables for PostgreSQL extensions such as PostGIS might already be loaded in the target database; specifying this option prevents duplicate or obsolete data from being loaded into them.
This option is effective only when restoring directly into a database, not when producing SQL script output.
--no-publications
-
Do not output commands to restore publications, even if the archive contains them.
--no-security-labels
-
Do not output commands to restore security labels, even if the archive contains them.
--no-subscriptions
-
Do not output commands to restore subscriptions, even if the archive contains them.
--no-table-access-method
-
Do not output commands to select table access methods. With this option, all objects will be created with whichever table access method is the default during restore.
--no-tablespaces
-
Do not output commands to select tablespaces. With this option, all objects will be created in whichever tablespace is the default during restore.
--section=
sectionname
-
Only restore the named section. The section name can be
pre-data
,data
, orpost-data
. This option can be specified more than once to select multiple sections. The default is to restore all sections.The data section contains actual table data as well as large-object definitions. Post-data items consist of definitions of indexes, triggers, rules and constraints other than validated check constraints. Pre-data items consist of all other data definition items.
--strict-names
-
Require that each schema (
-n
/--schema
) and table (-t
/--table
) qualifier match at least one schema/table in the backup file. --transaction-size=
N
-
Execute the restore as a series of transactions, each processing up to
N
database objects. This option implies--exit-on-error
.--transaction-size
offers an intermediate choice between the default behavior (one transaction per SQL command) and-1
/--single-transaction
(one transaction for all restored objects). While--single-transaction
has the least overhead, it may be impractical for large databases because the transaction will take a lock on each restored object, possibly exhausting the server’s lock table space. Using--transaction-size
with a size of a few thousand objects offers nearly the same performance benefits while capping the amount of lock table space needed. --use-set-session-authorization
-
Output SQL-standard
SET SESSION AUTHORIZATION
commands instead ofALTER OWNER
commands to determine object ownership. This makes the dump more standards-compatible, but depending on the history of the objects in the dump, might not restore properly. -?
--help
-
Show help about pg_restore command line arguments, and exit.
pg_restore also accepts the following command line arguments for connection parameters:
-h
host
--host=
host
-
Specifies the host name of the machine on which the server is running. If the value begins with a slash, it is used as the directory for the Unix domain socket. The default is taken from the
PGHOST
environment variable, if set, else a Unix domain socket connection is attempted. -p
port
--port=
port
-
Specifies the TCP port or local Unix domain socket file extension on which the server is listening for connections. Defaults to the
PGPORT
environment variable, if set, or a compiled-in default. -U
username
--username=
username
-
User name to connect as.
-w
--no-password
-
Never issue a password prompt. If the server requires password authentication and a password is not available by other means such as a
.pgpass
file, the connection attempt will fail. This option can be useful in batch jobs and scripts where no user is present to enter a password. -W
--password
-
Force pg_restore to prompt for a password before connecting to a database.
This option is never essential, since pg_restore will automatically prompt for a password if the server demands password authentication. However, pg_restore will waste a connection attempt finding out that the server wants a password. In some cases it is worth typing
-W
to avoid the extra connection attempt. --role=
rolename
-
Specifies a role name to be used to perform the restore. This option causes pg_restore to issue a
SET ROLE
rolename
command after connecting to the database. It is useful when the authenticated user (specified by-U
) lacks privileges needed by pg_restore, but can switch to a role with the required rights. Some installations have a policy against logging in directly as a superuser, and use of this option allows restores to be performed without violating the policy.
intro
Let’s learn how to import a PostgreSQL database backup with the pg_restore
command-line utility.
As you may already know, pg_dump
is a versatile tool for creating database backups in PostgreSQL.
If there is a tool helping you to create backups, there must also be a tool to restore these backups. This is exactly the purpose of the pg_restore
command line utility!
In this guide packed with numerous examples, you will learn what pg_restore
is, how it allows you to restore a PostgreSQL backup, and what options it supports.
Become a backup restoration master in PostgreSQL!
What Is pg_restore?
pg_restore
is a command-line utility for restoring a PostgreSQL database from an archive in a non-plain-text format created with pg_dump
. Specifically, it launches all the commands required to reconstruct a database to the state it was in at the time of the dump.
The restore process changes based on whether a database name is specified or not:
-
A database name is specified:
pg_restore
connects to that database and restores the database objects read from the archive directly into the specified database. -
A database name is NOT specified: the process first creates a script containing the SQL commands necessary to rebuild the database. PostgreSQL executes the script, creates the database, and then imports the objects into it.
Keep in mind that pg_restore
can only follow the instructions contained in the archive file generated with pg_dump
. This means if the dump contains INSERT
statements, the data restoration tool will not be able to load the data using COPY
statements.
How to Use the PostgreSQL pg_restore Utility: Syntax and Options
The pg_restore
syntax in the command line is:
Copy
1
pg_restore [options] [filename]
The optional parameters are:
-
options
: Includes the connection information and can contain various flags to customize the behavior of the backup restore process. -
filename
: The path to the directory or archive file that contains the dump created withpg_dump
. If not specified, it reads data from the standard input (stdin).
Here is a list of the most important and commonly used pg_restore
options:
-
-U <username>
or--username=<username>
: Specifies the PostgreSQL username to connect with. -
-h <hostname>
or--host=<hostname>
Specifies the host where the database server is running. If defaults to thePGHOST
environment variable, if it has a value. -
-p <port>
or--port=<port>
Specifies the port to use for the connection to the database. It defaults to thePGPORT
environment variable if it has a value. -
-d <dbname>
or--dbname=<dbname>
: Specifies the name of the database to connect to and restore data directly into. Note that in both cases,<dbname>
can also be a connection string. This applies to both of the options. -
-f <filename>
or--file=<filename>
: Specifies the name of the output file containing the restore process log. -
-a
or--data-only
: Restores only the data, not the schema. -
-I <index_name>
or--index=<index_name>
: Restores the specified index only. -
-n <schema_name>
or--schema=<schema_name>
: Restores only the objects that are in the specified schema. -
-s
or--schema-only
: Restores only the schema, not data. -
-t <table_name>
or--table=<table_name>
: Restores only the definition and data of the specified table. In the context of this option, the concept of “table” also includes views, materialized views, sequences, and foreign tables. -
-T <trigger_name>
or--trigger=<trigger_name>
: Restores only the specified trigger. -
-1
or--single-transaction
: Executes the restore as a single transaction. -
-v
or--verbose
: Enables the verbose mode to log the information about the objects being restored in a verbose— more expansive —mode. -
-c
or--clean
: IssuesDROP
commands before restoring database objects. -
-L <list-file>
or--use-list=<list-file>
: Restores only those archive elements that are listed in<list-file>
. -
-l
or--list
: Lists the tables of contents in the dump archive. The output of this operation can be used as input to theL
option. -
-C
or--create
: Creates the database before loading the backup into it. -
-e
or--exit-on-error
: Stops the database restoration process in case of error. -
--no-password
: Do not issue a password prompt by assuming that no password is required.
For the full list of options available, read the official documentation. Note that these options are case sensitive.
Tip: You can specify the -I
, -n
, and -T
options multiple times to restore multiple indexes, schemas, and tables at once, respectively.
Now, take a look at the pg_restore
example below:
Copy
1
pg_restore -U admin -d organization db_dump.tar
The above CLI command will connect to the organization
database in the local PostgreSQL server. It will log in as the admin
user, and you will be prompted for the user’s password. Then, it will try to import the db_dump.tar
archive into organization
.
pg_restore Example List
Now that you know how to use the PostgreSQL restore utility, it is time to see a complete pg_restore
example list!
Note: In the following CLI sample commands, the user will always be admin
, the database name company
, and the file name db_dump.sql
. Modify these fields accordingly to make the instructions below work in your specific scenario.
Import Data Only
Copy
1
pg_restore -U admin -d company --data-only db_dump.sql
The company
database will be filled with the data contained in db_dump.tar
. To see what is going on, enable the verbose mode:
Copy
1
pg_restore -U admin -d company -v --data-only db_dump.sql
Import Schema Only
Copy
1
pg_restore -U admin -d company --schema-only db_dump.sql
This pg_restore
example command only creates the schema in the company
database. For a clean import, specify the -c
flag:
Copy
1
pg_restore -U admin -d company -c --schema-only db_dump.sql
Import Only a Few Schemas
Given a PostgreSQL backup, suppose you only want to load the schemas sales
and finance
. You can achieve that with:
Copy
1
pg_restore -U admin -d company -n 'sales' -n 'finance' db_dump.sql
Note that -n
can be specified multiple times in the same pg_restore
command.
Import Only Some Tables
Assume you want to import only the orders
table from the sales
schema. Achieve that goal with:
Copy
1
pg_restore -U admin -d company -n 'sales' -t 'orders' db_dump.sql
Now we will get into the limitations that will dawn upon you after you start using pg_restore
. The limitations are also listed in the PostgreSQL documentation, but we will summarize everything below.
Main pg_restore Limitations
This is a list of the main limitations of pg_restore
:
-
None of the
pg_restore
options accept values including wildcards. For example, thet
option ofpg_dump
supports wildcards but that is not true for thet
flag inpg_restore
. -
When restoring data to a pre-existing table and using the
--disable-triggers
option,pg_restore
disables the SQL triggers before inserting the data. Then, it re-enables them after the data has been imported. If the restoration process is stopped in the middle, the system catalogs might be left in the wrong state. -
When
t
is specified,pg_restore
does not restore any other database objects that the selected table(s) might depend on. -
pg_restore
cannot restore Large Objects selectively. Thus, it cannot restore only those for a specific table. Thus, if a dump contains Large Objects, then all large objects will be restored, or none of them if they are excluded via specific options.
Conclusion
In this guide, you understood what pg_restore
is and what options it supports. This PostgreSQL command-line utility helps you restore backups generated via the pg_dump
command. There are a lot of pg_restore
options, and here you had the opportunity to see the most important ones with examples.
Creating and restoring database backups is essential but not easy to deal with. That is why you should opt for an advanced database client solution like DbVisualizer! In addition to supporting dozens of DBMS technologies, DbVisualizer enables you to export your databases and then import them with just a few clicks. It also provides advanced query optimization capabilities and can generate ERD-like schemas. Try DbVisualizer for free today!
FAQ
How long does pg_restore take to restore a PostgreSQL backup?
The time pg_restore
takes to restore a PostgreSQL backup varies based on factors such as database size, server resources, and the restore method used. However, it usually ranges from a few minutes to several hours for large databases.
What is the path to pg_restore.exe?
On Windows, you can typically find the pg_restore.exe
file in the bin
folder of your PostgreSQL installation. The complete path to pg_restore.exe
should be:
Copy
1
C:\Program Files\PostgreSQL\<version>\bin\pg_restore.exe
Replace <version>
with the version number of your PostgreSQL local installation.
Is it possible to run pg_restore on a remote server?
Yes, you can run pg_restore
on a remote server by following this procedure:
-
Specify the hostname or IP address of the PostgreSQL server with the
h
option. -
Pass the PostgreSQL username to log in with the
U
option. -
Specify the name of the database where to restore data with the
d
option.
Make also sure that the PostgreSQL server allows remote connections. Otherwise, adjust the firewall settings. To connect to the server, you will need to provide a password or use SSH tunneling.
How to make pg_restore ignore duplicates?
By default, pg_restore
restores data even if the creation command for a table fails (e.g. because it already exists). By setting the --no-data-for-failed-tables
option, data for such tables will be skipped. This behavior prevents duplicate or obsolete data from being loaded into existing tables in the database.
How to perform a parallel PostgreSQL backup restore with pg_restore?
To perform a parallel PostgreSQL backup restore, pass the -j
or --jobs
option followed by the number of parallel jobs to pg_restore
. This will run most of the most time-consuming steps of a restore, such as loading data, creating indexes, and creating constraints, concurrently. In particular, it will use up to the number of concurrent sessions passed to the option.
Sign up to receive The Table’s roundup
The content provided on dbvis.com/thetable, including but not limited to code and examples, is intended for educational and informational purposes only. We do not make any warranties or representations of any kind. Read more here.
Задача резервного копирования — одна из основных при сопровождении и поддержке PostgreSQL. Для резервного копирования логической схемы и данных можно использовать как встроенные инструменты СУБД, так и внешние. В этой статье мы разберем оба варианта.
Для начала подготовим сервер. Для демо-стенда закажем виртуальный сервер в Облачной платформе. Для этого откроем панель управления my.selectel.ru, перейдем в меню Облачная платформа и нажмем на кнопку Создать сервер.
В статье будем использовать виртуальный сервер с конфигурацией 2 vCPU, 4 ГБ RAM и 10 ГБ HDD с операционной системой CentOS 8 Stream 64-bit.
Теперь прокрутим представление ниже, где находятся настройки сети. Важно, чтобы у сервера был внешний плавающий IP-адрес для доступа извне.
После выбора операционной системы, конфигурации сервера и выполнения сетевых настроек переходим к завершению заказа и нажимаем на кнопку Создать. Через несколько минут сервер будет готов.
Перед началом демонстрации возможностей резервного копирования, мы подготовили PostgreSQL. Для целей наполнения базы данных и создания непрерывного потока записи, развернули там Zabbix (некоторое время назад публиковали о нем статью).
Доверьте нам развертывание и администрирование баз данных в облаке.
Создание резервных копий и восстановление из командной строки
В этом разделе мы расскажем как сделать дамп базы данных PostgreSQL в консоли при подключении по SSH, разберем синтаксис и покажем примеры использования утилит pg_dump, pg_dumpall, pg_restore, pg_basebackup и wal-g.
Утилита pg_dump
В PostgreSQL есть встроенный инструмент для создания резервных копий — утилита pg_dump. Утилита имеет простой синтаксис:
# pg_dump <параметры> <имя базы> > <файл для сохранения копии>
В простейшем случае достаточно указать имя базы данных, которую в дальнейшем нужно будет восстановить. Резервная копия создается следующей командой:
# pg_dump zabbix > /tmp/zabbix.dump
Если требуется авторизация под определенным пользователем, можно воспользоваться ключом -U:
# pg_dump -U zabbix -W zabbix > /tmp/zabbix.dump # pg dump u postgres
Ключ -U определяет пользователя, а -W обязывает ввести пароль.
Чтобы сэкономить место на диске, можно сразу же сжимать дамп:
# pg_dump -U zabbix -W zabbix | gzip > /tmp/zabbix.gz
Резервное копирование обычно выполняется по расписанию, например, ежедневно в 3 часа ночи. Нижеприведенный пример скрипта не только выполняет бэкап, но и удаляет все файлы старше 61 дня (за исключением 15-го числа месяца).
#!/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
PGPASSWORD=some_password
export PGPASSWORD
pathB=/mnt/backup
dbUser=dbadmin
database=zabbix
find $pathB \( -name "*-1[^5].*" -o -name "*-[023]?.*" \) -ctime +61 -delete
pg_dump -U $dbUser $database | gzip > $pathB/pgsql_$(date "+%Y-%m-%d").sql.gz
unset PGPASSWORD
Чтобы настроить регулярное выполнение, выполним следующую команду в планировщике crontab:
# crontab -e
3 0 * * * /etc/scripts/pgsql_dump.sh # postgres pg dump
Чтобы выполнить аналогичную команду на удаленном сервере, достаточно добавить ключ -h:
# pg_dump -h 192.168.56.101 zabbix > /tmp/zabbix.dump
Ключ -t задает таблицу, для которой нужно создать резервную копию:
# pg_dump -t history zabbix > /tmp/zabbix.dump # postgres dump table
При помощи специальных ключей можно создавать резервные копии структуры данных или непосредственно данных:
# pg_dump --schema-only zabbix > /tmp/zabbix.dump
# pg_dump --data-only zabbix > /tmp/zabbix.dump
У утилиты pg_dump также есть ключи для сохранения дампа в другие форматы. Чтобы сохранить копию в виде бинарного файла используются ключи -Fc:
# pg_dump -Fc zabbix > /tmp/zabbix.bak
Чтобы создать архив — -Ft:
# pg_dump -Ft zabbix > /tmp/zabbix.tar
Чтобы сохранить в directory-формате — -Fd:
# pg_dump -Fd zabbix > /tmp/zabbix.dir
Резервное копирование в виде каталогов позволяет выполнять процесс в многопоточном режиме.
Ниже мы перечислим возможные параметры утилиты pg_dump.
-d <имя_бд>, —dbname=имя_бд — база данных, к которой выполняется подключение.
-h <сервер>, —host=сервер — имя сервера.
-p <порт>, —port=порт — порт для подключения.
-U <пользователь>, —username=пользователь) — учетная запись, используемое для подключения.
-w, —no-password — деактивация требования ввода пароля.
-W, —password — активация требования ввода пароля.
—role=имя роли — роль, от имени которой генерируется резервная копия.
-a, —data-only — вывод только данных, вместо схемы объектов (DDL).
-b, —blobs — параметр добавляет в выгрузку большие объекты.
-c, —clean — добавление команд DROP перед командами CREATE в файл резервной копии.
-C, —create — генерация реквизитов для подключения к базе данных в файле резервной копии.
-E <кодировка>, —encoding=кодировка — определение кодировки резервной копии.
-f <файл>, —file=файл — задает имя файла, в который будет сохраняться вывод утилиты.
-F <формат>, —format=формат — параметр определяет формат резервной копии. Доступные форматы:
- p, plain) — формирует текстовый SQL-скрипт;
- c, custom) — формирует резервную копию в архивном формате;
- d, directory) — формирует копию в directory-формате;
- t, tar) — формирует копию в формате tar.
-j <число_заданий>, —jobs=число_заданий — параметр активирует параллельную выгрузку для одновременной обработки нескольких таблиц (равной числу заданий). Работает только при выгрузке копии в формате directory.
-n <схема>, —schema=схема — выгрузка в файл копии только определенной схемы.
-N <схема>, —exclude-schema=схема — исключение из выгрузки определенных схем.
-o, —oids — добавляет в выгрузку идентификаторы объектов (OIDs) вместе с данными таблиц.
-O, —no-owner — деактивация создания команд, определяющих владельцев объектов в базе данных.
-s, —schema-only —добавление в выгрузку только схемы данных, без самих данных.
-S <пользователь>, —superuser=пользователь — учетная запись привилегированного пользователя, которая должна использоваться для отключения триггеров.
-t <таблица>, —table=таблица — активация выгрузки определенной таблицы.
-T <таблица>, —exclude-table=таблица —исключение из выгрузки определенной таблицы.
-v, —verbose — режим подробного логирования.
-V, —version — вывод версии pg_dump.
-Z 0..9, —compress=0..9 — установка уровня сжатия данных. 0 — сжатие выключено.
Утилита pg_dumpall
Утилита pg_dumpall реализует резервное копирование всего экземпляра (кластера или инстанса) базы данных без указания конкретной базы данных на инстансе. По принципу схожа с pg_dump. Добавим, что только утилиты pg_dump и pg_dumpall предоставляют возможность создания логической копии данных, остальные утилиты, рассматриваемые в этой статье, позволяют создавать только бинарные копии.
# pg_dumpall > /tmp/instance.bak
Чтобы сразу сжать резервную копию экземпляра базы данных, нужно передать вывод на архиватор gzip:
# pg_dumpall | gzip > /tmp/instance.tar.gz
Ниже приведены параметры, с которыми может вызываться утилита pg_dumpall.
-d <имя_бд>, —dbname=имя_бд — имя базы данных.
-h <сервер>, —host=сервер — имя сервера.
-p <порт>, —port=порт — TCP-порт, на который принимаются подключения.
-U <пользователь>, —username=пользователь — имя пользователя для подключения.
-w, —no-password — деактивация требования ввода пароля.
-W, —password — активация требования ввода пароля.
—role=<имя роли> — роль, от имени которой генерируется резервная копия.
-a, —data-only — создание резервной копии без схемы данных.
-c, —clean — добавление операторов DROP перед операторами CREATE.
-f <имя_файла>, —file=имя_файла — активация направления вывода в указанный файл.
-g, —globals-only — выгрузка глобальных объектов без баз данных.
-o, —oids — выгрузка идентификаторов объектов (OIDs) вместе с данными таблиц.
-O, —no-owner — деактивация генерации команд, устанавливающих принадлежность объектов, как в исходной базе данных.
-r, —roles-only — выгрузка только ролей без баз данных и табличных пространств.
-s, —schema-only — выгрузка только схемы без самих данных.
-S <имя_пользователя>, —superuser=имя_пользователя — привилегированный пользователь, используемый для отключения триггеров.
-t, —tablespaces-only — выгрузка табличных пространства без баз данных и ролей.
-v, —verbose — режим подробного логирования.
-V (—version — вывод версии утилиты pg_dumpall.
Утилита pg_restore
Утилита позволяет восстанавливать данные из резервных копий. Например, чтобы восстановить только определенную БД (в нашем примере zabbix), нужно запустить эту утилиту с параметром -d:
# pg_restore -d zabbix /tmp/zabbix.bak
Чтобы этой же утилитой восстановить определенную таблицу, нужно использовать ее с параметром -t:
# pg_restore -a -t history /tmp/zabbix.bak
Также утилитой pg_restore можно восстановить данные из бинарного или архивного файла. Соответственно:
# pg_restore -Fc zabbix.bak
# pg_restore -Ft zabbix.tar
При восстановлении можно одновременно создать новую базу:
# pg_restore -Ft -С zabbix.tar
Восстановить данные из дампа также возможно при помощи psql:
# psql zabbix < /tmp/zabbix.dump
Если для подключения нужно авторизоваться, вводим следующую команду:
# psql -U zabbix -W zabbix < /tmp/zabbix.dump
Ниже приведен синтаксис утилиты pg_restore.
-h <сервер>, —host=сервер — имя сервера, на котором работает база данных.
-p <порт>, —port=порт — TCP-порт, через база данных принимает подключения.
-U <пользователь>, —username=пользователь — имя пользователя для подключения..
-w, —no-password — деактивация требования ввода пароля.
-W, —password — активация требования ввода пароля.
—role=имя роли — роль, от имени которой выполняется восстановление резервная копия.
<имя_файла> — расположение восстанавливаемых данных.
-a, —data-only — восстановление данных без схемы.
-c, —clean — добавление операторов DROP перед операторами CREATE.
-C, —create — создание базы данных перед запуском процесса восстановления.
-d <имя_бд>, —dbname=имя_бд — имя целевой базы данных.
-e, —exit-on-error — завершение работы в случае возникновения ошибки при выполнении SQL-команд.
-f <имя_файла>, —file=имя_файла — файл для вывода сгенерированного скрипта.
-F <формат>, —format=формат — формат резервной копии. Допустимые форматы:
- p, plain — формирует текстовый SQL-скрипт;
- c, custom — формирует резервную копию в архивном формате;
- d, directory — формирует копию в directory-формате;
- t, tar — формирует копию в формате tar.
-I <индекс>, —index=индекс — восстановление только заданного индекса.
-j <число-заданий>, —jobs=число-заданий — запуск самых длительных операций в нескольких параллельных потоках.
-l, —list) — активация вывода содержимого архива.
-L <файл-список>, —use-list=файл-список — восстановление из архива элементов, перечисленных в файле-списке в соответствующем порядке.
-n <пространство_имен>, —schema=схема — восстановление объектов в указанной схеме.
-O, —no-owner — деактивация генерации команд, устанавливающих владение объектами по образцу исходной базы данных.
-P <имя-функции(тип-аргумента[, …])>, —function=имя-функции(тип-аргумента[, …]) — восстановление только указанной функции.
-s, —schema-only — восстановление только схемы без самих данных.
-S <пользователь>, —superuser=пользователь — учетная запись привилегированного пользователя, используемая для отключения триггеров.
-t <таблица>, —table=таблица — восстановление определенной таблицы.
-T <триггер>, —trigger=триггер — восстановление конкретного триггера.
-v, —verbose — режим подробного логирования.
-V, —version — вывод версии утилиты pg_restore.
Утилита pg_basebackup
Утилитой pg_basebackup можно выполнять резервное копирования работающего кластера баз данных PostgreSQL. Результирующий бинарный файл можно использовать для репликации или восстановления на определенный момент в прошлом. Утилита создает резервную копию всего экземпляра базы данных и не дает возможности создавать слепки данных отдельных сущностей. Подключение pg_basebackup к PostgreSQL выполняется при помощи протокола репликации с полномочиями суперпользователя или с правом REPLICATION.
Для выполнения резервного копирования локальной базы данных достаточно передать утилите pg_basebackup параметр -D, обозначающий директорию, в которой будет сохранена резервная копия:
# pg_basebackup -D /tmp
Чтобы создать сжатые файлы из табличных пространств, добавим параметры -Ft и -z:
# pg_basebackup -D /tmp -Ft -z
То же самое, но со сжатием bzip2 и для экземпляра базы с общим табличным пространством:
# pg_basebackup -D /tmp -Ft | bzip2 > backup.tar.bz2
Ниже приведен синтаксис утилиты pg_basebackup.
-d <строка_подключения>, —dbname=строка_подключения — определение базы данных в виде строки для подключения.
-h <сервер>, —host=сервер — имя сервера с базой данных.
-p <порт>, —port=порт — TCP-порт, через база данных принимает подключения.
-s <интервал>, —status-interval=интервал — количество секунд между отправками статусных пакетов.
-U <пользователь>, —username=пользователь — установка имени пользователя для подключения.
-w, —no-password — отключение запроса на ввод пароля.
-W, —password — принудительный запрос пароля.
-V, —version — вывод версии утилиты pg_basebackup.
-?, —help — вывод справки по утилите pg_basebackup.
-D каталог, —pgdata=каталог — директория записи данных.
-F <формат>, —format=формат — формат вывода. Допустимые варианты:
- p, plain — значение для записи выводимых данных в текстовые файлы;
- t, tar — значение, указывающее на необходимость записи в целевую директорию в формате tar.
-r <скорость_передачи>, —max-rate=скорость_передачи — предельная скорость передачи данных в Кб/с.
-R, —write-recovery-conf — записать минимальный файл recovery.conf в директорию вывода.
-S <имя_слота>, —slot=имя_слота — задание слота репликации при использовании WAL в режиме потоковой передачи.
-T <каталог_1=каталог_2>, —tablespace-mapping=каталог_1=каталог_2 — активация миграции табличного пространства из одного каталога в другой каталог при копировании.
—xlogdir=каталог_xlog — директория хранения журналов транзакций.
-X <метод>, —xlog-method=метод — активация вывода файлов журналов транзакций WAL в резервную копию на основе следующих методов:
- f, fetch — включение режима сбора файлов журналов транзакций при окончании процесса копирования;
- s, stream — включение передачи журнала транзакций в процессе создания резервной копии.
-z, —gzip — активация gzip-сжатия результирующего tar-файла.
-Z <уровень>, —compress=уровень — определение уровня сжатия механизмом gzip.
-c , —checkpoint=fast|spread — активация режима реперных точек.
-l <метка>, —label=метка — установка метки резервной копии.
-P, —progress — активация в вывод отчета о прогрессе.
-v, —verbose — режим подробного логирования.
Утилита wal-g
Wal-g — утилита для резервного копирования и восстановления базы данных PostgreSQL. При помощи wal-g можно выполнять сохранение резервных копий на хранилищах S3 или просто на файловой системе. Ниже мы разберем установку, настройку и работу с утилитой. Покажем как выполнить резервное копирование в Объектное хранилище S3 от Selectel.
Создадим пользователя для облачного хранилища, учетные данные которого будем потом использовать для сохранения резервной копии. Перейдем в меню Пользователи и нажмем кнопку Создать пользователя:
Дополнительную информацию можно получить в нашей Базе знаний. Первую часть логина изменить нельзя — это идентификатор пользователя в панели управления. Вторая часть логина задается произвольно. Например, 123456_wal-g:
Теперь перейдем к установке wal-g. Скачаем готовый установочный пакет из репозитория на github.com, распакуем и скопируем папку содержающую исполняемые файлы:
# cd /tmp
# curl -L "https://github.com/wal-g/wal-g/releases/download/v0.2.19/wal-g.linux-amd64.tar.gz" -o "wal-g.linux-amd64.tar.gz
# tar -xzf wal-g.linux-amd64.tar.gz
# mv wal-g /usr/local/bin/
Заполним конфигурационный файл wal-g и изменим его владельца на учетную запись postgres:
# cat > //6ef4e6a1-9d49-47ac-bfed-170f67a815cf.selcdn.net/var/lib/pgsql/.walg.json << EOF
{
"WALG_S3_PREFIX": "s3://container",
"AWS_ENDPOINT": "https://s3.selcdn.ru"
"AWS_ACCESS_KEY_ID": "123456_wal-g",
"AWS_SECRET_ACCESS_KEY": "password",
"WALG_COMPRESSION_METHOD": "brotli",
"WALG_DELTA_MAX_STEPS": "5",
"PGDATA": "/var/lib/pgsql/data",
"PGHOST": "/var/run/postgresql/.s.PGSQL.5432"
}
EOF
# chown postgres: /var/lib/pgsql/.walg.json
Далее настроим автоматизированное создание резервных копий в PostgreSQL и перезагрузим процессы базы данных:
# echo "wal_level=replica" >> /var/lib/pgsql/data/postgresql.conf
# echo "archive_mode=on" >> /var/lib/pgsql/data/postgresql.conf
# echo "archive_command='/usr/local/bin/wal-g wal-push \"%p\" >> /var/log/postgresql/archive_command.log 2>&1' " >> /var/lib/pgsql/data/postgresql.conf
# echo “archive_timeout=60” >> /var/lib/pgsql/data/postgresql.conf
# echo "restore_command='/usr/local/bin/wal-g wal-fetch \"%f\" \"%p\" >> /var/log/postgresql/restore_command.log 2>&1' " >> /var/lib/pgsql/data/postgresql.conf
# killall -s HUP postgres
Теперь проверим корректность проведения настроек и загрузим резервную копию в хранилище:
# su - postgres -c '/usr/local/bin/wal-g backup-push /var/lib/pgsql/data'
После выполнения процесса резервного копирования, в созданном контейнере появится директория с резервными копиями баз данных:
Такой процесс в продакшене может выполняться при помощи планировщика заданий на регулярной основе.
Утилита pgAdmin
Управлять созданием резервных копий возможно также и в графическом интерфейсе. Для этого мы будем использовать утилиту pgAdmin (в примере — работа с утилитой на локальном устройстве, но то же самое можно сделать на сервере). Актуальную версию для Windows или другой поддерживаемой ОС можно свободно скачать с официального сайта.
После скачивания утилиту нужно установить и запустить. Она работает в виде веб-приложения через браузер.
После добавления сервера с базой данных, в интерфейсе появляется возможность создания резервной копии. Аналогичным образом здесь же можно выполнить восстановление из резервной копии.
После выполнения команды Backup резервная копия сохраняется в заранее определенную директорию.
Работа с облачной базой данных в панели управления Selectel
В облачной платформе Selectel есть возможность создавать управляемые базы данных (Managed Databases). Такие БД разворачиваются в несколько кликов мыши, однако, их основные преимущества — автоматическое резервное копирование, отказоустойчивость, быстрое масштабирование и управление различными характеристиками из графического интерфейса. Ниже мы создадим экземпляр управляемой базы данных, создадим резервную копию базы данных на виртуальном сервере и восстановим ее в управляемую базу данных.
Чтобы создать управляемую базу данных, перейдем в меню Базы данных и нажмем кнопку Создать кластер:
Появится форма создания кластера. Здесь можно выбрать версию PostgreSQL, конфигурацию кластера, настройки сети, режим пулинга и размер пула.
Обращаем внимание на блок Резервные копии, в котором указаны частота резервного копирования, время и срок хранения выгрузок. Под капотом используется механизм wal-g, о котором мы писали выше.
Автоматическое создание резервных копий отключить нельзя.
Следующий шаг — создание пользователя, от имени которого мы позже будем обращаться к базе данных. Для этого перейдем на вкладку Пользователи и нажмем на кнопку Создать пользователя.
После этого появится приглашение ввести имя пользователя и пароль. После ввода этих данных нажимаем Сохранить.
Пользователь создан и отображается в списке пользователей.
Теперь создадим базу данных. Для этого перейдем на вкладку Базы данных и нажмем на кнопку Создать базу данных.
Заполняем необходимые поля и нажимаем кнопку Сохранить.
База данных создана и отображается в списке баз данных.
Теперь проверим возможность подключения. Для этого откроем консоль и вводим реквизиты:
# psql "host=192.168.0.3 \
port=6432 \
user=rosella \
dbname=zabbix \
sslmode=disable"
В консоли должно появиться приглашение к вводу SQL-запроса или других управляющих команд.
Выполним резервное копирование при помощи команды pg_dump:
# pg_dump zabbix > /tmp/zabbix.dump
И следом резервное восстановление в созданную управляемую базу данных:
# psql -h 192.168.0.3 -U rosella -d zabbix < /tmp/zabbix.dump
В результате выполнения команды выше мы восстановили резервную копию в управляемую базу данных.
Чтобы воспользоваться восстановлением из резервной копии, которая автоматически создается на платформе Selectel, необходимо нажать на символ с тремя точками. В открывшемся меню нужно нажать на опцию Восстановить. После этого появится модальное окно, в котором можно выбрать резервную копию, а также дату и время, на которое нужно восстановить базу данных. Это так называемый Point-in-Time Recovery из WAL-файлов.
Услуга «Управляемые базы данных в облаке» позволяет перенести существующий кластер PostgreSQL на сервис управляемых баз данных бесшовно и без простоя, обратившись в техническую поддержку. Инженеры Selectel готовы помочь с переносом, а также проконсультировать по всем связанным с этим процессом вопросам.
Заключение
Мы рассмотрели возможности выполнения резервного копирования и показали отличия утилит pg_dump, pg_dumpall, pg_restore, pg_basebackup и wal-g. Вы увидели как можно создать управляемую базу данных, чтобы переложить часть административных задач на облачного провайдера.
Узнать подробнее об управляемых базах данных можно в документации Selectel.
Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров14K
Базы данных — замечательный инструмент, без которого сложно представить современное приложение. И как бы сильно я ни любил использовать БД, я просто ненавижу писать SQL-запросы. Поэтому однажды задался вопросом, кто мог бы делать это за меня, при этом несильно теряя в качестве. И, конечно же, на ум пришёл мой AI-друг. Тогда остаётся одна проблема, как скормить ему мою БД. Тут на помощь приходит резервное копирование! Выполнив все необходимые задачи, я решил углубиться в тему и поделиться с Хабром, какие вообще есть виды и, конечно, сравнить их между собой.
▍ Инструменты для работы с резервным копированием PostgreSQL
Для начала рассмотрим несколько CLI-инструментов, которые позволят нам работать с резервными копиями
▍ pg_dump
pg_dump <название БД>
Стандартная утилита для создания копий. Для лучшего понимания предлагаю вкратце ознакомиться с тем, как она реализована. Рассмотрим шаги внутренней работы:
- Подключение к БД: авторизация такая же, как и у обычного клиента, используется библиотека С — libpq.
- Чтение схемы: посредством запросов
SELECT * FROM ...
- Создание структуры: строится дерево объектов, которое затем преобразуется в соответствующий формат.
- Сохранение данных: отдельно сохраняются данные из БД.
- Запись в конечный файл: в зависимости от типа резервной копии сохраняется либо в бинарник, либо в текстовый файл всю копию, включающую структуру и данные.
Ключи:
-U
имя пользователя-h
хост-p
порт-F
формат дампа: p (plain), c (custom), d (directory), t (tar)-f
путь к файлу вывода-d
название базы данных--table=имя
снять дамп только одной таблицы--schema=имя
только определённая схема-v
подробный вывод--data-only
только данные, без схемы--schema-only
только схема, без данных--inserts
использовать INSERT вместо COPY
▍ pg_dumpall
pg_dumpall
По сути тот же pg_dump
, но делает дамп сразу всего кластера. Однако отметим сразу, что данная утилита не поддерживает указание форматов, копия создаётся только в формате SQL. Давайте начнём также с реализации:
- Подключение к БД: аналогично
pg_dump
. - Получение имён всех БД: посредством запросов
SELECT datname FROM pg_database WHERE datallowconn
. - Сохранение всех глобальных объектов.
- Получение списка БД: вызывается команда
pg_dump
для каждой базы. - Создание общего файла дампа: все дампы объединяются в один поток вывода и записываются в файл аналогично
pg_dump
.
Ключи:
-U
имя пользователя-h
хост-p
порт-f
файл вывода-v
подробный вывод--globals-only
только роли и настройки--roles-only
только роли--data-only
только данные
▍ pg_restore
pg_restore <путь к дампу>
Инструмент для восстановления БД из дампа. Под капотом всё просто:
- Чтение копии: считывается TOC (table of contents), определяется, в каком порядке необходимо восстанавливать данные.
- Фильтрация: происходит по определённым параметрам, которые задаются при запуске утилиты.
- Соединение с БД: посредством знакомой нам уже libpq. Также, если выбран многопоточный режим, то для каждого потока будет отдельное соединение.
- Восстановление: исполнение SQL-команд.
Ключи:
-U
имя пользователя-h
хост-p
порт-d
целевая база данных-F
формат (обычно не нужен — определяется автоматически)-v
подробный вывод-c
удалить объекты перед созданием-C
создать базу перед восстановлением-j N
параллельное восстановление (N — число потоков)--list
показать содержимое дампа--schema
восстановить только указанную схему--table
восстановить только указанную таблицу
Отлично! С инструментами мы познакомились, теперь перейдём к самому интересному.
▍ Форматы дампов
Ради этого мы тут все и собрались. Давайте погрузимся в возможности резервных копий. До этого вы могли наблюдать непонятный ключ -F
, который позволяет указать формат. Всего в PostgreSQL есть 4 формата:
- plain (стандартный)
- custom
- tar
- dir
Теперь хочется познакомиться с каждым поближе, но перед этим обсудим одну очень важную для понимания разницы между форматами вещь — TOC.
TOC — Table of Contents, оглавление резервной копии, которое отражает, какой контент содержится в дампе, в каком порядке его нужно восстанавливать и какие есть зависимости между объектами.
▍ plain
Дамп представляет собой один текстовый SQL-файл. Данный формат позволяет редактировать копию, а также удобно переходить между СУБД. Реализация представляет собой банальное генерирование SQL-команд.
Преимущества:
- Отличный вариант для миграции
- Прозрачность дампа
Недостатки:
- Невозможно выборочное восстановление
- Не поддерживает параллельное восстановление
- Отсутствует сжатие
Пример использования:
pg_dump -Fp demo -f demo-plain
Здесь ключ -Fp
указывает формат plain. Также можно было вообще не указывать ключ формата, т. к. дефолтно используется plain, но для наглядности прописан.
Давайте посмотрим на то, как отработает наш дамп. Здесь и далее для примера взята БД demo, последняя версия размером 2.5гб:
time pg_dump -Fp demo -f demo-plain
Executed in 8.42 secs fish external
usr time 1.33 secs 231.00 micros 1.33 secs
sys time 1.63 secs 120.00 micros 1.63 secs
ls -lh | grep "demo-plain"
-rw-r--r--. 1 net0pyr net0pyr 888M апр 1 21:03 demo-plain
Если посмотреть на формат файла, то это будет обычный текстовый файл:
file demo-plain
demo-plain: Unicode text, UTF-8 text, with very long lines (307)
P.S. Именно этот формат помог мне скормить моему AI-другу БД.
▍ custom
Резервная копия сохраняется в бинарном формате. Дамп содержит TOC.
Преимущества:
- Выборочное восстановление, можно использовать фильтры для восстановления только частей дампа
- Поддержка параллельного восстановления
- Сжатие
Недостатки:
- Невозможность читать дамп, пока не восстановишь его
Для использования необходимо прописать ключ -Fc
. Пример:
pg_dump -Fc demo -f demo.dump
Также давайте аналогично предыдущему варианту соберём информацию по требуемым для создания дампа ресурсам:
time pg_dump -Fc demo -f demo.dump
Executed in 37.00 secs fish external
usr time 36.40 secs 360.00 micros 36.40 secs
sys time 0.44 secs 187.00 micros 0.44 secs
ls -lh | grep "demo.dump"
-rw-r--r--. 1 net0pyr net0pyr 233M апр 1 20:50 demo.dump
В этот раз формат файла будет бинарный дамп PostgreSQL:
file demo-plain
demo-plain: Unicode text, UTF-8 text, with very long lines (307)
Вы можете отобразить TOC, воспользовавшись командой pg_restore
:
pg_restore --list demo.dump
▍ tar
Дамп сохраняется как tar-архив, который содержит файлы с данными, SQL-файл со структурой и TOC.
Преимущества:
- Удобство транспортировки
- Есть возможность восстановиться с помощью
tar -xvf
без использования pg_restore - Выборочное восстановление
Недостатки:
- Отсутствует сжатие
- Не поддерживает параллельное восстановление
Аналогично предыдущим форматам схема использования:
pg_dump -Ft demo -f demo-tar
И по классике взглянем на результаты создания дампа в tar-формате:
time pg_dump -Ft demo -f demo-tar
Executed in 10.77 secs fish external
usr time 1.57 secs 77.00 micros 1.57 secs
sys time 1.53 secs 982.00 micros 1.53 secs
ls -lh | grep "demo-tar"
-rw-r--r--. 1 net0pyr net0pyr 888M апр 1 20:59 demo-tar
Заинтересованный читатель, скорее всего, задался вопросом, что именно лежит в этом архиве. Давайте посмотрим:
tar -xvf demo-tar && ls -lh
total 1.8G
-rw------- 1 net0pyr net0pyr 631 Apr 21 16:14 3508.dat
-rw------- 1 net0pyr net0pyr 17K Apr 21 16:14 3509.dat
-rw------- 1 net0pyr net0pyr 204M Apr 21 16:15 3510.dat
-rw------- 1 net0pyr net0pyr 79M Apr 21 16:15 3511.dat
-rw------- 1 net0pyr net0pyr 26M Apr 21 16:15 3512.dat
-rw------- 1 net0pyr net0pyr 21K Apr 21 16:15 3514.dat
-rw------- 1 net0pyr net0pyr 297M Apr 21 16:15 3515.dat
-rw------- 1 net0pyr net0pyr 284M Apr 21 16:15 3516.dat
-rw-r--r-- 1 net0pyr net0pyr 888M Apr 21 16:15 demo-tar
-rw------- 1 net0pyr net0pyr 33K Apr 21 16:15 restore.sql
-rw------- 1 net0pyr net0pyr 41K Apr 21 16:14 toc.dat
Мы можем наблюдать toc.dat
— наш TOC, restore.sql
— SQL-скрипт для восстановления, 35[08-16].dat
— файлы с данными из БД. Таким образом мы можем восстановиться из дампа только с утилитой tar
.
▍ dir
Вот мы и дошли до последнего формата. Я специально оставил его на десерт, потому что он позиционирует себя как «не такой как все», предлагая уникальные возможности. Давайте подробнее разберёмся. Сам дамп представляет собой директорию, содержащую сжатые данные и TOC.
Преимущества:
- Есть поддержка параллельного дампа и восстановления
- Есть сжатие
- Быстро работает с большими объёмами данных
Недостатки:
- Неудобные хранение и транспортировка
Обычное использование:
pg_dump -Fd demo -f demo-dir-0
Но мы ведь уже знаем, что здесь есть возможность параллельного дампа, в этом нам поможет ключ -j
. Для пяти потоков команда будет выглядеть следующим образом:
pg_dump -Fd demo -j 5 -f demo-dir-5
Перейдём к самому интересному — сравнению результатов отработки дампа:
time pg_dump -Fd demo -f demo-dir-0
Executed in 36.94 secs fish external
usr time 36.23 secs 380.00 micros 36.22 secs
sys time 0.36 secs 197.00 micros 0.36 secs
ls -lh demo-dir-0
итого 233M
-rw-r--r--. 1 net0pyr net0pyr 321 апр 1 20:56 4437.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 5,6K апр 1 20:56 4438.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 54M апр 1 20:56 4439.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 20M апр 1 20:56 4440.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 3,3M апр 1 20:56 4441.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 3,0K апр 1 20:56 4443.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 69M апр 1 20:56 4444.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 87M апр 1 20:56 4445.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 40K апр 1 20:56 toc.dat
Обратим внимание на время 37 секунд. Также хочется остановиться на структуре каталога. Мы видим `toc.dat`и 8 сжатых файлов с данными, что позволяет сохранить небольшой размер копии. Теперь для сравнения посмотрим на дамп с 5 потоками:
time pg_dump -Fd demo -j 5 -f demo-dir-5
Executed in 17.69 secs fish external
usr time 53.16 secs 0.61 millis 53.16 secs
sys time 0.57 secs 1.24 millis 0.56 secs
ls -lh demo-dir-5
итого 233M
-rw-r--r--. 1 net0pyr net0pyr 321 апр 1 20:55 4437.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 5,6K апр 1 20:55 4438.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 54M апр 1 20:55 4439.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 20M апр 1 20:55 4440.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 3,3M апр 1 20:55 4441.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 3,0K апр 1 20:55 4443.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 69M апр 1 20:55 4444.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 87M апр 1 20:55 4445.dat.gz
-rw-r--r--. 1 net0pyr net0pyr 40K апр 1 20:55 toc.dat
Мы получили аналогичный результат, но уже за 18 секунд, т. е. в 2 раза быстрее.
▍ Выводы
Дорогой читатель, вот мы и познакомились с форматами резервных копий в PostgreSQL. Но мы не можем закончить на этом, в конце хочется структурировать все те измерения, что мы произвели, чтобы иметь под рукой шпаргалку, которая позволит выбрать самый подходящий формат для наших будущих задач.
© 2025 ООО «МТ ФИНАНС»
Telegram-канал со скидками, розыгрышами призов и новостями IT 💻
Обновлено:
Опубликовано:
Тематические термины: PostgreSQL, SQL
В данной инструкции рассмотрены варианты и примеры создания резервных копий и восстановления баз СУБД PostgreSQL.
Создание копий
Базовая команда
Пользователь и пароль
Сжатие данных
Скрипт
На удаленном сервере
Дамп определенной таблицы
Каждая таблица в свой файл
Для определенной схемы
Только схемы
Только данные
pgAdmin
Не текстовые форматы
pg_basebackup
pg_dumpall (все базы данных)
Восстановление
Базовая команда
С авторизацией
Из файла gz
Определенную базу
Определенную таблицу
С помощью pgAdmin
pg_restore (бинарные бэкапы)
Работа с CSV
Возможные проблемы
Input file appears to be a text format dump. please use psql
No matching tables were found
Too many command-line arguments
Aborting because of server version mismatch
No password supplied
Неверная команда \
Все команды, которые приводятся ниже, должны выполняться из командной строки. В Linux — это окно терминала, в Windows — командная строка (cmd.exe) с переходом в папку установки PostgreSQL.
Создание резервных копий
Базовая команда
Синтаксис:
pg_dump <параметры> <имя базы> > <файл, куда сохранить дамп>
Пример:
pg_dump users > /tmp/users.dump
Также путь к файлу можно указать с помощью опции -f:
pg_dump users -f /tmp/users.dump
Пользователь и пароль
Если резервная копия выполняется не от учетной записи postgres, необходимо добавить опцию -U с указанием пользователя:
pg_dump -U dmosk -W users > /tmp/users.dump
* где dmosk — имя учетной записи; опция W потребует ввода пароля.
Сжатие данных
Для экономии дискового пространства или более быстрой передачи по сети можно сжать наш архив. Можно для этого использовать разные подходы — использовать опцию -Z с указанием уровня компрессии от 0 до 9 или передать результат архиватору gzip. Рассмотрим оба примера.
а) С помощью опции -Z:
pg_dump -Z9 users > users.sql.gz
б) С использованием gzip:
pg_dump users | gzip > users.sql.gz
В обоих случаях будет использоваться gzip и перед восстановлением данных необходимо будет извлечь архив с помощью gunzip. Подробнее об этом ниже.
Скрипт для автоматического резервного копирования
Рассмотрим 2 варианта написания скрипта для резервирования баз PostgreSQL в системах Linux, а также приведем пример скрипта для Powershell (Windows).
Linux (bash)
Первый вариант — запуск скрипта от пользователя root для резервирования одной базы. Второй — запуск от пользователя postgres для резервирования всех баз, созданных в СУБД.
Для начала, создадим каталог, в котором разместим скрипт, например:
mkdir /scripts
И сам скрипт:
vi /scripts/postgresql_dump.sh
Вариант 1. Запуск от пользователя root; одна база.
#!/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
PGPASSWORD=password
export PGPASSWORD
pathB=/backup
dbUser=dbuser
database=db
find $pathB \( -name «*-1[^5].*» -o -name «*-[023]?.*» \) -ctime +61 -delete
pg_dump -U $dbUser $database | gzip > $pathB/pgsql_$(date «+%Y-%m-%d»).sql.gz
unset PGPASSWORD
* где password — пароль для подключения к postgresql; /backup — каталог, в котором будут храниться резервные копии; dbuser — имя учетной записи для подключения к БУБД; pathB — путь до каталога, где будут храниться резервные копии.
* данный скрипт сначала удалит все резервные копии, старше 61 дня, но оставит от 15-о числа как длительный архив. После при помощи утилиты pg_dump будет выполнено подключение и резервирование базы db. Пароль экспортируется в системную переменную на момент выполнения задачи.
Для запуска резервного копирования по расписанию, сохраняем скрипт в файл, например, /scripts/postgresql_dump.sh и создаем задание в планировщике:
crontab -e
3 0 * * * /scripts/postgresql_dump.sh
* наш скрипт будет запускаться каждый день в 03:00.
Вариант 2. Запуск от пользователя postgres; все базы.
#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
pathB=/backup/postgres
find $pathB \( -name «*-1[^5].*» -o -name «*-[023]?.*» \) -ctime +61 -delete
for dbname in `echo «SELECT datname FROM pg_database;» | psql | tail -n +3 | head -n -2 | egrep -v ‘template0|template1|postgres’`; do
pg_dump $dbname | gzip > $pathB/$dbname-$(date «+%Y-%m-%d»).sql.gz
done;
* где /backup — каталог, в котором будут храниться резервные копии; pathB — путь до каталога, где будут храниться резервные копии.
* данный скрипт сначала удалит все резервные копии, старше 61 дня, но оставит от 15-о числа как длительный архив. После найдет все созданные в СУБД базы, кроме служебных и при помощи утилиты pg_dump будет выполнено резервирование каждой найденной базы. Пароль нам не нужен, так как по умолчанию, пользователь postgres имеет возможность подключаться к базе без пароля.
Необходимо убедиться, что у пользователя postgre будет разрешение на запись в каталог назначения, в нашем примере, /backup/postgres.
Зададим в качестве владельца файла, пользователя postgres:
chown postgres:postgres /scripts/postgresql_dump.sh
Для запуска резервного копирования по расписанию, сохраняем скрипт в файл, например, /scripts/postgresql_dump.sh и создаем задание в планировщике:
crontab -e -u postgres
* мы откроем на редактирование cron для пользователя postgres.
3 0 * * * /scripts/postgresql_dump.sh
* наш скрипт будет запускаться каждый день в 03:00.
Права и запуск
Разрешаем запуск скрипта, как исполняемого файла:
chmod +x /scripts/postgresql_dump.sh
Единоразово можно запустить задание на выполнение резервной копии:
/scripts/postgresql_dump.sh
… или от пользователя postgres:
su — postgres -c «/scripts/postgresql_dump.sh»
Windows (Powershell)
Данный скрипт создаст бэкапы для всех баз, кроме служебных:
$Env:PGPASSWORD = ‘password’;
$DateStr = (Get-Date).ToString(«yyyy-MM-dd»)
$BackupPath = ‘C:\TmpBackup’
psql -Atc «SELECT datname FROM pg_database;» | foreach {
if ($_ -notmatch ‘postgres|template1|template0’) {
pg_dump $_ > $BackupPath\$_.$DateStr.sql
}
}
* все резервные копии будут размещены в каталоге C:\TmpBackup.
На удаленном сервере
Если сервер баз данных находится на другом сервере, просто добавляем опцию -h:
pg_dump -h 192.168.0.15 users > /tmp/users.dump
* необходимо убедиться, что сама СУБД разрешает удаленное подключение. Подробнее читайте инструкцию Как настроить удаленное подключение к PostgreSQL.
Дамп определенной таблицы
Запускается с опцией -t <table> или —table=<table>:
pg_dump -t students users > /tmp/students.dump
* где students — таблица; users — база данных.
Если наша таблица находится в определенной схеме, то она указывается вместе с ней, например:
pg_dump -t public.students users > /tmp/students.dump
* где public — схема; students — таблица; users — база данных.
Размещение каждой таблицы в отдельный файл
Также называется резервированием в каталог. Данный способ удобен при больших размерах базы или необходимости восстанавливать отдельные таблицы. Выполняется с ипользованием ключа -d:
pg_dump -d customers > /tmp/folder
* где /tmp/folder — путь до каталога, в котором разместяться файлы дампа для каждой таблицы.
Для определенной схемы
В нашей базе может быть несколько схем. Если мы хотим сделать дамп только для определенной схемы, то используем опцию -n, например:
pg_dump -n public peoples > /tmp/peoples.public.sql
* в данном примере мы заархивируем схему public базы данных peoples.
Только схемы (структуры)
Для резервного копирования без данных (только таблицы и их структуры):
pg_dump —schema-only users > /tmp/users.schema.dump
Также, внутри каждой базы могут быть свои схемы с данными. Если нам нужно сделать дамп именно той схемы, которая внутри базы, используем ключ -n:
pg_dump —schema-only users -n production > /tmp/users.schema_production.dump
* в данном примере мы создадим дамп структуры базы данных users только для схемы production.
Или полный дамп с данными для схемы внутри базы данных:
pg_dump users -n production > /tmp/users.production.dump
Только данные
pg_dump —data-only users > /tmp/users.data.dump
Использование pgAdmin
Данный метод хорошо подойдет для компьютеров с Windows и для быстрого создания резервных копий из графического интерфейса.
Запускаем pgAdmin — подключаемся к серверу — кликаем правой кнопкой мыши по базе, для которой хотим сделать дамп — выбираем Резервная копия:
В открывшемся окне выбираем путь для сохранения данных и настраиваемый формат:
При желании, можно изучить дополнительные параметры для резервного копирования:
После нажимаем Резервная копия — ждем окончания процесса и кликаем по Завершено.
Не текстовые форматы дампа
Другие форматы позволяют делать частичное восстановление, работать в несколько потоков и сжимать данные.
Бинарный с компрессией:
pg_dump -Fc users > users.bak
Тарбол:
pg_dump -Ft users > users.tar
Directory-формат:
pg_dump -Fd users > users.dir
Использование pg_basebackup
Утилита pg_basebackup идет в комплекте с СУБД и позволяет создать резервную копию кластера PostgreSQL. При этом, с ее помощью нельзя снять дамп определенной базы — только целиком все данные и конфигурационные файлы. Для восстановления информации нужно будет разместить полученные файлы в рабочий каталог СУБД.
Пример команды:
pg_basebackup -D /backup
* в данном примере создается резервная копия локального сервера с сохранением данных в каталог /backup.
Если мы хотим забрать данные, подключившись к удаленному серверу, нам нужно обеспечить доступ с правами replication. Для этого в файл pg_hba.conf добавляем строку:
…
host replication all 192.168.0.15/32 trust
…
* где 192.168.0.15 — компьютер, на котором мы будем запускать pg_basebackup.
Не забываем перезапустить службу postgresql, например:
systemctl restart postgresql-14
Теперь можно снимать бэкап кластера:
pg_basebackup -d postgresql://postgres@node1 -D /backup
* в данном примере создается резервная копия для сервера node1 с сохранением ее в каталог /backup.
** обратите внимание, что у нас должен быть возможность подключения к серверу node1 под пользователем postgres с компьютера, где мы запускаем pg_basebackup (для этого мы и меняли настройку в файле pg_hba.conf).
pg_dumpall
Данная утилита делает выгрузку всех баз данных, в том числе системных. На выходе получаем файл для восстановления в формате скрипта.
pg_dumpall > cluster.bak
Утилиту удобно использовать с ключом -g (—globals-only) — выгрузка только глобальных объектов (ролей и табличных пространств).
Для создание резервного копирования со сжатием:
pg_dumpall | gzip > cluster.tar.gz
Восстановление
Нам может понадобиться удалить старую базу. Это можно сделать с помощью SQL-запроса:
=# DROP DATABASE users;
* в данном примере будет удалена база с именем users.
Убедитесь, что удаляете базу с нужным названием на правильном сервере.
Если получаем ошибку на подобие:
ERROR: database «users» is being accessed by other users
… значит база используется приложением. Либо останавливаем его, либо выполняем:
=# SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = ‘users’; DROP DATABASE users;
Также может понадобиться создать базу данных (не потребуется, если делали дамп с опцией -C). Для этого используем SQL-запрос:
=# CREATE DATABASE users WITH ENCODING=’UTF-8′;
* где users — имя базы; UTF-8 — используемая кодировка.
Если мы получим ошибку:
ERROR: encoding «UTF8» does not match locale «en_US»
DETAIL: The chosen LC_CTYPE setting requires encoding «LATIN1».Указываем больше параметров при создании базы:
CREATE DATABASE users WITH OWNER ‘postgres’ ENCODING ‘UTF8’ LC_COLLATE = ‘ru_RU.UTF-8’ LC_CTYPE = ‘ru_RU.UTF-8’ TEMPLATE = template0;
Базовая команда
Синтаксис:
psql <имя базы> < <файл с дампом>
Пример:
psql users < /tmp/users.dump
С авторизацией
При необходимости авторизоваться при подключении к базе вводим:
psql -U dmosk -W users < /tmp/users.dump
* где dmosk — имя учетной записи; опция W потребует ввода пароля.
Из файла gz
Сначала распаковываем файл, затем запускаем восстановление:
gunzip users.sql.gz
psql users < users.sql
Или одной командой:
zcat users.sql.gz | psql users
Определенную базу
Если резервная копия делалась для определенной базы, запускаем восстановление:
psql users < /tmp/database.dump
Если делался полный дамп (всех баз), восстановить определенную можно при помощи утилиты pg_restore с параметром -d:
pg_restore -d users cluster.bak
Определенную таблицу
Если резервная копия делалась для определенной таблицы, можно просто запустить восстановление:
psql users < /tmp/students.dump
Если делался полный дамп, восстановить определенную таблицу можно при помощи утилиты pg_restore с параметром -t:
pg_restore -a -t students users.dump
С помощью pgAdmin
Запускаем pgAdmin — подключаемся к серверу — кликаем правой кнопкой мыши по базе, для которой хотим восстановить данные — выбираем Восстановить:
Выбираем наш файл с дампом:
И кликаем по Восстановить:
Использование pg_restore
Данная утилита предназначена для восстановления данных не текстового формата (в одном из примеров создания копий мы тоже делали резервную копию не текстового формата).
Из бинарника:
pg_restore -Fc users.bak
Из тарбола:
pg_restore -Ft users.tar
С созданием новой базы:
pg_restore -Ft -C users.tar
Мы можем использовать опцию d для указания подключения к конкретному серверу и базе, например:
pg_restore -d «postgresql://dmosk_user:dmosk_pass@localhost/dmosk_base» -Fc users.bak
* в данном примере мы подключимся к локальной базе (localhost) с названием dmosk_base от пользователя dmosk_user с паролем dmosk_pass.
Работа с CSV
Мы можем переносить данные с использованием файлов csv. Это нельзя назвать напрямую резервным копированием, но в рамках данной инструкции материал будет интересен.
Создание файла CSV (экспорт)
Пример запроса (выполняется в командной оболочке SQL):
> COPY (SELECT * FROM public.users WHERE name LIKE ‘А%’) TO ‘/tmp/users.csv’ WITH CSV DELIMITER ‘;’ HEADER;
* в данном примере мы выгрузим все данные для таблицы users в схеме public, где значение поля name начинается с буквы А. Результат будет сохранен в файл /tmp/users.csv. Также мы указываем, что в качестве разделителя данных нужно использовать точку с запятой и первой строкой сделать заголовок.
Также мы можем сделать выгрузку, но сделать вывод в оболочку и перенаправить его в файл:
psql -d «postgresql://pg_user:pg_pass@localhost:5432/pg_databasename» -c «COPY (SELECT * FROM public.users WHERE name LIKE ‘А%’) TO STDIN WITH CSV DELIMITER ‘;’ HEADER;» > /tmp/users.csv
Импорт данных из файла CSV
Также можно выполнить запрос в оболочке SQL:
> COPY public.users FROM ‘/tmp/test.csv’ DELIMITER ‘;’ CSV HEADER;
Или перенаправить запрос через STDOUT из файла:
psql -d «postgresql://pg_user:pg_pass@localhost:5432/pg_databasename» -c «COPY public.users FROM STDOUT DELIMITER ‘;’ CSV HEADER;» < /tmp/users.csv
* в нашем примере мы выполним импорт данных из ранее созданного файла /tmp/users.csv в таблицу users.
Возможные ошибки
Рассмотрим некоторые проблемы, с которыми можно столкнуться при работе с дампами PostgreSQL.
Input file appears to be a text format dump. please use psql.
Причина: дамп сделан в текстовом формате, поэтому нельзя использовать утилиту pg_restore.
Решение: восстановить данные можно командой psql <имя базы> < <файл с дампом> или выполнив SQL, открыв файл, скопировав его содержимое и вставив в SQL-редактор.
No matching tables were found
Причина: Таблица, для которой создается дамп не существует. Утилита pg_dump чувствительна к лишним пробелам, порядку ключей и регистру.
Решение: проверьте, что правильно написано название таблицы и нет лишних пробелов.
Too many command-line arguments
Причина: Утилита pg_dump чувствительна к лишним пробелам.
Решение: проверьте, что нет лишних пробелов.
Aborting because of server version mismatch
Причина: несовместимая версия сервера и утилиты pg_dump. Может возникнуть после обновления или при выполнении резервного копирования с удаленной консоли.
Решение: нужная версия утилиты хранится в каталоге /usr/lib/postgresql/<version>/bin/. Необходимо найти нужный каталог, если их несколько и запускать нужную версию. При отсутствии последней, установить.
No password supplied
Причина: нет системной переменной PGPASSWORD или она пустая.
Решение: либо настройте сервер для предоставление доступа без пароля в файле pg_hba.conf либо экспортируйте переменную PGPASSWORD (export PGPASSWORD или set PGPASSWORD).
Неверная команда \
Причина: при выполнении восстановления возникла ошибка, которую СУБД не показывает при стандартных параметрах восстановления.
Решение: запускаем восстановление с опцией -v ON_ERROR_STOP=1, например:
psql -v ON_ERROR_STOP=1 users < /tmp/users.dump
Теперь, когда возникнет ошибка, система прекратит выполнять операцию и выведет сообщение на экран.