Перейти к основному содержимому

Создание логической копии

  1. Получите резервную копию таблицы fatab БД monman_db в формате по умолчанию.

    Выйдите из psql и выполните pg_dump.

    [postgres@ServerName ~]$ pg_dump -d monman_db -t fatab > /tmp/fatab.sql
  2. Проверьте, включены ли ограничения целостности для таблицы в логическую копию и есть ли информация об индексе.

    Выведите строки, содержащие index или constraint.

    [postgres@ServerName ~]$ egrep -in '(index|constraint)' /tmp/fatab.sql
    100082:-- Name: fatab fatab_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
    100086: ADD CONSTRAINT fatab_pkey PRIMARY KEY (id);
    100090:-- Name: fatab_nme_idx; Type: INDEX; Schema: public; Owner: postgres
    100093:CREATE INDEX fatab_nme_idx ON public.fatab USING btree (nme);

    В логической копии присутствуют PRIMARY KEY (fatab_pkey) и индекс fatab_nme_idx.

  3. Сделайте резервную копию этой же таблицы в формате custom. Сравните размеры файлов резервных копий.

    Выполните pg_dump в формате custom.

    [postgres@ServerName ~]$ pg_dump -Fc -d monman_db -t fatab -f /tmp/fatab.dump

    Сравните размеры файлов.

    [postgres@ServerName ~]$ ls -lh /tmp/fatab.*
    -rw-r--r-- 1 postgres postgres 671K Nov 11 10:44 /tmp/fatab.dump -rw-r--r-- 1 postgres postgres 1.9M Nov 11 10:39 /tmp/fatab.sql

    Размер файла fatab.dump (671K) значительно меньше, чем fatab.sql (1.9M) — формат custom использует сжатие.

  4. Определите, какая роль в логической копии установлена для таблицы и подчиненных объектов в качестве владельца.

    Найдите строки с OWNER TO.

    [postgres@ServerName ~]$ egrep -in 'owner to' /tmp/fatab.sql
    35:ALTER TABLE public.fatab OWNER TO postgres; 50:ALTER TABLE public.fatab_id_seq OWNER TO postgres;

    Владельцем таблицы fatab и последовательности fatab_id_seq установлена роль postgres.

  5. Задача — восстановить таблицу fatab в БД student, осуществив восстановление ролью student.

    Закомментируйте строки OWNER TO postgres; в выводе и передайте результат в psql.

    [student@ServerName ~]$ sed 's/^\(.*OWNER TO postgres;$\)/-- \1/' /tmp/fatab.sql | psql
    Разбор команды

    • sed 's/^\(.*OWNER TO postgres;$\)/-- \1/' — заменяет строки, содержащие OWNER TO postgres;, на закомментированные версии (--);
    • \(\) — захватывает строку в группу, которая затем подставляется как \1;
    • | psql — передает измененный SQL-скрипт через конвейер в psql для выполнения.
    SET
    SET
    SET
    SET
    SET
    set_config
    ------------
    (1 row)
    SET
    SET
    SET
    SET
    SET
    SET
    CREATE TABLE
    CREATE SEQUENCE
    ALTER SEQUENCE
    ALTER TABLE
    COPY 100000
    setval
    --------
    100000
    (1 row)
    ALTER TABLE
    CREATE INDEX

    Поскольку логическая копия в формате по умолчанию — это текстовый SQL-скрипт, его можно обрабатывать стандартными текстовыми утилитами. В примере команда sed находит строки, содержащие OWNER TO postgres;, и добавляет к ним в начало комментарии (--), что отключает выполнение этих команд при восстановлении.

    Восстановление прошло бы и без обработки текста — при выполнении команд ALTER TABLE ... OWNER TO postgres возникли бы ошибки из-за недостаточных прав, но таблица и данные были бы восстановлены.

  6. Сделайте резервную копию всей БД monman_db в каталожном формате с двумя параллельными процессами.

    Выполните pg_dump с опциями для каталожного формата.

    [postgres@ServerName ~]$ pg_dump -cC -d monman_db -Fd -j2 -f /tmp/monman.dump
    Разбор команды

    • -c — удалять объекты БД перед их восстановлением;
    • -C — включить в логическую копию команду создания БД;
    • -d monman_db — БД для резервного копирования;
    • -Fd — формат резервной копии в виде каталога;
    • -j2 — два процесса резервного копирования в параллель;
    • -f /tmp/monman.dump — имя целевого каталога для записи в него резервной копии.

    Проверьте, что результат — каталог.

    [postgres@ServerName ~]$ ls -ld /tmp/monman.dump
    drwx------ 2 postgres postgres 4096 Nov 11 11:03 /tmp/monman.dump

    Выведите содержимое каталога.

    [postgres@ServerName ~]$ ls -l /tmp/monman.dump
    total 1128
    -rw-r--r-- 1 postgres postgres 682752 Nov 11 11:03 4398.dat.gz
    -rw-r--r-- 1 postgres postgres 118507 Nov 11 11:03 4399.dat.gz
    -rw-r--r-- 1 postgres postgres 100 Nov 11 11:03 4400.dat.gz
    -rw-r--r-- 1 postgres postgres 333365 Nov 11 11:03 4401.dat.gz
    -rw-r--r-- 1 postgres postgres 37 Nov 11 11:03 4402.dat.gz
    -rw-r--r-- 1 postgres postgres 6478 Nov 11 11:03 toc.dat

    Проверьте размер каталога.

    [postgres@ServerName ~]$ du -sh /tmp/monman.dump
    1.2M /tmp/monman.dump

    Размер каталога monman.dump составляет 1.2M, что значительно меньше исходного SQL-файла (1.9M) — каталожный формат сжимает данные.

  7. Получите список содержимого логической копии.

    Выполните pg_restore с опцией -l.

    [postgres@ServerName ~]$ pg_restore -l /tmp/monman.dump
    Разбор команды

    • pg_restore -l — выводит список содержимого архива резервной копии в формате TOC (Table of Contents);
    • /tmp/monman.dump — путь к каталогу с резервной копией.
    ;
    ; Archive created at 2024-11-11 11:03:29 MSK
    ; dbname: monman_db
    ; TOC Entries: 25
    ; Compression: -1
    ; Dump Version: 1.14-0
    ; Format: DIRECTORY
    ; Integer: 4 bytes
    ; Offset: 8 bytes
    ; Dumped from database version: 15.5
    ; Dumped by pg_dump version: 15.5
    ;
    ;
    ; Selected TOC Entries:
    ;
    2; 3079 16392 EXTENSION - plpython3u
    4409; 0 0 COMMENT - EXTENSION plpython3u
    240; 1259 16457 TABLE public fatab postgres
    239; 1259 16456 SEQUENCE public fatab_id_seq postgres
    4410; 0 0 SEQUENCE OWNED BY public fatab_id_seq postgres
    243; 1259 16488 TABLE public pgbench_accounts postgres
    244; 1259 16491 TABLE public pgbench_branches postgres
    241; 1259 16482 TABLE public pgbench_history postgres
    242; 1259 16485 TABLE public pgbench_tellers postgres
    4236; 2604 16460 DEFAULT public fatab id postgres
    4398; 0 16457 TABLE DATA public fatab postgres
    4401; 0 16488 TABLE DATA public pgbench_accounts postgres
    4402; 0 16491 TABLE DATA public pgbench_branches postgres
    4399; 0 16482 TABLE DATA public pgbench_history postgres
    4400; 0 16485 TABLE DATA public pgbench_tellers postgres
    4411; 0 0 SEQUENCE SET public fatab_id_seq postgres
    4239; 2606 16462 CONSTRAINT public fatab fatab_pkey postgres
    4243; 2606 16503 CONSTRAINT public pgbench_accounts pgbench_accounts_pkey postgres
    4245; 2606 16499 CONSTRAINT public pgbench_branches pgbench_branches_pkey postgres
    4241; 2606 16501 CONSTRAINT public pgbench_tellers pgbench_tellers_pkey postgres
    4237; 1259 16475 INDEX public fatab_nme_idx postgres

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

  8. Удалите БД monman_db (командой DROP DATABASE monman_db) и восстановите ее из копии.

    Выполните pg_restore с опциями -C -Fd -j2.

    [postgres@ServerName ~]$ pg_restore -d postgres -C -Fd -j2 /tmp/monman.dump
    Разбор команды

    • pg_restore — утилита для восстановления базы данных из резервной копии;
    • -d postgres — подключается к базе данных postgres для восстановления;
    • -C — создает базу данных monman_db перед восстановлением;
    • -Fd — указывает, что копия в каталожном формате;
    • -j2 — использует два параллельных потока для ускорения;
    • /tmp/monman.dump — путь к каталогу с резервной копией.

    Подключитесь к восстановленной базе данных.

    [postgres@ServerName ~]$ psql monman_db
    psql (15.5)
    Type "help" for help.

    Проверьте, что таблицы восстановлены.

    postgres@monman_db=# \d
    List of relations
    Schema | Name | Type | Owner
    --------+------------------+----------+----------
    public | fatab | table | postgres
    public | fatab_id_seq | sequence | postgres
    public | pgbench_accounts | table | postgres
    public | pgbench_branches | table | postgres
    public | pgbench_history | table
    public | pgbench_tellers | table
    (6 rows)

    База данных восстановлена.

Самопроверка​

Вопрос 1

Выполнена команда:

pg_dump -d monman_db -t fatab > /tmp/fatab.sql

Какие объекты из базы данных monman_db попали в файл /tmp/fatab.sql?

Вопрос 2

В файле /tmp/fatab.sql найдены строки:

ALTER TABLE public.fatab OWNER TO postgres;
ALTER TABLE public.fatab_id_seq OWNER TO postgres;

Что это означает?

Вопрос 3

Файл /tmp/fatab.dump (671K) оказался значительно меньше файла /tmp/fatab.sql (1.9M). Почему?

Вопрос 4

Нужно восстановить таблицу fatab из SQL-дампа, но не устанавливать владельца postgres. Какая команда закомментирует строки OWNER TO postgres; и передаст результат в psql?

Вопрос 5

Выполнена команда:

pg_dump -cC -d monman_db -Fd -j2 -f /tmp/monman.dump

Какие из следующих утверждений об опциях верны?

Вопрос 6

Команда pg_restore -l /tmp/monman.dump вывела список объектов. Что означает опция -l?

Вопрос 7

Восстановление БД из каталожного формата выполнено командой:

pg_restore -d postgres -C -Fd -j2 /tmp/monman.dump

Какие из следующих утверждений верны?