Создание физической копии
-
Предоставьте права на выполнение любых команд с таблицей
fatabв базе данныхmonman_dbролиstudent.Выполните
GRANT ALL.postgres@monman_db=# GRANT ALL ON fatab TO student;GRANTПроверьте права доступа к таблице.
postgres@monman_db=# \dp+ fatabAccess privilegesSchema | Name | Type | Access privileges | Column privileges | Policies--------+-------+-------+---------------------------+-------------------+----------public | fatab | table | postgres=arwdDxt/postgres+| || | | student=arwdDxt/postgres | |(1 row)У роли
studentустановлены все права (arwdDxt) на таблицуfatab. -
В сеансе
studentзапустите скрипт, изменяющий данные в таблицеfatab. Например, можно с помощью метакоманды\watchраз в 10 секунд выполнять массовое обновление в таблице. Завершить работу\watchможно нажатиемCtrl+C.Подключитесь к базе данных.
[student@ServerName ~]$ psql monman_dbpsql (15.5)Type "help" for help.Обновите данные в таблице.
student@monman_db=> UPDATE fatab SET dte = current_date + id;UPDATE 100000Выведите предыдущую команду.
student@monman_db=> \pUPDATE fatab SET dte = current_date + id;Запустите периодическое выполнение команды.
student@monman_db=> \watch 10 -
В сеансе пользователя ОС
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 -ltotal 12drwx------ 25 postgres postgres 4096 Nov 11 12:19 base_backupdrwx------ 3 postgres postgres 4096 Nov 10 08:39 ts_datadrwx------ 3 postgres postgres 4096 Nov 11 12:19 ts_newРезервная копия представлена каталогами
base_backup(основной кластер) иts_new(табличное пространство для копии). -
Остановите работу
\watchи остановите кластер.Остановите выполнение
\watch(Ctrl+C), выйдите изpsqlи остановите службу.^Cstudent@monman_db=> \qОстановите сервер.
[student@ServerName ~]$ sudo systemctl stop postgresql -
Проверьте наличие символьной ссылки на каталог копии табличного пространства.
Выведите содержимое
base_backup/pg_tblspc/.[postgres@ServerName ~]$ ls -l base_backup/pg_tblspc/total 0lrwxrwxrwx 1 postgres postgres 24 Nov 11 12:19 16431 -> /var/lib/postgres/ts_newСимвольная ссылка указывает на каталог
ts_new, что подтверждает корректное копирование табличного пространства. -
Проверьте работоспособность физической копии.
Запустите сервер из резервной копии.
[postgres@ServerName ~]$ pg_ctl start -D ~/base_backup/ -l backup_srv.logwaiting for server to start.... doneserver startedПодключитесь к базе данных.
[postgres@ServerName ~]$ psql monman_dbpsql (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.logwaiting for server to shut down.... doneserver stopped -
Удалите копию и запустите исходный кластер.
В сеансе пользователя ОС
postgresудалите каталоги.[postgres@ServerName ~]$ lsbackup_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 -lList of databasesName | 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/postgrestemplate1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres + postgres=CRc/postgrests_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?