pg_ctl
is een zeer nuttig maar onderschat hulpprogramma dat het leven van ontwikkelingsteams gemakkelijker kan maken. Lees verder voor meer informatie over pg_ctl
en hoe het uw ontwikkel- en testworkflows kan verbeteren.
Wat is pg_ctl?
pg_ctl is een opdrachtregeltool die is opgenomen in de standaard Postgres-distributie. Het is overal beschikbaar waar Postgres zelf is, vergelijkbaar met de andere meegeleverde tools zoals psql en pg_dump .
Het uitvoerbare bestand bevindt zich in dezelfde map als de andere binaire bestanden van Postgres. De exacte locatie varieert met de Linux-distro- en Postgres-versie:
# debain, ubuntu, ...
/usr/lib/postgresql/11/bin
# rhel, centos, ...
/usr/pgsql-11/bin
Misschien wilt u deze map aan uw PATH toevoegen, of alias pg_ctl aan het volledige pad.
Maak een databasecluster
In tegenstelling tot andere RDBMS-en, kan een enkel Postgres-databaseserverproces (van oudsher de postmaster genoemd) ), beheert een databasecluster . Het gebruik van de termcluster is niet modern en verwijst niet naar een groep netwerkknooppunten. Een databasecluster host een reeks databases, met een aantal functies (rollen, fysieke replicatie, WAL-bestanden, enz.) die ze allemaal gemeen hebben. De Postgressystemd-service die door je Linux-distro is geïnstalleerd, bedient een enkele databasecluster.
U kunt pg_ctl
. gebruiken om een databasecluster te maken. Bij creatie leeft het cluster volledig in één enkele directory. Het bevat alle benodigde configuratiebestanden (postgres.conf , pg_hba.conf , enz.) en gegevensbestanden. Het staat op zichzelf en kan worden verplaatst naar een andere redelijk vergelijkbare machine als de bestandspermissies correct worden afgehandeld. Je kunt zelfs logbestanden in de directory plaatsen, zodat je alle gerelateerde bestanden (configuratie, gegevens, logs) op één plek hebt.
Gebruik om een databasecluster te maken:
$ pg_ctl -D myclus initdb
Dit creëert een map met de naam myclus onder de huidige map, en vult deze met alle bestanden die nodig zijn om er een server van te starten.
Hier is een voorbeeldsessie:
$ 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
Start een databaseserver
Een "Postgres-server" is in feite een postmaster proces dat wordt gestart met de locatie van een databaseclusterdirectory. Dit postmaster-proces spawnt beurtelings meerdere processen die verschillende achtergrondactiviteiten uitvoeren en inkomende verbindingen afhandelen. U kunt dit procesmodel in actie zien door de systeemprocesboom te bekijken met bijvoorbeeld een tool als htop.
Om een postmasterproces voor uw nieuwe databasecluster te starten, gebruikt u:
$ pg_ctl -D myclus -l myclus/log start
De -l
optie specificeert de locatie van het Postgres-logbestand, dat zich in dit geval in de clusterdirectory zelf bevindt. Het is niet ongebruikelijk om het logbestand in de clusterdirectory te plaatsen.
Je zou een uitvoer als deze moeten zien:
waiting for server to start.... done
server started
Herladen, herstarten en stoppen gebeurt zoals je zou verwachten:
$ 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
U zou nu verbinding moeten kunnen maken met dit nieuwe cluster met behulp van clients zoals psql en pgAdmin .
Poortinstellingen en andere opties instellen
In de praktijk echter, als u Postgres al op uw computer hebt geïnstalleerd, moet u waarschijnlijk myclus/postgres.conf
bewerken en verander de waarden voor poort , unix_socket_directories en misschien ook listen_address voordat het cluster netjes opstart. Dit komt omdat de door het systeem geïnstalleerde Postgresservice al draait op poort 5432 en de mappen inunix_socket_directories kan niet worden beschreven door een gewone gebruiker. Het standaardlisten_address is localhost, wat betekent dat u geen verbinding kunt maken met het cluster van buiten localhost.
Als u pg_ctl . gebruikt om clusters in uw geautomatiseerde testscripts te maken en af te breken, is het gemakkelijker als u deze opties rechtstreeks vanaf de opdrachtregel kunt specificeren in plaats van programmatisch myclus/postgres.conf
te bewerken .U kunt de opties als volgt specificeren:
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i" start
Dit start de server op poort 6000, met de unix-socket gemaakt in de map /tmp en luisteren op alle interfaces.
U hoeft deze opties alleen te specificeren voor "start", u kunt ze weglaten voor andere commando's, inclusief zelfs "restart".
Andere nuttige startopties
Er zijn een aantal andere opties die u kunt gebruiken binnen "-o" die handig kunnen zijn:
-F
schakelt fsync uit, handig voor snellere voltooiing van testscripts-B shared_bufffers
waarde instellen van shared_buffers , voorbeeld-B 100MB
-c conf_var=value
stel een willekeurige configuratiewaarde in, bijvoorbeeld-c wal_level=logical
Hier is een voorbeeld met een aantal van deze sets:
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i -B 100MB -c wal_level=logical" start
Deze opties zijn eigenlijk de opdrachtregelopties van de postgres proces, waarvan de volledige lijst hier is gedocumenteerd.
Database van een andere Postgres-versie uitvoeren
EnterpriseDB host vooraf gebouwde binaire bestanden voor verschillende Postgres-versies voor verschillende platforms. Dit zijn tarballs zonder installatieprogramma.
Pak de gewenste tarball, pak hem uit, zoek de pg_ctl
binair mee, en gebruik dat om een cluster te maken. pg_ctl
vindt automatisch de bijbehorende initdb/postgres/other binaries die het nodig heeft om het cluster te maken/starten.
U kunt dit ongeacht en onafhankelijk van elke bestaande PostgreSQL-installatie op de machine gebruiken.
Services maken op Windows
pg_ctl
is beschikbaar op alle platforms, inclusief MacOS en Windows. U kunt het met name gebruiken om eenvoudig een service te maken die kan worden gestart en gestopt via de Service Control Manager (SCM). Gebruik om een dienst aan te maken:
pg_ctl -D myclus -N myclus_service register
Dit creëert een auto-start service genaamd "myclus_service".
Deze functie is alleen beschikbaar in Postgres v10 en hoger.