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

Уровень 3.0

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

  • Изучена лекция 8 «Миграция в Pangolin»

Миграция с использованием pg_dumpall​

Создание табличного пространства и базы данных на Host1​

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

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

  2. В терминале запустите оболочку от имени пользователя postgres.

    [student@ServerName ~]$ sudo -iu postgres
  3. Создайте каталог для табличного пространства:

    [postgres@ServerName ~]$ mkdir ~/tablespace_dir
  4. Подключитесь в psql к базе данных postgres с ролью postgres:

    [postgres@ServerName ~]$ psql
    psql (13.8)
    Type "help" for help.
  5. Проверьте версию экземпляра 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.

  6. Задайте в качестве алгоритма хеширования паролей scram-sha-256:

    postgres=# SET password_encryption = 'scram-sha-256';
    SET

    Изменение параметра password_encryption потребовалось из-за несоответствия его установленного значения (md5) разрешению подключения по паролю в файле pg_hba.conf

  7. Создайте роль student:

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

    postgres=# ALTER ROLE postgres WITH PASSWORD 'postgres';
    ALTER ROLE

    Установка пароля для пользователя postgres потребовалась для возможности удаленного подключения утилиты pg_dumpall от его имени с виртуальной машины Host2.

  9. Создайте табличное пространство с владельцем student:

    postgres=# CREATE TABLESPACE some_tablespace OWNER student LOCATION '/home/postgres/tablespace_dir';
    CREATE TABLESPACE

    Табличное пространство размещено в ранее созданном каталоге.

  10. Создайте базу данных migration_db в созданном табличном пространстве с владельцем student:

    postgres=# CREATE DATABASE migration_db WITH OWNER student TABLESPACE some_tablespace;
    CREATE DATABASE

    База данных migration_db будет иметь some_tablespace в качестве табличного пространства по умолчанию. Это означает, что все таблицы в указанной базе данных по умолчанию будут размещаться в этом табличном пространстве.

  11. Подключитесь с базе данных migration_db с ролью student:

    postgres=# \c migration_db student
    You are now connected to database "migration_db" as user "student".
  12. Создайте простую таблицу и добавьте в нее несколько строк:

    migration_db=> CREATE TABLE some_table(id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY, value text);
    CREATE TABLE
    migration_db=> INSERT INTO some_table(value) VALUES ('Первая строка'), ('Вторая строка'), ('Третья строка') RETURNING id, value;
    id | value
    ----+---------------
    1 | Первая строка
    2 | Вторая строка
    3 | Третья строка
    (3 rows)

    Вместе с таблицей созданы: уникальный индекс и последовательность для автозаполнения поля id.

  13. Проверьте, что вместе с таблицей были созданы индекс и последовательность:

    migration_db=> \di
    List of relations
    Schema | Name | Type | Owner | Table
    --------+--------------------+-------+---------+------------
    public | some_table_pkey | index | student | some_table
    (1 row)
    migration_db=> \ds
    List of relations
    Schema | Name | Type | Owner
    --------+-------------------+----------+---------
    public | some_table_id_seq | sequence | student
    (1 row)
  14. Выйдите из сеанса psql:

    migration_db=> \q

