PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

pg_ctl Suggerimenti e trucchi

pg_ctl è un'utilità molto utile ma sottovalutata che può semplificare la vita dei team di sviluppo. Continua a leggere per saperne di più su pg_ctl e come può migliorare i tuoi flussi di lavoro di sviluppo e test.

Cos'è pg_ctl?

pg_ctl è uno strumento da riga di comando incluso nella distribuzione standard di Postgres. È disponibile ovunque sia Postgres stesso, simile agli altri strumenti inclusi come psql e pg_dump .

L'eseguibile sarà nella stessa directory degli altri binari di Postgres. La posizione esatta varia con la distribuzione Linux e la versione Postgres:

# debain, ubuntu, ...
/usr/lib/postgresql/11/bin

# rhel, centos, ...
/usr/pgsql-11/bin

Potresti voler aggiungere questa directory al tuo PATH, o alias pg_ctl al percorso completo.

Crea un cluster di database

A differenza di altri RDBMS, un singolo processo del server di database Postgres (storicamente chiamato postmaster ), gestisce un cluster di database . L'uso del terminecluster non è moderno e non fa riferimento a un gruppo di nodi in rete. Un cluster di database ospita un insieme di database, con alcune funzionalità (ruoli, replica fisica, file WAL, ecc.) comuni a tutti loro. Il servizio Postgressystemd installato dalla tua distribuzione Linux serve un cluster di database singolo.

Puoi usare pg_ctl per creare un cluster di database. Al momento della creazione, il cluster vive interamente all'interno di una singola directory. Contiene tutti i file di configurazione necessari (postgres.conf , pg_hba.conf , ecc.) e file di dati. È autonomo e può essere spostato su un'altra macchina ragionevolmente simile se i permessi dei file vengono gestiti correttamente. Puoi persino inserire i file di registro all'interno della directory, in modo da avere tutti i file correlati (configurazione, dati, registri) in un unico posto.

Per creare un cluster di database, utilizza:

$ pg_ctl -D myclus initdb

Questo crea una directory chiamata myclus nella directory corrente e la popola con tutti i file necessari per avviare un server da essa.

Ecco una sessione di esempio:

$ 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

Avvia un server di database

Un "server Postgres" è fondamentalmente un postmaster processo avviato con il percorso di una directory del cluster di database. Questo processo postmaster a turno genera processi multipli che svolgono varie attività in background e gestiscono le connessioni in entrata. Puoi vedere questo modello di processo in azione visualizzando l'albero dei processi di sistema utilizzando uno strumento come htop, ad esempio.

Per avviare un processo postmaster per il tuo nuovo cluster di database, utilizza:

$ pg_ctl -D myclus -l myclus/log start

Il -l l'opzione specifica la posizione del file di registro di Postgres, che in questo caso è all'interno della directory del cluster stesso. Non è raro posizionare il file di registro all'interno della directory del cluster.

Dovresti vedere un output come questo:

waiting for server to start.... done
server started

La ricarica, il riavvio e l'arresto avvengono come previsto:

$ 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

Ora dovresti essere in grado di connetterti a questo nuovo cluster utilizzando client come psql e pgAdmin .

Impostazione della porta e altre opzioni

In pratica, però, se hai già Postgres installato sulla tua macchina, probabilmente dovrai modificare myclus/postgres.conf e cambia i valori per porta , directory_socket_unix e forse anche listen_address prima che il cluster si avvii in modo pulito. Questo perché Postgresservice installato dal sistema è già in esecuzione sulla porta 5432 e le directory inunix_socket_directories non può essere scritto da un utente normale. L'indirizzo_ascolta predefinito è localhost, il che significa che non sarai in grado di connetterti al cluster da localhost esterno.

Se stai usando pg_ctl per creare e smontare i cluster negli script di test automatico, è più facile specificare queste opzioni direttamente dalla riga di comando piuttosto che modificare a livello di codice myclus/postgres.conf .Puoi specificare le opzioni in questo modo:

$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i" start

Questo avvia il server sulla porta 6000, con il socket unix creato nella directory /tmp e in ascolto su tutte le interfacce.

Devi specificare queste opzioni solo per "start", puoi ometterle per altri comandi, incluso anche "restart".

Altre utili opzioni di avvio

Ci sono un paio di altre opzioni che puoi usare all'interno di "-o" che potrebbero essere utili:

  • -F disabilita fsync, utile per completare più velocemente gli script di test
  • -B shared_bufffers imposta il valore di shared_buffers , esempio -B 100MB
  • -c conf_var=value imposta qualsiasi valore di configurazione, esempio -c wal_level=logical

Ecco un esempio con alcuni di questi set:

$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i -B 100MB -c wal_level=logical" start

Queste opzioni sono effettivamente le opzioni della riga di comando di postgres processo, il cui elenco completo è documentato qui.

Esegui database di una versione diversa di Postgres

EnterpriseDB ospita binari predefiniti per varie versioni di Postgres per varie piattaforme. Questi sono tarball senza alcun programma di installazione.

Prendi il tarball che desideri, scompattalo, individua il pg_ctl binario con esso e usalo per creare un cluster. pg_ctl troverà automaticamente i binari initdb/postgres/altri associati di cui ha bisogno per creare/avviare il cluster.

Puoi usarlo indipendentemente e indipendentemente da qualsiasi installazione PostgreSQL esistente sulla macchina.

Crea servizi su Windows

pg_ctl è disponibile su tutte le piattaforme, inclusi MacOS e Windows. In particolare, puoi utilizzarlo per creare facilmente un servizio che può essere avviato e interrotto tramite Service Control Manager (SCM). Per creare un servizio, usa:

pg_ctl -D myclus -N myclus_service register

Questo crea un servizio di avvio automatico chiamato "myclus_service".

Questa funzione è disponibile solo in Postgres v10 e versioni successive.