Создание логической копии
-
Получите резервную копию таблицы
fatabБДmonman_dbв формате по умолчанию.Выйдите из
psqlи выполнитеpg_dump.[postgres@ServerName ~]$ pg_dump -d monman_db -t fatab > /tmp/fatab.sql -
Проверьте, включены ли ограничения целостности для таблицы в логическую копию и есть ли информация об индексе.
Выведите строки, содержащие
indexилиconstraint.[postgres@ServerName ~]$ egrep -in '(index|constraint)' /tmp/fatab.sql100082:-- Name: fatab fatab_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres100086: ADD CONSTRAINT fatab_pkey PRIMARY KEY (id);100090:-- Name: fatab_nme_idx; Type: INDEX; Schema: public; Owner: postgres100093:CREATE INDEX fatab_nme_idx ON public.fatab USING btree (nme);В логической копии присутствуют PRIMARY KEY (
fatab_pkey) и индексfatab_nme_idx. -
Сделайте резервную копию этой же таблицы в формате
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использует сжатие. -
Определите, какая роль в логической копии установлена для таблицы и подчиненных объектов в качестве владельца.
Найдите строки с
OWNER TO.[postgres@ServerName ~]$ egrep -in 'owner to' /tmp/fatab.sql35:ALTER TABLE public.fatab OWNER TO postgres; 50:ALTER TABLE public.fatab_id_seq OWNER TO postgres;Владельцем таблицы
fatabи последовательностиfatab_id_seqустановлена рольpostgres. -
Задача — восстановить таблицу
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для выполнения.
SETSETSETSETSETset_config------------(1 row)SETSETSETSETSETSETCREATE TABLECREATE SEQUENCEALTER SEQUENCEALTER TABLECOPY 100000setval--------100000(1 row)ALTER TABLECREATE INDEXПоскольку логическая копия в формате по умолчанию — это текстовый SQL-скрипт, его можно обрабатывать стандартными текстовыми утилитами. В примере команда
sedнаходит строки, содержащиеOWNER TO postgres;, и добавляет к ним в начало комментарии (--), что отключает выполнение этих команд при восстановлении.Восстановление прошло бы и без обработки текста — при выполнении команд
ALTER TABLE ... OWNER TO postgresвозникли бы ошибки из-за недостаточных прав, но таблица и данные были бы восстановлены. -
Сделайте резервную копию всей БД
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.dumpdrwx------ 2 postgres postgres 4096 Nov 11 11:03 /tmp/monman.dumpВыведите содержимое каталога.
[postgres@ServerName ~]$ ls -l /tmp/monman.dumptotal 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.dump1.2M /tmp/monman.dumpРазмер каталога
monman.dumpсоставляет 1.2M, что значительно меньше исходного SQL-файла (1.9M) — каталожный формат сжимает данные. -
Получите список содержимого логической копии.
Выполните
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 - plpython3u4409; 0 0 COMMENT - EXTENSION plpython3u240; 1259 16457 TABLE public fatab postgres239; 1259 16456 SEQUENCE public fatab_id_seq postgres4410; 0 0 SEQUENCE OWNED BY public fatab_id_seq postgres243; 1259 16488 TABLE public pgbench_accounts postgres244; 1259 16491 TABLE public pgbench_branches postgres241; 1259 16482 TABLE public pgbench_history postgres242; 1259 16485 TABLE public pgbench_tellers postgres4236; 2604 16460 DEFAULT public fatab id postgres4398; 0 16457 TABLE DATA public fatab postgres4401; 0 16488 TABLE DATA public pgbench_accounts postgres4402; 0 16491 TABLE DATA public pgbench_branches postgres4399; 0 16482 TABLE DATA public pgbench_history postgres4400; 0 16485 TABLE DATA public pgbench_tellers postgres4411; 0 0 SEQUENCE SET public fatab_id_seq postgres4239; 2606 16462 CONSTRAINT public fatab fatab_pkey postgres4243; 2606 16503 CONSTRAINT public pgbench_accounts pgbench_accounts_pkey postgres4245; 2606 16499 CONSTRAINT public pgbench_branches pgbench_branches_pkey postgres4241; 2606 16501 CONSTRAINT public pgbench_tellers pgbench_tellers_pkey postgres4237; 1259 16475 INDEX public fatab_nme_idx postgresВ копий содержится 25 объектов (таблицы, последовательности, индексы, ограничения) из базы данных
monman_db. -
Удалите БД
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_dbpsql (15.5)Type "help" for help.Проверьте, что таблицы восстановлены.
postgres@monman_db=# \dList of relationsSchema | Name | Type | Owner--------+------------------+----------+----------public | fatab | table | postgrespublic | fatab_id_seq | sequence | postgrespublic | pgbench_accounts | table | postgrespublic | pgbench_branches | table | postgrespublic | pgbench_history | tablepublic | 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
Какие из следующих утверждений верны?