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

Уровень 3.0

Предусловия:

  • Изучена лекция 3 «Логическое резервное копирование»

Логическое резервное копирование​

Подготовка виртуальной машины Host1​

  1. В терминале запустите оболочку от имени пользователя postgres и войдите в сеанс psql:

    [student@ServerName ~]$ sudo -iu postgres
    [postgres@ServerName ~]$ psql
    psql (15.5)
    Type "help" for help.
  2. Создайте роль student:

    postgres=# CREATE ROLE student WITH LOGIN CREATEDB PASSWORD 'student';
    CREATE ROLE
  3. Установите пароль для пользователя postgres:

    postgres=# ALTER ROLE postgres WITH PASSWORD 'postgres';
    ALTER ROLE
  4. Создайте базу данных pgbench_db1 с владельцем student:

    postgres=# CREATE DATABASE pgbench_db1 WITH OWNER student;
    CREATE DATABASE
  5. Создайте базу данных pgbench_db2 с владельцем student:

    postgres=# CREATE DATABASE pgbench_db2 WITH OWNER student;
    CREATE DATABASE
  6. Выйдите из сеанса psql:

    postgres=# \q
  7. Наполните базу данных pgbench_db1 с использованием теста pgbench:

    [postgres@ServerName ~]$ pgbench -i -d pgbench_db1
    dropping old tables...
    NOTICE: table "pgbench_accounts" does not exist, skipping
    NOTICE: table "pgbench_branches" does not exist, skipping
    NOTICE: table "pgbench_history" does not exist, skipping
    NOTICE: table "pgbench_tellers" does not exist, skipping
    creating tables...
    generating data (client-side)...
    100000 of 100000 tuples (100%) done (elapsed 0.02 s, remaining 0.00 s)
    vacuuming...
    creating primary keys...
    done in 0.15 s (drop tables 0.00 s, create tables 0.00 s, client-side generate 0.07 s, vacuum 0.03 s, primary keys 0.04 s).
    [postgres@ServerName ~]$ pgbench -t 100000 -d pgbench_db1 2> /dev/null
    pgbench (15.5)
    transaction type: <builtin: TPC-B (sort of)>
    scaling factor: 1
    query mode: simple
    number of clients: 1
    number of threads: 1
    maximum number of tries: 1
    number of transactions per client: 100000
    number of transactions actually processed: 100000/100000
    number of failed transactions: 0 (0.000%)
    latency average = 0.832 ms
    initial connection time = 2.326 ms
    tps = 1201.837735 (without initial connection time)
  8. Таким же образом наполните базу данных pgbench_db2:

    [postgres@ServerName ~]$ pgbench -i -d pgbench_db2
    dropping old tables...
    NOTICE: table "pgbench_accounts" does not exist, skipping
    NOTICE: table "pgbench_branches" does not exist, skipping
    NOTICE: table "pgbench_history" does not exist, skipping
    NOTICE: table "pgbench_tellers" does not exist, skipping
    creating tables...
    generating data (client-side)...
    100000 of 100000 tuples (100%) done (elapsed 0.02 s, remaining 0.00 s)
    vacuuming...
    creating primary keys...
    done in 0.18 s (drop tables 0.00 s, create tables 0.02 s, client-side generate 0.07 s, vacuum 0.04 s, primary keys 0.05 s).
    [postgres@ServerName ~]$ pgbench -t 100000 -d pgbench_db2 2> /dev/null
    pgbench (15.5)
    transaction type: <builtin: TPC-B (sort of)>
    scaling factor: 1
    query mode: simple
    number of clients: 1
    number of threads: 1
    maximum number of tries: 1
    number of transactions per client: 100000
    number of transactions actually processed: 100000/100000
    number of failed transactions: 0 (0.000%)
    latency average = 0.829 ms
    initial connection time = 2.644 ms
    tps = 1205.568153 (without initial connection time)
  9. Подключитесь в psql к базе данных pgbench_db1, проверьте размер и количество строк в созданных в ней таблицах:

