Blog JSystems - uwalniamy wiedzę!

Szukaj

PostgreSQL

Jak przenieść dane na inny dysk - przestrzenie tabel (tablespace)

W skrócie

  • Dysk z katalogiem danych PostgreSQL się zapełnia albo chcesz trzymać duże, rzadko używane tabele na tańszym nośniku, a szybkie na SSD.
  • Domyślnie wszystkie dane leżą w jednym katalogu, ale PostgreSQL pozwala kierować wybrane obiekty na inne ścieżki przez przestrzenie tabel.
  • Zakładasz katalog na docelowym dysku, tworzysz tablespace wskazujący na niego i przenosisz do niego tabelę, indeks albo całą bazę.

Kiedy baza rośnie, prędzej czy później jeden wolumen przestaje wystarczać - albo miejscem, albo wydajnością. Przestrzenie tabel, czyli tablespace, to mechanizm, który pozwala rozłożyć dane PostgreSQL na kilka fizycznych lokalizacji bez przenoszenia całej bazy. Możesz trzymać gorące, często czytane tabele na szybkim SSD, a archiwalne na dużym, tańszym dysku. Pokażemy, jak to bezpiecznie skonfigurować i na co uważać, żeby nie uszkodzić instancji.

Jak to wygląda w praktyce

Najczęściej problem zaczyna się od alertu, że partycja z katalogiem danych zbliża się do zapełnienia, a rozbudowa tego wolumenu jest trudna albo kosztowna. Masz za to podpięty drugi, duży dysk, który stoi pusty. Alternatywnie sytuacja jest wydajnościowa: kilka tabel jest ekstremalnie gorących i chciałbyś je trzymać na najszybszym nośniku, a przy tym nie kupować drogiego SSD na całą, w dużej części zimną bazę. Bez przestrzeni tabel utknąłbyś, bo wszystkie pliki bazy siedzą w jednym katalogu wskazanym przez zmienną PGDATA i nie da się ich rozdzielić na poziomie systemu plików bez ryzyka.

Dlaczego tak się dzieje

PostgreSQL domyślnie zapisuje wszystko w jednym katalogu danych - to tam trafiają pliki tabel, indeksów, dziennik transakcji i konfiguracja. Ten katalog wyznacza jeden konkretny wolumen, więc rozmiar bazy jest ograniczony pojemnością tej jednej partycji, a szybkość odczytu i zapisu - parametrami tego jednego dysku. Nie da się bezpiecznie ręcznie przenieść plików tabel gdzie indziej, bo PostgreSQL trzyma sztywne powiązania między obiektami a ich plikami i nie zniesie samowolki na poziomie systemu plików. Przestrzeń tabel rozwiązuje to na poziomie samej bazy: to nazwany wskaźnik na katalog w innej lokalizacji, który PostgreSQL zna i którym sam zarządza. Dzięki temu możesz świadomie zdecydować, że dany obiekt ma fizycznie leżeć na innym dysku, a baza zadba o resztę.

Jak to rozwiązać krok po kroku

  1. Na docelowym dysku utwórz pusty katalog i nadaj go na własność użytkownikowi systemowemu, pod którym działa serwer bazy (najczęściej postgres). Katalog musi być pusty i należeć do tego konta, inaczej tworzenie tablespace się nie powiedzie.
  2. Utwórz przestrzeń tabel wskazującą na ten katalog: CREATE TABLESPACE szybki LOCATION '/mnt/ssd/pg_szybki';. Od tej chwili baza wie o nowej lokalizacji.
  3. Umieść nową tabelę od razu w wybranej przestrzeni: CREATE TABLE zamowienia (...) TABLESPACE szybki;. Nowe indeksy też możesz kierować tam osobno klauzulą TABLESPACE.
  4. Istniejącą tabelę przenieś poleceniem ALTER TABLE archiwum SET TABLESPACE wolny;. Uwaga - ta operacja blokuje tabelę na czas przenoszenia, więc rób ją w oknie serwisowym.
  5. Możesz też przenieść całą bazę na inną przestrzeń jednym poleceniem ALTER DATABASE moja_baza SET TABLESPACE wolny;, ale wymaga to, by do tej bazy nikt nie był podłączony.
  6. Jeśli chcesz, żeby domyślnie nowe obiekty w danej sesji lądowały w wybranej przestrzeni, ustaw parametr SET default_tablespace = 'szybki'; - działa dla obiektów tworzonych bez jawnej klauzuli TABLESPACE.

Jak sprawdzić, że zadziałało

Listę wszystkich przestrzeni tabel wraz z ich lokalizacjami zobaczysz w psql poleceniem \db+. Żeby potwierdzić, w której przestrzeni fizycznie leży dany obiekt, sprawdź katalog systemowy - przydatna jest funkcja pg_tablespace_location(oid), która zwraca ścieżkę dla wskazanej przestrzeni. Po przeniesieniu tabeli warto też zajrzeć na docelowy dysk narzędziem systemowym pokazującym zajętość: miejsce powinno przyrosnąć na nowym wolumenie i zwolnić się na starym. Rozmiar samej przestrzeni tabel policzysz funkcją pg_tablespace_size('nazwa'), co pozwoli monitorować, jak zapełnia się nowy dysk.

Wróć do listy: 100 najczęstszych pytań i problemów z PostgreSQL

Szkolenie Administracja, replikacja i tuning baz danych PostgreSQL

Sprawdź szkolenie: Administracja, replikacja i tuning baz danych PostgreSQL

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

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

Szkolenie Zaawansowana administracja PostgreSQL - HA, DR, monitoring, skalowanie

Sprawdź szkolenie: Zaawansowana administracja PostgreSQL (HA, DR, monitoring, skalowanie)

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

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

Najczęściej zadawane pytania

Jak przenieść część danych PostgreSQL na inny dysk?
Utwórz przestrzeń tabel wskazującą na katalog na docelowym dysku: CREATE TABLESPACE nazwa LOCATION '/sciezka'. Potem kierujesz do niej obiekty - nową tabelę klauzulą TABLESPACE, a istniejącą poleceniem ALTER TABLE tabela SET TABLESPACE nazwa. Baza sama zarządza plikami w nowej lokalizacji.
Czy można ręcznie przenieść pliki bazy w systemie plików?
Nie, to droga do uszkodzenia instancji. PostgreSQL trzyma sztywne powiązania między obiektami a ich plikami i nie zniesie samowolnego przenoszenia na poziomie systemu plików. Do rozłożenia danych na kilka dysków służą właśnie przestrzenie tabel, którymi baza zarządza w kontrolowany sposób.
Tworzenie przestrzeni tabel się nie udaje - jakie są najczęstsze przyczyny?
Najczęściej katalog docelowy nie jest pusty albo nie należy do użytkownika systemowego, pod którym działa serwer bazy. Katalog musi być pusty i być własnością konta postgres. Warto też sprawdzić, czy sam użytkownik systemowy ma prawa zapisu do tej ścieżki na docelowym dysku.
Czy przeniesienie tabeli do innej przestrzeni blokuje ją na czas operacji?
Tak, ALTER TABLE ... SET TABLESPACE bierze blokadę na czas przepisania tabeli, więc rób to w oknie serwisowym. Przeniesienie całej bazy przez ALTER DATABASE wymaga z kolei, by nikt nie był do niej podłączony. Planuj takie operacje poza godzinami największego ruchu.

Komentarze (0)

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

Brak komentarzy...