Пост

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

PostgreSQL — это объектно-реляционная система управления базами данных (ORDBMS), наиболее развитая из открытых СУБД в мире. Она позволяет хранить и управлять крупными объемами данных, обеспечивая высокую надёжность, производительность и масштабируемость.

Допустим на сервере установлена PostgreSQL 9.6, требуется обновить её на более новую версию (например при обновлении Zabbix с 3.2 до 6.2)

Установим PostgreSQL 15 из репозитория

1
2
3
4
5
6
$ sudo apt -y install gnupg2
$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt update
$ sudo apt -y install postgresql-15

Делаем сим линк

1
$ sudo ln -s /usr/lib/postgresql/15/bin/* /usr/sbin/

Смотрим, какие еще версии PostgreSQL есть в системе

1
2
3
4
5
6
7
$ sudo su - postgres

$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory                Log file
9.4 main    5431 down   postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log
9.6 main    5432 up   postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log
13  main    5433 up   postgres /var/lib/postgresql/13/main  /var/log/postgresql/postgresql-13-main.log

PostgreSQL 9.6: с данными, не трогаем её, остальные удаляем. Действия выполняются от пользователя postgres

1
2
$ pg_dropcluster --stop 9.4 main
$ pg_dropcluster --stop 13 main

Создаем новую БД: PostgreSQL 15

1
2
3
4
$ pg_createcluster --start 15 main \
--datadir=/var/lib/postgresql/15/main \
--logfile=/var/log/postgresql/postgresql-15-main.log \
--port=5433

Так же можно указать локаль при создании СУБД

1
$ pg_createcluster --locale ru_RU.UTF-8 --start 15 main

Если надо перезагрузить СУБД воспользуемся командой reload

1
$ pg_ctlcluster 15 main reload

Смотрим статус, выключаем все СУБД

1
2
3
4
5
6
7
8
$ pg_ctlcluster 15 main status
$ pg_ctlcluster 15 main stop
$ pg_ctlcluster 9.6 main stop

$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory                Log file
9.6 main    5432 down   postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log
15  main    5433 down   postgres /var/lib/postgresql/15/main  /var/log/postgresql/postgresql-15-main.log

Проверяем готовность СУБД к обновлению

1
2
3
4
5
6
7
8
9
10
$ /usr/lib/postgresql/15/bin/pg_upgrade \
--old-datadir=/var/lib/postgresql/9.6/main \
--new-datadir=/var/lib/postgresql/15/main \
--old-bindir=/usr/lib/postgresql/9.6/bin \
--new-bindir=/usr/lib/postgresql/15/bin \
--old-port=5432 \
--new-port=5433 \
--old-options '-c config_file=/etc/postgresql/9.6/main/postgresql.conf' \
--new-options '-c config_file=/etc/postgresql/15/main/postgresql.conf' \
--check

Если на этом этапе ошибок не возникло, можно обновлять PostgreSQL

1
2
3
4
5
6
7
8
9
$ /usr/lib/postgresql/15/bin/pg_upgrade \
--old-datadir=/mnt/data/postgresql/9.6/main \
--new-datadir=/mnt/data/postgresql/15/main \
--old-bindir=/usr/lib/postgresql/9.6/bin \
--new-bindir=/usr/lib/postgresql/15/bin \
--old-port=5432 \
--new-port=5433 \
--old-options '-c config_file=/etc/postgresql/9.6/main/postgresql.conf' \
--new-options '-c config_file=/etc/postgresql/15/main/postgresql.conf'

Если возникли ошибки, разбираемся как их устранить. У меня они были из-за подключенных расширений

Запускаем PostgreSQL, выполняем команду vacuumdb, смотрим статус

1
2
3
4
5
6
7
8
$ pg_ctlcluster 15 main start
$ pg_ctlcluster 9.6 main start
/usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory                Log file
9.6 main    5432 up   postgres /mnt/data/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log
15  main    5433 up   postgres /mnt/data/postgresql/15/main  /var/log/postgresql/postgresql-15-main.log

Если требуется поменять порты, останавливаем PostgreSQL

1
2
$ pg_ctlcluster 15 main stop
$ pg_ctlcluster 9.6 main stop

От пользователя с правами sudo, правим конфиг postgresql.conf

1
2
3
$ sudo nano /etc/postgresql/15/main/postgresql.conf
...
port = 5432

Правим конфиг pg_hba.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ sudo nano /etc/postgresql/15/main/pg_hba.conf
...
# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

Запустить БД можно несколькими способами:

1
$ sudo systemctl start postgresql@15-main

Либо от пользователя postgres

1
2
$ sudo su - postges
$ pg_ctlcluster 15 main start

Чтобы запустить все БД, установленные на сервере:

1
$ sudo systemctl start postgresql
Авторский пост защищен лицензией CC BY 4.0 .

© IT Draft. Некоторые права защищены.