[postgres@ServerName ~]$ psql -d pgbench_db1
psql (15.5)
Type "help" for help.
pgbench_db1=# SELECT relname,
reltuples,
pg_size_pretty(pg_total_relation_size(relname::regclass)) total_table_size,
relhasindex
FROM pg_class
WHERE relname IN ('pgbench_accounts', 'pgbench_branches', 'pgbench_history', 'pgbench_tellers');
relname | reltuples | total_table_size | relhasindex
------------------+-----------+------------------+-------------
pgbench_accounts | 100000 | 15 MB | t
pgbench_branches | 1 | 56 kB | t
pgbench_tellers | 10 | 56 kB | t
pgbench_history | 100000 | 5168 kB | f
(4 rows)

Как видно из результата выполнения запроса, утилитой pgbench создано четыре таблицы, две из которых содержат по 100000 строк. При этом у трех таблиц имеется индекс.

Подготовка виртуальной машины Host2​

  1. Подключитесь к виртуальной машине посредством webssh, указав ip-адрес Host2.

  2. В домашнем каталоге пользователя student создайте файл паролей и установите необходимые права доступа к нему. При этом используйте ip-адрес, соответствующий вашей виртуальной машине Host1:

    [student@ServerName ~]$ echo "172.29.53.222:5432:*:postgres:postgres" > .pgpass
    [student@ServerName ~]$ chmod 0600 .pgpass

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

    В качестве цели применения пароля указан экземпляр Pangolin на виртуальной машине Host1.

  3. В домашнем каталоге пользователя student создайте каталог dump и перейдите в него:

    [student@ServerName ~]$ mkdir dump && cd dump

    Далее все действия выполняются на виртуальной машине Host2.

