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

Come lavorare con i database PostgreSQL

Indice

Elenco dei database
Elimina un database
Elimina tutti i database
Elimina le sovvenzioni
Elimina o elimina un database
Elimina un Concessione
Ripristino di un database
Ripristino Concessione

PostgreSQL è un eccellente motore di database alternativo a MySQL o MariaDB, ma la gestione di questi database è molto diversa, specialmente per quegli amministratori di sistema che sono molto abituati a usare MySQL dalla riga di comando o PHPMyAdmin. Molti CMS e applicazioni sanno già come interagire con i database PostgreSQL immediatamente, ma come MySQL, dipendono ancora da te per mantenere quei database.

Per questo articolo, assumiamo che tu sia inserito in SSH nel tuo server come utente "root" e che abbia installato il server PostgreSQL con la configurazione predefinita, che richiede la connessione come utente "postgres". Pertanto, la maggior parte dei comandi accetta anche l'opzione -U postgres. Questi comandi saranno generalmente identici tra CentOS e Ubuntu nella maggior parte delle versioni moderne, ma sono stati testati principalmente su un server VPS CentOS 7 e un server Ubuntu 16.04 con PostgreSQL 9.2.

La creazione di database e sovvenzioni è piuttosto complessa, ma se utilizzi cPanel, Plesk o un altro pannello di controllo che supporta l'integrazione di PostgreSQL, l'impostazione è semplice. La creazione di questi database e delle sovvenzioni dalla riga di comando non rientra nell'ambito di questo particolare articolo, quindi supponiamo anche che tu abbia già i tuoi database in esecuzione e in uso.

Elenca i database in PostgreSQL

Aiuta a conoscere i nomi esatti dei database su cui lavorerai, oltre a fare un doppio controllo per assicurarti di lavorare sul server giusto. Elenchiamo prima i database PostgreSQL sulla nostra macchina:
psql -l -U postgres

L'output di questo comando è una tabella di nomi di database, proprietari e privilegi di accesso. Useremo i dati della prima colonna per descrivere i nomi dei database per i comandi futuri. Per questo articolo, utilizzeremo un database chiamato "database_name ”.

Se hai solo bisogno di nomi di database e nessun'altra informazione, puoi eliminare le informazioni in eccesso eseguendo una query esatta per i nomi di database:
psql -U postgres -tA -c 'select datname from pg_database;'

Questo comando esegue un comando (descritto da -c flag) di selezionare il datname colonna del pg_database tavola globale. Il -t flag elenca solo tuple (righe di risultati) e nasconde i descrittori in eccesso come l'intestazione e il conteggio dei risultati e -A flag rimuoverà l'allineamento, stampando un database per riga senza caratteri davanti o dietro i nomi. L'output di questo comando è particolarmente utile per creare loop per i dump del database.

Scarica un database

Il comando dump prenderà una copia completa di un database, inclusi tutte le tabelle, gli schemi e i dati, e la memorizzerà in un unico file compresso:
pg_dump -c -Fc -U postgres database_name > database_name.psql

Ci sono alcuni flag importanti per questo comando. -c o –pulito , dice a pg_dump per aggiungere istruzioni DROP all'output e -Fc o –format=custom , comprime e organizza l'output da utilizzare con pg_restore più tardi. Il formato personalizzato ha la massima flessibilità e salva vantaggiosamente anche il backup in un unico file.

Elimina tutti i database

Sarebbe probabilmente meglio far uscire ciascuno dei database nel proprio file eseguendo il comando sopra più volte. Faremo riferimento al nostro secondo comando di elenco, eliminando alcuni database non necessari, per creare i nostri singoli dump.
for db in $(psql -U postgres -tA -c 'select datname from pg_database;' | grep -E -v “^(template1|template0|postgres)$”); do
echo $db
pg_dump -c -Fc -U postgres $db > $db.psql
done

Questo ciclo for passerà un elenco di tutti i database, diversi dai modelli predefiniti e dal database postgres, nel pg_dump comando per creare un .psql file per ciascuno nella directory corrente.