Создание расширения на Host1​

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

  1. Смените текущий каталог на каталог хранения файлов расширений:

    [postgres@ServerName ~]$ cd $(pg_config --sharedir)/extension
    [postgres@ServerName extension]$ pwd
    /usr/pangolin-\{pangolin_version\}/share/extension

    Напомним: каталог с расширениями (extension) находится в каталоге с общими данным Pangolin. Директорию каталога с общими данными можно определить с использованием функции pg_config --sharedir.

  2. Создайте файл-скрипт для нового расширения:

    [postgres@ServerName extension]$ cat << EOF > cities--1.0.sql
    \echo Use "CREATE EXTENSION cities" to load this file. \quit
    COMMENT 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;).

  3. Создайте управляющий файл для расширения:

    [postgres@ServerName extension]$ cat << EOF > cities.control
    # cities extension
    comment = 'cities table'
    default_version = '1.0'
    encoding = UTF8
    relocatable = true
    superuser = false
    EOF

    Помимо файла-скрипта для использования расширения, нужен управляющий файл.

    Обратите внимание на параметр default_version, определяющий версию расширения по умолчанию, которая будет использована командами CREATE EXTENSION и ALTER EXTENSION UPDATE без явного указания версии.

  4. Подключитесь в psql к базе данных migration_db с ролью student:

    [postgres@ServerName extension]$ psql -d migration_db -U student
    psql (13.8)
    Type "help" for help.
  5. Убедитесь, что после создания файлов расширение стало доступно для установки в базе данных:

    migration_db=> SELECT * FROM pg_available_extensions WHERE name = 'cities'\gx
    -[ RECORD 1 ]-----+-------------
    name | cities
    default_version | 1.0
    installed_version |
    comment | cities table

    Представление pg_available_extensions на основе информации из управляющих файлов определяет доступные для установки в базе данных расширения.

  6. Установите расширение в базе данных:

    migration_db=> CREATE EXTENSION cities;
    CREATE EXTENSION
  7. Проверьте наличие и содержание таблицы cities:

    migration_db=> \d cities
    Table "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 | Москва | Moscow
    2 | Санкт-Петербург | Saint Petersburg
    3 | Новосибирск | Novosibirsk
    (3 rows)

    Файл-скрипт расширения успешно выполнен — таблица создана и заполнена данными.

  8. Добавьте две строки в таблицу cities:

    migration_db=> INSERT INTO cities VALUES(4, 'Владивосток', 'Vladivostok'), (5, 'Калининград', 'Kaliningrad');
    INSERT 0 2
    migration_db=> SELECT * FROM cities;
    id | ru_city | en_city
    ----+-----------------+------------------
    1 | Москва | Moscow
    2 | Санкт-Петербург | Saint Petersburg
    3 | Новосибирск | Novosibirsk
    4 | Владивосток | Vladivostok
    5 | Калининград | Kaliningrad
    (5 rows)

    Обратите внимание, что первые три строки были добавлены при создании расширения, последние две — пользователем.

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

    migration_db=> \q

