PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak pracować z bazami danych PostgreSQL

Spis treści

Wyświetlanie baz danych
Zrzuć bazę danych
Zrzuć wszystkie bazy danych
Zrzuć dotacje
Usuń lub upuść bazę danych
Usuń Grant
Przywróć bazę danych
Przywróć Grant

PostgreSQL to doskonały alternatywny silnik bazy danych dla MySQL lub MariaDB, ale zarządzanie tymi bazami danych jest bardzo różne, szczególnie dla tych administratorów systemu, którzy są bardzo przyzwyczajeni do korzystania z MySQL z wiersza poleceń lub PHPMyAdmin. Wiele CMS i aplikacji już wie, jak komunikować się z bazami danych PostgreSQL po wyjęciu z pudełka, ale podobnie jak MySQL, nadal zależy od Ciebie w utrzymaniu tych baz danych.

W tym artykule założymy, że jesteś zalogowany przez SSH na swoim serwerze jako użytkownik „root” i masz zainstalowany serwer PostgreSQL z domyślną konfiguracją, która wymaga połączenia jako użytkownik „postgres”. W związku z tym większość poleceń przyjmie również opcję -U postgres. Polecenia te będą zasadniczo identyczne między CentOS i Ubuntu w większości nowoczesnych wersji, ale zostały przetestowane głównie na serwerze CentOS 7 VPS i serwerze Ubuntu 16.04 z systemem PostgreSQL 9.2.

Tworzenie baz danych i grantów jest dość skomplikowane, ale jeśli używasz cPanel, Plesk lub innego panelu sterowania obsługującego integrację PostgreSQL, konfiguracja jest prosta. Tworzenie tych baz danych i grantów z wiersza poleceń wykracza poza zakres tego konkretnego artykułu, więc założymy, że masz już uruchomione i używane bazy danych.

Lista baz danych w PostgreSQL

Pomaga znać dokładne nazwy baz danych, nad którymi będziesz pracować, a także dwukrotnie sprawdzić, czy pracujesz na właściwym serwerze. Wymieńmy najpierw bazy danych PostgreSQL na naszym komputerze:
psql -l -U postgres

Wynikiem tego polecenia jest tabela nazw baz danych, właścicieli i uprawnień dostępu. Będziemy używać danych z pierwszej kolumny podczas opisywania nazw baz danych dla przyszłych poleceń. W tym artykule użyjemy bazy danych o nazwie „database_name ”.

Jeśli potrzebujesz tylko nazw baz danych i żadnych innych informacji, możesz usunąć nadmiar informacji, wykonując dokładne zapytanie o nazwy baz danych:
psql -U postgres -tA -c 'select datname from pg_database;'

To polecenie wykonuje polecenie (opisane przez -c flaga) wybrania nazwy danych kolumna pg_database tabela globalna. -t flaga wyświetla tylko krotki (wiersze wyników) i ukrywa nadmiarowe deskryptory, takie jak liczba nagłówków i wyników oraz -A flaga usunie wyrównanie, drukując jedną bazę danych w wierszu bez znaków przed lub za nazwami. Dane wyjściowe tego polecenia są szczególnie przydatne do tworzenia pętli dla zrzutów bazy danych.

Zrzuć bazę danych

Polecenie dump pobierze pełną kopię bazy danych, w tym wszystkie tabele, schematy i dane, i zapisze ją w jednym skompresowanym pliku:
pg_dump -c -Fc -U postgres database_name > database_name.psql

Jest kilka ważnych flag dla tego polecenia. -c lub –wyczyść , mówi pg_dump aby dodać instrukcje DROP do danych wyjściowych i -Fc lub –format=niestandardowy , kompresuje i porządkuje dane wyjściowe do użycia z pg_restore później. Niestandardowy format ma największą elastyczność i korzystnie przechowuje kopię zapasową również w jednym pliku.

Zrzuć wszystkie bazy danych

Prawdopodobnie lepiej byłoby przenieść każdą z baz danych do własnego pliku, uruchamiając powyższe polecenie wiele razy. Odniesiemy się do naszego drugiego polecenia listingu, przeszukując kilka niepotrzebnych baz danych, aby utworzyć nasze indywidualne zrzuty.
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

Ta pętla for przekaże listę wszystkich baz danych, poza domyślnymi szablonami i bazą danych postgres, do pg_dump polecenie, aby utworzyć plik .psql plik dla każdego z nich w bieżącym katalogu.

Uwaga:Możliwe jest również wykonanie zrzutu wszystkich baz danych do jednego pliku, chociaż przy dużych zestawach danych może to być nieporęczne i trudne do przywrócenia. Dlatego nie polecam tej metody, chociaż jest ona mniej skomplikowana i może działać w niektórych sytuacjach.

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

Zrzuć dotacje

