web-dev-qa-db-fra.com

Comment déplacer des données postgresql vers un autre répertoire sur Ubuntu via Amazon EC2?

Nous utilisons postgresql 8.4 depuis un certain temps. Comme pour toute base de données, nous atteignons lentement notre seuil d'espace. J'ai ajouté un autre lecteur EBS de 8 Go et l'ai monté sur notre instance et 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 sauvegardé la base de données et j'ai exécuté l'arrêt Sudo /etc/init.d/postgresql. Cela 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 message! en raison des autorisations de fichier. J'ai dû entrer et chmod le contenu de ce dossier juste pour que je puisse les copier et les coller. Certains fichiers n'ont pas été copiés complètement en raison des autorisations root. J'ai modifié le paramètre data_directory dans postgresql.conf pour pointer vers le répertoire des fichiers

 data_directory = '/files/postgresql/main'

et j'ai exécuté Sudo /etc/init.d/postgresql restart et le serveur n'a pas pu démarrer. Encore une fois probablement en raison de problèmes d'autorisation. Amazon EC2 vous permet uniquement d'accéder au service en tant qu'ubuntu par défaut. Vous ne pouvez accéder à root qu'à partir du terminal, ce qui rend tout beaucoup plus compliqué.

Existe-t-il une méthode étape par étape beaucoup plus propre et plus efficace?

36
noahandthewhale

Arrêtez le serveur.

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

Ensuite (le plus simple, car cela évite d'avoir à modifier les scripts), déplacez simplement l'ancien datadir de côté et créez un lien symbolique entre l'ancien chemin et le nouvel emplacement.

77
Craig Ringer

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 souhaitez utiliser un disque dur dédié pour la base de données, vous pouvez également le monter normalement . dans le répertoire de données.

J'ai fait ce dernier. Voici mes étapes si quelqu'un a besoin d'une référence. J'ai exécuté cela en tant que 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
Kenyakorn Ketsombut

Une clarification. C'est l'AMI particulière que vous avez utilisée qui définit Ubuntu comme utilisateur par défaut, cela peut ne pas s'appliquer aux autres AMI.

En gros, si vous essayez de déplacer des données manuellement, vous devrez probablement le faire en tant qu'utilisateur root, puis vous assurer qu'elles sont disponibles pour tous les utilisateurs avec lesquels postgres s'exécute.

Vous avez également la possibilité de créer un instantané du volume et d'augmenter la taille d'un volume créé à partir de l'instantané. Ensuite, vous pouvez remplacer le volume de votre instance par le nouveau volume (vous devrez probablement redimensionner la partition pour profiter de tout l'espace).

1
datasage