Nota:è anche possibile eseguire un dump di tutti i database in un unico file, anche se con set di dati di grandi dimensioni questo può diventare ingombrante e difficile da ripristinare. Pertanto, non consiglio questo metodo, anche se è meno complesso e può funzionare in alcune situazioni.

pg_dumpall --clean -U postgres > pg.all.psql

Discarica sovvenzioni

Le sovvenzioni sono archiviate nello schema PostgreSQL. È possibile eseguire il dump dello schema, ottenendo così tutte le sovvenzioni disponibili per il sistema, utilizzando il comando pg_dump:
pg_dumpall -U postgres -s > pg.schema.psql

Questo scaricherà non solo le sovvenzioni, ma anche il resto dello schema del server, incluse le istruzioni di creazione di database e tabelle, la proprietà e l'appartenenza al ruolo e l'allocazione dell'ACL, in pratica tutto tranne i dati.

Se hai bisogno solo di utenti (ruoli) e sovvenzioni, puoi raccoglierli usando questo comando:
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' -e '^(CREATE|ALTER)\ ROLE' > pg.grants.psql

Questo sfrutta il dump completo dello schema ma prende solo le istruzioni di creazione del ruolo e le istruzioni di concessione/revoca per assemblare utenti e concessioni.

Elimina o elimina un database

Per distruggere un database, la sintassi è molto semplice. Fai attenzione quando digiti questo comando, poiché non ti chiede di confermare!
psql -U postgres -c ‘drop database database_name’

Se il database esiste, non lo sarà più. C'è anche un wrapper della riga di comando per questa stessa attività:
dropdb -U postgres database_name

Elimina una sovvenzione

Le sovvenzioni vengono rimosse agli utenti revocandole. È importante prima di tutto sapere quali concessioni ha un utente specifico, quindi cerchiamole scaricando lo schema e trovando le righe relative al nostro utente.
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' | grep database_user

Nel mio caso, esiste una concessione simile a questa:
GRANT ALL ON DATABASE database_name TO database_user;

Per contrastare questo, revocheremo lo stesso descrittore:
psql -U postgres -c ‘revoke all on database database_name from database_user;’

Nota:notare le lievi modifiche, GRANT è stato modificato in REVOKE e TO è stato modificato in FROM. Questo comando è racchiuso tra virgolette singole e passato a psql con il flag -c per eseguire il comando in PostgreSQL.
Questo sostituirà l'istruzione GRANT originale con un REVOKE nello schema. L'esecuzione del primo comando in questa sezione ora mostra solo la riga appena passata:
REVOKE ALL ON DATABASE database_name FROM database_user;

Ripristina un database

Per i database che sono stati scaricati utilizzando il metodo pg_dump utilizzato in questo articolo, possiamo ripristinare l'intero database utilizzando questo comando:
pg_restore -U postgres -c -C -O -d database_name database_name.psql

Qui sono necessarie molte altre bandiere! -c o –pulito , come prima, elimina gli oggetti del database prima di scrivere dal file in PostgreSQL. Lo aggiungiamo nel caso in cui non sia stato utilizzato per il comando dump. -C o –crea , creerà il database nome_database durante il ripristino se non esiste. Se il database esiste già, -c flag lo distruggerà prima di -C lo ricrea. Successivamente, c'è -O o –nessun proprietario , che rimuove il proprietario dal database. Ciò consente di modificare un backup da qualsiasi fonte al proprietario dell'utente che esegue il ripristino, che nel nostro caso è postgres. -d nome_database descrive il nome del database in cui eseguire il ripristino. Questo può essere un nome diverso da quello da cui è stato creato il backup, se necessario. L'argomento finale è il nome del nostro file di backup, database_name.psql .

Ripristinare una sovvenzione

Poiché tutte le sovvenzioni sono archiviate nel nostro file pg.grants.psql, dobbiamo selezionare solo l'utente che dobbiamo ripristinare. Nel nostro caso, ripristineremo database_user:
grep database_user pg.grants.psql | psql -U postgres

Poiché il file pg.grants.psql ha ruoli e concessioni, questo comando ricreerà l'utente con i suoi privilegi e password originali, quindi gli concederà l'accesso ai database e agli schemi richiesti.