Парни из проекта Command Prompt сделали шикарный подарок всем пользователям Ubuntu, особенно тем, кто нежно любит СУБД PostgreSQL. Различные версии этой прекрасной БД представлены в различных snap пакетах, что открывает перед вами новые возможности. Вы сможете поставить все версии одновременно и использовать их, к примеру, для тестирования своего приложения, использующего PostgreSQL.
Для установки используйте - sudo snap install postgresql$version
Где $version 93, 94, 95 или 96.
Традиционно PostgreSQL стартует от непривилегированного пользователя postgres. Будьте аккуратны если у вас есть уже установленный PostgreSQL из официальных репо или PPA. Такой пользователь postgres уже будет существовать в операционной системе. Вам придётся использовать другое произвольное имя, особенно если захотите установить параллельно несколько версий. Нежелательно использовать существующий postgres и лучше создайте новые учётные записи.
Ниже в разделе "Проблемы и ограничения" прочтёте подробнее о временных сложностях, а пока следует знать - как нужно управляться конкретной версией СУБД.
Чтобы показать вам, дорогие читатели, самый сложный вариант, решил поставить все 4 доступные версии и показать на их примере как разрешить вопрос об учётной записи для каждой из версий и как разрулить вопрос с дефолтным портом 5432.
Ставим все версии - sudo snap install postgresql9*
snap list
Name Version Rev Developer Notes postgresql93 9.3.15 3 cmd - postgresql94 9.4.10 3 cmd - postgresql95 9.5.5 3 cmd - postgresql96 9.6.1 3 cmd -
Создаём 4 учётные записи через adduser. Решил не мудрить и назвал учётки postgresql user - pu93, pu94, pu95, pu96. На данном этапе кратко напомню что за новый мир snap. Программа внутри snap пакета сильно сжата с помощью squashfs и при установке пакета в систему её прозрачно для нас монтируют, но данное место программе не доступно для записи. Если внутри программы или в её стартовых скриптах нужно понять автору пакета где именно она находится, то следует оперировать переменной $SNAP. Для записи десктопной программе следует манипулировать переменной $SNAP_USER_DATA, а для сервисов-демонов $SNAP_DATA. Эти переменные традиционно тянутся в папку той учётной записи, от которой потом будет работать программа или сервис.
Итак, у нас поставлены 4 версии PostgreSQL и созданы 4 учётные записи - pu9[3/4/5/6]. В 4 Терминалах через su - pu9x
осуществлён вход в конкретные учётные записи. Дальше будет приведён пример для версии 9.3, так как остальное делается по аналогии.
В учётной записи pu93 командуем
$ postgresql93.initialize initdb
Generating a new locale in /home/pu93/snap/postgresql93/3/locales/en_US.UTF-8... Setting up PostgreSQL environment... Data directory: /home/pu93/snap/postgresql93/3/data Logs directory: /home/pu93/snap/postgresql93/3/logs psql history directory: /home/pu93/snap/postgresql93/3/history .psqlrc file: /home/pu93/snap/postgresql93/3/.psqlrc Checking if initdb has already been run before. If not, a new cluster will be created. The files belonging to this database system will be owned by user "pu93". This user must also own the server process. The database cluster will be initialized with locale "en_US.UTF-8". The default database encoding has accordingly been set to "UTF8". The default text search configuration will be set to "english". Data page checksums are disabled. fixing permissions on existing directory /home/pu93/snap/postgresql93/3/data ... ok creating subdirectories ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 128MB creating configuration files ... ok creating template1 database in /home/pu93/snap/postgresql93/3/data/base/1 ... ok initializing pg_authid ... ok initializing dependencies ... ok creating system views ... ok loading system objects' descriptions ... ok creating collations ... ok creating conversions ... ok creating dictionaries ... ok setting privileges on built-in objects ... ok creating information schema ... ok loading PL/pgSQL server-side language ... ok vacuuming database template1 ... ok copying template1 to template0 ... ok copying template1 to postgres ... ok syncing data to disk ... ok WARNING: enabling "trust" authentication for local connections You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. Success. You can now start the database server using: /snap/postgresql93/3/usr/bin/postgres -D /home/pu93/snap/postgresql93/3/data or /snap/postgresql93/3/usr/bin/pg_ctl -D /home/pu93/snap/postgresql93/3/data -l logfile start
Теперь аккуратно правим файл postgresql.conf, который в моём случае находится в /home/pu93/snap/postgresql93/3/data/postgresql.conf
Откуда я взял что файл лежит там? В последней строке вышеописанного вывода можно наблюдать подстроку "-D /home/pu93/snap/postgresql93/3/data". Вот там и следует искать требуемое. В файле postgresql.conf находим закомментированную строку port = 5432, раскомментируем строку и чтобы в дальнейшем не путаться, решаю последнюю цифру порта сделать связанной с версией.
Порт 5433 для версии 9.3
Порт 5434 для версии 9.4
Порт 5435 для версии 9.5
Порт 5436 для версии 9.6
В дальнейшем, настоятельно рекомендуется НЕ выполнять какие-либо команды, когда рабочим каталогом является каталог ~/snap/
Для запуска/остановки/получения-статуса конкретной версии PostgreSQL нам советуется не совсем точная команда
/snap/postgresql93/3/usr/bin/pg_ctl -D /home/pu93/snap/postgresql93/3/data -l logfile start
она выведет вам ошибку о невозможности создать журнал там где нужно
cannot create logfile: Permission denied
Даю правильный старт всех 4 версий PostgreSQL, который получился у меня, но будьте аккуратны и в будущем может изменится номер ревизии и пути у вас будут другими.
cd ~/; postgresql93.pgctl -D /home/pu93/snap/postgresql93/3/data -l /home/pu93/snap/postgresql93/3/logs/logfile start
cd ~/; postgresql94.pgctl -D /home/pu94/snap/postgresql94/3/data -l /home/pu94/snap/postgresql94/3/logs/logfile start
cd ~/; postgresql95.pgctl -D /home/pu95/snap/postgresql95/3/data -l /home/pu95/snap/postgresql95/3/logs/logfile start
cd ~/; postgresql96.pgctl -D /home/pu96/snap/postgresql96/3/data -l /home/pu96/snap/postgresql96/3/logs/logfile start
Точно все сервисы стартовали?
netstat -nap4|grep postgres
tcp 0 0 127.0.0.1:5433 0.0.0.0:* LISTEN 3092/postgres tcp 0 0 127.0.0.1:5434 0.0.0.0:* LISTEN 3355/postgres tcp 0 0 127.0.0.1:5435 0.0.0.0:* LISTEN 3366/postgres tcp 0 0 127.0.0.1:5436 0.0.0.0:* LISTEN 3377/postgres
Проверяем статус:
cd ~/; postgresql93.pgctl -D /home/pu93/snap/postgresql93/3/data -l /home/pu93/snap/postgresql93/3/logs/logfile status
pg_ctl: server is running (PID: 3092) /snap/postgresql93/3/usr/bin/postgres "-D" "/home/pu93/snap/postgresql93/3/data"
Так как для примера были запущены все 4 версии PostgreSQL, то был указан для каждой версии свой порт. Вы можете не делать так и использовать один, дефолтный порт 5432, но тогда должны строго следить, чтобы в одну единицу времени была запущена какая-либо одна и только одна версия. В нашем примере могут быть запущены одновременно все 4 версии и тогда для работы с ними нужно указывать порт, для psql через ключ -p.
postgresql93.psql -h 127.0.0.1 -p 5433 -d postgres
psql (9.3.15) Type "help" for help. postgres=#
Вскоре команда Command Prompt устранит текущие ограничения, но пока:
Странно что ситуация с локалью у англоязычных разработчиков возникает из раза в раз. Это связано с тем, что англосаксы "развращены" наличием только одной локали в системе и отсутствием понятия "переключение между раскладками-локалями" как класс. В одном из своих пакетов snap я столкнулся с тем, что программа не может открыть файлы, если в полном пути есть национальные символы.
Раньше нужно было при упаковке в snapcraft.yaml указать в разделе stage просьбу добавить следующие пакеты внутрь итогового snap.
stage-packages: - locales - locales-all - libc-bin ...
и в стартовом скрипте программы определить строки
export I18NPATH=$SNAP/usr/share/i18n export LOCPATH=$SNAP_USER_DATA export LC_ALL=$LANG LANG1=$(echo $LANG | cut -f1 -d.) ENC=UTF-8 LOC="$LANG" # generate a locale so we get properly working charsets and graphics if [ ! -e $SNAP_USER_DATA/$LOC ]; then $SNAP/usr/bin/localedef --prefix=$SNAP_USER_DATA -f $ENC -i $LANG1 $SNAP_USER_DATA/$LOC fi
Но snapd не стоит на месте и хорошеет день ото дня. Был добавлен интерфейс locale-control, к которому можно попросить коннект во всё том же snapcraft.yaml и вышеописанные строки не нужны. Почему у парней из Command Prompt возникли тут проблемы? Не ясно, но раз обещают исправить - исправят! В любом случае респект парням и лично от себя хочется добавить, что очень рад развитию технологии упаковки в самодостаточные пакеты snap. Благодаря им, легко и просто делаются откаты установленного софта при ошибках и возможность установки одной и той же программы в различных её версиях. А про безопасность вообще молчу. Она там by design.
Администрирование PostgreSQL.