run PostgreSQL by hands

Раз в год (или около того) мне нужно запустить PostgreSQL с целью поразрабатывать что-нибудь. За то время что я его не использую знания выветриваются, так что на будущее я делаю эту заметку, в основном для себя.

Запускать PostgreSQL можно разными способами, вот два самых распространенных:

  • использовать docker
  • поставить пакет

Оба способа немного магические. Контейнеры стараются быть удобными и покрывать как можно больше функциональности, что выливается в адские entrypoint’ы на bash с обратным удобству эффектом. Пакеты в распространенных дистрибутивах тоже содержат не мало магии, ведь они обычно (как минимум) инициализируют директорию с данными СУБД и запускают её сервис.

В nixos тоже есть пакет для PostgreSQL, но он не управляет ни запуском, ни процессом инициализации. Так что полезно помнить как работать руками.

Инициализируем директорию с конфигурацией (и данными) по умолчанию:

$ pg_ctl initdb --pgdata=data
The files belonging to this database system will be owned by user "user".
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.

creating directory data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... 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:

    pg_ctl -D data -l logfile start

Запустим процесс СУБД, указав ему использовать только что созданную директорию и создать unix socket для клиентов в текущей директории:

$ postgres -D data -k .
LOG:  database system was shut down at 2019-02-25 17:30:27 UTC
LOG:  MultiXact member wraparound protections are now enabled
LOG:  autovacuum launcher started
LOG:  database system is ready to accept connections

Сервер запущен. Теперь клиент:

$ psql -h .
psql: FATAL:  database "user" does not exist

Базы данных нужно создать самстоятельно:

$ createdb -h 127.0.0.1 user

Теперь клиент должен работать:

$ psql -h .
psql (9.6.11)
Type "help" for help.

user=# help
You are using psql, the command-line interface to PostgreSQL.
Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit
user=# \q