Копия кластера в однопоточном режиме​

  1. На виртуальной машине Host2 создайте логическую копию кластера, развернутого на виртуальной машине Host1. При этом используйте ip-адрес, соответствующий вашей виртуальной машине Host1:

    [student@ServerName dump]$ pg_dumpall -h 172.29.53.222 -U postgres -f host1_cluster.sql

    Вспомним, что утилита pg_dumpall создает копию всего кластера баз данных в виде SQL-скрипта.

  2. Посмотрите на начало созданного SQL-скрипта:

    [student@ServerName dump]$ head -n 20 host1_cluster.sql
    --
    -- PostgreSQL database cluster dump
    --

    SET default_transaction_read_only = off;

    SET client_encoding = 'UTF8';
    SET standard_conforming_strings = on;

    --
    -- Roles
    --

    CREATE ROLE postgres;
    ALTER ROLE postgres WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS;
    UPDATE pg_authid SET rolpassword='SCRAM-SHA-256$4096:rQ0Zkpy3YPEjYNaOcRIthQ==$KoDZ3xX9Oba+v3fDOEoDh4f1ILv40m+a8V7boOWZMTA=:xyGhh8b8WQZ5n04sgJVaa3i+Bk6x7LNi/RASGJvlRBY=' WHERE rolname='postgres';
    CREATE ROLE student;
    ALTER ROLE student WITH NOSUPERUSER INHERIT NOCREATEROLE CREATEDB LOGIN NOREPLICATION NOBYPASSRLS;
    UPDATE pg_authid SET rolpassword='SCRAM-SHA-256$4096:DN0ALFFZLCYv3tAbSaVDvQ==$qTeQMd3C2J/GS9ExbJYZmpqFQ6rAxR//kczxyxGXGTo=:NMLRKM0/eXO7F+SW9SlIS2V916UVIIfoWzI8MqDeQe8=' WHERE rolname='student';

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

  3. Посмотрите в SQL-скрипте команды создания баз данных:

    [student@ServerName dump]$ grep 'CREATE DATABASE' host1_cluster.sql
    CREATE DATABASE pgbench_db1 WITH TEMPLATE = template0 ENCODING = 'UTF8' LOCALE_PROVIDER = libc LOCALE = 'en_US.UTF-8';
    CREATE DATABASE pgbench_db2 WITH TEMPLATE = template0 ENCODING = 'UTF8' LOCALE_PROVIDER = libc LOCALE = 'en_US.UTF-8';

    Также имеются команды для создания баз данных. Обратите внимание, что базы данных создаются на основе чистого шаблона template0.

    Вспомним, что использование шаблона template0 необходимо для исключения дублирования объектов при восстановлении копии базы данных, которая, как правило, создана на базе шаблона template1, допускающего изменения.

  4. Посмотрите в SQL-скрипте наличие команд COPY:

    [student@ServerName dump]$ grep 'COPY' host1_cluster.sql
    COPY public.pgbench_accounts (aid, bid, abalance, filler) FROM stdin;
    COPY public.pgbench_branches (bid, bbalance, filler) FROM stdin;
    COPY public.pgbench_history (tid, bid, aid, delta, mtime, filler) FROM stdin;
    COPY public.pgbench_tellers (tid, bid, tbalance, filler) FROM stdin;
    COPY public.pgbench_accounts (aid, bid, abalance, filler) FROM stdin;
    COPY public.pgbench_branches (bid, bbalance, filler) FROM stdin;
    COPY public.pgbench_history (tid, bid, aid, delta, mtime, filler) FROM stdin;
    COPY public.pgbench_tellers (tid, bid, tbalance, filler) FROM stdin;

    Загрузка данных в таблицы по умолчанию выполняется командой COPY. Для наполнения таблиц в двух базах данных потребовалось всего 8 вызовов данной команды.

  5. Восстановите копию кластера путем выполнения SQL-скрипта в psql с замером времени восстановления:

    [student@ServerName dump]$ time psql -U postgres -f host1_cluster.sql > /dev/null
    psql:host1_cluster.sql:14: ERROR: role "postgres" already exists

    real 0m0.855s
    user 0m0.017s
    sys 0m0.014s

    Восстановление выполняется путем простого выполнения скрипта утилитой psql.

    Для исключения вывода большого количества сообщений стандартный вывод psql направлен в /dev/null.

    Для замера времени выполнения восстановления перед командой psql использована команда time.

    В результате восстановление заняло 0.855 сек.

  6. Подключитесь в psql к базе данных pgbench_db1 и проверьте список имеющихся в кластере ролей и баз данных:

    [student@ServerName dump]$ psql -U postgres -d pgbench_db1
    psql (15.5)
    Type "help" for help.
    pgbench_db1=# \du
    List of roles
    Role name | Attributes | Member of
    -----------+------------------------------------------------------------+-----------
    postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
    student | Create DB | {}
    pgbench_db1=# \l
    List of databases
    Name | Owner | Encoding | Collate | Ctype | ICU Locale | Locale Provider | Access privileges
    -------------+----------+----------+-------------+-------------+------------+-----------------+-----------------------
    pgbench_db1 | student | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc |
    pgbench_db2 | student | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc |
    postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc |
    template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres +
    | | | | | | | postgres=CTc/postgres
    template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres +
    | | | | | | | postgres=CTc/postgres
    (5 rows)

    Все созданные на виртуальной машине Host1 роли и базы данных восстановились.

  7. Проверьте размер и количество строк в таблицах базы данных pgbench_db1:

    pgbench_db1=# SELECT relname,
    reltuples,
    pg_size_pretty(pg_total_relation_size(relname::regclass)) total_table_size,
    relhasindex
    FROM pg_class
    WHERE relname IN ('pgbench_accounts', 'pgbench_branches', 'pgbench_history', 'pgbench_tellers');
    relname | reltuples | total_table_size | relhasindex
    ------------------+-----------+------------------+-------------
    pgbench_accounts | 100000 | 15 MB | t
    pgbench_branches | 1 | 24 kB | t
    pgbench_history | 100000 | 5168 kB | f
    pgbench_tellers | 10 | 24 kB | t
    (4 rows)

    Также восстановились таблицы с данными и индексы.

    Однако размер некоторых таблиц немного отличается в меньшую сторону с сохранением количества строк. Это можно объяснить тем, что pgbench в ходе теста порождает какое-то количество мертвых строк, в результате чего таблицы могут немного распухнуть. А поскольку логическая копия — это набор команд SQL, при ее восстановлении произошло полное перестроение таблиц и индексов с уплотнением.

    Аналогичную проверку при желании можно выполнить и для базы данных pgbench_db2.

  8. Выйдите из psql:

    pgbench_db1=# \q
  9. Создайте логическую копию кластера с использованием операторов INSERT. При этом используйте ip-адрес, соответствующий вашей виртуальной машине Host1:

    [student@ServerName dump]$ pg_dumpall --clean --column-inserts -h 172.29.53.222 -U postgres -f host1_cluster_inserts.sql

    Для использования операторов INSERT вместо COPY был применен ключ --column-inserts.

    Помимо этого, поскольку базы данных уже восстанавливались в кластере Host2, был указан ключ --clean для генерации команд по их удалению.

  10. Посмотрите, сколько команд INSERT было добавлено в SQL-скрипт:

