Blog JSystems - uwalniamy wiedzę!

Szukaj
Z tego artykułu dowiesz się:
  • czym są i do czego służą bazy danych w PostgreSQL,
  • jak sprawdzić dostępne bazy danych za pomocą SQL
  • jak sprawdzić wielkość baz danych za pomocą SQL
  • jak sprawdzić przestrzeń tabel w której mieści się baza danych za pomocą SQL,
  • jak sprawdzić kto jest właścicielem bazy danych za pomocą SQL,
  • jak w prosty sposób tworzyć bazy danych,
  • jak tworzyć bazy danych jako kopie innych baz,
  • jak tworzyć bazy danych w wybranych przestrzeniach tabel,
  • jak tworzyć bazy danych tak by należały do wybranego użytkownika,
  • jak przemieszczać bazy danych pomiędzy przestrzeniami tabel i jakie są tego konsekwencje,
  • jak zmieniać właściciela bazy danych,
  • jak zmieniać i sprawdzać parametry ustawione dla konkretnej bazy danych,
  • jak zmieniać nazwę bazy danych,
  • jak kasować bazę danych.

Bazy danych są strukturą logiczną, choć wiążą się ze strukturą fizyczną. Każda baza danych ma swój osobny katalog na serwerze. - Dane pomiędzy poszczególnymi bazami danych są od siebie odseparowane fizycznie i logicznie. Niestety nie są na tyle niezależne jak np. w Oracle czy SQL Server, by można było osobno robić kopie zapasowe i osobno przywracać bazy danych. Co prawda można wykonać eksport danych do pliku tekstowego za pomocą pg_dump, ale nie jest to kopia zapasowa w pełnym tego słowa znaczeniu i nie pozwala np. przywrócić bazy do wybranego punktu w czasie. W przypadku eksportu danych- możliwość późniejszego odtworzenia bazy ogranicza się do punktu w czasie, z którego pochodzi eksport. Należy mieć to na uwadze przy projektowaniu - struktur bazodanowych. Jeśli potrzebujemy kilku baz dla kilku niezależnych od siebie systemów, to lepiej zamiast osobnych baz stworzyć osobne klastry. Dzięki temu będziemy mogli włączać i wyłączać poszczególne systemy niezależnie, osobno backupować i w razie potrzeby odtwarzać.

Wszystkie bazy danych współdzielą obszar pamięci dostępny dla całego klastra PostgreSQL, a zdefiniowany przez parametr "shared_buffers". - To jest kolejny powód do separacji danych w osobnych klastrach. Jeśli w jednym klastrze będą dane kilku systemów, to każdy z nich będzie opóźniał działanie pozostałych.

Sprawdzanie dostępnych baz danych

Jakie - bazy danych mamy w klastrze, możemy sprawdzić, wykonując:

select oid,datname from pg_database;
Sprawdzanie dostępnych baz danych: Bazy danych w PostgreSQL

Jak widać, mamy w - tym - przypadku 5 baz danych. Bazy danych example i test_config zostały stworzone przy okazji jakiegoś przykładu, nie ma ich domyślnie. Baza "postgres" jest tworzona przez skrypt "initdb" w momencie inicjalizacji klastra. Bazy "template0" i "template1" to bazy wzorcowe. Każda nowa baza danych jest tworzona jako kopia bazy "template1". Oznacza to, że jeśli dodamy jakieś obiekty czy ustawienia dla tej bazy, będzie to duplikowane do każdej nowo tworzonej bazy. Baza "template0" - również jest bazą wzorcową, jednak nie powinniśmy jej modyfikować. Ma ona pozostać “dziewicza” -jak określono w dokumentacji . Służyć będzie do tworzenia nowych pustych baz danych w przypadku, gdy zmodyfikujemy "template1", a chcielibyśmy nową czystą bazę.

Przy okazji należy porównać - oid’y poszczególnych baz z nazwami katalogów w podkatalogu “base” (to tu są pliki danych naszych baz) - PGDATA:

Sprawdzanie dostępnych baz danych: Bazy danych w PostgreSQL (2)

Jak widać, - każda baza ma osobny katalog i jego nazwa pokrywa się z wartością oid dla każdej bazy. To powoduje, - że możemy między innymi umieścić wybraną bazę na innym dysku. Nie sprawia to jednak, że można te katalogi osobno backupować, ponieważ pliki w nich zawarte są powiązane z innymi plikami w PGDATA.

Sprawdzanie wielkości baz danych

Możemy sprawdzić wielkość poszczególnych baz danych za pomocą funkcji: "pg_database_size" oraz - outputu "pg_size_pretty":

select datname,pg_database_size(datname), pg_size_pretty(pg_database_size(datname))
from pg_database;
Sprawdzanie wielkości baz danych: Bazy danych w PostgreSQL

Sprawdzanie przestrzeni tabel, w której mieści się baza danych

