Имеется:
- Debian 9 (Stretch) 64-bit
 - PostgreSQL 9.6.8 (от PostgresPro)
 
Задача:
- Обновить PostgreSQL на более новую версию 10.9 (от 1С) 
и ничего не про*бать 
План действий:
- Теория по обновлению PostgreSQL
 - Создание резервной копии данных
 - Удаление текущей PostgreSQL 9.6.8
 - Подготовка к установке PostgreSQL 10.9 от 1С
 - Установка
 - Разворот резервной копии данных
 
1. Обновление PostgreSQL
Для перехода PostgreSQL с версии 9 на версию 10 недостаточно установить новые пакеты и подсунуть имеющийся каталог данных кластера.
При обновлении основных версий Postgres Pro внутренний формат данных может меняться, что усложняет процедуру обновления. Традиционный способ переноса данных в новую основную версию — выгрузить данные из старой версии, а затем загрузить их в новую (это не самый быстрый вариант). Выполнить обновление быстрее позволяет pg_upgrade. Также для обновления можно использовать репликацию.
В связи с тем, что у PostgresPro изменились правила лицензирования, и для свободного использования доступна лишь версия Postgres Pro Standard “для тестирования, разработки ПО, ознакомления с функциональностью СУБД, использования в образовательном процессе”, и для коммерческих целей ее использовать низя.
Поэтому планируется устанавливать уже готовые “пропатченные” пакеты, собранные самим 1С, и использовать pg_upgrade не будем.
Один из вариантов обновления заключается в выгрузке данных из одной основной версии Postgres Pro и загрузке их в другую — для этого необходимо использовать средство логического копирования, например pg_dumpall; копирование на уровне файловой системы не подходит. В самом сервере есть проверки, которые не дадут использовать каталог данных от несовместимой версии Postgres Pro, так что если попытаться запустить с существующим каталогом данных неправильную версию сервера, никакого вреда не будет.
Если попытаться запустить новый PostgreSQL со старым каталогом данных, будет вот такая ошибка:
[38003] ВАЖНО: файлы базы данных не совместимы с сервером
[38003] ПОДРОБНОСТИ: Каталог данных инициализирован сервером PostgreSQL версии 9.6, не совместимой с данной версией (10.9 (Ubuntu 10.9-5.1C)).
2. Создание резервной копии данных
Для создания копии рекомендуется применять программы pg_dump и pg_dumpall от новой версии Postgres Pro, чтобы воспользоваться улучшенными функциями, которые могли в них появиться. Хотя этот совет может показаться абсурдным, ведь новая версия ещё не установлена, ему стоит последовать, если вы планируете установить новую версию рядом со старой. В этом случае вы сможете выполнить установку как обычно, а перенести данные позже. Это также сократит время обновления.
Я создавал бэкап старой версией PostgreSQL, а потом устанавливал новую.
| 
					 1 2  | 
						$ su postgres $ pg_dumpall > backup_postgresql_9.6.sql  | 
					
3. Удаление текущей PostgreSQL 9.6.8
Смотрим что установлено:
| 
					 1 2 3 4 5  | 
						$ dpkg -l | grep postgres ii postgresql-client-pro-1c-9.6 9.6.8-1.1C.stretch amd64 front-end programs for PostgreSQL 9.6 ii postgresql-common-pro-1c 181-7.stretch all PostgreSQL database-cluster manager ii postgresql-contrib-pro-1c-9.6 9.6.8-1.1C.stretch amd64 additional facilities for PostgreSQL ii postgresql-pro-1c-9.6 9.6.8-1.1C.stretch amd64 object-relational SQL database, version 9.6 server  | 
					
Сохраняем конфиги для дальнейшего переноса настроек в новую версию (если в них что-то меняли, конечно):
| 
					 1 2  | 
						$ cp -a /etc/postgresql/10/main/postgresql.conf /home/USER $ cp -a /etc/postgresql/10/main/pg_hba.conf /home/USER  | 
					
Удаление старых пакетов версии 181. Можно снести postgresql-common, который потащит за собой все остальные:
| 
					 1  | 
						$ apt purge postgresql-common  | 
					
Удаляем с помощью purge , чтобы полностью снести конфиги текущей версии PostgreSQL, иначе при установки новой версии будут ошибки типа:
Not replacing deleted config file /etc/postgresql-common/createcluster.conf
В целом вот что снеслось:
postgresql-client-pro-1c-9.6
postgresql-common-pro-1c
postgresql-contrib-pro-1c-9.6
postgresql-pro-1c-9.6
4. Подготовка к установке PostgreSQL 10.9 от 1С
В особенностях релиза написано:
sudo apt-get install libicu55 postgresql-commonsudo apt-get install libicu-dev (для целей сборки)plperl plpython plpython3 pltcl test devel docsВ архиве postgresql-10.9-5.1C_amd64_deb лежат уже собранные пакеты:
- libpq5_10.9-5.1C_amd64.deb
 - postgresql-10_10.9-5.1C_amd64.deb
 - postgresql-client-10_10.9-5.1C_amd64.deb
 