[student@ServerName dump]$ grep -c 'INSERT' host1_cluster_inserts.sql
400032

В скрипте оказалось чуть более 400000 команд INSERT, то есть для каждой строки таблицы по отдельной команде INSERT. Вспомним, что при использовании COPY потребовалось всего 8 вызовов команд.

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

  1. Восстановите копию кластера из скрипта с командами INSERT:
[student@ServerName dump]$ time psql -U postgres -f host1_cluster_inserts.sql > /dev/null
psql:host1_cluster_inserts.sql:24: ERROR: current user cannot be dropped
psql:host1_cluster_inserts.sql:32: ERROR: role "postgres" already exists

real 3m23.174s
user 0m3.309s
sys 0m1.786s

Восстановление длилось более трех минут при том, что в случае использования команды COPY оно заняло около одной секунды.

Многие ошибки, выдаваемые psql при выполнении скрипта восстановления, несущественны.

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

Это произошло из-за указания ключа --clean при создании логической копии.

  1. Подключитесь к базе данных postgres и удалите базы данных pgbench_db1 и pgbench_db2:
[student@ServerName dump]$ psql -U postgres -d postgres
psql (15.5)
Type "help" for help.
postgres=# DROP DATABASE pgbench_db1;
DROP DATABASE
postgres=# DROP DATABASE pgbench_db2;
DROP DATABASE
  1. Выйдите из psql:
postgres=# \q