Przestrzeniami tabel jeszcze się nie zajmowaliśmy. Na potrzeby tego rozdziału należy przyjąć, że przestrzeń tabel to - katalog, w którym mogą się znajdować pliki danych.

Jeśli chcielibyśmy sprawdzić, w jakim tablespace leżą poszczególne bazy, potrzebujemy wykorzystać dodatkowo słownik "pg_tablespace":

select datname,spcname from pg_database d join pg_tablespace t on t.oid=d.dattablespace;
Sprawdzanie przestrzeni tabel, w której mieści się baza danych: Bazy danych w PostgreSQL

Sprawdzanie, kto jest właścicielem bazy danych

Korzystając z funkcji "pg_get_userbyid" znajdującej się w schemacie "pg_catalog", jesteśmy - w stanie zweryfikować, kto jest właścicielem bazy danych:

SELECT d.datname, pg_catalog.pg_get_userbyid(d.datdba)
FROM pg_catalog.pg_database d;
Sprawdzanie, kto jest właścicielem bazy danych: Bazy danych w PostgreSQL

Sprawdzanie parametrów ustawionych indywidualnie dla bazy

Niektóre z parametrów (np. random_page_cost, seq_page_cost) można ustawić na poziomie bazy danych. Bazy, które mają tak ustawione parametry, będą widoczne w słowniku "pg_db_role_setting". Co ważne - :nie figurują tam wszystkie bazy danych, a jedynie te, które mają - parametry ustawione indywidualnie

select * from pg_db_role_setting;
Sprawdzanie parametrów ustawionych indywidualnie dla bazy: Bazy danych w PostgreSQL

Zamiast nazwy bazy danych mamy jej oid. Potrzebujemy więc - zapytania, by zwracało nam nazwy baz:

select datname,setconfig
from pg_db_role_setting s
join pg_database d on s.setdatabase=d.oid;
Sprawdzanie parametrów ustawionych indywidualnie dla bazy: Bazy danych w PostgreSQL (2)

Tworzenie - bazy danych

Ogólna konstrukcja polecenia tworzenia bazy danych jest następująca:

CREATE DATABASE NAZWA_BAZY
WITH OWNER = NAZWA UŻYTKOWNIKA
TEMPLATE = BAZA_ROBIĄCA_ZA_SZABLON
ENCODING = KODOWANIE
TABLESPACE = NAZWA_PRZESTRZENI
CONNECTION LIMIT = X

Najprostszy sposób stworzenia bazy:

create database druga;

W ramach takiej bazy utworzy się jeden schemat o nazwie public oraz ewentualnie inne obiekty, jeśli dodamy je do bazy "template1". Możemy też utworzyć bazę danych na podstawie innej bazy:

create database trzecia with template=test_config;

Stworzona w ten sposób kopia będzie zawierała kopię obiektów z bazy wzorcowej.Jest to - ciekawy sposób na produkowanie baz developerskich czy testowych. Jedna uwaga - nie możemy w ten sposób stworzyć kopii bazy, do której została podłączona jakakolwiek sesja.

Możemy również umieścić bazę danych w określonej przestrzeni tabel (co za tym idzie i lokalizacji) w następujący sposób:

create database czwarta tablespace=pg_default;

Dane tak stworzonej bazy będą umieszczone w katalogu związanym z daną przestrzenią tabel.

Domyślnie właścicielem bazy danych będzie użytkownik ją tworzący. Aby stworzyć bazę, której właścicielem będzie określony użytkownik, trzeba wykonać - polecenie:

create database piata owner=mapet;

Użytkownik, który jest właścicielem bazy danych, będzie mógł zrobić z nią wszystko - w tym nawet - skasować, jeśli w danej bazie istnieją obiekty należące do innego użytkownika. Może też kasować i zmieniać obiekty wszystkich innych użytkowników - w tym obiekty stworzone przez użytkownika postgres - czyli administratora klastra.

Zmiana właściciela bazy danych

Tym razem stworzymy nową bazę danych z domyślnym właścicielem "postgres" .Z jego poziomu utworzymy - bazę danych.To będzie - jej właściciel. Następnie zmienimy właściciela:

create database nowa;
select datname,pg_catalog.pg_get_userbyid(d.datdba) from pg_database d;
Zmiana właściciela bazy danych: Bazy danych w PostgreSQL

Widzimy wszystkie stworzone dotychczas bazy - w tym np. bazę “piata” należąca do użytkownika mapet. Nasza nowo stworzona baza “nowa” - należy do użytkownika postgres. Zmieniamy właściciela na użytkownika mapet:

alter database nowa owner to mapet;

Sprawdzamy właściciela dla tej bazy:

select datname,pg_catalog.pg_get_userbyid(d.datdba) from pg_database d
where datname='nowa';
Zmiana właściciela bazy danych: Bazy danych w PostgreSQL (2)

