Обновление 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