Копия кластера в многопоточном режиме​

  1. Создайте логическую копию в многопоточном режиме с использованием утилит pg_dumpall и pg_dump. При этом используйте ip-адрес, соответствующий вашей виртуальной машине Host1:

    [student@ServerName dump]$ (
    pg_dumpall --clean --globals-only -h 172.29.53.222 -U postgres -f host1_cluster_globals.sql &
    pg_dump -F d -j 2 --column-inserts -h 172.29.53.222 -U postgres -d pgbench_db1 -f pgbench_db1.directory &
    pg_dump -F d -j 2 --column-inserts -h 172.29.53.222 -U postgres -d pgbench_db2 -f pgbench_db2.directory &
    wait
    )

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

    Однако имеется возможность выгрузки только глобальных объектов. Для этого был использован ключ --globals-only.

    А базы данных были выгружены отдельно с использованием утилиты pg_dump в параллельном режиме (В этом случае в два потока — ключ -j 2) в архивном формате directory (ключ -F d).

    Выполнение всех указанных команд происходило параллельно. Для этого в оболочке в конце команды указан символ & и добавлена команда wait для ожидания завершения всех параллельно выполняемых команд.

  2. Восстановите кластер из созданных копий:

    [student@ServerName dump]$ time (
    psql -U postgres -f host1_cluster_globals.sql > /dev/null && (
    pg_restore --create -F d -j 2 -d postgres -U postgres pgbench_db1.directory &
    pg_restore --create -F d -j 2 -d postgres -U postgres pgbench_db2.directory &
    wait
    )
    )
    psql:host1_cluster_globals.sql:16: ERROR: current user cannot be dropped
    psql:host1_cluster_globals.sql:24: ERROR: role "postgres" already exists

    real 0m12.402s
    user 0m1.338s
    sys 0m1.070s

    Сначала с использованием psql были созданы глобальные объекты, далее с использованием утилиты pg_restore параллельно были восстановлены имеющиеся копии баз данных.

    При этом в pg_restore восстановление выполнялось с использованием двух потоков -j 2.

    Также в pg_restore указан ключ --create для создания базы данных и подключения к ней перед восстановлением.

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

    Вспомним, что длительное время восстановления в нашем эксперименте связано с использованием в копии большого количества операторов INSERT.

    При использовании операторов COPY при таком небольшом объеме баз данных разница не была бы заметна.

  3. Подключитесь в psql и убедитесь, что база данных pgbench_db1 успешно восстановилась:

    [student@ServerName dump]$ psql -U postgres -d pgbench_db1
    psql (15.5)
    Type "help" for help.
    pgbench_db1=# SELECT relname,
    reltuples,
    pg_size_pretty(pg_total_relation_size(relname::regclass)) total_table_size,
    relhasindex
    FROM pg_class
    WHERE relname IN ('pgbench_accounts', 'pgbench_branches', 'pgbench_history', 'pgbench_tellers');
    relname | reltuples | total_table_size | relhasindex
    ------------------+-----------+------------------+-------------
    pgbench_history | 100000 | 5168 kB | f
    pgbench_accounts | 100000 | 15 MB | t
    pgbench_tellers | 10 | 24 kB | t
    pgbench_branches | 1 | 24 kB | t
    (4 rows)

    В многопоточном режиме база данных pgbench_db1 успешно восстановилась.

    Аналогичную проверку можно выполнить и для базы данных pgbench_db2.

  4. Подключитесь к базе данных postgres и удалите базу данных pgbench_db1:

    pgbench_db1=# \c postgres
    You are now connected to database "postgres" as user "postgres".
    postgres=# DROP DATABASE pgbench_db1;
    DROP DATABASE
  5. Выйдите из psql:

    postgres=# \q
  6. Посмотрите содержимое каталога копии какой-нибудь базы данных, например pgbench_db1:

    [student@ServerName dump]$ ls -1 pgbench_db1.directory
    4430.dat.gz
    4431.dat.gz
    4432.dat.gz
    4433.dat.gz
    toc.dat

    В формате directory в каталоге для каждой таблицы создается отдельный файл, который по умолчанию сжат.

    Также имеется файл с оглавлением toc.dat. Посмотрим содержащееся в нем его оглавление.

  7. С помощью утилиты pg_restore посмотрите список объектов в файле с оглавлением:

    [student@ServerName dump]$ pg_restore --list pgbench_db1.directory
    ;
    ; Archive created at 2025-10-01 09:57:22 UTC
    ; dbname: pgbench_db1
    ; TOC Entries: 15
    ; 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:
    ;
    242; 1259 16538 TABLE public pgbench_accounts postgres
    243; 1259 16541 TABLE public pgbench_branches postgres
    240; 1259 16532 TABLE public pgbench_history postgres
    241; 1259 16535 TABLE public pgbench_tellers postgres
    4432; 0 16538 TABLE DATA public pgbench_accounts postgres
    4433; 0 16541 TABLE DATA public pgbench_branches postgres
    4430; 0 16532 TABLE DATA public pgbench_history postgres
    4431; 0 16535 TABLE DATA public pgbench_tellers postgres
    4274; 2606 16553 CONSTRAINT public pgbench_accounts pgbench_accounts_pkey postgres
    4276; 2606 16549 CONSTRAINT public pgbench_branches pgbench_branches_pkey postgres
    4272; 2606 16551 CONSTRAINT public pgbench_tellers pgbench_tellers_pkey postgres

    В оглавлении имеется список таблиц, данные для таблиц в виде отдельных записей и ограничения первичного ключа.

    Указанный список можно отредактировать (например, удалить какую-нибудь таблицу) и сохранить в виде отдельного файла. Далее им можно воспользоваться для выборочного восстановления с использованием ключа --use-list файл_объектов в утилите pg_restore.

    Однако мы применим другой способ восстановления — укажем таблицы в параметрах команды pg_restore.

  8. Выполните частичное восстановление базы данных pgbench_db1:

    [student@ServerName dump]$ pg_restore --create -F d -j 2 -d postgres -U postgres -t pgbench_accounts -t pgbench_history pgbench_db1.directory

    Каждая таблица для восстановления была указана с использованием отдельного ключа -t.

  9. Подключитесь в psql и проверьте содержимое базы данных pgbench_db1:

    [student@ServerName dump]$ psql -U postgres -d pgbench_db1
    psql (15.5)
    Type "help" for help.
    pgbench_db1=# SELECT relname,
    reltuples,
    pg_size_pretty(pg_total_relation_size(relname::regclass)) total_table_size,
    relhasindex
    FROM pg_class
    WHERE relname IN ('pgbench_accounts', 'pgbench_branches', 'pgbench_history', 'pgbench_tellers');
    relname | reltuples | total_table_size | relhasindex
    ------------------+-----------+------------------+-------------
    pgbench_history | 100000 | 5168 kB | f
    pgbench_accounts | 100000 | 13 MB | f
    (2 rows)

    В базе данных восстановились только указанные таблицы.

    Обратите внимание, что индекс для первичного ключа таблицы pgbench_accounts восстановлен не был, так как для восстановления были указаны только таблицы.

    Для восстановления индекса можно было воспользоваться ключом -I.