Миграция содержимого кластера на Host2​

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

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

  2. В терминале запустите оболочку от имени пользователя postgres.

    [student@ServerName ~]$ sudo -iu postgres
  3. В домашнем каталоге пользователя postgres создайте файл паролей и установите необходимые права доступа к нему. При этом используйте IP-адрес, соответствующий вашей виртуальной машине Host1:

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

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

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

  4. Создайте каталог для логической копии и перейдите в него:

    [postgres@ServerName ~]$ mkdir ~/dump && cd ~/dump
  5. Создайте логическую копию всего содержимого кластера баз данных, развернутого на 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) все объекты всех баз данных, а также глобальные объекты кластера, такие как роли и табличные пространства.

  6. Попробуйте восстановить содержимое кластера из созданной копии:

    [postgres@ServerName dump]$ psql -f host1_cluster.sql | grep ERROR
    psql:host1_cluster.sql:14: ERROR: role "postgres" already exists
    psql:host1_cluster.sql:56: ERROR: directory "/home/postgres/tablespace_dir" does not exist
    psql:host1_cluster.sql:134: ERROR: tablespace "some_tablespace" does not exist
    psql:host1_cluster.sql:137: ERROR: database "migration_db" does not exist
    psql: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, поскольку не было создано соответствующее табличное пространство

    Исправим эти ошибки.

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

    [postgres@ServerName dump]$ mkdir ~/tablespace_dir

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

  8. Остановите экземпляр Pangolin, инициализируйте новый кластер и запустите новый экземпляр:

    [postgres@ServerName dump]$ pg_ctl stop
    waiting for server to shut down.... done
    server stopped
    [postgres@ServerName dump]$ initdb -D /home/postgres/pgdata2 > /dev/null
    WARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not exists
    LOCATION: check_enable_params_cache, security.c:101
    WARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not exists
    LOCATION: check_enable_params_cache, security.c:101
    initdb: warning: enabling "trust" authentication for local connections
    initdb: 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 logfile
    waiting for server to start.... done
    server started

    Кластер проинициализирован в каталоге /home/postgres/pgdata2. При его запуске был установлен параметр enabled_extra_auth_methods=trust для подключения от имени роли postgres с учетом имеющихся разрешений в файле pg_hba.conf.

  9. Попробуйте восстановить содержимое кластера еще раз:

    [postgres@ServerName dump]$ psql -h localhost -f host1_cluster.sql | grep ERROR
    psql:host1_cluster.sql:14: ERROR: role "postgres" already exists
    psql:host1_cluster.sql:165: ERROR: extension "cities" is not available
    DETAIL: 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 соответствующее расширение должно быть установлено в файловой системе.

  10. Создайте файл-скрипт расширения:

    [postgres@ServerName dump]$ cat << EOF > $(pg_config --sharedir)/extension/cities--1.0.sql
    \echo Use "CREATE EXTENSION cities" to load this file. \quit
    COMMENT 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
  11. Создайте управляющий файл для расширения:

    [postgres@ServerName dump]$ cat << EOF > $(pg_config --sharedir)/extension/cities.control
    # cities extension
    comment = 'cities table'
    default_version = '1.0'
    encoding = UTF8
    relocatable = true
    superuser = false
    EOF
  12. Остановите экземпляр Pangolin, инициализируйте новый кластер и запустите новый экземпляр:

    [postgres@ServerName dump]$ pg_ctl stop -D /home/postgres/pgdata2
    waiting for server to shut down.... done
    server stopped
    [postgres@ServerName dump]$ initdb -D /home/postgres/pgdata3 > /dev/null
    WARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not exists
    LOCATION: check_enable_params_cache, security.c:101
    WARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not exists
    LOCATION: check_enable_params_cache, security.c:101
    initdb: warning: enabling "trust" authentication for local connections
    initdb: 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 logfile
    waiting for server to start.... done
    server started
  13. Очистите каталог с табличным пространством:

    [postgres@ServerName dump]$ rm -rf ~/tablespace_dir/*
  14. Попробуйте восстановить содержимое кластера еще раз:

    [postgres@ServerName dump]$ psql -h localhost -f host1_cluster.sql | grep ERROR
    psql:host1_cluster.sql:14: ERROR: role "postgres" already exists

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

  15. Подключитесь в psql к базе данных migration_db с ролью student:

    [postgres@ServerName dump]$ psql -d migration_db -U student -h localhost
    psql (15.5)
    Type "help" for help.

    База данных migration_db восстановлена, можно подключиться к ней с ролью student.

  16. Проверьте версию экземпляра 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.

  17. Получите информацию о базе данных migration_db:

    migration_db=> \x \l+ migration_db \x
    Expanded display is on.
    List of databases
    -[ RECORD 1 ]-----+----------------
    Name | migration_db
    Owner | student
    Encoding | UTF8
    Collate | en_US.UTF-8
    Ctype | en_US.UTF-8
    ICU Locale |
    Locale Provider | libc
    Access privileges |
    Size | 9606 kB
    Tablespace | some_tablespace
    Description |

    Expanded display is off.

    Табличное пространство для размещения объектов базы данных some_tablespace — все правильно.

  18. Проверьте схему и содержимое таблицы some_table:

    migration_db=> \d some_table
    Table "public.some_table"
    Column | Type | Collation | Nullable | Default
    --------+---------+-----------+----------+------------------------------
    id | integer | | not null | generated always as identity
    value | text | | |
    Indexes:
    "some_table_pkey" PRIMARY KEY, btree (id)
    migration_db=> SELECT * FROM some_table;
    id | value
    ----+---------------
    1 | Первая строка
    2 | Вторая строка
    3 | Третья строка
    (3 rows)

    Таблица some_table с данными и соответствующий индекс также успешно перенесены.

  19. Проверьте последнее значение последовательности some_table_id_seq:

    migration_db=> SELECT last_value FROM some_table_id_seq;
    last_value
    ------------
    3
    (1 row)

    Также перенесена последовательность.

  20. Проверьте содержимое таблицы cities:

    migration_db=> SELECT * FROM cities;
    id | ru_city | en_city
    ----+-----------------+------------------
    1 | Москва | Moscow
    2 | Санкт-Петербург | Saint Petersburg
    3 | Новосибирск | Novosibirsk
    (3 rows)

    Также перенесена таблица из состава расширения cities.

    Однако, в ней только строки, созданные в SQL-скрипте расширения. Строки, добавленные пользователем, перенесены не были.

    Дело в том, что pg_dumpall выгружает только команду создания расширения (CREATE EXTENSIONS). Объекты из состава расширения создаются при вызове команды CREATE EXTENSIONS путем выполнения установленного SQL-скрипта. Соответственно, добавленные пользователем данные не содержатся ни в файле-скрипте расширения, ни в выгруженной логической копии.

    Проверим это.

  21. Выйдите из 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.

  1. Создайте файл-скрипт обновления расширения 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. \quit
    COMMENT 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.

  2. Подключитесь в psql к базе данных migration_db с ролью student:

    [postgres@ServerName extension]$ psql -U student -d migration_db
    psql (13.8)
    Type "help" for help.
  3. Обновите расширение cities:

    migration_db=> ALTER EXTENSION cities UPDATE TO '1.1';
    ALTER EXTENSION
  4. Добавьте в таблицу cities две строки и посмотрите ее содержимое:

    migration_db=> INSERT INTO cities VALUES (6, 'Краснодар', 'Krasnodar'), (7, 'Казань', 'Kazan');
    INSERT 0 2
    migration_db=> SELECT * FROM cities;
    id | ru_city | en_city | is_predifined
    ----+-----------------+------------------+---------------
    1 | Москва | Moscow | t
    2 | Санкт-Петербург | Saint Petersburg | t
    3 | Новосибирск | Novosibirsk | t
    4 | Владивосток | Vladivostok | f
    5 | Калининград | Kaliningrad | f
    6 | Краснодар | Krasnodar | f
    7 | Казань | Kazan | f
    (7 rows)

    Теперь в таблице cities 5 строк, добавленных пользователем.

Миграция кластера с обновленным расширением на Host2​

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

  1. Создайте файл-скрипт обновления расширения 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. \quit
    COMMENT 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
  2. Обновите управляющий файл для расширения:

    [postgres@ServerName dump]$ cat << EOF > $(pg_config --sharedir)/extension/cities.control
    # cities extension
    comment = 'cities table'
    default_version = '1.1'
    encoding = UTF8
    relocatable = true
    superuser = false
    EOF

    Теперь версия по умолчанию у расширения "1.1".

  3. Создайте логическую копию всего содрежимого кластера баз данных, развернутого на Host1, указав IP-адрес виртуальной машины Host1:

    [postgres@ServerName dump]$ pg_dumpall -h 172.29.53.138 -U postgres -f host1_cluster_updated.sql
  4. Остановите экземпляр Pangolin, инициализируйте новый кластер и запустите новый экземпляр:

    [postgres@ServerName dump]$ pg_ctl stop -D /home/postgres/pgdata3
    waiting for server to shut down.... done
    server stopped
    [postgres@ServerName dump]$ initdb -D /home/postgres/pgdata4 > /dev/null
    WARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not exists
    LOCATION: check_enable_params_cache, security.c:101
    WARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not exists
    LOCATION: check_enable_params_cache, security.c:101
    initdb: warning: enabling "trust" authentication for local connections
    initdb: 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
    waiting for server to start.... done
    server started
  5. Очистите каталог с табличным пространством:

    [postgres@ServerName dump]$ rm -rf ~/tablespace_dir/*
  6. Восстановите содержимое кластера с обновленным расширением:

    [postgres@ServerName dump]$ psql -h localhost -f host1_cluster_updated.sql | grep ERROR
    psql:host1_cluster.sql:14: ERROR: role "postgres" already exists
  7. Подключитесь в psql к базе данных migration_db с ролью postgres:

    [postgres@ServerName dump]$ psql -d migration_db -U postgres -h localhost
    psql (15.5)
    Type "help" for help.
  8. Посмотрите содержимое таблицы cities:

    migration_db=# SELECT * FROM cities;
    id | ru_city | en_city | is_predifined
    ----+-----------------+------------------+---------------
    1 | Москва | Moscow | t
    2 | Санкт-Петербург | Saint Petersburg | t
    3 | Новосибирск | Novosibirsk | t
    4 | Владивосток | Vladivostok | f
    5 | Калининград | Kaliningrad | f
    6 | Краснодар | Krasnodar | f
    7 | Казань | Kazan | f
    (7 rows)

    Теперь все строки таблицы cities были переданы.

  9. Выйдите из psql и посмотрите в логической копии наличие команды COPY для таблицы cities:

    migration_db=> \q
    [postgres@ServerName dump]$ grep -A5 "COPY public.cities" host1_cluster_updated.sql
    COPY public.cities (id, ru_city, en_city, is_predifined) FROM stdin;
    4 Владивосток Vladivostok f
    5 Калининград Kaliningrad f
    6 Краснодар Krasnodar f
    7 Казань Kazan f
    \.

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

    Миграция данных между различными мажорными версиями Pangolin успешно завершена.

Завершение​

Завершение на Host1​

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

    migration_db=> \c postgres postgres
    You are now connected to database "postgres" as user "postgres".
  2. В сеансе psql удалите базу данных migration_db:

    postgres=# DROP DATABASE migration_db;
    DROP DATABASE
  3. В сеансе psql удалите табличное пространство some_tablespace:

    postgres=# DROP TABLESPACE some_tablespace;
    DROP TABLESPACE
  4. В сеансе psql удалите роль student и выйдите из сеанса:

    postgres=# DROP ROLE student;
    DROP ROLE
    postgres=# \q
  5. Удалите каталог табличного пространства:

[postgres@ServerName extension]$ rm -rf /home/postgres/tablespace_dir
  1. Удалите файлы созданного расширения:
[postgres@ServerName extension]$ rm cities.control cities--1.0.sql cities--1.0--1.1.sql
  1. Выйдите из оболочки, запущенной от имени пользователя postgres:

    [postgres@ServerName extension]$ exit
    logout

Завершение на Host2​

  1. Остановите экземпляр Pangolin:

    [postgres@ServerName dump]$ pg_ctl stop -D /home/postgres/pgdata4
    waiting for server to shut down.... done
    server stopped
  2. Перейдите в домашний каталог пользователя postgres и удалите все его содержимое:

    [postgres@ServerName ~]$ cd ~ && rm -rf ~/*
  3. Запустите экземпляр Pangolin:

    [postgres@ServerName ~]$ pg_ctl start -l logfile
    waiting for server to start.... done
    server started
  4. Подключитесь в psql к базе данных postgres с ролью postgres:

    [postgres@ServerName ~]$ psql
    psql (15.5)
    Type "help" for help.
  5. В сеансе psql удалите базу данных migradion_db:

    postgres=# DROP DATABASE migration_db;
    DROP DATABASE
  6. В сеансе psql удалите табличное пространство some_tablespace:

    postgres=# DROP TABLESPACE some_tablespace;
    WARNING: could not open directory "pg_tblspc/16412/PG_15_202506231": No such file or directory
    DROP TABLESPACE
  7. В сеансе psql удалите роль student и выйдите из сеанса:

    postgres=# DROP ROLE student;
    DROP ROLE
    postgres=# \q
  8. Удалите файлы созданного расширения:

    [postgres@ServerName ~]$ cd $(pg_config --sharedir)/extension && rm cities.control cities--1.0.sql cities--1.0--1.1.sql
  9. Выйдите из оболочки, запущенной от имени пользователя postgres:

    [postgres@ServerName ~]$ exit
    logout

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

Вопрос 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 попадут в логическую копию содержимого кластера, в котором есть база данных с указанным расширением? Выберите один вариант ответа: