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

Sådan arbejder du med PostgreSQL-databaser

Indholdsfortegnelse

Opstilling af databaser
Dump en database
Dumping af alle databaser
Dump Grants
Slet eller slip en database
Slet en Grant
Gendan en database
Gendan Grant

PostgreSQL er en glimrende alternativ databasemotor til MySQL eller MariaDB, men administration af disse databaser er meget anderledes, især for de systemadministratorer, der er meget vant til at bruge MySQL fra kommandolinjen eller PHPMyAdmin. Mange CMS og applikationer ved allerede, hvordan man interagerer med PostgreSQL-databaser lige uden for boksen, men er ligesom MySQL stadig afhængige af, at du vedligeholder disse databaser.

For denne artikel antager vi, at du er SSH-ed på din server som 'root'-bruger og har installeret PostgreSQL-server med standardkonfigurationen, som kræver tilslutning som 'postgres'-bruger. Derfor vil de fleste kommandoer også tage -U postgres-indstillingen. Disse kommandoer vil generelt være identiske mellem CentOS og Ubuntu på tværs af de fleste moderne versioner, men blev primært testet på en CentOS 7 VPS-server og en Ubuntu 16.04-server, der kører PostgreSQL 9.2.

Oprettelse af databaser og bevillinger er ret komplekst, men hvis du bruger cPanel, Plesk eller et andet kontrolpanel, der understøtter PostgreSQL-integration, er det ligetil at konfigurere dette. At lave disse databaser og bevillinger fra kommandolinjen er uden for denne artikels omfang, så vi antager også, at du allerede har dine databaser kørende og i brug.

Vis databaser i PostgreSQL

Det hjælper at kende de nøjagtige navne på de databaser, du skal arbejde på, samt at foretage en dobbeltkontrol for at sikre, at du arbejder på den rigtige server. Lad os først liste PostgreSQL-databaserne på vores maskine:
psql -l -U postgres

Outputtet for denne kommando er en tabel med databasenavne, ejere og adgangsrettigheder. Vi vil bruge data fra den første kolonne, når vi beskriver databasenavne til fremtidige kommandoer. Til denne artikel bruger vi en database kaldet "databasenavn ”.

Hvis du kun har brug for databasenavne og ingen anden information, kan du trimme overskydende information væk ved at udføre en nøjagtig forespørgsel efter databasenavne:
psql -U postgres -tA -c 'select datname from pg_database;'

Denne kommando udfører en kommando (beskrevet af -c flag) for at vælge datname kolonne i pg_database global tabel. -t flag viser kun tuples (resultatrækker) og skjuler overskydende deskriptorer som header og resultatantal og -A flag vil fjerne justering og udskrive én database pr. linje uden tegn foran eller bagved navnene. Outputtet af denne kommando er særligt nyttigt til at skabe loops til databasedumps.

Dump en database

Dump-kommandoen vil tage en fuld kopi af en database, inklusive alle tabeller, skemaer og data, og gemme den i en enkelt komprimeret fil:
pg_dump -c -Fc -U postgres database_name > database_name.psql

Der er et par vigtige flag for denne kommando. -c , eller –ren , fortæller pg_dump for at tilføje DROP-sætninger til outputtet, og -Fc , eller –format=custom , komprimerer og organiserer outputtet, der skal bruges med pg_restore senere. Det brugerdefinerede format har den største fleksibilitet og gemmer med fordel også sikkerhedskopien i en enkelt fil.

Dump alle databaser

Det ville sandsynligvis være bedre at bringe hver af databaserne ud i sin egen fil ved at køre ovenstående kommando flere gange. Vi henviser til vores anden listekommando, der fjerner et par unødvendige databaser, for at lave vores individuelle dumps.
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

Denne for loop sender en liste over alle databaserne, bortset fra standardskabelonerne og postgres-databasen, tilpg_dump kommando for at lave en .psql fil for hver enkelt i den aktuelle mappe.

Bemærk:Det er også muligt at udføre en dump af alle databaser til en enkelt fil, men med store datasæt kan dette blive uhåndterligt og svært at gendanne. Derfor anbefaler jeg ikke denne metode, selvom den er mindre kompleks og kan fungere i nogle situationer.

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

Dump Grants

Tilskud gemmes i PostgreSQL-skemaet. Du kan dumpe skemaet og derved få alle de tilgængelige bevillinger til systemet ved at bruge kommandoen pg_dump:
pg_dumpall -U postgres -s > pg.schema.psql

Dette vil dumpe ikke kun bevillinger, men også resten af ​​serverens skema, inklusive database- og tabeloprettelseserklæringer, ejerskab og rollemedlemskab og ACL-allokering – dybest set alt undtagen dataene.

Hvis du kun har brug for brugere (roller) og bevillinger, kan du indsamle dem ved hjælp af denne kommando:
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' -e '^(CREATE|ALTER)\ ROLE' > pg.grants.psql

Dette udnytter det fulde skemadump, men tager kun rolleoprettelseserklæringerne og grant/revoke-erklæringerne til at samle brugere og bevillinger.

Slet eller slip en database

For at ødelægge en database er syntaksen meget ligetil. Vær venligst forsigtig, når du skriver denne kommando, da den ikke beder dig om at bekræfte!
psql -U postgres -c ‘drop database database_name’

Hvis databasen eksisterer, vil den ikke længere. Der er også en kommandolinjeindpakning til den samme opgave:
dropdb -U postgres database_name

Slet et tilskud

Tilskud fjernes fra brugerne ved at tilbagekalde dem. Det er vigtigt først at vide, hvilke bevillinger en specifik bruger har, så lad os søge efter dem ved at dumpe skemaet og finde linjer relateret til vores bruger.
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' | grep database_user

I mit tilfælde er der en bevilling, der ser sådan ud:
GRANT ALL ON DATABASE database_name TO database_user;

For at bekæmpe dette vil vi tilbagekalde den samme beskrivelse:
psql -U postgres -c ‘revoke all on database database_name from database_user;’

Bemærk:Bemærk de små ændringer, GRANT er blevet ændret til REVOKE, og TIL er blevet ændret til FROM. Denne kommando pakkes ind i enkelte anførselstegn og sendes til psql med flaget -c for at udføre kommandoen i PostgreSQL.
Dette vil erstatte den originale GRANT-sætning med en REVOKE i skemaet. At køre den første kommando i dette afsnit igen viser nu kun den linje, vi lige har passeret:
REVOKE ALL ON DATABASE database_name FROM database_user;

Gendan en database

For databaser, der blev dumpet ved hjælp af pg_dump-metoden brugt i denne artikel, kan vi gendanne hele databasen ved hjælp af denne kommando:
pg_restore -U postgres -c -C -O -d database_name database_name.psql

Der er brug for en hel del flere flag her! -c eller –ren , som før, dropper databaseobjekter, før de skrives fra filen til PostgreSQL. Vi tilføjer dette, hvis det ikke blev brugt til dump-kommandoen. -C , eller –opret , vil lave databasen databasenavn under gendannelse, hvis den ikke eksisterer. Hvis databasen allerede eksisterer, skal -c flag vil ødelægge det før -C genskaber det. Dernæst er der -O , eller –ingen ejer , som fjerner ejeren fra databasen. Dette gør det muligt at ændre en sikkerhedskopi fra enhver kilde til ejeren af ​​den bruger, der udfører gendannelsen, hvilket i vores tilfælde er postgres. -d databasenavn beskriver navnet på den database, som du vil gendanne til. Dette kan være et andet navn end det, som backuppen blev oprettet fra, hvis det er nødvendigt. Det sidste argument er navnet på vores backup-fil, database_name.psql .

Gendan et tilskud

Da alle bevillinger er gemt i vores pg.grants.psql-fil, skal vi kun vælge den bruger, som vi skal gendanne. I vores tilfælde vil vi gendanne database_user:
grep database_user pg.grants.psql | psql -U postgres

Da filen pg.grants.psql har roller og bevillinger, vil denne kommando genskabe brugeren med dens oprindelige privilegier og adgangskode og derefter give dens adgang til de nødvendige databaser og skemaer.


  1. Sådan grupperes efter år i T-SQL

  2. Bestemmelse af OID for en tabel i Postgres 9.1?

  3. MariaDB JSON_VALUE() Forklaret

  4. Installer pdo til postgres Ubuntu