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

Уровень 3.0

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

  • Изучена лекция 9 «Обновление Pangolin»

Все действия в этой лабораторной работе выполняйте на виртуальной машине 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=# SELECT name, setting FROM pg_settings WHERE name IN ('server_se_version', 'server_version');
    name | setting
    -------------------+---------------------------
    server_se_version | Platform V Pangolin \{pangolin_version\}
    server_version | 13.8
    (2 rows)

    Подключение выполнено к серверу Pangolin {pangolin_version}, которая соответствует 13.8 оригинальной версии PostgreSQL.

  6. Проверьте, с какой локалью инициализирован кластер баз данных:

    postgres=# \l template0
    List of databases
    Name | Owner | Encoding | Collate | Ctype | ICU Locale | Locale Provider | Access privileges
    -----------+----------+----------+-------------+-------------+------------+-----------------+-----------------------
    template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres +
    | | | | | | | postgres=CTc/postgres
    (1 row)

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

    Локаль кластера проверяется на основе шаблонной базы данных template0, поскольку только она гарантировано сохраняется в неизменном «чистом» виде после инициализации кластера. В других базах данных, включая template1, локаль может быть использована другая.

    В этом случае в качестве провайдера локали используется библиотека libc, кодировка локали — UTF8, в качестве правил сортировки (Collate) и классификации символов (Ctype) - en_US.UTF-8.

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

    postgres=# CREATE ROLE student WITH LOGIN CREATEDB PASSWORD 'student';
    CREATE ROLE

    Вспомним, что роли относятся к глобальным объектам — они не принадлежат ни одной из баз данных. Это верно также для табличных пространств.

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

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

    Созданное табличное пространство размещено в каталоге /home/postgres/tablespace_dir.

  9. Создайте базу данных pgbench_db с владельцем student:

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

    При создании базы данных в качестве табличного пространства по умолчанию было выбрано только что созданное some_tablespace.

  10. Выйдите из сеанса psql:

postgres=# \q
  1. Наполните базу данных pgbench_db1 с использованием теста pgbench:
[postgres@ServerName ~]$ pgbench -i -d pgbench_db
dropping old tables...
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
creating tables...
generating data (client-side)...
100000 of 100000 tuples (100%) done (elapsed 0.02 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 0.16 s (drop tables 0.00 s, create tables 0.00 s, client-side generate 0.07 s, vacuum 0.05 s, primary keys 0.04 s).
[postgres@ServerName ~]$ pgbench -t 100000 -d pgbench_db 2> /dev/null
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
number of transactions per client: 100000
number of transactions actually processed: 100000/100000
latency average = 0.939 ms
tps = 1064.789486 (including connections establishing)
tps = 1064.829438 (excluding connections establishing)

Сначала pgbench был проинициализирован (pgbench -i) в созданной базе данных pgbench_db.

Затем с помощью теста с использованием 100000 транзакций (-t 100000) база данных наполнена данными.

  1. Подключитесь в psql к базе данных pgbench_db, проверьте размер и количество строк в созданных в ней таблицах:
[postgres@ServerName ~]$ psql -d pgbench_db
psql (13.8)
Type "help" for help.
pgbench_db=# SELECT relname,
reltuples,
pg_size_pretty(pg_total_relation_size(relname::regclass)) total_table_size,
relhasindex
FROM pg_class
WHERE relname IN ('pgbench_accounts', 'pgbench_branches', 'pgbench_history', 'pgbench_tellers');
relname | reltuples | total_table_size | relhasindex
------------------+-----------+------------------+-------------
pgbench_accounts | 100000 | 15 MB | t
pgbench_branches | 1 | 56 kB | t
pgbench_tellers | 10 | 56 kB | t
pgbench_history | 100000 | 5128 kB | f
(4 rows)

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

  1. Выйдите из сеанса psql:
pgbench_db=# \q
  1. Остановите экземпляр Pangolin:
[postgres@ServerName ~]$ pg_ctl stop
waiting for server to shut down.... done
server stopped

Установка пакетов новой мажорной версии Pangolin​

  1. Выйдите из оболочки, запущенной от имени пользователя postgres:

    [postgres@ServerName ~]$ exit
    logout
  2. Проверьте наличие дистрибутива Pangolin в каталоге Distrib домашнего каталога пользователя student:

    [student@ServerName ~]$ ls -1 ~/Distrib
    PSQ-\{pangolin_version\}-4-\{OS\}.10-distrib.zip
    PSQ-\{major-minor\}.0-176767-\{OS\}-distrib.zip

    Будут установлены пакеты сервера и клиента Pangolin версии {major-minor}.0 с использованием дистрибутива PSQ-\{major-minor\}.0-176767-\{OS\}-distrib.zip.

    Поскольку обновление происходит на новую мажорную версию (5 -> 6), после установки пакетов нужно выполнить перенос данных в новый кластер баз данных.

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

    [student@ServerName ~]$ mkdir ~/Distr && cd ~/Distr
  4. Распакуйте монолитный архив с дистрибутивом:

    [student@ServerName Distr]$ unzip ~/Distrib/PSQ-\{major-minor\}.0-176767-\{OS\}-distrib.zip
    Archive: /home/student/Distrib/PSQ-\{major-minor\}.0-176767-\{OS\}-distrib.zip
    inflating: PSQ-\{major-minor\}.0-176767-\{OS\}-cyclonedx-distrib.json
    inflating: PSQ-\{major-minor\}.0-176767-\{OS\}-installer-distrib.pom
    inflating: PSQ-\{major-minor\}.0-176767-\{OS\}-installer-distrib.zip
    inflating: PSQ-\{major-minor\}.0-176767-\{OS\}-owned-distrib.pom
    inflating: PSQ-\{major-minor\}.0-176767-\{OS\}-owned-distrib.zip
    inflating: PSQ-\{major-minor\}.0-176767-\{OS\}-party-distrib.pom
    inflating: PSQ-\{major-minor\}.0-176767-\{OS\}-party-distrib.zip
    inflating: PSQ-\{major-minor\}.0-176767-\{OS\}-swidtag-distrib.swidtag
    inflating: PSQ-\{major-minor\}.0-176767-\{OS\}-unpacker-distrib.sh
    inflating: PSQ-doc-\{major-minor\}.0-17-distrib.zip
    inflating: PSQ-doc-\{major-minor\}.0-17.pom
  5. Выполните скрипт распаковки:

    [student@ServerNamedcdp8b Distr]$ bash PSQ-\{major-minor\}.0-176767-\{OS\}-unpacker-distrib.sh
    start
    ~/Distr/distributive ~/Distr
    successful completion: PSQ-06.006.00-distrib.tar.gz
    ~/Distr

    В результате выполнения скрипта установочное программное обеспечение перепаковывается в сжатый архив tar.gz с RPM-пакетами.

  6. Распакуйте архив PSQ-06.005.01-distrib.tar.gz и посмотрите список полученных rpm-пакетов:

    [student@ServerName Distr]$ tar xf PSQ-06.006.00-distrib.tar.gz
    [student@ServerName Distr]$ ls -1 *.rpm
    pangolin-backup-tools-1.2.5-\{OS\}.x86_64.rpm
    pangolin-copywala-v1.1.0-hotfix-\{OS\}.x86_64.rpm
    pangolin-core-\{major-minor\}.0-\{OS\}.x86_64.rpm
    pangolin-dbms-\{major-minor\}-\{major-minor\}.0-\{OS\}.x86_64.rpm
    pangolin-dbms-\{major-minor\}-client-\{major-minor\}.0-\{OS\}.x86_64.rpm
    pangolin-dbms-\{major-minor\}-libpq-\{major-minor\}.0-\{OS\}.x86_64.rpm
    pangolin-dbms-\{major-minor\}-libpq-dev-\{major-minor\}.0-\{OS\}.x86_64.rpm
    pangolin-full-\{major-minor\}.0-\{OS\}.x86_64.rpm
    pangolin-manager-2.1.8-\{OS\}.x86_64.rpm
    pangolin-manager-dcs-\{major-minor\}.0-\{OS\}.x86_64.rpm
    pangolin-orchestrated-\{major-minor\}.0-\{OS\}.x86_64.rpm
    pangolin-pooler-1.5.2-\{OS\}.x86_64.rpm

    Сервер Pangolin содержится в пакете pangolin-dbms-\{major-minor\}-\{major-minor\}.0-\{OS\}.x86_64.rpm.

    Клиент Pangolin содержится в пакете pangolin-dbms-\{major-minor\}-client-\{major-minor\}.0-\{OS\}.x86_64.rpm.

  7. Выполните установку сервера Pangolin:

    [student@ServerName Distr]$ sudo dnf -y install pangolin-dbms-\{major-minor\}-\{major-minor\}.0-\{OS\}.x86_64.rpm
    ...
    Installed:
    pangolin-dbms-\{major-minor\}-\{major-minor\}.0-\{OS\}.x86_64 python39-3.9.20-2.module+sl8.10+1373+039144e8.x86_64
    python39-libs-3.9.20-2.module+sl8.10+1373+039144e8.x86_64 python39-pip-20.2.4-9.module+sl8.10+997+aa9ed508.noarch
    python39-pip-wheel-20.2.4-9.module+sl8.10+997+aa9ed508.noarch python39-setuptools-50.3.2-7.module+sl8.10+1373+039144e8.noarch
    python39-setuptools-wheel-50.3.2-7.module+sl8.10+1373+039144e8.noarch

    Complete!
  8. Выполните установку клиента Pangolin:

    [student@ServerName Distr]$ sudo dnf -y install pangolin-dbms-\{major-minor\}-client-\{major-minor\}.0-\{OS\}.x86_64.rpm
    ...
    Verifying : pangolin-dbms-\{major-minor\}-client-\{major-minor\}.0-\{OS\}.x86_64 1/1
    Installed products updated.

    Installed:
    pangolin-dbms-\{major-minor\}-client-\{major-minor\}.0-\{OS\}.x86_64

    Complete!
  9. Проверьте, что пакеты успешно установлены:

    [student@ServerName Distr]$ sudo rpm -qa pangolin\*
    ...
    pangolin-dbms-\{major-minor\}-\{major-minor\}.0-\{OS\}.x86_64
    pangolin-dbms-\{major-minor\}-client-\{major-minor\}.0-\{OS\}.x86_64

Инициализация кластера и перенос конфигурации​

  1. Запустите оболочку от имени пользователя postgres:

    [student@ServerName Distr]$ sudo -iu postgres
  2. Создайте необходимые каталоги:

    [postgres@ServerName ~]$ mkdir -p /pgdata/\{major-minor\}.0/data /pgdata/pgerrorlogs/\{major-minor\}.0

    Помимо каталога с данным и каталога с журналом ошибок, необходимым является каталог с лицензией.

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

  3. Актуализируйте содержание файла .bash_profile:

    [postgres@ServerName ~]$ cp .bash_profile .bash_profile.orig
    [postgres@ServerName ~]$ cat << 'EOF' > .bash_profile
    # Pangolin
    export LD_LIBRARY_PATH=/usr/pangolin-major.minor/lib
    export PATH=$PATH:/usr/pangolin-major.minor/bin
    export PGHOME=/usr/pangolin-\{major-minor\}
    export PGDATABASE=postgres
    export PGUSER=postgres
    export PGHOST=127.0.0.1
    export PGPORT=5432
    export PGCLIENTENCODING=UTF8
    export CLNAME=clustername
    export PGSSLCERT=/pg_ssl/client.crt
    export PGSSLKEY=/pg_ssl/client.key
    export PGSSLROOTCERT=/pg_ssl/root.crt
    NOW=$(date +"%Y-%m-%d")
    export PGDATA=/pgdata/\{major-minor\}.0/data
    export MANPATH=$MANPATH:$PGHOME/share/man
    EOF
    [postgres@ServerName ~]$ source .bash_profile

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

  4. Инициализируйте кластер баз данных:

    [postgres@ServerName ~]$ initdb -D /pgdata/\{major-minor\}.0/data
    ...
    Data page checksums are disabled.

    fixing permissions on existing directory /pgdata/\{major-minor\}.0/data ... ok
    creating subdirectories ... ok
    selecting dynamic shared memory implementation ... posix
    selecting default max_connections ...
    "/usr/pangolin-major.minor/bin/postgres" --check -F -c log_checkpoints=false -c is_initdb=true -c max_connections=100 -c shared_buffers=1000 -c dynamic_shared_memory_type=posix < "/dev/null" > "/dev/null" 2>&1
    100
    selecting default shared_buffers ... 128MB
    selecting default time zone ... UTC
    creating configuration files ... ok
    running bootstrap script ... WARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not exists
    LOCATION: check_enable_params_cache, security.c:101
    ok
    performing post-bootstrap initialization ... WARNING: 01000: Force disable "enable_vault_params_cache", vault credentials does not exists
    LOCATION: check_enable_params_cache, security.c:101
    ok
    syncing data to disk ... ok

    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.

    Success. You can now start the database server using:

    pg_ctl -D /pgdata/\{major-minor\}.0/data -l logfile start

    Кластер инициализирован в новом каталоге /pgdata/\{major-minor\}.0/data

  5. Посмотрите содержимое проинициализированного каталога с данными:

    [postgres@ServerName ~]$ ls /pgdata/\{major-minor\}.0/data
    base pg_hba.conf pg_multixact pg_prep_stats pg_snapshots pg_tblspc pg_xact postmaster.pid
    global pg_ident.conf pg_notify pg_quota.conf pg_stat pg_twophase postgresql.auto.conf PRODUCT_VERSION
    pg_commit_ts pg_integrity pg_perf_insights pg_replslot pg_stat_tmp PG_VERSION postgresql.conf tracing
    pg_dynshmem pg_logical pg_pp_cache pg_serial pg_subtrans pg_wal postmaster.opts

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

    Однако, не забывайте, что мы также создали еще одно табличное пространство, размещенное в отдельном каталоге.

  6. Сравните значения параметра enabled_extra_auth_methods в старом и новом кластере:

    [postgres@ServerName ~]$ cat /pgdata/\{pangolin_version\}/data/postgresql.conf | grep enabled_extra_auth_methods
    enabled_extra_auth_methods = 'peer, trust, scram-sha-256'
    [postgres@ServerName ~]$ cat /pgdata/\{major-minor\}.0/data/postgresql.conf | grep enabled_extra_auth_methods
    enabled_extra_auth_methods = ''

    При обновлении с переносом данных также требуется выполнить перенос конфигурационных параметров со старого кластера на новый.

    В нашем случае нужно привести в соответствие значение параметра enabled_extra_auth_methods. Иначе подключение от имени роли postgres будет невозможно.

  7. Измените значение параметра enabled_extra_auth_methods в новом кластере:

    [postgres@ServerName ~]$ sed -i '/^enabled_extra_auth_methods/ c\enabled_extra_auth_methods = '\''peer, trust, scram-sha-256'\''' /pgdata/\{major-minor\}.0/data/postgresql.conf
    [postgres@ServerName ~]$ cat /pgdata/\{major-minor\}.0/data/postgresql.conf | grep enabled_extra_auth_methods
    enabled_extra_auth_methods = 'peer, trust, scram-sha-256'
  8. Запустите экземпляр Pangolin и подключитесь в psql к базе данных postgres с ролью postgres:

    [postgres@ServerName ~]$ pg_ctl start -l logfile
    waiting for server to start.... done
    server started
    [postgres@ServerName ~]$ psql
    psql (15.5)
    Type "help" for help.

    Был запущен кластер Pangolin новой версии, хотя каталог данных явно не был указан.

    Вспомним, что мы обновили значения переменных среды пользователя postgres в .bash_profile.

  9. Проверьте номер версии Pangolin и соответствующий номер версии оригинального PostgreSQL:

    postgres=# SELECT name, setting FROM pg_settings WHERE name IN ('server_se_version', 'server_version');
    name | setting
    -------------------+------------------------------
    server_se_version | Platform V Pangolin DB \{major-minor\}.0
    server_version | 15.5
    (2 rows)

    Подключение выполнено к экземпляру Pangolin версии {major-minor}.0, которому соответствует версия 15.5 оригинального PostgreSQL.

  10. Проверьте, с какой локалью инициализирован кластер баз данных:

postgres=# \l template0
List of databases
Name | Owner | Encoding | Collate | Ctype | ICU Locale | Locale Provider | Access privileges
-----------+----------+----------+-------------+-------------+------------+-----------------+-----------------------
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres +
| | | | | | | postgres=CTc/postgres
(1 row)

Новый кластер по умолчанию был инициализирован с той же локалью, что и старый.

  1. Выйдите из psql:
postgres=# \q

Перенос данных с использованием pg_upgrade​

  1. Проверьте версию утилиты pg_upgrade и pg_dump:

    [postgres@ServerName ~]$ pg_upgrade --version
    pg_upgrade (PostgreSQL) 15.5
    [postgres@ServerName ~]$ pg_dump --version
    pg_dump (PostgreSQL) 15.5

    Для переноса данных нужно, чтобы версии утилит pg_upgrade и pg_dump соответствовали новой версии Pangolin.

    Вспомним, что pg_upgrade логически переносит только данные системного каталога. Для этого он использует утилиту логического резервного копирования pg_dump. Файлы пользовательских таблиц и индексов логически не переносятся. Они либо копируются на новый кластер «как есть», либо на них создаются жесткие ссылки в нем (для этого в pg_upgrade используется ключ --link).

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

    [postgres@ServerName ~]$ pg_ctl stop
    waiting for server to shut down.... done
    server stopped

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

  3. Проверьте возможность выполнения переноса данных с использованием утилиты pg_upgrade:

    [postgres@ServerName ~]$ pg_upgrade --check \
    -b /usr/pangolin-\{pangolin_version\}/bin \
    -B /usr/pangolin-major.minor/bin \
    --new-bindirclient /usr/pangolin-dbms-client-major.minor/bin \
    -d /pgdata/\{pangolin_version\}/data \
    -D /pgdata/\{major-minor\}.0/data
    Performing Consistency Checks
    -----------------------------
    Checking cluster versions ok
    Checking old cluster type Pangolin
    Checking database user is the install user ok
    Checking database connection settings ok
    Checking for prepared transactions ok
    Checking for system-defined composite types in user tables ok
    Checking for reg* data types in user tables ok
    Checking for arrays of predefined domains in user tables ok
    Checking for contrib/isn with bigint-passing mismatch ok
    Checking for user-defined encoding conversions ok
    Checking for user-defined postfix operators ok
    Checking for incompatible polymorphic functions ok
    Checking for incompatible "xid" data type ok
    Checking for spgist indexes ok
    Checking for gin indexes ok
    Checking for external indexes ok
    Checking for presence of required libraries ok
    Checking database user is the install user ok
    Checking for prepared transactions ok
    Checking for new cluster tablespace directories ok

    *Clusters are compatible*
    ok

    Опция --check позволяет провести ряд проверок для определения возможности переноса данных между кластерами баз данных.

    Остальные опции определяют различные каталоги для старой и новой версии Pangolin, а именно:

    • -b — каталог с исполняемыми файлами серверной части старой версии Pangolin
    • -B — каталог с исполняемыми файлами серверной части новой версии Pangolin
    • --new-bindirclient — каталог с исполняемыми файлами клиентской части новой версии Pangolin, в нем в том числе находится pg_dump
    • -d — каталог с конфигурационными файлами старой версии Pangolin
    • -D — каталог с конфигурационными файлами новой версии Pangolin

    Здесь все проверки успешно пройдены. Может быть выполнен перенос данных из старого кластера в новый.

  4. Выполните перенос данных с использованием pg_upgrade:

    [postgres@ServerName ~]$ pg_upgrade \
    -b /usr/pangolin-\{pangolin_version\}/bin \
    -B /usr/pangolin-major.minor/bin \
    --new-bindirclient /usr/pangolin-dbms-client-major.minor/bin \
    -d /pgdata/\{pangolin_version\}/data \
    -D /pgdata/\{major-minor\}.0/data
    Restoring global objects in the new cluster ok
    Restoring database schemas in the new cluster
    ok
    Setting minmxid counter in new cluster ok
    Merging TDE settings ok
    Copying user relation files
    ok
    Setting next OID for new cluster ok
    Sync data directory to disk ok
    Creating script to delete old cluster ok
    Checking for spgist indexes ok
    Checking for gin indexes ok
    Checking for external indexes ok
    Checking for extension updates ok

    Upgrade Complete
    ----------------
    Optimizer statistics are not transferred by pg_upgrade.
    Once you start the new server, consider running:
    /usr/pangolin-dbms-client-major.minor/bin/vacuumdb --all --analyze-in-stages

    Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh
    ok

    Для переноса данных в pg_upgrade использованы те же ключи, что и для проверки возможности переноса, за исключением ключа --check.

    Перенос данных успешно выполнен.

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

  5. Запустите экземпляр Pangolin:

    [postgres@ServerName ~]$ pg_ctl start -l logfile
    waiting for server to start.... done
    server started
  6. Подключитесь к базе данных pgbench_db с ролью postgres и получите информацию об имеющихся таблицах:

    [postgres@ServerName ~]$ psql -d pgbench_db
    psql (15.5)
    Type "help" for help.
    pgbench_db=# SELECT relname,
    reltuples,
    pg_size_pretty(pg_total_relation_size(relname::regclass)) total_table_size,
    relhasindex
    FROM pg_class
    WHERE relname IN ('pgbench_accounts', 'pgbench_branches', 'pgbench_history', 'pgbench_tellers');
    relname | reltuples | total_table_size | relhasindex
    ------------------+-----------+------------------+-------------
    pgbench_accounts | -1 | 15 MB | t
    pgbench_branches | -1 | 56 kB | t
    pgbench_history | -1 | 5128 kB | f
    pgbench_tellers | -1 | 56 kB | t
    (4 rows)

    Все таблицы и индексы успешно перенесены. Размеры таблиц совпадают, поскольку перенос выполнен путем их физического копирования.

    Однако, количество строк не определено (reltuples = -1).

    Дело в том, что поле reltuple в таблице pg_class заполняется при обновлении статистики по данным.

    В нашем случае статистика по данным еще не успела собраться. Это произойдет через некоторое время — при срабатывании процесса автоочистки.

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

    Поэтому после выполнения переноса рекомендуется выполнить сбор статистики явно, с использованием команды ANALYZE.

  7. Выполните сбор статистики и снова получите информацию об имеющихся таблицах:

    pgbench_db=# ANALYZE;
    ANALYZE
    pgbench_db=# SELECT relname,
    reltuples,
    pg_size_pretty(pg_total_relation_size(relname::regclass)) total_table_size,
    relhasindex
    FROM pg_class
    WHERE relname IN ('pgbench_accounts', 'pgbench_branches', 'pgbench_history', 'pgbench_tellers');
    relname | reltuples | total_table_size | relhasindex
    ------------------+-----------+------------------+-------------
    pgbench_accounts | 100000 | 15 MB | t
    pgbench_branches | 1 | 56 kB | t
    pgbench_history | 100000 | 5128 kB | f
    pgbench_tellers | 10 | 56 kB | t
    (4 rows)

    Статистика собрана, теперь в поле reltuples указано количество строк в таблицах.

  8. Проверьте наличие созданной роли и табличного пространства:

    pgbench_db=# \du
    List of roles
    Role name | Attributes | Member of
    -----------+------------------------------------------------------------+-----------
    postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
    student | Create DB | {}
    pgbench_db=# \db
    List of tablespaces
    Name | Owner | Location
    -----------------+----------+-------------------------------
    pg_default | postgres |
    pg_global | postgres |
    some_tablespace | student | /home/postgres/tablespace_dir
    (3 rows)

    Глобальные объекты кластера (роли и табличные пространства) также успешно перенесены.

  9. Выйдите из psql и проверьте содержимое каталога tablespace_dir:

    pgbench_db=# \q
    [postgres@ServerName ~]$ ls tablespace_dir/
    PG_13_202306131 PG_15_202506231psql

    В каталоге табличного пространства создан новый подкаталог (PG_15_202506231psql), соответствующий новой версии Pangolin.

    В него скопированы файлы данных из каталога табличного пространства старого кластера Pangolin (PG_13_202306131).

    Обновление мажорной версии Pangolin с переносом данных успешно выполнено!

    Утилита pg_upgrade сгенерировала скрипт, удаляющий файлы старого кластера.

  10. Посмотрите содержимое скрипта delete_old_cluster.sh и выполните его:

[postgres@ServerName ~]$ cat delete_old_cluster.sh
#!/bin/sh

rm -rf '/pgdata/\{pangolin_version\}/data'
rm -rf '/home/postgres/tablespace_dir/PG_13_202306131'
[postgres@ServerName ~]$ bash delete_old_cluster.sh

Завершение​

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

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

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

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

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

    [postgres@ServerName ~]$ rm -rf ~/tablespace_dir/
  6. Выйдите из оболочки, запущенной от имени пользователя postgres:

    [postgres@ServerName ~]$ exit
    logout
  7. Перейдите в домашний каталог пользователя student и удалите каталог Distr:

    [student@ServerName Distr]$ cd ~ && rm -rf Distr

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

Вопрос 1

Какие действия выполняет утилита pg_upgrade без указания ключей --check и --link? Выберите все правильные варианты:

Вопрос 2

Какие условия нужно соблюсти для переноса данных с использованием утилиты pg_upgrade? Выберите все правильные варианты:

Вопрос 3

Перенос данных при обновлении кластера выполняется с использованием следующей команды:

[postgres@pangolin-prac-dcdp8b ~]$ pg_upgrade --link \
-b /usr/pangolin-5.5.6/bin \
-B /usr/pangolin-6.6/bin \
--new-bindirclient /usr/pangolin-dbms-client-6.6/bin \
-d /pgdata/5.5.6/data \
-D /pgdata/6.6.0/data

В обновляемом кластере баз данных пользовательские табличные пространства отсутствуют.

Какие каталоги будут физически содержать файлы с данными после выполнения переноса с использованием указанной команды?