pg_ctl
е много полезна, но подценена помощна програма, която може да улесни живота на екипите за разработка. Прочетете, за да научите повече за pg_ctl
и как може да подобри работните ви процеси за разработка и тестване.
Какво е pg_ctl?
pg_ctl е инструмент от командния ред, включен в стандартната дистрибуция на Postgres. Той е достъпен навсякъде, където е самият Postgres, подобно на другите включени инструменти като psql и pg_dump .
Изпълнимият файл ще бъде в същата директория като другите двоични файлове на Postgres. Точното местоположение варира в зависимост от дистрибуцията на Linux и версията на Postgres:
# debain, ubuntu, ...
/usr/lib/postgresql/11/bin
# rhel, centos, ...
/usr/pgsql-11/bin
Може да искате да добавите тази директория към вашия PATH или псевдоним pg_ctl към пълния път.
Създаване на клъстер от база данни
За разлика от други RDBMS, един процес на сървър на база данни Postgres (исторически наречен postmaster ), управляваклъстер от база данни . Използването на терминаклъстер не е модерен и не се отнася до група мрежови възли. Клъстерът на базата данни хоства набор от бази данни, с някои функции (роли, физическа репликация, WAL файлове и т.н.), общи за всички тях. Услугата Postgressystemd, която е инсталирана от вашата Linux дистрибуция, обслужва клъстер с единична база данни.
Можете да използвате pg_ctl
за създаване на клъстер от база данни. При създаването, клъстерът живее изцяло в една директория. Той съдържа всички необходими конфигурационни файлове (postgres.conf , pg_hba.conf и др.) и файлове с данни. Той е самостоятелен и може да бъде преместен на друга сравнително подобна машина, ако разрешенията за файлове се обработват правилно. Можете дори да поставите регистрационни файлове в директорията, така че да имате всички свързани файлове (конфигурация, данни, регистрационни файлове) на едно място.
За да създадете клъстер от база данни, използвайте:
$ pg_ctl -D myclus initdb
Това създава директория, наречена myclus в текущата директория и я попълва с всички файлове, необходими за стартиране на сървър от нея.
Ето примерна сесия:
$ pg_ctl -D myclus initdb
The files belonging to this database system will be owned by user "alice".
This user must also own the server process.
The database cluster will be initialized with locale "C.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 myclus ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default timezone ... Etc/UTC
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:
/usr/lib/postgresql/11/bin/pg_ctl -D myclus -l logfile start
Стартиране на сървър за база данни
“Postgres сървър” е основно postmaster процес, който се стартира с местоположението на клъстерна директория на база данни. Този постмайстор процес поражда множество процеси, които извършват различни фонови дейности, както и обработват входящи връзки. Можете да видите този модел на процес в действие, като прегледате дървото на системните процеси с помощта на инструмент като htop, например.
За да стартирате процес на пощенски администратор за вашия нов клъстер от база данни, използвайте:
$ pg_ctl -D myclus -l myclus/log start
-l
опция определя местоположението на регистрационния файл на Postgres, който в този случай е в самата директория на клъстера. Не е необичайно регистрационният файл да се постави в директорията на клъстера.
Трябва да видите изход като този:
waiting for server to start.... done
server started
Презареждането, рестартирането и спирането се случват, както бихте очаквали:
$ pg_ctl -D myclus -l myclus/log reload
server signaled
$ pg_ctl -D myclus -l myclus/log restart
waiting for server to shut down.... done
server stopped
waiting for server to start.... done
server started
$ pg_ctl -D myclus -l myclus/log stop
waiting for server to shut down.... done
server stopped
Вече трябва да можете да се свържете с този нов клъстер, като използвате клиенти като psql и pgAdmin .
Настройка на порт и други опции
На практика обаче, ако вече имате инсталиран Postgres на вашата машина, вероятно ще трябва да редактирате myclus/postgres.conf
и променете стойностите за порт , unix_socket_directories а също и може би адрес_слушане преди клъстерът да стартира чисто. Това е така, защото инсталираната в системата Postgresservice вече работи на порт 5432 и директориите вunix_socket_directories не може да бъде записана от обикновен потребител. По подразбиранеадрес_слушане е localhost, което означава, че няма да можете да се свържете с клъстера извън локалния хост.
Ако използвате pg_ctl за да създавате и разрушавате клъстери във вашите автоматизирани тестови скриптове, е по-лесно, ако можете да посочите тези опции директно от командния ред, отколкото програмно да редактирате myclus/postgres.conf
.Можете да посочите опциите по следния начин:
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i" start
Това стартира сървъра на порт 6000, като unix сокетът е създаден в директорията /tmp и слушане на всички интерфейси.
Трябва да посочите тези опции само за „start“, можете да ги пропуснете за други команди, включително дори „рестартиране“.
Други полезни опции за стартиране
Има няколко други опции, които можете да използвате в „-o“, които може да са полезни:
-F
деактивира fsync, полезно за по-бързо завършване на тестови скриптове-B shared_bufffers
задайте стойност на споделени_буфери , пример-B 100MB
-c conf_var=value
задайте произволна конфигурационна стойност, например-c wal_level=logical
Ето пример с някои от тези набори:
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i -B 100MB -c wal_level=logical" start
Тези опции всъщност са опциите на командния ред на postgres процес, чийто пълен списък е документиран тук.
Изпълнете база данни на различна версия на Postgres
EnterpriseDB хоства предварително изградени двоични файлове за различни версии на Postgres за различни платформи. Това са tarball-ове без никакъв инсталатор.
Вземете tarball, който искате, разопаковайте го, намерете pg_ctl
двоичен с него и го използвайте, за да създадете клъстер. pg_ctl
автоматично ще намери свързаните initdb/postgres/други двоични файлове, които са му необходими за създаване/стартиране на клъстера.
Можете да използвате това независимо и независимо от всяка съществуваща инсталация на PostgreSQL на машината.
Създаване на услуги под Windows
pg_ctl
е наличен на всички платформи, включително MacOS и Windows. По-специално, можете да го използвате за лесно създаване на услуга, която може да бъде стартирана и спряна чрез Service Control Manager (SCM). За да създадете услуга, използвайте:
pg_ctl -D myclus -N myclus_service register
Това създава услуга за автоматично стартиране, наречена „myclus_service“.
Тази функция е достъпна само в Postgres v10 и по-нова версия.