В архиве postgresql-10.9-5.1C_amd64_addon_deb лежат доп.модули (мне не понадобились):
- libecpg6_10.9-5.1C_amd64.deb
 - libecpg-compat3_10.9-5.1C_amd64.deb
 - libecpg-dev_10.9-5.1C_amd64.deb
 - libpgtypes3_10.9-5.1C_amd64.deb
 - libpq-dev_10.9-5.1C_amd64.deb
 - postgresql-10-dbg_10.9-5.1C_amd64.deb
 - postgresql-doc-10_10.9-5.1C_all.deb
 - postgresql-plperl-10_10.9-5.1C_amd64.deb
 - postgresql-plpython-10_10.9-5.1C_amd64.deb
 - postgresql-plpython3-10_10.9-5.1C_amd64.deb
 - postgresql-pltcl-10_10.9-5.1C_amd64.deb
 - postgresql-server-dev-10_10.9-5.1C_amd64.deb
 
В архиве Patch_SUBD_PostgreSQL_10.9-5.1C лежат файлы для ручной сборки пропатченой postgresql (“голая” версия postgresql и патчи для нее):
- файлы .patch
 - postgresql-10_10.9-5.1C.debian.tar.xz
 - postgresql-10_10.9-5.1C.dsc
 - postgresql-10_10.9-5.1C_source.changes
 - postgresql-10_10.9.orig.tar.bz2
 
5. Установка PostgreSQL 10.9
1) Установим “правильную” локаль:
| 
					 1 2 3 4  | 
						$ locale-gen en_US $ locale-gen ru_RU $ update-locale LANG=ru_RU.UTF8 $ dpkg-reconfigure locales  | 
					
2) как сказано в особенностях релиза, сначала ставим зависимости libicu55 и postgresql-common :
2.1) libicu55
В debian 9 нет пакета libicu версии 55. Варианты решения проблемы:
а) скачать liibicu55 напрямую из репозитория и установить (мое решение):
| libicu55_55.1-7_amd64.deb | 2016-01-21 21:29 | 7.3M | 
| libicu55_55.1-7_i386.deb | 2016-01-21 21:30 | 7.4M | 
| libicu55_55.1-7ubuntu0.4_amd64.deb | 2018-03-28 17:48 | 7.3M | 
| libicu55_55.1-7ubuntu0.4_i386.deb | 2018-03-28 17:48 | 7.4M | 
| 
					 1 2 3  | 
						$ cd <каталог с пакетами PostgeSQL-1C> $ wget http://security.ubuntu.com/ubuntu/pool/main/i/icu/libicu55_55.1-7_amd64.deb $ sudo dpkg -i libicu55*.deb  | 
					
б) или пересобрать пакет PostgreSQL с использованием другой версии libicu (не пробовал)
1) копируем postgresql-contrib-*-1.1C_amd64.deb в папку на сервере, входим в нее
| 
					 1  | 
						$ cd <папка>  | 
					
2) Распаковываем пакет:
| 
					 1  | 
						$ dpkg -x postgresql-contrib-*-1.1C_amd64.deb tmpdir  | 
					
3) после:
| 
					 1  | 
						$ dpkg -e postgresql-contrib-*-1.1C_amd64.deb tmpdir/DEBIAN  | 
					
4) далее открываем в текстовом редакторе файл «control»:
| 
					 1  | 
						$ nano ./tmpdir/DEBIAN/control  | 
					
5) ищем строку libicu* (>= 1.4.6) и меняем ее на libicu52 (>= 1.4.6)
6) сохраняем изменения и собираем пакет обратно:
| 
					 1  | 
						$ dpkg -b tmpdir postgresql-contrib-*-1.1C_amd64_fix.deb  | 
					
в) говоряяяят, есть утилита aptly, позволяющая легко и удобно организовать управление пакетами, исправляя проблемы зависимостей (не пробовал).
2.2) postgresql-common
В debian 9 пакеты PosqtgreSQL имеют старую версию 181, а нужно >= 182.
Подключаем репозиторий PosqtgreSQL от более новой версии Debian 10 (buster), в которой имеются либы PosqtgreSQL версии 207.
| 
					 1 2 3 4 5  | 
						$ sudo apt-get install curl ca-certificates gnupg $ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - $ sudo nano /etc/apt/sources.list.d/pgdg.list deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main $ sudo apt-get update  | 
					
Устанавливаем:
| 
					 1  | 
						$ sudo apt-get install postgresql-common  | 
					
