2009-11-26 7 views
1

J'ai besoin de synchroniser deux bases de données PostgreSQL (certaines tables de développement db vers la production db) parfois.PostgreSQL, mise à jour des lignes existantes avec pg_restore

Alors je suis venu avec ce script:

[...] 
pg_dump -a -F tar -t table1 -t table2 -U user1 dbname1 | \ 
pg_restore -a -U user2 -d dbname2 
[...] 

Le problème est que cela fonctionne juste pour les nouvelles lignes ajoutées. Lorsque je modifie une colonne non PK, j'obtiens une erreur de contrainte et la ligne n'est pas mise à jour. Pour chaque ligne vidée, j'ai besoin de vérifier si elle existe dans la base de données de destination (par PK) et si c'est le cas, supprimez-la avant INSERT/COPY.

Merci pour les conseils.

Répondre

1

Pour ce faire:

pg_dump -t table1 production_database > /tmp/old_production_database_table1.sql 
pg_dump -t table1 devel_database > /tmp/devel_database_table1.sql 
psql production_database 
truncate table1 
\i /tmp/devel_database_table1.sql 
\i /tmp/old_production_database_table1.sql 

Vous obtiendrez beaucoup d'erreurs de clé primaire en double sur la deuxième \i, mais il va faire ce que vous voulez: toutes les lignes de devel seront mis à jour, toutes les lignes non Devel ne sera pas mis à jour ni supprimé.

Si vous avez des références à table1, vous devrez les supprimer avant de les recréer après l'importation. Vérifiez en particulier on delete cascade, set null ou set default références à table1 - vous perdriez des données dans d'autres tables si vous en avez.

+0

Merci, c'est tout. Cependant, je devrai sauvegarder de nombreuses 'tables de jointure '(avec des FK' en cas de suppression'), mais cela ne devrait pas poser de problème. – woky

+0

Ne pas sauvegarder les tables jointes - supprimez simplement tous les FK de cette table. Sinon, vous devrez sauvegarder les tables de référencement, les tables référençant celles-ci, et ainsi de suite. Très facile de rater quelque chose d'important. Je recommande vraiment de convertir tous les FK en "supprimer aucune action" ou "supprimer supprimer". – Tometzky

Questions connexes