Właścicielem bazy “nowa” jest już użytkownik “mapet”.

Konfiguracja indywidualnych parametrów bazy danych

Niektóre parametry można ustawiać na poziomie bazy danych. Aby zmienić parametry, wykonujemy poniższe zapytanie:

alter database nowa set random_page_cost=1;

Został użyty parametr: "random_page_cost" , ale może to być dowolny parametr konfigurowalny na poziomie bazy danych. Sprawdźmy jeszcze, czy to działa:

select datname,setconfig from
pg_db_role_setting s join pg_database d on s.setdatabase=d.oid;
Konfiguracja indywidualnych parametrów bazy danych: Bazy danych w PostgreSQL

Przenoszenie bazy danych pomiędzy przestrzeniami tabel

Bazy danych przy tworzeniu będą lądowały w domyślnej przestrzeni tabel tj. "pg_default", czyli w podkatalogu "base" naszej PGDATA. Przestrzeń docelową możemy wskazać, tworząc bazę danych, ale jeśli taka już istnieje, możemy ją też przenieść. Przeniesienie bazy danych pomiędzy przestrzeniami tabel będzie się wiązało z fizycznym przeniesieniem jej plików pomiędzy katalogami. W związku z tym, by zapewnić spójność danych, baza w trakcie przenoszenia pomiędzy przestrzeniami tabel będzie niedostępna. Aby przenieść bazę do innej przestrzeni tabel, - wykonujemy komendę wg schematu:

alter database do_przeniesienia set tablespace dane1;

Zmiana nazwy bazy danych

Zmienimy - nazwę bazy danych. W swoim klastrze mamy bazę o nazwie "example":

Zmiana nazwy bazy danych: Bazy danych w PostgreSQL

Zmieniamy - nazwę z “example” na “samples”:

alter database example rename to samples;

Nazwa została zmieniona:

Zmiana nazwy bazy danych: Bazy danych w PostgreSQL (2)

Kasowanie bazy danych

Jeśli chcemy skasować bazę danych, możemy wywołać:

drop database samples;

Wykonując tę operację, należy podpiąć się do innej bazy niż ta kasowana. - Nie uda się też skasować bazy, jeśli jakiś użytkownik będzie do niej podpięty. Trzeba będzie ubić jego sesję. Każdą bazę niezależnie od tego, kto jest jej właścicielem, może skasować superużytkownik, np. postgres. Kasowanie bazy danych powoduje skasowanie wszystkich obiektów w niej zawartych.

Baner szkolenia Administracja, replikacja i tuning baz danych PostgreSQL w JSystems, terminy gwarantowane

Szkolenie Administracja, replikacja i tuning baz danych PostgreSQL →

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Czy w PostgreSQL można osobno backupować i przywracać pojedyncze bazy danych?
Nie w pełni. Bazy są odseparowane logicznie i mają osobne katalogi, ale nie są aż tak niezależne jak w Oracle czy SQL Server. Można wykonać eksport przez pg_dump, ale nie jest to pełna kopia zapasowa i nie pozwala przywrócić bazy do dowolnego punktu w czasie.
Kiedy lepiej użyć osobnych klastrów zamiast osobnych baz danych?
Gdy potrzebujesz kilku baz dla niezależnych od siebie systemów. Osobne klastry pozwalają włączać, wyłączać, backupować i odtwarzać każdy system osobno. Dodatkowo bazy w jednym klastrze współdzielą shared_buffers, więc wzajemnie się spowalniają.
Do czego służą bazy template0 i template1?
To bazy wzorcowe. Każda nowa baza powstaje jako kopia template1, więc obiekty i ustawienia dodane do niej są duplikowane. template0 ma pozostać nietknięta i służy do tworzenia czystych baz, gdy template1 została zmodyfikowana.
Jak utworzyć bazę danych jako kopię innej bazy?
Używasz polecenia CREATE DATABASE z opcją template wskazującą bazę wzorcową. Kopia zawiera obiekty z tej bazy, co bywa wygodne przy tworzeniu baz developerskich i testowych. Nie da się jednak skopiować bazy, do której podłączona jest jakaś sesja.
Jak sprawdzić rozmiar i właściciela baz danych?
Rozmiar sprawdzisz funkcją pg_database_size, którą warto połączyć z pg_size_pretty dla czytelnego wyniku. Właściciela odczytasz funkcją pg_get_userbyid zastosowaną do kolumny datdba w słowniku pg_database.
Jak zmienić właściciela bazy danych?
Bazę tworzysz z domyślnym właścicielem lub wskazujesz go opcją owner przy CREATE DATABASE, a właściciela zmieniasz poleceniem ALTER DATABASE. Właściciel może zrobić z bazą wszystko, łącznie z kasowaniem i modyfikowaniem obiektów innych użytkowników.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...