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

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

  1. Предоставьте права на выполнение любых команд с таблицей fatab в базе данных monman_db роли student.

    Выполните GRANT ALL.

    postgres@monman_db=# GRANT ALL ON fatab TO student;
    GRANT

    Проверьте права доступа к таблице.

    postgres@monman_db=# \dp+ fatab
    Access privileges
    Schema | Name | Type | Access privileges | Column privileges | Policies
    --------+-------+-------+---------------------------+-------------------+----------
    public | fatab | table | postgres=arwdDxt/postgres+| |
    | | | student=arwdDxt/postgres | |
    (1 row)

    У роли student установлены все права (arwdDxt) на таблицу fatab.

  2. В сеансе student запустите скрипт, изменяющий данные в таблице fatab. Например, можно с помощью метакоманды \watch раз в 10 секунд выполнять массовое обновление в таблице. Завершить работу \watch можно нажатием Ctrl+C.

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

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

    Обновите данные в таблице.

    student@monman_db=> UPDATE fatab SET dte = current_date + id;
    UPDATE 100000

    Выведите предыдущую команду.

    student@monman_db=> \p
    UPDATE fatab SET dte = current_date + id;

    Запустите периодическое выполнение команды.

    student@monman_db=> \watch 10
  3. В сеансе пользователя ОС postgres выполните физическое копирование кластера.

    Выполните pg_basebackup.

    [postgres@ServerName ~]$ pg_basebackup -c fast --tablespace-mapping=${PWD}/ts_data=${PWD}/ts_new -D ~/base_backup
    Разбор команды

    • -c fast — выполняет быструю контрольную точку перед началом копирования;
    • --tablespace-mapping=${PWD}/ts_data=${PWD}/ts_new — отображает исходное табличное пространство ts_data на новое каталог ts_new;
    • -D ~/base_backup — целевой каталог для резервной копии.

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

    [postgres@ServerName ~]$ ls -l
    total 12
    drwx------ 25 postgres postgres 4096 Nov 11 12:19 base_backup
    drwx------ 3 postgres postgres 4096 Nov 10 08:39 ts_data
    drwx------ 3 postgres postgres 4096 Nov 11 12:19 ts_new

    Резервная копия представлена каталогами base_backup (основной кластер) и ts_new (табличное пространство для копии).

  4. Остановите работу \watch и остановите кластер.

    Остановите выполнение \watch (Ctrl+C), выйдите из psql и остановите службу.

    ^C
    student@monman_db=> \q

    Остановите сервер.

    [student@ServerName ~]$ sudo systemctl stop postgresql
  5. Проверьте наличие символьной ссылки на каталог копии табличного пространства.

    Выведите содержимое base_backup/pg_tblspc/.

    [postgres@ServerName ~]$ ls -l base_backup/pg_tblspc/
    total 0
    lrwxrwxrwx 1 postgres postgres 24 Nov 11 12:19 16431 -> /var/lib/postgres/ts_new

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

  6. Проверьте работоспособность физической копии.

    Запустите сервер из резервной копии.

    [postgres@ServerName ~]$ pg_ctl start -D ~/base_backup/ -l backup_srv.log
    waiting for server to start.... done
    server started

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

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

    Проверьте количество строк в таблице.

    postgres@monman_db=# SELECT count(*) FROM fatab;
    count
    --------
    100000
    (1 row)

    Физическая копия работает и содержит 100000 строк в таблице fatab.

    Выйдите из psql и остановите сервер.

    postgres@monman_db=# \q
    [postgres@ServerName ~]$ pg_ctl stop -D ~/base_backup/ -l backup_srv.log
    waiting for server to shut down.... done
    server stopped
  7. Удалите копию и запустите исходный кластер.

    В сеансе пользователя ОС postgres удалите каталоги.

    [postgres@ServerName ~]$ ls
    backup_srv.log base_backup ts_data ts_new
    [postgres@ServerName ~]$ rm -rf base_backup/ ts_new/

    В сеансе student запустите исходный кластер.

    [student@ServerName ~]$ sudo systemctl start postgresql

    Проверьте список баз данных.

    [student@ServerName ~]$ psql -l
    List of databases
    Name | Owner | Encoding | Collate | Ctype | ICU Locale | Locale Provider | Access privileges
    -------------------+----------------+-----------------+-------------------+-------------------+------------------------+---------------------------+-----------------------
    koi8_db | postgres | KOI8R | ru_RU.koi8r | ru_RU.koi8r | | libc |
    monman_db | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc |
    postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc |
    py_json_db | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc |
    student | 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=CRc/postgres
    template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres + postgres=CRc/postgres
    ts_db | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc |
    (8 rows)

    Исходный кластер запущен и содержит все базы данных.

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

Вопрос 1

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

pg_basebackup -c fast --tablespace-mapping=${PWD}/ts_data=${PWD}/ts_new -D ~/base_backup

Что делает опция -c fast?

Вопрос 2

Какие из действий выполняет опция --tablespace-mapping в pg_basebackup? Выберите все верные варианты.

Вопрос 3

В каталоге base_backup/pg_tblspc/ находится:

lrwxrwxrwx 1 postgres postgres 24 Nov 11 12:19 16431 -> /var/lib/postgres/ts_new

Что это?

Вопрос 4

Как запустить сервер PostgreSQL из физической копии, расположенной в ~/base_backup/?

Вопрос 5

Физическая копия кластера создана командой pg_basebackup. Какие условия необходимы для запуска второго экземпляра из этой копии параллельно с основным сервером?

Вопрос 6

Почему команду pg_restore нельзя использовать для восстановления из физической копии, созданной pg_basebackup?