sql >> Database >  >> RDS >> PostgreSQL

Werken met PostgreSQL-databases

Inhoudsopgave

Databases weergeven
Een database dumpen
Alle databases dumpen
Granten dumpen
Een database verwijderen of verwijderen
Een database verwijderen Grant
Een database herstellen
Grant herstellen

PostgreSQL is een uitstekende alternatieve database-engine voor MySQL of MariaDB, maar het beheren van die databases is heel anders, vooral voor die systeembeheerders die erg gewend zijn om MySQL vanaf de opdrachtregel of PHPMyAdmin te gebruiken. Veel CMS en applicaties weten al uit de doos hoe ze moeten communiceren met PostgreSQL-databases, maar zijn net als MySQL nog steeds afhankelijk van u om die databases te onderhouden.

Voor dit artikel gaan we ervan uit dat je SSH-ed op je server als de 'root'-gebruiker en dat je de PostgreSQL-server hebt geïnstalleerd met de standaardconfiguratie, waarvoor verbinding moet worden gemaakt als de 'postgres'-gebruiker. Daarom zullen de meeste opdrachten ook de optie -U postgres gebruiken. Deze commando's zijn over het algemeen identiek tussen CentOS en Ubuntu in de meeste moderne versies, maar zijn voornamelijk getest op een CentOS 7 VPS-server en een Ubuntu 16.04-server met PostgreSQL 9.2.

Het maken van databases en subsidies is nogal ingewikkeld, maar als je cPanel, Plesk of een ander configuratiescherm gebruikt dat PostgreSQL-integratie ondersteunt, is het instellen hiervan eenvoudig. Het maken van deze databases en subsidies vanaf de opdrachtregel valt buiten het bestek van dit specifieke artikel, dus we gaan er ook van uit dat uw databases al actief en in gebruik zijn.

Lijst databases in PostgreSQL

Het helpt om de exacte namen te kennen van de databases waaraan u gaat werken, en om een ​​dubbele controle uit te voeren om er zeker van te zijn dat u op de juiste server werkt. Laten we eerst de PostgreSQL-databases op onze machine opsommen:
psql -l -U postgres

De uitvoer voor deze opdracht is een tabel met databasenamen, eigenaren en toegangsrechten. We zullen gegevens uit de eerste kolom gebruiken bij het beschrijven van databasenamen voor toekomstige opdrachten. Voor dit artikel gebruiken we een database met de naam "database_name ”.

Als u alleen databasenamen nodig heeft en geen andere informatie, kunt u de overtollige informatie wegknippen door een exacte query voor databasenamen uit te voeren:
psql -U postgres -tA -c 'select datname from pg_database;'

Dit commando voert een commando uit (beschreven door de -c vlag) van het selecteren van de datname kolom van de pg_database globale tafel. De -t vlag geeft alleen tupels (resultaatrijen) weer en verbergt overtollige descriptors zoals de koptekst en het aantal resultaten, en de -A flag verwijdert de uitlijning en drukt één database per regel af zonder tekens voor of achter de namen. De uitvoer van dit commando is vooral handig voor het maken van lussen voor databasedumps.

Dump een database

De dump-opdracht neemt een volledige kopie van een database, inclusief alle tabellen, schema's en gegevens, en slaat deze op in een enkel gecomprimeerd bestand:
pg_dump -c -Fc -U postgres database_name > database_name.psql

Er zijn een paar belangrijke vlaggen voor deze opdracht. -c , of –schoon , vertelt pg_dump om DROP-instructies aan de uitvoer toe te voegen, en -Fc , of –format=custom , comprimeert en organiseert de uitvoer die moet worden gebruikt met pg_restore later. Het aangepaste formaat biedt de grootste flexibiliteit en slaat de back-up ook voordelig op in een enkel bestand.

Dump alle databases

Het zou waarschijnlijk superieur zijn om elk van de databases naar zijn eigen bestand te brengen door de bovenstaande opdracht meerdere keren uit te voeren. We verwijzen naar onze tweede lijstopdracht, die een paar onnodige databases weghaalt, om onze individuele dumps te maken.
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

Deze for-lus geeft een lijst met alle databases, behalve de standaardsjablonen en de postgres-database, door aan de pg_dump commando om een ​​.psql . te maken bestand voor elk bestand in de huidige map.

Opmerking:het is ook mogelijk om alle databases in een enkel bestand te dumpen, hoewel dit bij grote datasets onpraktisch en moeilijk te herstellen kan worden. Daarom raad ik deze methode niet aan, hoewel deze minder complex is en in sommige situaties kan werken.

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