Если будет ошибка типа:
Not replacing deleted config file /etc/postgresql-common/createcluster.conf
Значит, не вычистили систему от конфигов прежней версии PostgreSQL.
3.1) Вариант установки уже собранных пакетов.
Ставим пакеты из основного архива: libpq5, postgresql-client и postgresql.
| 
					 1 2  | 
						$ cd <каталог с разархивироваными пакетами .deb> $ dpkg -i *.deb  | 
					
Но для libpq5 может понадобиться пакет libssl1.0.0, который отсутствует в Debian 9.
Он есть в Debian 8 (jessie). Подключим репозиторий:
| 
					 1 2 3  | 
						$ sudo nano /etc/apt/sources.list deb http://ftp.ru.debian.org/debian/ jessie main $ sudo apt update  | 
					
Устанавливаем:
| 
					 1  | 
						$ sudo apt install libssl1.0.0  | 
					
Закомментируем (или удалим) устаревший репозиторий и обновим индексы.
| 
					 1  | 
						$ sudo apt update  | 
					
И пробуем устанавливать опять.
3.2) Вариант ручной сборки пропатченной PostgreSQL и ее установка (не пробовал)
Описано здесь.
По поводу сборки, то имеет смысл собирать под текущую архитектуру процессора, используя ключи сборки -march=native -O3 -flto – это позволяет существенно (до 20-25%) повысить скорость стандартного теста pgbench (у меня с 8к до 10,8к увеличилась скорость при j10 и с10).
4) Проверяем, что установили:
| 
					 1 2 3 4 5 6  | 
						$ dpkg -l | grep postgres ... ii postgresql-10 10.9-5.1C amd64 object-relational SQL database, version 10 server ii postgresql-client-10 10.9-5.1C amd64 front-end programs for PostgreSQL 10 ii postgresql-client-common 207.pgdg100+1 all manager for multiple PostgreSQL client versions ii postgresql-common 207.pgdg100+1 all PostgreSQL database-cluster manager  | 
					
По-молчанию путь к кластеру установлен по пути:
/var/lib/postgresql/10/main
А логи тут:
/var/log/postgresql/postgresql-10-main.log
Можем переместить созданный каталог данных кластера в нужное нам место, или проинициализировать (создать) новый сразу в нужном месте:
| 
					 1 2  | 
						$ mkdir <psql_data_path> $ chown postgres:postgres <psql_data_path>  | 
					
1) вариант с переносом:
| 
					 1  | 
						$ mv /var/lib/postgresql/10/main/* <psql_data_path>  | 
					
2) вариант с инициализацией нового с помощью утилиты initdb (описание).
| 
					 1 2  | 
						$ su postgres $ /usr/lib/postgresql/10/bin/initdb -D <psql_data_path>  | 
					
Но нужно, чтобы новый каталог был пуст, иначе возникнет ошибка.
Приводим конфиги postgresql к нужному виду.
Тут добавил в конец файла измененные значения параметров:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20  | 
						$ nano /etc/postgresql/10/main/postgresql.conf # log logging_collector = on log_rotation_age = 1d log_rotation_size = 1GB log_directory = 'pg_log' log_destination = 'stderr' log_min_messages = error log_min_error_statement = error log_min_duration_statement = 2000 log_truncate_on_rotation = on log_filename = 'postgres-%a.log' # memory ... #other data_directory = 'postgres_data_path' listen_addresses = 'localhost' ...  | 
					
Тут добавил trust для учеток postgres и zabbix:
| 
					 1 2 3  | 
						$ nano /etc/postgresql/10/main/pg_hba.conf local   all             postgres                                trust local   zabbix          zabbix                                  trust  | 
					
Готово. Теперь можно попробовать запустить сервер баз данных:
| 
					 1  | 
						$ /usr/lib/postgresql/10/bin/pg_ctl -D /var/lib/postgresql/10/main -l <файл_журнала> start  | 
					
Или сразу службу:
| 
					 1  | 
						$ service postgresql start  | 
					
Добавляем службу в автозагрузку:
| 
					 1  | 
						$ systemctl enable postgresql  | 
					
Проверяем слушается ли порт 5432.
| 
					 1  | 
						$ netstat -tunlp | grep 5432  | 
					
6. Разворот резервной копии данных
Запускаем процесс восстановления из бэкапа (а на самом деле, процесс выполнения SQL-команд из файла) с помощью psql:
$ psql -f backup_postgresql_9.6.sqlНужно иметь ввиду, что владельцем файла бэкапа и каталога, в котором он лежит (!), должен быть postgres, иначе получим ошибку доступа.
| 
					 1 2  | 
						$ chown postgres:postgres backup_postgresql_9.6.sql  $ chown postgres:postgres </backup/postgres/>  | 
					
Готово. Все должно подняться.
А чем не нравится вариант фикса содержимого файла control в postgresql-contrib*.deb? Вместо libicu48 ставим libicu52 и нармуль.
Привычка ставить то, что просит, во избежание непредвиденных проблем. Хотя в данном случае можно и подредактировать зависимость, согласен.