Comment puis-je transférer des données postgresql dans un autre répertoire D'Ubuntu sur Amazon EC2?

nous exécutons postgresql 8.4 depuis un certain temps. Comme pour toute base de données, nous atteignons lentement notre seuil pour l'espace. J'ai ajouté un autre lecteur EBS de 8 Go et je l'ai monté sur notre instance et je l'ai configuré pour fonctionner correctement sur un répertoire appelé / files

dans / files, j'ai créé manuellement

corrigez - moi si je me trompe, mais je crois que toutes les données postgresql sont stockées dans/var/lib/postgresql/8.4 / main

j'ai fait marche arrière la base de données et j'ai couru sudo /etc/init.d/postgresql arrêter. Ceci arrête le serveur postgresql. J'ai essayé de copier et coller le contenu de /var/lib/postgresql/8.4/main dans le répertoire /files, mais cela s'est avéré être un énorme gâchis! en raison des autorisations de fichier. J'ai dû entrer et coller le contenu de ce dossier juste pour pouvoir le copier et le coller. Certains fichiers n'ont pas été entièrement copiés à cause des permissions de root. J'ai modifié le paramètre data_directory dans postgresql.conf pour pointer vers le répertoire des fichiers de

 data_directory = '/files/postgresql/main'

et j'ai couru sudo /etc/init.d / postgresql redémarre et le serveur ne démarre pas. Encore probablement à cause de problèmes de permission. Amazon EC2 vous permet seulement d'accéder au service en tant qu'ubuntu par défaut. Vous ne pouvez accéder à la racine de l'intérieur du terminal qui rend tout beaucoup plus compliqué.

Est-il beaucoup plus propre et plus efficace, étape par étape la façon de le faire?

36
demandé sur noahandthewhale 2013-05-22 00:24:15

3 réponses

arrêtez le serveur.

Copiez le datadir tout en conservant les permissions - utilisez cp -aRv .

puis (plus facile, car il évite la nécessité de modifier initscripts) il suffit de déplacer l'ancien datadir de côté et de symlink l'ancien chemin vers le nouvel emplacement.

74
répondu Craig Ringer 2014-01-13 00:47:06

Merci pour la réponse acceptée. Au lieu du lien symbolique, vous pouvez également utiliser un bind mount . De cette façon, il est indépendant du système de fichiers. Si vous voulez utiliser un disque dur dédié pour la base de données, vous pouvez aussi le monter normalement . le répertoire de données.

j'ai fait le dernier. Voici mes étapes si quelqu'un a besoin d'une référence. J'ai lancé ceci comme un script sur de nombreuses instances 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
13
répondu Kenyakorn Ketsombut 2017-04-13 12:36:24

Une clarification. C'est L'AMI particulier que vous avez utilisé qui définit ubuntu comme l'utilisateur par défaut, cela peut ne pas s'appliquer à D'autres AMIs.

en essence si vous essayez de déplacer des données manuellement, vous aurez probablement besoin de le faire en tant qu'utilisateur root, et ensuite s'assurer qu'il est disponible pour n'importe quel utilisateur postgres est en cours d'exécution avec.

vous avez également l'option de snapshot le volume et l'augmentation de la taille du volume a créé à partir de l'instantané. Vous pouvez alors remplacer le volume sur votre instance par le nouveau volume (vous devrez probablement redimensionner la partition pour profiter de tout l'espace).

1
répondu datasage 2013-05-21 21:12:34