2013-05-21 14 views
36

Już od jakiegoś czasu uruchamiamy PostgreSQL 8.4. Podobnie jak w przypadku każdej bazy danych, powoli osiągamy nasz próg dla przestrzeni. I dodaje inny dysk 8 GB EBS i zamontowany do naszego przykładu i skonfigurować go poprawnie działać na katalogu o nazwie/plikiJak przenieść dane postgreSQL do innego katalogu na Ubuntu przez Amazon EC2?

ciągu/plików, ręcznie utworzonego

Popraw mnie jeśli się mylę, ale wierzę, że wszystkie dane postgresql są przechowywane w /var/lib/postgresql/8.4/main

Zarchiwizowałem bazę danych i uruchomiłem sudo /etc/init.d/postgresql stop. To zatrzymuje serwer postgresql. Próbowałem skopiować i wkleić zawartość /var/lib/postgresql/8.4/main do katalogu/files, ale okazało się, że to OGROMNA MESS! ze względu na uprawnienia do plików. Musiałem wejść i skopiować zawartość tego folderu, aby móc je skopiować i wkleić. Niektóre pliki nie zostały w pełni skopiowane z powodu uprawnień root'a. I zmodyfikowany parametr data_directory w postgresql.conf pkt do katalogu plików

data_directory = '/files/postgresql/main' 

i pobiegłem sudo /etc/init.d/postgresql restart i serwer nie powiodło się. Ponownie prawdopodobnie z powodu problemów z uprawnieniami. Amazon EC2 umożliwia domyślnie dostęp do usługi jako ubuntu. Możesz uzyskać dostęp tylko root z terminala, co sprawia, że ​​wszystko jest o wiele bardziej skomplikowane.

Czy jest to o wiele czystszy i wydajniejszy krok po kroku?

Odpowiedz

74

Zatrzymaj serwer.

Skopiuj datadir z zachowaniem uprawnień - użyj cp -aRv.

Następnie (najłatwiej, ponieważ nie trzeba modyfikować skryptów startowych) po prostu przenieś stary datadir na bok i dobierz symboliczną ścieżkę do nowej lokalizacji.

+2

Witam, czy możesz wyjaśnić, co masz na myśli przez "odsuń stary datadir"? masz na myśli, po prostu usunąć lub skopiować go do jakiegoś folderu kopii zapasowej? i: jaki katalog danych masz na myśli? cały folder zwracany przez 'show data_directory;'? –

+0

Zmień nazwę, aby nie stracić niczego, jeśli okaże się, że było to ważne. –

+0

Pomysły symlinków nie są złe, ale nie są idealne, ponieważ wymagają utrzymywania starego miejsca na dane. – yglodt

1

Wyjaśnienie. To właśnie AMI, którego użyłeś, ustawia Ubuntu na domyślnego użytkownika, może to nie dotyczyć innych AMI.

W istocie, jeśli próbujesz przenieść dane ręcznie, prawdopodobnie będziesz musiał to zrobić jako użytkownik root, a następnie upewnić się, że jest dostępny dla dowolnego użytkownika postgrena.

Istnieje również opcja zrzutu obrazu woluminu i zwiększenia rozmiaru woluminu utworzonego z migawki. Następnie możesz zamienić wolumin na instancję na nowy wolumin (prawdopodobnie będziesz musiał zmienić rozmiar partycji, aby wykorzystać całą przestrzeń).

12

Dzięki za zaakceptowaną odpowiedź. Zamiast dowiązania symbolicznego można również użyć numeru bind mount. W ten sposób jest niezależny od systemu plików. Jeśli chcesz użyć dedykowanego dysku twardego dla bazy danych, możesz również mount it normally. do katalogu danych.

Zrobiłem to drugie. Oto moje kroki, jeśli ktoś potrzebuje referencji. Uruchomiłem to jako skrypt w wielu instancjach AWS.

# stop postgres server 
sudo service postgresql stop 

# create new filesystem in empty hard drive 
sudo mkfs.ext4 /dev/xvdb 

# mount it 
mkdir /tmp/pg 
sudo mount /dev/xvdb /tmp/pg/ 

# copy the entire postgres home dir content 
sudo cp -a /var/lib/postgresql/. /tmp/pg 

# mount it to the correct directory 
sudo umount /tmp/pg 
sudo mount /dev/xvdb /var/lib/postgresql/ 

# see if it is mounted 
mount | grep postgres 

# add the mount point to fstab 
echo "/dev/xvdb /var/lib/postgresql ext4 rw 0 0" | sudo tee -a /etc/fstab 

# when database is in use, observe that the correct disk is being used 
watch -d grep xvd /proc/diskstats 
+0

Działa jak czar, dzięki :) –