it-swarm.com.de

Wie kann ich postgresql-Daten über Amazon EC2 in ein anderes Ubuntu-Verzeichnis verschieben?

Wir haben seit einiger Zeit postgresql 8.4 ausgeführt. Wie bei jeder Datenbank erreichen wir langsam unsere Raumschwelle. Ich habe ein weiteres EBS-Laufwerk mit 8 GB hinzugefügt, es in unsere Instanz eingebunden und so konfiguriert, dass es in einem Verzeichnis mit dem Namen/files ordnungsgemäß funktioniert

Innerhalb von/files habe ich manuell erstellt

Korrigieren Sie mich, wenn ich falsch liege, aber ich glaube, dass alle postgresql-Daten in /var/lib/postgresql/8.4/main gespeichert sind

Ich habe die Datenbank gesichert und Sudo /etc/init.d/postgresql stop ausgeführt. Dies stoppt den postgresql-Server. Ich habe versucht, den Inhalt von /var/lib/postgresql/8.4/main in das Verzeichnis/files zu kopieren und einzufügen, aber das stellte sich als RIESIGE NACHRICHT heraus! aufgrund von Dateiberechtigungen. Ich musste hineingehen und den Inhalt dieses Ordners modifizieren, damit ich sie kopieren und einfügen konnte. Einige Dateien wurden aufgrund von Root-Berechtigungen nicht vollständig kopiert. Ich habe den Parameter data_directory in postgresql.conf so geändert, dass er auf das Dateiverzeichnis verweist

 data_directory = '/files/postgresql/main'

ich ließ Sudo /etc/init.d/postgresql neu starten und der Server konnte nicht gestartet werden. Wieder wahrscheinlich aufgrund von Berechtigungsproblemen. Mit Amazon EC2 können Sie standardmäßig nur als Ubuntu auf den Dienst zugreifen. Sie können nur über das Terminal auf root zugreifen, was alles sehr viel komplizierter macht.

Gibt es eine viel sauberere und effizientere Methode, dies Schritt für Schritt zu tun?

36
noahandthewhale

Stoppen Sie den Server.

Kopieren Sie den Datadir unter Beibehaltung der Berechtigungen - verwenden Sie cp -aRv.

Verschieben Sie dann (am einfachsten, da keine Initskripte geändert werden müssen) den alten Datadir beiseite und verknüpfen Sie den alten Pfad mit dem neuen Speicherort.

77
Craig Ringer

Danke für die akzeptierte Antwort. Anstelle des Symlinks können Sie auch ein bind mount verwenden. Auf diese Weise ist es unabhängig vom Dateisystem. Wenn Sie eine dedizierte Festplatte für die Datenbank verwenden möchten, können Sie auch diese normal einhängen . in das Datenverzeichnis.

Letzteres habe ich getan. Hier sind meine Schritte, wenn jemand eine Referenz benötigt. Ich habe dies auf vielen AWS-Instanzen als Skript ausgeführt.

# 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
13

Eine Klarstellung. Es ist die bestimmte AMI, die Sie verwendet haben, die Ubuntu als Standardbenutzer festlegt. Dies gilt möglicherweise nicht für andere AMIs.

Wenn Sie im Wesentlichen versuchen, Daten manuell zu verschieben, müssen Sie dies wahrscheinlich als Root-Benutzer tun und dann sicherstellen, dass es für alle Benutzer verfügbar ist, mit denen postgres ausgeführt wird.

Sie haben auch die Möglichkeit, einen Snapshot des Volumes zu erstellen und das aus dem Snapshot erstellte Volume zu vergrößern. Dann können Sie das Volume auf Ihrer Instanz durch das neue Volume ersetzen (Sie müssen wahrscheinlich die Größe der Partition ändern, um den gesamten Speicherplatz zu nutzen).

1
datasage