Dotacje są przechowywane w schemacie PostgreSQL. Możesz zrzucić schemat, uzyskując w ten sposób wszystkie dostępne granty dla systemu, używając polecenia pg_dump:
pg_dumpall -U postgres -s > pg.schema.psql

Spowoduje to zrzucenie nie tylko grantów, ale także reszty schematu serwera, w tym instrukcji tworzenia bazy danych i tabel, własności i członkostwa w rolach oraz alokacji ACL – w zasadzie wszystko oprócz danych.

Jeśli potrzebujesz tylko użytkowników (roli) i grantów, możesz je zebrać za pomocą tego polecenia:
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' -e '^(CREATE|ALTER)\ ROLE' > pg.grants.psql

Wykorzystuje to pełny zrzut schematu, ale do łączenia użytkowników i dotacji wykorzystuje tylko instrukcje tworzenia ról i instrukcje grant/revoke.

Usuń lub upuść bazę danych

Aby zniszczyć bazę danych, składnia jest bardzo prosta. Zachowaj ostrożność podczas wpisywania tego polecenia, ponieważ nie wymaga ono potwierdzenia!
psql -U postgres -c ‘drop database database_name’

Jeśli baza danych istnieje, już nie będzie. Istnieje również opakowanie wiersza poleceń dla tego samego zadania:
dropdb -U postgres database_name

Usuń grant

Dotacje są usuwane z użytkowników poprzez ich cofnięcie. Ważne jest, aby najpierw wiedzieć, jakie uprawnienia ma dany użytkownik, więc wyszukajmy je, zrzucając schemat i znajdując wiersze związane z naszym użytkownikiem.
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' | grep database_user

W moim przypadku istnieje grant, który wygląda tak:
GRANT ALL ON DATABASE database_name TO database_user;

Aby temu zaradzić, odwołamy ten sam deskryptor:
psql -U postgres -c ‘revoke all on database database_name from database_user;’

Uwaga:Zwróć uwagę na drobne zmiany, GRANT zostało zmienione na REVOKE, a TO zostało zmienione na FROM. To polecenie jest ujęte w pojedyncze cudzysłowy i przekazywane do psql z flagą -c w celu wykonania polecenia w PostgreSQL.
Zastąpi to oryginalną instrukcję GRANT przez REVOKE w schemacie. Ponowne uruchomienie pierwszego polecenia w tej sekcji pokazuje teraz tylko wiersz, który właśnie przekazaliśmy:
REVOKE ALL ON DATABASE database_name FROM database_user;

Przywróć bazę danych

W przypadku baz danych, które zostały zrzucone przy użyciu metody pg_dump użytej w tym artykule, możemy przywrócić całą bazę danych za pomocą tego polecenia:
pg_restore -U postgres -c -C -O -d database_name database_name.psql

Potrzebnych jest tutaj jeszcze kilka flag! -c lub –oczyść , tak jak poprzednio, usuwa obiekty bazy danych przed zapisaniem z pliku do PostgreSQL. Dodajemy to na wypadek, gdyby nie było używane w poleceniu dump. -C lub –utwórz , spowoduje, że baza danych nazwa_bazy_danych zostanie przywrócona, jeśli nie istnieje. Jeśli baza danych już istnieje, -c flaga zniszczy go przed -C odtwarza to. Następnie jest -O lub –brak właściciela , co usuwa właściciela z bazy danych. Dzięki temu kopię zapasową z dowolnego źródła można zmienić na właściciela użytkownika wykonującego przywracanie, którym w naszym przypadku jest postgres. -d nazwa_bazy opisuje nazwę bazy danych, do której będziesz przywracać. W razie potrzeby może to być inna nazwa niż ta, z której utworzono kopię zapasową. Ostatnim argumentem jest nazwa naszego pliku kopii zapasowej, nazwa_bazy_danych.psql .

Przywróć dotację

Ponieważ wszystkie granty są przechowywane w naszym pliku pg.grants.psql, musimy wybrać tylko użytkownika, którego chcemy przywrócić. W naszym przypadku przywrócimy database_user:
grep database_user pg.grants.psql | psql -U postgres

Ponieważ plik pg.grants.psql ma role i granty, to polecenie odtworzy użytkownika z jego oryginalnymi uprawnieniami i hasłem, a następnie przyzna mu dostęp do wymaganych baz danych i schematów.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Usuń zduplikowane wiersze z małej tabeli

  2. Używanie jsonb_set() do aktualizacji określonej wartości tablicy jsonb

  3. Błąd migracji Django:kolumna nie istnieje

  4. Pięć fajnych rzeczy, których nauczyłem się na konferencji PostgreSQL w Europie 2018

  5. Wysoka dostępność PostgreSQL dzięki architekturze Master-Slave i Master-Master