Backup restore postgresql базы данных с pg_dump

pg_dump - это утилита позволяющая делать бэкап базы данных из postgresql. Она сохраняет в файл набор SQL команд которые полностью воссоздают структуру исходной базы данных. Для последующего восстановления из подобного файла достаточно psql которая почти всегда идет в комплекте с самим postgresql.

С помощью pg_dump, вы можете сделать бэкап базы данных в текущий момент времени, и в дальнейшнейм развернуть его без каких либо проблем. Для тех, кто раньше работал с mysql, pg_dump может показаться весьма знакомым. С mysql в поставке идет аналогичная утилита под названием mysqldump.

В этой небольшой статье мы рассмотрим несколько полезных примеров использования pg_dump.

Резервное копирование базы данных

Бэкап одной базы данных

В примере ниже, мы сделаем резервную копию базы данных под названием thebosharu, принадлежащей пользователю bosha и сохраним её в файл thebosharu.sql:

pg_dump -U bosha thebosharu -f thebosharu.sql

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

Вот часть дампа моей базы данных, чтобы вы понимали что в нем находится:

--
-- Name: auth_user; Type: TABLE; Schema: public; Owner: bosha; Tablespace:
--

CREATE TABLE auth_user (
    id integer NOT NULL,
    username character varying(250) NOT NULL,
    password character varying(250),
    email character varying(250),
    first_name character varying(250),
    last_name character varying(250),
    middle_name character varying(250),
    authenticated boolean,
    active boolean,
    is_admin boolean
);


ALTER TABLE auth_user OWNER TO bosha;

--
-- Name: auth_user_id_seq; Type: SEQUENCE; Schema: public; Owner: bosha
--

CREATE SEQUENCE auth_user_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;


ALTER TABLE auth_user_id_seq OWNER TO bosha;

--
-- Name: auth_user_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: bosha
--

ALTER SEQUENCE auth_user_id_seq OWNED BY auth_user.id;

--
-- Data for Name: auth_user; Type: TABLE DATA; Schema: public; Owner: bosha
--

COPY auth_user (id, username, password, email, first_name, last_name, middle_name, authenticated, active, is_admin) FROM stdin;
1       test    pbkdf2:sha1:$sfadfadafda$sfadfadf10019sdfadfad0101010dsfadf0202022      \N                              f       f       f
\.

Так же можно передать ключ --format=t, чтобы pg_dump запаковал базу данных в tar:

pg_dump -U bosha thebosharu --format=t -f thebosharu.sql.tar

Бэкап всех баз данных

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

Права доступа могут быть настроены у всех по разному, поэтому бэкап всех баз данных лучше делать из под пользователя postgres.

Зайдем под ним:

su - postgres

И выполним:

pg_dumpall > all_databases.sql

Бэкап всех баз данных будет содержаться в файле all_databases.sql.

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

psql -l

В моем случае было три базы данных:

postgres:~$ psql -l
                                      List of databases
     Name      |  Owner   | Encoding |   Collate   |    Ctype    |     Access privileges     
---------------+----------+----------+-------------+-------------+---------------------------
 thebosharu    | postgres | UTF8     | ru_RU.UTF-8 | ru_RU.UTF-8 | =Tc/postgres             +
               |          |          |             |             | postgres=CTc/postgres    +
               |          |          |             |             | thebosharu=CTc/postgres
 testdb1       | postgres | UTF8     | ru_RU.UTF-8 | ru_RU.UTF-8 | =Tc/postgres             +
               |          |          |             |             | postgres=CTc/postgres    +
               |          |          |             |             | testdb1=CTc/postgres
 testdb2       | postgres | UTF8     | ru_RU.UTF-8 | ru_RU.UTF-8 | =Tc/postgres             +
               |          |          |             |             | postgres=CTc/postgres    +
               |          |          |             |             | testdb2=CTc/postgres
(3 rows)

Теперь удостоверимся, что все перечисленные базы попали в дамп:

bash:~$ grep "^[\]connect" all.sql
\connect thebosharu
\connect testdb1
\connect testdb2

Бэкап определенной таблицы

pg_dump --table auth_user -U bosha thebosharu -f auth_user_table.sql

Для бэкапа определенной таблицы используется параметр --table и следом за ним названием таблицы. Если в базе данных указанная таблица есть в разных схемах, то её можно указать используя параметр --schema.

Восстановление из бэкапа

Восстановление одной базы данных

psql -U bosha -d thebosharu -f thebosharu.sql

В процессе восстановления из резервной копии, могут возникнуть ошибки и предупреждения. Их можно игнорировать:

psql:mydb.sql:49: ERROR:  must be owner of schema public
psql:mydb.sql:89: ERROR:  must be member of role "bosha"
psql:mydb.sql:159: WARNING:  no privileges could be revoked
psql:mydb.sql:261: WARNING:  no privileges could be revoked
psql:mydb.sql:381: WARNING:  no privileges were granted
psql:mydb.sql:452: WARNING:  no privileges were granted

Восстановление из бэкапа всех баз данных

su - postgres
psql -f all_databases.sql

Восстановление одной таблицы

psql -f auth_user_table.sql thebosharu


Понравилась статья? Поделись с друзьями!




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