Dumpsubsidies

Subsidies worden opgeslagen in het PostgreSQL-schema. U kunt het schema dumpen en zo alle beschikbare subsidies voor het systeem verkrijgen met de opdracht pg_dump:
pg_dumpall -U postgres -s > pg.schema.psql

Hiermee worden niet alleen subsidies gedumpt, maar ook de rest van het schema van de server, inclusief instructies voor het maken van databases en tabellen, eigendoms- en rollidmaatschap en ACL-toewijzing - eigenlijk alles behalve de gegevens.

Als je alleen gebruikers (rollen) en subsidies nodig hebt, kun je die verzamelen met dit commando:
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' -e '^(CREATE|ALTER)\ ROLE' > pg.grants.psql

Dit maakt gebruik van de volledige schemadump, maar neemt alleen de instructies voor het maken van rollen en de opdrachten voor verlenen/intrekken om gebruikers en toekenningen samen te stellen.

Een database verwijderen of verwijderen

Om een ​​database te vernietigen, is de syntaxis heel eenvoudig. Wees voorzichtig bij het typen van deze opdracht, aangezien er niet om bevestiging wordt gevraagd!
psql -U postgres -c ‘drop database database_name’

Als de database bestaat, zal deze niet meer bestaan. Er is ook een opdrachtregelwrapper voor dezelfde taak:
dropdb -U postgres database_name

Een subsidie ​​verwijderen

Subsidies worden van gebruikers verwijderd door ze in te trekken. Het is belangrijk om eerst te weten welke subsidies een specifieke gebruiker heeft, dus laten we ernaar zoeken door het schema te dumpen en regels te vinden die betrekking hebben op onze gebruiker.
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' | grep database_user

In mijn geval is er een subsidie ​​die er als volgt uitziet:
GRANT ALL ON DATABASE database_name TO database_user;

Om dit tegen te gaan, zullen we dezelfde descriptor intrekken:
psql -U postgres -c ‘revoke all on database database_name from database_user;’

Opmerking:let op de kleine wijzigingen, GRANT is gewijzigd in REVOKE en TO is gewijzigd in FROM. Deze opdracht is verpakt tussen enkele aanhalingstekens en wordt doorgegeven aan psql met de vlag -c om de opdracht in PostgreSQL uit te voeren.
Dit zal de oorspronkelijke GRANT-instructie vervangen door een REVOKE in het schema. Als u de eerste opdracht in deze sectie opnieuw uitvoert, wordt nu alleen de regel weergegeven die we zojuist hebben gepasseerd:
REVOKE ALL ON DATABASE database_name FROM database_user;

Een database herstellen

Voor databases die zijn gedumpt met de pg_dump-methode die in dit artikel wordt gebruikt, kunnen we die hele database herstellen met deze opdracht:
pg_restore -U postgres -c -C -O -d database_name database_name.psql

Nog een flink aantal vlaggen nodig hier! -c of –schoon , zoals eerder, worden database-objecten verwijderd voordat ze vanuit het bestand naar PostgreSQL schrijven. We voegen dit toe voor het geval het niet werd gebruikt voor het dump-commando. -C , of –creëren , maakt de database databasenaam tijdens het herstellen als deze niet bestaat. Als de database al bestaat, de -c vlag zal het vernietigen vóór -C herschept het. Vervolgens is er -O , of –geen eigenaar , waarmee de eigenaar uit de database wordt verwijderd. Hierdoor kan een back-up van elke bron worden gewijzigd in de eigenaar van de gebruiker die het herstel uitvoert, wat in ons geval postgres is. -d database_name beschrijft de naam van de database waarnaar u wilt herstellen. Dit kan, indien nodig, een andere naam zijn dan de naam van waaruit de back-up is gemaakt. Het laatste argument is de naam van ons back-upbestand, database_name.psql .

Een subsidie ​​herstellen

Aangezien alle subsidies worden opgeslagen in ons bestand pg.grants.psql, hoeven we alleen de gebruiker te selecteren die we moeten herstellen. In ons geval zullen we database_user:
grep database_user pg.grants.psql | psql -U postgres

Aangezien het bestand pg.grants.psql rollen en toekenningen heeft, zal deze opdracht de gebruiker opnieuw maken met zijn oorspronkelijke privileges en wachtwoord, en vervolgens zijn toegang verlenen tot de vereiste databases en schema's.


  1. ADDM op SearchOracle.com

  2. IN clausule beperking in SQL Server

  3. PLS-00428:er wordt een INTO-clausule verwacht in deze SELECT-instructie

  4. Omgaan met SQL-databases met PyQt:de basis