Имеется:
- 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-common
sudo 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 и нармуль.
Привычка ставить то, что просит, во избежание непредвиденных проблем. Хотя в данном случае можно и подредактировать зависимость, согласен.