pg_ctl
er et meget nyttigt, men undervurderet værktøj, der kan gøre livet for udviklingsteams nemmere. Læs videre for at lære mere om pg_ctl
og hvordan det kan forbedre din udvikling og teste arbejdsgange.
Hvad er pg_ctl?
pg_ctl er et kommandolinjeværktøj inkluderet i Postgres-standarddistributionen. Det er tilgængeligt overalt, hvor Postgres selv er, ligesom de andre inkluderede værktøjer såsom psql og pg_dump .
Den eksekverbare vil være i samme mappe som de andre Postgres-binære filer. Den nøjagtige placering varierer med Linux-distroen og Postgres-versionen:
# debain, ubuntu, ...
/usr/lib/postgresql/11/bin
# rhel, centos, ...
/usr/pgsql-11/bin
Du ønsker måske at tilføje denne mappe til din PATH eller alias pg_ctl til den fulde sti.
Opret en databaseklynge
I modsætning til andre RDBMS'er, en enkelt Postgres-databaseserverproces (historisk kaldet postmaster ), administrerer en databaseklynge . Brugen af udtrykketklynge er ikke moderne og refererer ikke til en gruppe af netværksforbundne noder. En databaseklynge er vært for et sæt databaser med nogle funktioner (roller, fysisk replikering, WAL-filer osv.) fælles for dem alle. Postgressystemd-tjenesten, der er installeret af din Linux-distro, betjener en enkelt databaseklynge.
Du kan bruge pg_ctl
at oprette en databaseklynge. Ved oprettelsen lever klyngen helt i en enkelt mappe. Den indeholder alle nødvendige konfigurationsfiler (postgres.conf , pg_hba.conf osv.) og datafiler. Det er selvstændigt og kan flyttes til en anden rimelig lignende maskine, hvis filtilladelserne håndteres korrekt. Du kan endda placere logfiler inde i mappen, så du har alle de relaterede filer (konfiguration, data, logfiler) på ét sted.
For at oprette en databaseklynge skal du bruge:
$ pg_ctl -D myclus initdb
Dette opretter en mappe kaldet myclus under den aktuelle mappe og udfylder den med alle de nødvendige filer for at starte en server fra den.
Her er en prøvesession:
$ 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 en databaseserver
En "Postgres-server" er grundlæggende en postmaster proces, der startes med placeringen af en databaseklyngemappe. Denne postmaster-proces afføder til gengæld flere processer, der udfører forskellige baggrundsaktiviteter samt håndterer indgående forbindelser. Du kan se denne procesmodel i aktion ved at se systemets procestræ ved at bruge et værktøj som f.eks. htop.
For at starte en postmaster-proces for din nye databaseklynge skal du bruge:
$ pg_ctl -D myclus -l myclus/log start
-l
option angiver placeringen af Postgres-logfilen, som i dette tilfælde er i selve klyngebiblioteket. Det er ikke ualmindeligt at placere logfilen i klyngebiblioteket.
Du skulle se et output som dette:
waiting for server to start.... done
server started
Genindlæsning, genstart og stop sker, som du ville forvente:
$ 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 skulle nu være i stand til at oprette forbindelse til denne nye klynge ved hjælp af klienter som psql og pgAdmin .
Indstilling af port og andre indstillinger
Men praktisk talt, hvis du allerede har Postgres installeret på din maskine, bliver du sandsynligvis nødt til at redigere myclus/postgres.conf
og ændre værdierne for port , unix_socket_directories og måske også lytteadresse før klyngen starter rent op. Dette skyldes, at den systeminstallerede Postgresservice allerede kører på port 5432 og mapperne iunix_socket_directories kan ikke skrives til af en almindelig bruger. Standardlytteadressen er localhost, hvilket betyder, at du ikke vil være i stand til at oprette forbindelse til klyngen uden for localhost.
Hvis du bruger pg_ctl at oprette og rive ned klynger i dine automatiserede testscripts, er det nemmere, hvis du kan angive disse muligheder direkte fra kommandolinjen i stedet for at redigere myclus/postgres.conf
programmatisk. .Du kan angive valgmulighederne sådan her:
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i" start
Dette starter serveren på port 6000 med unix-socket oprettet i mappen /tmp og lytte på alle grænseflader.
Du skal kun angive disse muligheder for "start", du kan udelade dem for andre kommandoer, inklusive endda "genstart".
Andre nyttige startmuligheder
Der er et par andre muligheder, som du kan bruge inde i "-o", som kan være nyttige:
-F
deaktiverer fsync, nyttigt til hurtigere færdiggørelse af testscripts-B shared_bufffers
indstillet værdi for shared_buffers , eksempel-B 100MB
-c conf_var=value
indstil enhver konfigurationsværdi, f.eks.-c wal_level=logical
Her er et eksempel med nogle af disse sæt:
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i -B 100MB -c wal_level=logical" start
Disse muligheder er faktisk kommandolinjeindstillingerne for postgres proces, hvoraf den fulde liste er dokumenteret her.
Kør database for en anden Postgres-version
EnterpriseDB er vært for præbyggede binære filer til forskellige Postgres-versioner til forskellige platforme. Disse er tarballs uden nogen installatør.
Grib den ønskede tarball, pak den ud, find pg_ctl
binært med det, og brug det til at oprette en klynge. pg_ctl
vil automatisk finde de tilknyttede initdb/postgres/andre binære filer, som den skal bruge for at oprette/starte klyngen.
Du kan bruge dette uanset og uafhængigt af enhver eksisterende PostgreSQL-installation på maskinen.
Opret tjenester på Windows
pg_ctl
er tilgængelig på alle platforme, inklusive MacOS og Windows. Især kan du bruge den til nemt at oprette en tjeneste, der kan startes og stoppes via Service Control Manager (SCM). For at oprette en tjeneste skal du bruge:
pg_ctl -D myclus -N myclus_service register
Dette opretter en automatisk start-tjeneste kaldet "myclus_service".
Denne funktion er kun tilgængelig i Postgres v10 og nyere.