sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man arbetar med PostgreSQL-databaser

Innehållsförteckning

Listdatabaser
Dumpa en databas
Dumpa alla databaser
Dumpa bidrag
Ta bort eller släpp en databas
Ta bort en Grant
Återställ en databas
Återställ Grant

PostgreSQL är en utmärkt alternativ databasmotor till MySQL eller MariaDB, men att hantera dessa databaser är väldigt annorlunda, särskilt för de systemadministratörer som är mycket vana vid att använda MySQL från kommandoraden eller PHPMyAdmin. Många CMS och applikationer vet redan hur man interagerar med PostgreSQL-databaser direkt, men är liksom MySQL fortfarande beroende av att du underhåller dessa databaser.

För den här artikeln antar vi att du är SSH-add till din server som "root"-användare och har installerat PostgreSQL-servern med standardkonfigurationen, vilket kräver att du ansluter som "postgres"-användare. Därför kommer de flesta kommandon också att använda alternativet -U postgres. Dessa kommandon kommer i allmänhet att vara identiska mellan CentOS och Ubuntu i de flesta moderna versioner men testades främst på en CentOS 7 VPS-server och en Ubuntu 16.04-server som kör PostgreSQL 9.2.

Att skapa databaser och anslag är ganska komplicerat, men om du använder cPanel, Plesk eller någon annan kontrollpanel som stöder PostgreSQL-integration är det enkelt att ställa in detta. Att göra dessa databaser och anslag från kommandoraden ligger utanför ramen för den här artikeln, så vi antar också att du redan har dina databaser igång och används.

Lista databaser i PostgreSQL

Det hjälper att känna till de exakta namnen på databaserna du kommer att arbeta med, samt göra en dubbelkontroll för att säkerställa att du arbetar på rätt server. Låt oss först lista PostgreSQL-databaserna på vår maskin:
psql -l -U postgres

Utdata för detta kommando är en tabell över databasnamn, ägare och åtkomstbehörigheter. Vi kommer att använda data från den första kolumnen när vi beskriver databasnamn för framtida kommandon. För den här artikeln använder vi en databas som heter "database_name ”.

Om du bara behöver databasnamn, och ingen annan information, kan du trimma bort överflödig information genom att utföra en exakt fråga efter databasnamn:
psql -U postgres -tA -c 'select datname from pg_database;'

Detta kommando kör ett kommando (beskrivs av -c flagga) för att välja datnamn kolumnen i pg_database global tabell. -t flaggan listar endast tupler (resultatrader) och döljer överflödiga beskrivningar som rubriken och resultaträkningen och -A flaggan tar bort justeringen och skriver ut en databas per rad utan tecken framför eller bakom namnen. Utdata från detta kommando är särskilt användbart för att skapa loopar för databasdumpar.

Dumpa en databas

Dumpkommandot tar en fullständig kopia av en databas, inklusive alla tabeller, scheman och data, och lagrar den i en enda komprimerad fil:
pg_dump -c -Fc -U postgres database_name > database_name.psql

Det finns några viktiga flaggor för detta kommando. -c , eller –ren , berättar pg_dump för att lägga till DROP-satser till utdata, och -Fc , eller –format=custom , komprimerar och organiserar utdata som ska användas med pg_restore senare. Det anpassade formatet har störst flexibilitet och lagrar med fördel även säkerhetskopian i en enda fil.

Dumpa alla databaser

Det skulle sannolikt vara överlägset att ta ut var och en av databaserna till sin egen fil genom att köra kommandot ovan flera gånger. Vi kommer att referera till vårt andra listningskommando, som tar bort några onödiga databaser, för att göra våra individuella dumpningar.
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

Denna for-loop skickar en lista över alla databaser, förutom standardmallarna och postgres-databasen, tillpg_dump kommando för att skapa en .psql fil för var och en i den aktuella katalogen.

Obs:Det är också möjligt att utföra en dumpning av alla databaser till en enda fil, men med stora datamängder kan detta bli svårt och svårt att återställa. Därför rekommenderar jag inte den här metoden, även om den är mindre komplex och kan fungera i vissa situationer.

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

