PostgreSQL (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
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
).
Чтобы включить подсчёт контрольных сумм на существующем кластере:
Остановите
службу
postgresql.service
.
Выполните команду
[postgres]$ pg_checksums --pgdata /var/lib/postgres/data --enable
(или
--disable
, если вы хотите наоборот выключить эту функцию). Включение подсчёта контрольных сумм приведёт к перезаписи всех страниц базы данных, что займет некоторое время в больших базах данных.
Запустите
службу
postgresql.service
.
Графические инструменты
phpPgAdmin
— Веб-интерфейс для администрирования PostgreSQL.
https://github.com/phppgadmin/phppgadmin
||
phppgadmin
AUR
pgAdmin
— Комплексный графический интерфейс для управления PostgreSQL.
https://www.pgadmin.org/
||
pgadmin3
AUR
[
ссылка недействительна
: package not found]
или
pgadmin4
AUR
pgModeler
— Инструмент для моделирования баз данных PostgreSQL.
https://pgmodeler.io/
||
pgmodeler
AUR
Список инструментов, поддерживающих несколько разных СУБД, можно посмотреть в статье
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-upgrade
AUR
. (Нужно использовать команду
pg_upgrade
из той версии PostgreSQL, на которую вы хотите обновиться.)
Обратите внимание, что каталог кластера баз данных не меняется от версии к версии, поэтому перед запуском
pg_upgrade
необходимо переименовать старый каталог данных и выполнить миграцию в новый каталог. Новый кластер баз данных необходимо инициализировать с теми же параметрами, что и старый.
Когда вы будете готовы к обновлению, выполните следующие шаги:
Пока старая база данных всё ещё доступна, соберите аргументы для команды
initdb
, которые использовались при создании базы. Команды для просмотра текущих настроек кластера описаны в разделе
#Начальная настройка
.
Остановите
службу
postgresql.service
. (Проверьте
статус юнита
, чтобы убедиться, что PostgreSQL завершился корректно, иначе
pg_upgrade
не сможет отработать корректно.)
Обновите
пакеты
postgresql
,
postgresql-libs
и
postgresql-old-upgrade
.
Переименуйте каталог со старым кластером и создайте каталог для нового кластера и временный каталог:
# 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
Инициализируйте новый кластер командой
initdb
с теми же аргументами, которые использовались для старого кластера:
[postgres]$ initdb -D /var/lib/postgres/data --locale=
ru_RU.UTF-8
--encoding=
UTF8
--data-checksums
Обновите кластер, выполнив эту команду (замените
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, восстановите предыдущие данные кластера из резервных копий и перезапустите процесс обновления.
Запустите
службу
postgresql.service
.
Опционально:
Выполните
[postgres]$ /usr/bin/vacuumdb --all --analyze-in-stages
для пересчёта статистики анализатора запросов, что
должно улучшить производительность запросов
вскоре после обновления (добавление аргумента
--jobs=
ЧИСЛО_ЯДЕР_ПРОЦЕССОРА
может улучшить производительность этой команды).
Опционально:
Сделайте резервную копию каталога
/var/lib/postgres/olddata
на случай, если вдруг понадобится вернуть старую версию PostgreSQL.
Удалите каталог
/var/lib/postgres/olddata
со старыми данными кластера.
Удалите каталог
/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
имя_пакета
Важно
Это очень грязное решение, которое может привести к потере данных в базе, поэтому создайте резервную копию перед выполнением этих действий.