pg_ctl
är ett mycket användbart men underskattat verktyg som kan göra livet för utvecklingsteam enklare. Läs vidare för att lära dig mer om pg_ctl
och hur det kan förbättra dina utvecklings- och testarbetsflöden.
Vad är pg_ctl?
pg_ctl är ett kommandoradsverktyg som ingår i Postgres standarddistribution. Det är tillgängligt överallt där Postgres själv är, liknande de andra inkluderade verktygen som psql och pg_dump .
Den körbara filen kommer att finnas i samma katalog som de andra Postgres-binärfilerna. Den exakta platsen varierar med Linux-distro och Postgres-version:
# debain, ubuntu, ...
/usr/lib/postgresql/11/bin
# rhel, centos, ...
/usr/pgsql-11/bin
Du kanske vill lägga till den här katalogen till din PATH, eller alias pg_ctl till den fullständiga sökvägen.
Skapa ett databaskluster
Till skillnad från andra RDBMS, en enda Postgres databasserverprocess (historiskt kallad postmaster ), hanterar ett databaskluster . Användningen av termenkluster är inte modern och hänvisar inte till en grupp nätverksanslutna noder. Ett databaskluster är värd för en uppsättning databaser, med vissa funktioner (roller, fysisk replikering, WAL-filer, etc.) gemensamma för dem alla. Tjänsten Postgressystemd som installeras av din Linux-distro tjänar ett enda databaskluster.
Du kan använda pg_ctl
för att skapa ett databaskluster. Vid skapandet lever klustret helt i en enda katalog. Den innehåller alla nödvändiga konfigurationsfiler (postgres.conf , pg_hba.conf , etc.) och datafiler. Den är fristående och kan flyttas till en annan någorlunda liknande maskin om filbehörigheterna hanteras korrekt. Du kan till och med placera loggfiler i katalogen, så att du har alla relaterade filer (konfiguration, data, loggar) på ett ställe.
För att skapa ett databaskluster, använd:
$ pg_ctl -D myclus initdb
Detta skapar en katalog som heter myclus under den aktuella katalogen och fyller den med alla filer som behövs för att starta en server från den.
Här är ett exempel på session:
$ 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
Starta en databasserver
En "Postgres-server" är i grunden en postmaster process som startas med platsen för en databasklusterkatalog. Denna postmasterprocess skapar i sin tur flera processer som gör olika bakgrundsaktiviteter samt hanterar inkommande anslutningar. Du kan se denna processmodell i aktion genom att se systemprocessträdet med till exempel ett verktyg som htop.
För att starta en postmasterprocess för ditt nya databaskluster, använd:
$ pg_ctl -D myclus -l myclus/log start
-l
alternativet anger platsen för Postgres-loggfilen, som i det här fallet finns i själva klusterkatalogen. Det är inte ovanligt att placera loggfilen i klusterkatalogen.
Du bör se en utgång så här:
waiting for server to start.... done
server started
Omladdning, omstart och stopp sker som du kan förvänta dig:
$ 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
Du bör nu kunna ansluta till detta nya kluster med klienter som psql och pgAdmin .
Ställa in port och andra alternativ
Men praktiskt taget, om du redan har Postgres installerat på din maskin, måste du förmodligen redigera myclus/postgres.conf
och ändra värdena för port , unix_socket_kataloger och kanske även lyssningsadress innan klustret startar rent. Detta beror på att den systeminstallerade Postgresservice redan körs på port 5432 och katalogerna iunix_socket_directory kan inte skrivas till av en vanlig användare. Standardlyssningsadress är localhost, vilket betyder att du inte kommer att kunna ansluta till klustret från en extern lokalvärd.
Om du använder pg_ctl att skapa och riva kluster i dina automatiserade testskript är det enklare om du kan specificera dessa alternativ direkt från kommandoraden än att programmera redigera myclus/postgres.conf
.Du kan ange alternativen så här:
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i" start
Detta startar servern på port 6000, med unix-socket skapad i katalogen /tmp och lyssna på alla gränssnitt.
Du behöver endast ange dessa alternativ för "start", du kan utelämna dem för andra kommandon, inklusive till och med "starta om".
Andra användbara startalternativ
Det finns ett par andra alternativ som du kan använda i "-o" som kan vara användbara:
-F
inaktiverar fsync, användbart för snabbare slutförande av testskript-B shared_bufffers
inställt värde för shared_buffers , exempel-B 100MB
-c conf_var=value
ställ in valfritt konfigurationsvärde, exempel-c wal_level=logical
Här är ett exempel med några av dessa set:
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i -B 100MB -c wal_level=logical" start
Dessa alternativ är faktiskt kommandoradsalternativen för postgres process, vars fullständiga lista dokumenteras här.
Kör databas för en annan Postgres-version
EnterpriseDB är värd för förbyggda binärer för olika Postgres-versioner för olika plattformar. Dessa är tarballs utan någon installatör.
Ta tag i tarballen du vill ha, packa upp den, leta reda på pg_ctl
binär med det, och använd det för att skapa ett kluster. pg_ctl
kommer automatiskt att hitta de associerade initdb/postgres/andra binärer som den behöver för att skapa/starta klustret.
Du kan använda detta oavsett, och oberoende av, eventuell befintlig PostgreSQL-installation på maskinen.
Skapa tjänster på Windows
pg_ctl
är tillgänglig på alla plattformar, inklusive MacOS och Windows. I synnerhet kan du använda den för att enkelt skapa en tjänst som kan startas och stoppas via Service Control Manager (SCM). För att skapa en tjänst, använd:
pg_ctl -D myclus -N myclus_service register
Detta skapar en automatisk starttjänst som heter "myclus_service".
Den här funktionen är endast tillgänglig i Postgres v10 och senare.