Dumpa bidrag

Bidrag lagras i PostgreSQL-schemat. Du kan dumpa schemat och därigenom få alla tillgängliga anslag för systemet med kommandot pg_dump:
pg_dumpall -U postgres -s > pg.schema.psql

Detta kommer att dumpa inte bara anslag, utan även resten av serverns schema, inklusive databas- och tabellskapande uttalanden, ägande och rollmedlemskap och ACL-allokering – i princip allt utom data.

Om du bara behöver användare (roller) och anslag, kan du samla in dem med detta kommando:
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' -e '^(CREATE|ALTER)\ ROLE' > pg.grants.psql

Detta utnyttjar hela schemadumpen men tar bara rollskapande uttalanden och grant/revoke-satser för att sammanställa användare och anslag.

Ta bort eller släpp en databas

För att förstöra en databas är syntaxen väldigt enkel. Var försiktig när du skriver ut det här kommandot, eftersom det inte ber dig att bekräfta!
psql -U postgres -c ‘drop database database_name’

Om databasen finns kommer den inte att göra det längre. Det finns också ett kommandoradspaket för samma uppgift:
dropdb -U postgres database_name

Ta bort ett bidrag

Bidrag tas bort från användare genom att återkalla dem. Det är viktigt att först veta vilka anslag en specifik användare har, så låt oss söka efter dem genom att dumpa schemat och hitta rader relaterade till vår användare.
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' | grep database_user

I mitt fall finns det ett anslag som ser ut så här:
GRANT ALL ON DATABASE database_name TO database_user;

För att bekämpa detta kommer vi att återkalla samma deskriptor:
psql -U postgres -c ‘revoke all on database database_name from database_user;’

Notera:Notera de små ändringarna, GRANT har ändrats till REVOKE och TO har ändrats till FROM. Detta kommando lindas in i enkla citattecken och skickas till psql med flaggan -c för att utföra kommandot i PostgreSQL.
Detta kommer att ersätta den ursprungliga GRANT-satsen med en REVOKE i schemat. Att köra det första kommandot i det här avsnittet igen visar nu bara raden vi just passerade:
REVOKE ALL ON DATABASE database_name FROM database_user;

Återställ en databas

För databaser som dumpades med metoden pg_dump som används i den här artikeln kan vi återställa hela databasen med det här kommandot:
pg_restore -U postgres -c -C -O -d database_name database_name.psql

Här behövs en hel del fler flaggor! -c eller –ren , som tidigare, släpper databasobjekt innan du skriver från filen till PostgreSQL. Vi lägger till detta ifall det inte användes för dump-kommandot. -C , eller –skapa , kommer att göra databasen databasnamn under återställning om den inte finns. Om databasen redan finns, -c flaggan förstör den före -C återskapar det. Därefter finns -O , eller –ingen ägare , vilket tar bort ägaren från databasen. Detta gör att en säkerhetskopia från vilken källa som helst kan ändras till ägaren till användaren som gör återställningen, vilket i vårt fall är postgres. -d databasnamn beskriver namnet på databasen som du kommer att återställa till. Detta kan vara ett annat namn än det som säkerhetskopian skapades från, om det behövs. Det sista argumentet är namnet på vår säkerhetskopia, database_name.psql .

Återställ ett bidrag

Eftersom alla anslag lagras i vår pg.grants.psql-fil behöver vi bara välja den användare som vi behöver återställa. I vårt fall kommer vi att återställa database_user:
grep database_user pg.grants.psql | psql -U postgres

Eftersom filen pg.grants.psql har roller och grants, kommer detta kommando att återskapa användaren med sina ursprungliga privilegier och lösenord och sedan ge denne åtkomst till nödvändiga databaser och scheman.


  1. Frågan tar timeout när den körs från webben, men supersnabb när den körs från SSMS

  2. Hur kan jag se om jag har oengagerat arbete i en Oracle-transaktion?

  3. När kan vi använda ett identifikationsnummer istället för dess namn i PostgreSQL?

  4. R12.2 Bestämning och konfiguration av upplaga