Завершение​

Завершение на виртуальной машине Host1​

  1. Подключитесь к базе данных postgres:

    pgbench_db1=# \c postgres
    You are now connected to database "postgres" as user "postgres".
  2. Удалите базы данных pgbench_db1 и pgbench_db2:

    postgres=# DROP DATABASE pgbench_db1;
    DROP DATABASE
    postgres=# DROP DATABASE pgbench_db2;
    DROP DATABASE
  3. Удалите роль student, выйдите из psql и режима выполнения команд от имени пользователя postgres:

    postgres=# DROP ROLE student;
    DROP ROLE
    postgres=# \q
    [postgres@ServerName ~]$ exit
    logout

Завершение на виртуальной машине Host2​

  1. Подключитесь к базе данных postgres:

    pgbench_db1=# \c postgres
    You are now connected to database "postgres" as user "postgres".
  2. Удалите базы данных pgbench_db1 и pgbench_db2:

    postgres=# DROP DATABASE pgbench_db1;
    DROP DATABASE
    postgres=# DROP DATABASE pgbench_db2;
    DROP DATABASE
  3. Удалите роль student и выйдите из psql:

    postgres=# DROP ROLE student;
    DROP ROLE
    postgres=# \q
  4. Удалите каталог dump:

    [student@ServerName dump]$ cd ~ && rm -r dump

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

Вопрос 1

Восстановление данных из логической резервной копии выполняется следующей командой:

[student@pangolin-prac-l964qa ~]$ pg_restore -F d -d some_db -U student -t some_table /dump/db_dump.directory

Какие объекты будут восстановлены в результате успешного выполнения данной команды?

Вопрос 2

В оболочке bash выполнена следующая последовательность команд:

[student@pangolin-prac-l964qa ~]$ psql -d some_db -U postgres -c '\d'
List of relations
Schema | Name | Type  |  Owner
--------+------+-------+----------
public | t1   | table | postgres
public | t2   | table | postgres
public | t3   | table | postgres
(3 rows)

[student@pangolin-prac-l964qa ~]$ pg_dump -F d -j 2 -U postgres -d some_db -f some_db.directory

Какое количество файлов было создано в каталоге some_db.directory в результате успешного выполнения последней команды?

Вопрос 3

Создание логической копии выполняется следующей командой:

[student@pangolin-prac-l964qa ~]$ pg_dumpall --globals-only -U postgres -f dump.sql

Какие SQL-команды могут оказаться в файле dump.sql в результате успешного выполнения указанной команды? Выберите все верные варианты ответа

Вопрос 4

Какие утилиты требуются для многопоточного восстановления логической копии кластера баз данных? Выберите все верные варианты ответа