Уровень 3.0
Предусловия:
- Изучена лекция 8 «Миграция в Pangolin»
Миграция с использованием pg_dumpall
Создание табличного пространства и базы данных на Host1
В этом разделе все команды выполняются на виртуальной машине Host1.
-
Подключитесь к виртуальной машине посредством
webssh, указав IP-адрес Host1. -
В терминале запустите оболочку от имени пользователя
postgres.[student@ServerName ~]$ sudo -iu postgres -
Создайте каталог для табличного пространства:
[postgres@ServerName ~]$ mkdir ~/tablespace_dir -
Подключитесь в
psqlк базе данныхpostgresс рольюpostgres:[postgres@ServerName ~]$ psqlpsql (13.8)Type "help" for help. -
Проверьте версию экземпляра Pangolin и соответствующую ему оригинальную версию PostgreSQL:
postgres=# SHOW server_se_version;server_se_version---------------------------Platform V Pangolin \{pangolin_version\}(1 row)postgres=# SHOW server_version;server_version----------------13.8(1 row)На виртуальной машине Host1 экземпляр Pangolin имеет версию {pangolin_version}, что соответствует версии 13.8 оригинального PostgreSQL.
-
Задайте в качестве алгоритма хеширования паролей
scram-sha-256:postgres=# SET password_encryption = 'scram-sha-256';SETИзменение параметра
password_encryptionпотребовалось из-за несоответствия его установленного значения (md5) разрешению подключения по паролю в файлеpg_hba.conf -
Создайте роль
student:postgres=# CREATE ROLE student WITH LOGIN CREATEDB PASSWORD 'student';CREATE ROLE -
Установите пароль для пользователя
postgres:postgres=# ALTER ROLE postgres WITH PASSWORD 'postgres';ALTER ROLEУстановка пароля для пользователя
postgresпотребовалась для возможности удаленного подключения утилитыpg_dumpallот его имени с виртуальной машины Host2. -
Создайте табличное пространство с владельцем
student:postgres=# CREATE TABLESPACE some_tablespace OWNER student LOCATION '/home/postgres/tablespace_dir';CREATE TABLESPACEТабличное пространство размещено в ранее созданном каталоге.
-
Создайте базу данных
migration_dbв созданном табличном пространстве с владельцемstudent:postgres=# CREATE DATABASE migration_db WITH OWNER student TABLESPACE some_tablespace;CREATE DATABASEБаза данных
migration_dbбудет иметьsome_tablespaceв качестве табличного пространства по умолчанию. Это означает, что все таблицы в указанной базе данных по умолчанию будут размещаться в этом табличном пространстве. -
Подключитесь с базе данных
migration_dbс рольюstudent:postgres=# \c migration_db studentYou are now connected to database "migration_db" as user "student". -
Создайте простую таблицу и добавьте в нее несколько строк:
migration_db=> CREATE TABLE some_table(id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY, value text);CREATE TABLEmigration_db=> INSERT INTO some_table(value) VALUES ('Первая строка'), ('Вторая строка'), ('Третья строка') RETURNING id, value;id | value----+---------------1 | Первая строка2 | Вторая строка3 | Третья строка(3 rows)Вместе с таблицей созданы: уникальный индекс и последовательность для автозаполнения поля
id. -
Проверьте, что вместе с таблицей были созданы индекс и последовательность:
migration_db=> \diList of relationsSchema | Name | Type | Owner | Table--------+--------------------+-------+---------+------------public | some_table_pkey | index | student | some_table(1 row)migration_db=> \dsList of relationsSchema | Name | Type | Owner--------+-------------------+----------+---------public | some_table_id_seq | sequence | student(1 row) -
Выйдите из сеанса
psql:migration_db=> \q
Создание расширения на Host1
В этом разделе все команды выполняются на виртуальной машине Host1.
-
Смените текущий каталог на каталог хранения файлов расширений:
[postgres@ServerName ~]$ cd $(pg_config --sharedir)/extension[postgres@ServerName extension]$ pwd/usr/pangolin-\{pangolin_version\}/share/extensionНапомним: каталог с расширениями (
extension) находится в каталоге с общими данным Pangolin. Директорию каталога с общими данными можно определить с использованием функцииpg_config --sharedir. -
Создайте файл-скрипт для нового расширения:
[postgres@ServerName extension]$ cat << EOF > cities--1.0.sql\echo Use "CREATE EXTENSION cities" to load this file. \quitCOMMENT ON EXTENSION cities IS 'Список городов. Версия 1.0.';CREATE TABLE cities (id integer PRIMARY KEY, ru_city text UNIQUE, en_city text UNIQUE);INSERT INTO cities VALUES (1, 'Москва', 'Moscow');INSERT INTO cities VALUES (2, 'Санкт-Петербург', 'Saint Petersburg');INSERT INTO cities VALUES (3, 'Новосибирск', 'Novosibirsk');GRANT SELECT ON cities TO PUBLIC;EOFСкрипт с SQL-командами для создания указанных объектов записан в файл
cities--1.0.sqllкаталога с расширениями, где "1.0" является именем версии расширения.В этом случае в составе расширения будет одна таблица, содержащая соответствия названий городов на русском и английский языках.
В скрипте указанная таблица сразу заполняется тремя городами.
Доступ на чтение этой таблицы будут иметь все роли (
GRANT SELECT ON cities TO PUBLIC;). -
Создайте управляющий файл для расширения:
[postgres@ServerName extension]$ cat << EOF > cities.control# cities extensioncomment = 'cities table'default_version = '1.0'encoding = UTF8relocatable = truesuperuser = falseEOFПомимо файла-скрипта для использования расширения, нужен управляющий файл.
Обратите внимание на параметр
default_version, определяющий версию расширения по умолчанию, которая будет использована командамиCREATE EXTENSIONиALTER EXTENSION UPDATEбез явного указания версии. -
Подключитесь в
psqlк базе данныхmigration_dbс рольюstudent:[postgres@ServerName extension]$ psql -d migration_db -U studentpsql (13.8)Type "help" for help. -
Убедитесь, что после создания файлов расширение стало доступно для установки в базе данных:
migration_db=> SELECT * FROM pg_available_extensions WHERE name = 'cities'\gx-[ RECORD 1 ]-----+-------------name | citiesdefault_version | 1.0installed_version |comment | cities tableПредставление
pg_available_extensionsна основе информации из управляющих файлов определяет доступные для установки в базе данных расширения. -
Установите расширение в базе данных:
migration_db=> CREATE EXTENSION cities;CREATE EXTENSION -
Проверьте наличие и содержание таблицы
cities:migration_db=> \d citiesTable "public.cities"Column | Type | Collation | Nullable | Default---------+---------+-----------+----------+---------id | integer | | not null |ru_city | text | | |en_city | text | | |Indexes:"cities_pkey" PRIMARY KEY, btree (id)"cities_en_city_key" UNIQUE CONSTRAINT, btree (en_city)"cities_ru_city_key" UNIQUE CONSTRAINT, btree (ru_city)migration_db=> SELECT * FROM cities;id | ru_city | en_city----+-----------------+------------------1 | Москва | Moscow2 | Санкт-Петербург | Saint Petersburg3 | Новосибирск | Novosibirsk(3 rows)Файл-скрипт расширения успешно выполнен — таблица создана и заполнена данными.
-
Добавьте две строки в таблицу
cities:migration_db=> INSERT INTO cities VALUES(4, 'Владивосток', 'Vladivostok'), (5, 'Калининград', 'Kaliningrad');INSERT 0 2migration_db=> SELECT * FROM cities;id | ru_city | en_city----+-----------------+------------------1 | Москва | Moscow2 | Санкт-Петербург | Saint Petersburg3 | Новосибирск | Novosibirsk4 | Владивосток | Vladivostok5 | Калининград | Kaliningrad(5 rows)Обратите внимание, что первые три строки были добавлены при создании расширения, последние две — пользователем.
-
Выйдите из
psql:migration_db=> \q
Миграция содержимого кластера на Host2
В этом разделе все команды выполняются на виртуальной машине Host2.
-
Подключитесь к виртуальной машине посредством
webssh, указав IP-адрес Host2. -
В терминале запустите оболочку от имени пользователя
postgres.[student@ServerName ~]$ sudo -iu postgres -
В домашнем каталоге пользователя
postgresсоздайте файл паролей и установите необходимые права доступа к нему. При этом используйте IP-адрес, соответствующий вашей виртуальной машине Host1:[postgres@ServerName ~]$ echo "172.29.53.138:5432:*:postgres:postgres" > .pgpass[postgres@ServerName ~]$ chmod 0600 .pgpassФайл паролей потребуется при использовании утилиты
pg_dumpall, чтобы многократно не вводить пароль при каждом подключении к базе данных.В качестве цели применения пароля указан экземпляр Pangolin на виртуальной машине Host1.
-
Создайте каталог для логической копии и перейдите в него:
[postgres@ServerName ~]$ mkdir ~/dump && cd ~/dump -
Создайте логическую копию всего содержимого кластера баз данных, развернутого на Host1, указав IP-адрес виртуальной машины Host1:
[postgres@ServerName dump]$ pg_dumpall -h 172.29.53.138 -U postgres -f host1_cluster.sqlВспомним, что
pg_dumpallпо умолчанию выгружает в виде SQL-скрипта (host1_cluster.sql) все объекты всех баз данных, а также глобальные объекты кластера, такие как роли и табличные пространства. -
Попробуйте восстановить содержимое кластера из созданной копии:
[postgres@ServerName dump]$ psql -f host1_cluster.sql | grep ERRORpsql:host1_cluster.sql:14: ERROR: role "postgres" already existspsql:host1_cluster.sql:56: ERROR: directory "/home/postgres/tablespace_dir" does not existpsql:host1_cluster.sql:134: ERROR: tablespace "some_tablespace" does not existpsql:host1_cluster.sql:137: ERROR: database "migration_db" does not existpsql:host1_cluster.sql:139: error: \connect: connection to server at "172.29.53.7", port 5432 failed: FATAL: database "migration_db" does not existВосстановление выполняется путем проигрывания созданного SQL-скрипта в
psql.Здесь в результате выполнения SQL-команд возник ряд ошибок.
- Ошибка наличие в кластере роли
postgresне является существенной - Следующая ошибка возникла при попытке создания табличного пространства, поскольку необходимый для него каталог отсутствует в файловой системе. Перед восстановлением необходимо создать необходимые каталоги для имеющихся в кластере табличных пространств
- Также возникла ошибка при создании базы данных
migration_db, поскольку не было создано соответствующее табличное пространство
Исправим эти ошибки.
- Ошибка наличие в кластере роли
-
Создайте каталог для табличного пространства и снова попробуйте восстановить содержимое кластера:
[postgres@ServerName dump]$ mkdir ~/tablespace_dirДалее, для чистоты проведения экспериментов, каждое восстановление данных из копии будет выполняться на чистом проинициализированном кластере баз данных.
-
Остановите экземпляр Pangolin, инициализируйте новый кластер и запустите новый экземпляр:
[postgres@ServerName dump]$ pg_ctl stopwaiting for server to shut down.... doneserver stopped[postgres@ServerName dump]$ initdb -D /home/postgres/pgdata2 > /dev/nullWARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not existsLOCATION: check_enable_params_cache, security.c:101WARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not existsLOCATION: check_enable_params_cache, security.c:101initdb: warning: enabling "trust" authentication for local connectionsinitdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.[postgres@ServerName dump]$ pg_ctl start -D /home/postgres/pgdata2 -o "-c enabled_extra_auth_methods=trust" -l logfilewaiting for server to start.... doneserver startedКластер проинициализирован в каталоге
/home/postgres/pgdata2. При его запуске был установлен параметрenabled_extra_auth_methods=trustдля подключения от имени ролиpostgresс учетом имеющихся разрешений в файлеpg_hba.conf. -
Попробуйте восстановить содержимое кластера еще раз:
[postgres@ServerName dump]$ psql -h localhost -f host1_cluster.sql | grep ERRORpsql:host1_cluster.sql:14: ERROR: role "postgres" already existspsql:host1_cluster.sql:165: ERROR: extension "cities" is not availableDETAIL: Could not open extension control file "/usr/pangolin-major.minor/share/extension/cities.control": No such file or directory.HINT: The extension must first be installed on the system where PostgreSQL is running.psql:host1_cluster.sql:172: ERROR: extension "cities" does not existТеперь не появились ошибки, связанные с созданием табличного пространства и базы данных.
Однако, возникла ошибка при создании расширения
cities. Дело в том, что перед выполнение командыCREATE EXTENSIONсоответствующее расширение должно быть установлено в файловой системе. -
Создайте файл-скрипт расширения:
[postgres@ServerName dump]$ cat << EOF > $(pg_config --sharedir)/extension/cities--1.0.sql\echo Use "CREATE EXTENSION cities" to load this file. \quitCOMMENT ON EXTENSION cities IS 'Список городов. Версия 1.0.';CREATE TABLE cities (id integer PRIMARY KEY, ru_city text UNIQUE, en_city text UNIQUE);INSERT INTO cities VALUES (1, 'Москва', 'Moscow');INSERT INTO cities VALUES (2, 'Санкт-Петербург', 'Saint Petersburg');INSERT INTO cities VALUES (3, 'Новосибирск', 'Novosibirsk');GRANT SELECT ON cities TO PUBLIC;EOF -
Создайте управляющий файл для расширения:
[postgres@ServerName dump]$ cat << EOF > $(pg_config --sharedir)/extension/cities.control# cities extensioncomment = 'cities table'default_version = '1.0'encoding = UTF8relocatable = truesuperuser = falseEOF -
Остановите экземпляр Pangolin, инициализируйте новый кластер и запустите новый экземпляр:
[postgres@ServerName dump]$ pg_ctl stop -D /home/postgres/pgdata2waiting for server to shut down.... doneserver stopped[postgres@ServerName dump]$ initdb -D /home/postgres/pgdata3 > /dev/nullWARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not existsLOCATION: check_enable_params_cache, security.c:101WARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not existsLOCATION: check_enable_params_cache, security.c:101initdb: warning: enabling "trust" authentication for local connectionsinitdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.[postgres@ServerName dump]$ pg_ctl start -D /home/postgres/pgdata3 -o "-c enabled_extra_auth_methods=trust" -l logfilewaiting for server to start.... doneserver started -
Очистите каталог с табличным пространством:
[postgres@ServerName dump]$ rm -rf ~/tablespace_dir/* -
Попробуйте восстановить содержимое кластера еще раз:
[postgres@ServerName dump]$ psql -h localhost -f host1_cluster.sql | grep ERRORpsql:host1_cluster.sql:14: ERROR: role "postgres" already existsБольше нет ошибок, связанных с созданием расширения и табличного пространства.
-
Подключитесь в
psqlк базе данныхmigration_dbс рольюstudent:[postgres@ServerName dump]$ psql -d migration_db -U student -h localhostpsql (15.5)Type "help" for help.База данных
migration_dbвосстановлена, можно подключиться к ней с рольюstudent. -
Проверьте версию экземпляра Pangolin и соответствующую ему оригинальную версию PostgreSQL:
migration_db=> SHOW server_se_version;server_se_version------------------------------Platform V Pangolin DB \{major-minor\}.0(1 row)migration_db=> SHOW server_version;server_version----------------15.5(1 row)Перенос содержимого кластера выполнен на новую мажорную версию Pangolin ({pangolin_version} -> {major-minor}.0), соответствующую 15.5 версии ядра оригинального PostgreSQL.
-
Получите информацию о базе данных
migration_db:migration_db=> \x \l+ migration_db \xExpanded display is on.List of databases-[ RECORD 1 ]-----+----------------Name | migration_dbOwner | studentEncoding | UTF8Collate | en_US.UTF-8Ctype | en_US.UTF-8ICU Locale |Locale Provider | libcAccess privileges |Size | 9606 kBTablespace | some_tablespaceDescription |Expanded display is off.Табличное пространство для размещения объектов базы данных
some_tablespace— все правильно. -
Проверьте схему и содержимое таблицы
some_table:migration_db=> \d some_tableTable "public.some_table"Column | Type | Collation | Nullable | Default--------+---------+-----------+----------+------------------------------id | integer | | not null | generated always as identityvalue | text | | |Indexes:"some_table_pkey" PRIMARY KEY, btree (id)migration_db=> SELECT * FROM some_table;id | value----+---------------1 | Первая строка2 | Вторая строка3 | Третья строка(3 rows)Таблица
some_tableс данными и соответствующий индекс также успешно перенесены. -
Проверьте последнее значение последовательности
some_table_id_seq:migration_db=> SELECT last_value FROM some_table_id_seq;last_value------------3(1 row)Также перенесена последовательность.
-
Проверьте содержимое таблицы
cities:migration_db=> SELECT * FROM cities;id | ru_city | en_city----+-----------------+------------------1 | Москва | Moscow2 | Санкт-Петербург | Saint Petersburg3 | Новосибирск | Novosibirsk(3 rows)Также перенесена таблица из состава расширения
cities.Однако, в ней только строки, созданные в SQL-скрипте расширения. Строки, добавленные пользователем, перенесены не были.
Дело в том, что
pg_dumpallвыгружает только команду создания расширения (CREATE EXTENSIONS). Объекты из состава расширения создаются при вызове командыCREATE EXTENSIONSпутем выполнения установленного SQL-скрипта. Соответственно, добавленные пользователем данные не содержатся ни в файле-скрипте расширения, ни в выгруженной логической копии.Проверим это.
-
Выйдите из
psqlи посмотрите в логической копии команды, относящиеся либо к расширениюcities, либо к таблицеcities:migration_db=> \q[postgres@ServerName dump]$ grep cities host1_cluster.sql-- Name: cities; Type: EXTENSION; Schema: -; Owner: -CREATE EXTENSION IF NOT EXISTS cities WITH SCHEMA public;-- Name: EXTENSION cities; Type: COMMENT; Schema: -; Owner:COMMENT ON EXTENSION cities IS 'Список городов. Версия 1.0.';Действительно, в копию попала только команда
CREATE EXTENSION.Создадим обновление расширения, чтобы решить проблему.
Обновление расширения на Host1
В этом разделе все команды выполняются на виртуальной машине Host1.
-
Создайте файл-скрипт обновления расширения
cities:[postgres@ServerName extension]$ cat << EOF > cities--1.0--1.1.sql\echo Use "ALTER EXTENSION cities UPDATE TO '1.1'" to load this file. \quitCOMMENT ON EXTENSION cities IS 'Список городов. Версия 1.1.';ALTER TABLE cities ADD is_predifined boolean NOT NULL DEFAULT false;UPDATE cities SET is_predifined = true WHERE id IN (1, 2, 3);SELECT pg_extension_config_dump('cities', 'WHERE NOT is_predifined');EOFДля решения этой проблемы в скрипте расширения таблица
citiesпомечена как конфигурационная. Для этого использована функцияpg_extension_config_dump.В результате
pg_dumpallбудет включать в выгружаемые данные содержимое помеченной таблицы, но не ее определение. При этом в параметрах функцииpg_extension_config_dumpможет быть указано условие для выгрузки данных.В этом случае в таблицу добавлен столбец
is_predifined, который принимает значениеtrueтолько для строк, добавленных в скрипте расширения.Таким образом, в логическую копию будут попадать строки, имеющие значение столбца
is_predifined, равноеfalse. -
Подключитесь в
psqlк базе данныхmigration_dbс рольюstudent:[postgres@ServerName extension]$ psql -U student -d migration_dbpsql (13.8)Type "help" for help. -
Обновите расширение
cities:migration_db=> ALTER EXTENSION cities UPDATE TO '1.1';ALTER EXTENSION -
Добавьте в таблицу
citiesдве строки и посмотрите ее содержимое:migration_db=> INSERT INTO cities VALUES (6, 'Краснодар', 'Krasnodar'), (7, 'Казань', 'Kazan');INSERT 0 2migration_db=> SELECT * FROM cities;id | ru_city | en_city | is_predifined----+-----------------+------------------+---------------1 | Москва | Moscow | t2 | Санкт-Петербург | Saint Petersburg | t3 | Новосибирск | Novosibirsk | t4 | Владивосток | Vladivostok | f5 | Калининград | Kaliningrad | f6 | Краснодар | Krasnodar | f7 | Казань | Kazan | f(7 rows)Теперь в таблице
cities5 строк, добавленных пользователем.
Миграция кластера с обновленным расширением на Host2
В этом разделе все команды выполняются на виртуальной машине Host2.
-
Создайте файл-скрипт обновления расширения
cities:[postgres@ServerName dump]$ cat << EOF > $(pg_config --sharedir)/extension/cities--1.0--1.1.sql\echo Use "ALTER EXTENSION cities UPDATE TO '1.1'" to load this file. \quitCOMMENT ON EXTENSION cities IS 'Список городов. Версия 1.1.';ALTER TABLE cities ADD is_predifined boolean NOT NULL DEFAULT false;UPDATE cities SET is_predifined = true WHERE id IN (1, 2, 3);SELECT pg_extension_config_dump('cities', 'WHERE NOT is_predifined');EOF -
Обновите управляющий файл для расширения:
[postgres@ServerName dump]$ cat << EOF > $(pg_config --sharedir)/extension/cities.control# cities extensioncomment = 'cities table'default_version = '1.1'encoding = UTF8relocatable = truesuperuser = falseEOFТеперь версия по умолчанию у расширения "1.1".
-
Создайте логическую копию всего содрежимого кластера баз данных, развернутого на Host1, указав IP-адрес виртуальной машины Host1:
[postgres@ServerName dump]$ pg_dumpall -h 172.29.53.138 -U postgres -f host1_cluster_updated.sql -
Остановите экземпляр Pangolin, инициализируйте новый кластер и запустите новый экземпляр:
[postgres@ServerName dump]$ pg_ctl stop -D /home/postgres/pgdata3waiting for server to shut down.... doneserver stopped[postgres@ServerName dump]$ initdb -D /home/postgres/pgdata4 > /dev/nullWARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not existsLOCATION: check_enable_params_cache, security.c:101WARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not existsLOCATION: check_enable_params_cache, security.c:101initdb: warning: enabling "trust" authentication for local connectionsinitdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.[postgres@ServerNamewaiting for server to start.... doneserver started -
Очистите каталог с табличным пространством:
[postgres@ServerName dump]$ rm -rf ~/tablespace_dir/* -
Восстановите содержимое кластера с обновленным расширением:
[postgres@ServerName dump]$ psql -h localhost -f host1_cluster_updated.sql | grep ERRORpsql:host1_cluster.sql:14: ERROR: role "postgres" already exists -
Подключитесь в
psqlк базе данныхmigration_dbс рольюpostgres:[postgres@ServerName dump]$ psql -d migration_db -U postgres -h localhostpsql (15.5)Type "help" for help. -
Посмотрите содержимое таблицы
cities:migration_db=# SELECT * FROM cities;id | ru_city | en_city | is_predifined----+-----------------+------------------+---------------1 | Москва | Moscow | t2 | Санкт-Петербург | Saint Petersburg | t3 | Новосибирск | Novosibirsk | t4 | Владивосток | Vladivostok | f5 | Калининград | Kaliningrad | f6 | Краснодар | Krasnodar | f7 | Казань | Kazan | f(7 rows)Теперь все строки таблицы
citiesбыли переданы. -
Выйдите из
psqlи посмотрите в логической копии наличие командыCOPYдля таблицыcities:migration_db=> \q[postgres@ServerName dump]$ grep -A5 "COPY public.cities" host1_cluster_updated.sqlCOPY public.cities (id, ru_city, en_city, is_predifined) FROM stdin;4 Владивосток Vladivostok f5 Калининград Kaliningrad f6 Краснодар Krasnodar f7 Казань Kazan f\.В логической копии появилась команда
COPY ... FROM ..., содержащая строки таблицыcities, добавленные пользователем.Миграция данных между различными мажорными версиями Pangolin успешно завершена.
Завершение
Завершение на Host1
-
Подключитесь в
psqlк базе данныхpostgresс рольюpostgres:migration_db=> \c postgres postgresYou are now connected to database "postgres" as user "postgres". -
В сеансе
psqlудалите базу данныхmigration_db:postgres=# DROP DATABASE migration_db;DROP DATABASE -
В сеансе
psqlудалите табличное пространствоsome_tablespace:postgres=# DROP TABLESPACE some_tablespace;DROP TABLESPACE -
В сеансе
psqlудалите рольstudentи выйдите из сеанса:postgres=# DROP ROLE student;DROP ROLEpostgres=# \q -
Удалите каталог табличного пространства:
[postgres@ServerName extension]$ rm -rf /home/postgres/tablespace_dir
- Удалите файлы созданного расширения:
[postgres@ServerName extension]$ rm cities.control cities--1.0.sql cities--1.0--1.1.sql
-
Выйдите из оболочки, запущенной от имени пользователя
postgres:[postgres@ServerName extension]$ exitlogout
Завершение на Host2
-
Остановите экземпляр Pangolin:
[postgres@ServerName dump]$ pg_ctl stop -D /home/postgres/pgdata4waiting for server to shut down.... doneserver stopped -
Перейдите в домашний каталог пользователя
postgresи удалите все его содержимое:[postgres@ServerName ~]$ cd ~ && rm -rf ~/* -
Запустите экземпляр Pangolin:
[postgres@ServerName ~]$ pg_ctl start -l logfilewaiting for server to start.... doneserver started -
Подключитесь в
psqlк базе данныхpostgresс рольюpostgres:[postgres@ServerName ~]$ psqlpsql (15.5)Type "help" for help. -
В сеансе
psqlудалите базу данныхmigradion_db:postgres=# DROP DATABASE migration_db;DROP DATABASE -
В сеансе
psqlудалите табличное пространствоsome_tablespace:postgres=# DROP TABLESPACE some_tablespace;WARNING: could not open directory "pg_tblspc/16412/PG_15_202506231": No such file or directoryDROP TABLESPACE -
В сеансе
psqlудалите рольstudentи выйдите из сеанса:postgres=# DROP ROLE student;DROP ROLEpostgres=# \q -
Удалите файлы созданного расширения:
[postgres@ServerName ~]$ cd $(pg_config --sharedir)/extension && rm cities.control cities--1.0.sql cities--1.0--1.1.sql -
Выйдите из оболочки, запущенной от имени пользователя
postgres:[postgres@ServerName ~]$ exitlogout
Самопроверка
Вопрос 1
Какие условия должны быть соблюдены для миграции данных между кластерами Pangolin с использованием утилит pg_dumpall и psql? Выберите все правильные варианты:
Вопрос 2
В сеансе psql выполнена последовательность команд:
postgres=# \d
List of relations
Schema | Name | Type | Owner
--------+-------------------+----------+---------
public | t1 | table | student
public | t1_id_seq | sequence | student
(3 rows)
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------
revenue | 1.0 | public | Тип данных
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
postgres=# \db
List of tablespaces
Name | Owner | Location
-----------------+----------+-------------------------------
pg_default | postgres |
pg_global | postgres |
fast_ts | postgres | /var/fast_ts_dir
(3 rows)
После выполнения указанных команд с использованием pg_dumpall -h 172.29.53.135 -U postgres -f dump.sql создана логическая копия кластера, к базе данных которого выполнено подключение в psql.
Какие действия необходимо выполнить перед восстановлением данных из созданной копии на другом кластере Pangolin? Выберите все правильные варианты:
Вопрос 3
В файле-скрипте расширения есть команда:
SELECT pg_extension_config_dump('some_table', 'WHERE id > 10');
Какие строки таблицы some_table попадут в логическую копию содержимого кластера, в котором есть база данных с указанным расширением? Выберите один вариант ответа: