PostgreSQL (Русский) - ArchWiki

Jump to content

# PostgreSQL (Русский)

3 languages

- English
- 日本語
- 中文（简体）

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи PostgreSQL. Дата последней синхронизации: 21 ноября 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Ссылки по теме

- PhpPgAdmin

PostgreSQL — это поддерживаемая сообществом система управления базами данных с открытым исходным кодом.

## Установка

Важно: Смотрите раздел #Обновление PostgreSQL для выполнения обязательных шагов перед установкой обновлений пакета PostgreSQL.

Установите пакет postgresql. Он также создаст системного пользователя postgres.

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

Примечание: Команды, которые нужно запускать от имени пользователя postgres, в данной статье обозначены префиксом `[postgres]$`.

Для переключения в пользователя postgres можно использовать одну из следующих команд:

- Если у вас есть sudo и ваш пользователь прописан в sudoers:

      $ sudo -iu postgres

- Или через su:

      $ su
      # su -l postgres

Смотрите также документацию sudo(8) или su(1).

## Начальная настройка

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

    [postgres]$ initdb -D /var/lib/postgres/data

Где опция `-D` указывает на стандартное расположение данных кластера (если вы хотите использовать другой каталог, смотрите раздел #Изменение стандартного каталога данных). `initdb` принимает дополнительные аргументы:

- По умолчанию локаль и кодировка для кластера баз данных наследуются из вашего текущего окружения (используется значение $LANG). Если вас это не устраивает, вы можете прописать нужные параметры вручную с помощью опций `--locale=локаль` (где локаль должна быть одной из доступных системных локалей) и `--encoding=кодировка` для выбора кодировки (должна соответствовать выбранной локали). (После настройки базы данных вы сможете посмотреть используемые значения командой `[postgres]$ psql -l`.)
- Если каталог с данными расположен на файловой системе без контроля целостности данных, вы можете включить встроенный в PostgreSQL подсчёт контрольных сумм для повышения гарантий целостности — для этого добавьте аргумент `--data-checksums`. Дополнительная информация описана в разделе #Включение подсчёта контрольных сумм. (После настройки базы данных вы сможете посмотреть. включена ли эта функция, командой `[postgres]$ psql -c "SHOW data_checksums"`.)
- Другие доступные опции можно посмотреть в `initdb --help` или официальной документации.

Пример для русской локали:

    [postgres]$ initdb --locale=ru_RU.UTF-8 --encoding=UTF8 -D /var/lib/postgres/data --data-checksums

После инициализации на экране появится много строчек, некоторых из которых оканчиваются на `... ок`:

    Файлы, относящиеся к этой СУБД, будут принадлежать пользователю "postgres".
    От его имени также будет запускаться процесс сервера.

    Кластер баз данных будет инициализирован с локалью "ru_RU.UTF-8".
    Кодировка БД по умолчанию, выбранная в соответствии с настройками: "UTF8".
    Выбрана конфигурация текстового поиска по умолчанию "russian".

    Контроль целостности страниц данных отключён.

    исправление прав для существующего каталога /var/lib/postgres/data... ок
    создание подкаталогов... ок
    выбирается реализация динамической разделяемой памяти... posix
    выбирается значение max_connections по умолчанию... 100
    выбирается значение shared_buffers по умолчанию... 128MB
    выбирается часовой пояс по умолчанию... Europe/Moscow
    создание конфигурационных файлов... ок
    выполняется подготовительный скрипт... ок
    выполняется заключительная инициализация... ок
    сохранение данных на диске... ок

    initdb: предупреждение: включение метода аутентификации "trust" для локальных подключений
    Другой метод можно выбрать, отредактировав pg_hba.conf или используя ключи -A,
    --auth-local или --auth-host при следующем выполнении initdb.

    Готово. Теперь вы можете запустить сервер баз данных:

        pg_ctl -D /var/lib/postgres/data -l файл_журнала start

Если вы видите подобное, значит инициализация прошла успешно. Можно вернуться в обычного пользователя, выполнив команду `exit` в сеансе пользователя postgres.

Примечание: Подробнее об этом предупреждении читайте в разделе #Ограничение доступа к суперпользователю по умолчанию.
Совет: Если вы хотите использовать путь отличный от `/var/lib/postgres`, нужно отредактировать файл службы systemd. Если вы помещаете его в `/home`, не забудьте отключить `ProtectHome`.
Важно:

- Если база данных располагается на файловой системе Btrfs, стоит отключить копирование при записи для каталога перед созданием любых баз данных.
- Если база данных располагается на файловой системе ZFS, прочтите ZFS#Databases перед созданием любых баз данных.

Наконец, запустите и включите службу `postgresql.service`.

## Создание первой базы данных

Совет: Если имя роли/пользователя совпадает с именем вашего пользователя в Linux, вы сможете получить доступ к оболочке PostgreSQL без явного указания имени пользователя (что весьма удобно).

Становимся пользователем postgres. Добавляем нового пользователя базы данных с помощью команды createuser:

    [postgres]$ createuser --interactive

Создаём новую базу данных от имени пользователя, имеющего доступ на чтение-запись, с помощью команды createdb (выполните эту команду в оболочке вашего обычного пользователя, если имя будущего владельца базы данных совпадает с вашим именем пользователя в Linux, в ином случае добавьте опцию `-O имя-пользователя`)

    $ createdb имяМоейБазы

Совет: Если вы не выдали разрешение на создание баз данных вашему свежесозданному пользователю, добавьте опцию `-U postgres` к этой команде.

## Знакомство с PostgreSQL

### Доступ к оболочке базы данных

Становимся postgres пользователем. Запускаем основную оболочку базы данных psql, в которой мы сможем создавать, удалять базы данных/таблицы, задавать права и запускать команды SQL. Используйте опцию `-d`, чтобы указать название базы данных, которую вы создали (если опцию не указать, то `psql` попытается подключиться к базе, имя которой совпадает с именем пользователя).

    [postgres]$ psql -d имяМоейБазы

Некоторые полезные команды:

Получение справки:

    => \help

Подключение к определённой базе данных:

    => \c <database>

Список всех пользователей и их уровни доступа:

    => \du

Краткая информация о всех таблицах в текущей базе данных:

    => \dt

Выход из оболочки `psql`:

    => \q или CTRL+d

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

    => \?

## Дополнительные настройки

Файл настроек сервера баз данных PostgreSQL — `postgresql.conf`. Этот файл находится в папке данных сервера, обычно `/var/lib/postgres/data`. В этой же папке находятся основные файлы настроек включая и `pg_hba.conf`, который определяет параметры аутентификации, как для локальных пользователей, так и для пользователей с других хостов.

Примечание: По умолчанию эта папка не доступна даже для просмотра (или поиска) от лица обычного пользователя.

### Ограничение доступа к суперпользователю по умолчанию

По умолчанию `pg_hba.conf` разрешает подключение любого локального пользователя к любому пользователю базы данных, в том числе суперпользователю. Скорее всего это не то, что вам нужно, поэтому, чтобы разрешить подключение только пользователю postgres, измените эту строку:

    /var/lib/postgres/data/pg_hba.conf

    # TYPE  DATABASE        USER            ADDRESS                 METHOD

    # "local" is for Unix domain socket connections only
    local   all             all                                     trust

На эту:

    /var/lib/postgres/data/pg_hba.conf

    # TYPE  DATABASE        USER            ADDRESS                 METHOD

    # "local" is for Unix domain socket connections only
    local   all             postgres                                peer

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

### Требование пароля при входе

Измените `/var/lib/postgres/data/pg_hba.conf`, прописав метод аутентификации для каждого пользователя (или «all» для всех пользователей) на `scram-sha-256` (предпочтительно) или `md5` (менее безопасно; по возможности стоит его избегать):

    /var/lib/postgres/data/pg_hba.conf

    # TYPE  DATABASE        USER            ADDRESS                 METHOD

    # "local" is for Unix domain socket connections only
    local   all             пользователь                            scram-sha-256

Если вы выбрали `scram-sha-256`, также нужно изменить `/var/lib/postgres/data/postgresql.conf`:

    /var/lib/postgres/data/postgresql.conf

    password_encryption = scram-sha-256

Перезапустите службу `postgresql.service` и заново пропишите пароли для пользователей с помощью SQL-запроса `ALTER USER пользователь WITH ENCRYPTED PASSWORD 'пароль';`.

### Доступ только через Unix-сокет

В разделе «connections and authentication» пропишите:

    /var/lib/postgres/data/postgresql.conf

    listen_addresses = ''

Это полностью отключит доступ через сеть. Не забудьте перезапустить службу `postgresql.service` для применения изменений.

### Доступ с удалённых хостов

В разделе «connections and authentication» раскомментируйте или исправьте строку `listen_addresses` по вашему желанию, например:

    /var/lib/postgres/data/postgresql.conf

    listen_addresses = 'localhost,мой_локальный_ip'

Можно использовать `'*'` для прослушивания всех доступных сетевых интерфейсов.

Примечание: PostgreSQL по умолчанию использует TCP-порт `5432` для удалённого доступа. Убедитесь, что этот порт открыт в вашем межсетевом экране и может принимать входящие соединения. Изменить порт можно в этом же файле настроек, под строкой `listen_addresses`.

Затем измените настройки аутентификации:

    /var/lib/postgres/data/pg_hba.conf

    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    # IPv4 local connections:
    host    all             all             ip_адрес/32             md5

где `ip_адрес` — IP-адрес удалённого клиента.

Смотрите также документацию по pg_hba.conf.

Примечание: Ни отправка простого пароля, ни отправка md5-хэша (использованный в приведённом выше примере) через интернет не являются безопасными, если это не выполняется через защищенное SSL-соединение. Смотрите Secure TCP/IP Connections with SSL, чтобы узнать, как настроить PostgreSQL с использованием SSL.

Перезапустите службу `postgresql.service` для применения изменений.

В случае проблем посмотрите журнал сервера:

    # journalctl -u postgresql.service

### Настройка аутентификации через PAM

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

Например, та же конфигурация, что и выше, но с включенным PAM:

    /var/lib/postgres/data/pg_hba.conf

    # IPv4 local connections:
    host   all   all   ip_адрес/32   pam

Однако сервер PostgreSQL работает без прав root и не сможет получить доступ к файлу `/etc/shadow`. Мы можем обойти это, разрешив группе postgres доступ к этому файлу:

    # setfacl -m g:postgres:r /etc/shadow

### Изменение стандартного каталога данных

По умолчанию PostgreSQL настроен на использование каталога `/var/lib/postgres/data` для хранения всех баз данных. Для его изменения выполните следующие шаги:

Создайте новый каталог и сделайте пользователя postgres его владельцем:

    # mkdir -p /путь/к/pgroot/data
    # chown -R postgres:postgres /путь/к/pgroot

Войдите в пользователя postgres и выполните инициализацию кластера:

    [postgres]$ initdb -D /путь/к/pgroot/data

Отредактируйте службу `postgresql.service`, создав drop-in файл и переопределив настройки `Environment` и `PIDFile`. Например:

    /etc/systemd/system/postgresql.service.d/PGROOT.conf

    [Service]
    Environment=PGROOT=/путь/к/pgroot
    PIDFile=/путь/к/pgroot/data/postmaster.pid

Если вы хотите использовать каталог в `/home`, добавьте ещё одну строку:

    ProtectHome=false

### Изменение кодировки новых баз данных на UTF-8

Примечание: Если вы выполнили `initdb` с опцией `--encoding=UTF8` или с использованием локали UTF-8, выполнять эти шаги не нужно.

Когда создаётся новая база данных (например, командой `createdb blog`), PostgreSQL просто копирует шаблон базы данных. Есть два стандартных шаблона: `template0` — ванильный, и `template1`, который используется по умолчанию и предназначен для редактирования администратором. Один из вариантов изменения кодировки новой базы данных — изменить шаблон `template1`. Для этого зайдите в оболочку PostgreSQL (`psql`) и выполните следующее:

Сперва нужно удалить `template1`. Шаблоны нельзя удалять, так что сперва нужно преобразовать его в обычную базу данных:

    UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';

Теперь можно удалить:

    DROP DATABASE template1;

Затем создайте новую базу данных с новой кодировкой по умолчанию, в качестве шаблона используя `template0`:

    CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE';

Теперь снова сделайте `template1` шаблоном:

    UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

По желанию, если вы не хотите, чтобы кто-либо подключался к этому шаблону, присвойте параметру `datallowconn` значение `FALSE`:

    UPDATE pg_database SET datallowconn = FALSE WHERE datname = 'template1';

Примечание: Этот шаг может привести к проблемам при обновлении через `pg_upgrade`.

Теперь вы можете создать базу данных, используя стандартные команды в терминале:

    [postgres]$ createdb blog

Если снова войти в `psql` и проверить базу данных, вы должны увидеть правильную кодировку новой базы данных:

    \l

                                  List of databases
      Name    |  Owner   | Encoding  | Collation | Ctype |   Access privileges
    -----------+----------+-----------+-----------+-------+----------------------
    blog      | postgres | UTF8      | C         | C     |
    postgres  | postgres | SQL_ASCII | C         | C     |
    template0 | postgres | SQL_ASCII | C         | C     | =c/postgres
                                                         : postgres=CTc/postgres
    template1 | postgres | UTF8      | C         | C     |

### Включение подсчёта контрольных сумм

Если файлы вашей базы данных находятся на файловой системе, которая не использует контрольные суммы, то данные в ней могут незаметно повреждаться из-за битфлипов и аппаратных проблем. Хотя такие случаи редки, желательно включить встроенный в PostgreSQL подсчёт контрольных сумм, если вы заботитесь о целостности данных. Эта функция должна быть включена на уровне кластера, а не для отдельных баз данных или таблиц.

Примечание: Ряд предостережений, которые стоит иметь в виду:

- Есть небольшое влияние на производительность, особенно при чтении больших массивов данных с диска. На операции в памяти это не влияет.
- PostgreSQL не может исправить повреждённые данные — он только прервёт транзакции, читающие с повреждённых страниц, чтобы предотвратить дальнейшее повреждение или получение некорректных результатов выполнения.
- Контрольные суммы охватывают только страницы данных (строк) на диске, но не метаданные или управляющие структуры. Страницы в памяти не проверяются. Хранилища с коррекцией ошибок и память с ECC по-прежнему полезны.

- Чтобы включить подсчёт контрольных сумм при создании кластера, добавьте аргумент `--data-checksums` к команде `initdb`.
- Чтобы проверить, включен ли подсчёт контрольных сумм, выполните `[postgres]$ psql -c "SHOW data_checksums"` (выведется `off` или `on`).
- Чтобы включить подсчёт контрольных сумм на существующем кластере:

1. Остановите службу `postgresql.service`.
2. Выполните команду `[postgres]$ pg_checksums --pgdata /var/lib/postgres/data --enable` (или `--disable`, если вы хотите наоборот выключить эту функцию). Включение подсчёта контрольных сумм приведёт к перезаписи всех страниц базы данных, что займет некоторое время в больших базах данных.
3. Запустите службу `postgresql.service`.

## Графические инструменты

- phpPgAdmin — Веб-интерфейс для администрирования PostgreSQL.

  https://github.com/phppgadmin/phppgadmin || phppgadminAUR

- pgAdmin — Комплексный графический интерфейс для управления PostgreSQL.

  https://www.pgadmin.org/ || pgadmin3AUR[ссылка недействительна: package not found] или pgadmin4[ссылка недействительна: package not found]

- pgModeler — Инструмент для моделирования баз данных PostgreSQL.

  https://pgmodeler.io/ || pgmodelerAUR

Список инструментов, поддерживающих несколько разных СУБД, можно посмотреть в статье List of applications/Documents#Database tools.

## Обновление PostgreSQL

This article or section needs expansion.

Reason: How to upgrade when using third party extensions? (Discuss in Talk:PostgreSQL#pg_upgrade problem if extensions (like postgis) are used)

Для обновления до новой мажорной версии PostgreSQL (например, с версии 13.x на версию 14.y) необходима специальная процедура.

Примечание: Следуйте официальной документации по обновлению.
Важно: Приведённые ниже инструкции потенциально могут привести к потере данных. Не запускайте эти команды вслепую без понимания того, что они делают. Сделайте резервную копию перед началом.

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

    # cat /var/lib/postgres/data/PG_VERSION

Чтобы случайно не обновиться до несовместимой версии, рекомендуется запретить обновления пакетов PostgreSQL.

Минорные обновления вполне безопасны. Однако если вы случайно обновитесь до другой мажорной версии, то не сможете получить доступ к данным. Всегда проверяйте домашнюю страницу PostgreSQL, чтобы знать, какие шаги требуются для каждого обновления. Чтобы узнать, почему это так, смотрите политику управления версиями.

Примечание: Если вы используете расширения, смотрите разделы #PostgreSQL не может запуститься после обновления пакета при использовании расширений и #Не удаётся запустить PostgreSQL со старой версией базы данных при обновлении до новой версии с расширениями.

Есть два основных способа обновить базу данных PostgreSQL. Подробности читайте в официальной документации.

### pg_upgrade

Утилита `pg_upgrade` пытается скопировать как можно больше совместимых данных между кластерами и обновить всё остальное. Как правило, это самый быстрый метод обновления большинства экземпляров, хотя он требует доступа к бинарным файлам исходной и целевой версий PostgreSQL. Прочтите справочную страницу pg_upgrade(1), чтобы понять, какие действия он выполняет. Для нетривиальных экземпляров (например, с потоковой репликацией или трансляцией журналов) сперва ознакомьтесь с официальной документацией.

Для тех, кто хочет использовать `pg_upgrade`, доступен пакет postgresql-old-upgrade, который всегда отстаёт на одну мажорную версию от основного пакета PostgreSQL. Его можно установить параллельно с новой версией PostgreSQL. Для обновления более старых версий PostgreSQL доступны пакеты AUR, например postgresql-12-upgradeAUR. (Нужно использовать команду `pg_upgrade` из той версии PostgreSQL, на которую вы хотите обновиться.)

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

Когда вы будете готовы к обновлению, выполните следующие шаги:

1. Пока старая база данных всё ещё доступна, соберите аргументы для команды `initdb`, которые использовались при создании базы. Команды для просмотра текущих настроек кластера описаны в разделе #Начальная настройка.
2. Остановите службу `postgresql.service`. (Проверьте статус юнита, чтобы убедиться, что PostgreSQL завершился корректно, иначе `pg_upgrade` не сможет отработать корректно.)
3. Обновите пакеты postgresql, postgresql-libs и postgresql-old-upgrade.
4. Переименуйте каталог со старым кластером и создайте каталог для нового кластера и временный каталог:

       # mv /var/lib/postgres/data /var/lib/postgres/olddata
       # mkdir /var/lib/postgres/data /var/lib/postgres/tmp
       # chown postgres:postgres /var/lib/postgres/data /var/lib/postgres/tmp
       [postgres]$ cd /var/lib/postgres/tmp

5. Инициализируйте новый кластер командой `initdb` с теми же аргументами, которые использовались для старого кластера:

       [postgres]$ initdb -D /var/lib/postgres/data --locale=ru_RU.UTF-8 --encoding=UTF8 --data-checksums

6. Обновите кластер, выполнив эту команду (замените `PG_VERSION` на номер старой версии, например `13`):

       [postgres]$ pg_upgrade -b /opt/pgsql-PG_VERSION/bin -B /usr/bin -d /var/lib/postgres/olddata -D /var/lib/postgres/data

   Примечание: Не забудьте обновить файлы конфигурации (например, `pg_hba.conf` и `postgresql.conf`) для соответствия старому кластеру.
   Примечание: Если `pg_upgrade` завершается с ошибкой `The source cluster was not shut down cleanly`, значит PostgreSQL не был остановлен перед запуском обновления. Остановите его, затем перезапустите кластер со старыми бинарными файлами, чтобы восстановить старые файлы кластера:

       [postgres]$ /opt/pgsql-PG_VERSION/bin/pg_ctl start -D /var/lib/postgres/olddata && /opt/pgsql-PG_VERSION/bin/pg_ctl stop -D /var/lib/postgres/olddata

   После этого можно снова выполнить `pg_upgrade`. Если обновиться всё равно не получается, остановите все процессы СУБД, откатитесь на более старую версию PostgreSQL, восстановите предыдущие данные кластера из резервных копий и перезапустите процесс обновления.
7. Запустите службу `postgresql.service`.
8. Опционально: Выполните `[postgres]$ /usr/bin/vacuumdb --all --analyze-in-stages` для пересчёта статистики анализатора запросов, что должно улучшить производительность запросов вскоре после обновления (добавление аргумента `--jobs=ЧИСЛО_ЯДЕР_ПРОЦЕССОРА` может улучшить производительность этой команды).
9. Опционально: Сделайте резервную копию каталога `/var/lib/postgres/olddata` на случай, если вдруг понадобится вернуть старую версию PostgreSQL.
10. Удалите каталог `/var/lib/postgres/olddata` со старыми данными кластера.
11. Удалите каталог `/var/lib/postgres/tmp`.

### Выгрузка и загрузка вручную

Ещё можно сделать что-то вроде такого (после обновления и установки postgresql-old-upgrade):

Примечание:

- В примере показано обновление с PostgreSQL 13; посмотрите в `/opt/` установленную у вас версию postgresql-old-upgrade и исправьте команды по необходимости.
- Если вы меняли файл `pg_hba.conf`, вам может понадобиться временно разрешить полный доступ к старому кластеру с локальной системы. После обновления не забудьте прописать нужные вам настройки в новом кластере и перезапустить службу `postgresql.service`.

Остановите службу `postgresql.service`.

    # mv /var/lib/postgres/data /var/lib/postgres/olddata
    # mkdir /var/lib/postgres/data
    # chown postgres:postgres /var/lib/postgres/data
    [postgres]$ initdb -D /var/lib/postgres/data
    [postgres]$ /opt/pgsql-13/bin/pg_ctl -D /var/lib/postgres/olddata/ start
    # cp /usr/lib/postgresql/postgis-3.so /opt/pgsql-13/lib/ # Только если установлен postgis
    [postgres]$ pg_dumpall -h /tmp -f /tmp/old_backup.sql
    [postgres]$ /opt/pgsql-13/bin/pg_ctl -D /var/lib/postgres/olddata/ stop

Запустите службу `postgresql.service`.

    [postgres]$ psql -f /tmp/old_backup.sql postgres

## Решение проблем

### Ускорение мелких транзакций

Если вы используете PostgreSQL на своей локальной машине для разработки и он медленный, то можете попробовать отключить synchronous_commit в конфигурации. Однако, не забывайте про его особенности.

    /var/lib/postgres/data/postgresql.conf

    synchronous_commit = off

### Запретить запись на диск во время бездействия

PostgreSQL периодически обновляет свою статистику, лежащую в файле. По умолчанию этот файл находится на диске, что не даёт отдыхать жёсткому диску (и изнашивает его), заставляя его шуметь. Однако можно легко и безопасно переместить статистику в ОЗУ с помощью такой настройки:

    /var/lib/postgres/data/postgresql.conf

    stats_temp_directory = '/run/postgresql'

### Проблемы с pgAdmin 4 после обновления до PostgreSQL 12

Если вы видите ошибки вроде `string indices must be integers` при навигации по дереву слева или `column rel.relhasoids does not exist` при просмотре данных, удалите сервер из списка соединений в pgAdmin и добавьте его заново. Без этого pgAdmin продолжает считать его сервером PostgreSQL 11, что и приводит к таким ошибкам.

### PostgreSQL не может запуститься после обновления пакета при использовании расширений

Причина скорее всего в том, что существующий пакет не скомпилирован для новой версии (а она может быть актуальной), решение — пересобрать пакет вручную или дождаться обновления пакета расширения.

### Не удаётся запустить PostgreSQL со старой версией базы данных при обновлении до новой версии с расширениями

Это происходит потому, что старая версия postgres из пакета postgresql-old-upgrade не имеет необходимых расширений (.so файлов) в своём каталоге lib. Предлагаемое здесь решение грязное и может вызвать много проблем, поэтому сохраните резервную копию базы данных на всякий случай. В целом, скопируйте необходимые .so файлы расширений из `/usr/lib/postgresql/` в `/opt/pgsql-XX/lib/` (не забудьте заменить XX на мажорную версию пакета postgresql-old-upgrade).

Например, для timescaledb:

    # cp /usr/lib/postgresql/timescaledb*.so /opt/pgsql-13/lib/

Важно: Хотя копирования .so файлов обычно достаточно, может понадобиться скопировать больше файлов в правильные расположения в `/opt/pgsql-XX/`.

Чтобы узнать точные файлы для копирования, посмотрите содержимое пакета расширения с помощью команды:

    $ pacman -Ql имя_пакета

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

- Relational DBMSs (Русский)

Hidden categories:

- Pages with broken package links
- Pages or sections flagged with Template:Expansion