2009-08-18 13 views
7

Mam proces serwera PostgreSQL każdego uruchomiony w moim pulpit i laptopa.zsynchronizować dwie bazy danych pg

Oba serwery mają bazę danych o nazwie MG z dokładnie tym samym schematem/układem. Teraz wprowadzam dane do podobnych tabel, ale w różnym czasie.

Ogólnie klucze główne przechowuję oddzielnie, aby nie kolidowały ze sobą. np.: klucz nieparzysty na laptopa, a nawet numer na pulpicie.

Jak mogę teraz zsynchronizować dane między komputerem stacjonarnym a laptopem?

DESK:ADDRESS ----- LAP:ADDRESS 
DESK:TO_DO ----- LAP:TO_DO 

DESK wykorzystuje pkeys jak 1001 ... dla wkładek
LAP wykorzystuje pkeys jak 2001 ... dla wkładek

muszę zarówno aktualizacji dla zmodyfikowanych zapisów i wstawić nowych rekordów. Ale jak?

Odpowiedz

4

Wygląda na to, że rubyrep będzie działać dla Ciebie.

+1

jest jakiś inny wybór? – yjfuk

+0

@yjfuk: a jaki jest problem z rubyrep? –

+1

'rubyrep' wydaje się być dość przestarzały. Wygląda na to, że nie jest bardzo solidny: nie mogę łatwo zsynchronizować dwóch baz danych. Zobacz http://stackoverflow.com/questions/13941430/rubyrep-with-postgres-pgerror-connection-is-closed-when-trying-to-scan – fatuhoku

1

Najprostszym sposobem byłoby napisanie niestandardowego skryptu/programu. Nie jest to trudne, a na pewno będziesz wiedział i rozumiesz, jak to działa, więc rozszerzenie to będzie banalne.

+0

czy dałbyś mi jakąś zasadę, jak to działa? – yjfuk

+0

To zadziała tak, jak to napiszesz. Ogólnie wszystko zależy od tego, co aplikacje robią z bazą danych. Uproszczone podejście: sprawdź najnowszy identyfikator replikowany do innej bazy danych i skopiuj wszystkie nowe. –

+0

i co z modyfikowanymi danymi? nie mogę wymyślić, jak zsynchronizować to w uproszczonym podejściu – sacabuche

2

Korzystając Slony-I zrobić synchronizację PostgreSQL.

+0

Slony-I nie obsługuje replikacji multi-master, więc nie będzie tu działać. – Tometzky

0

Aby dodać odpowiedź user80168, oto jest potencjalnym stół fuzja:

package merge.tables; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class PostgreTableMerger { 

    private static String dbOrigin = "jdbc:postgresql://server1:5432/DB"; 
    private static String dbDest = "jdbc:postgresql://server2:5432/DB"; 
    private static String tableToMerge = "important_results"; 

    public static void main(String[] args) throws Exception { 

     Connection dbConnOrigin = DriverManager.getConnection(dbOrigin, "pgadmin", "pgadmin"); 
     Statement dbOriginStat = dbConnOrigin.createStatement(); 

     Connection dbConnDest = DriverManager.getConnection(dbDest, "pgadmin", "pgadmin"); 
     Statement dbDestStat = dbConnDest.createStatement(); 

     String sqlToExecute = "SELECT * FROM " + tableToMerge; 
     ResultSet assets = dbOriginStat.executeQuery(sqlToExecute); 
     ResultSetMetaData rsMeta = assets.getMetaData(); 


     while(assets.next()){ 
      String insertSQL = "INSERT INTO " + tableToMerge + " VALUES("; 

      for(int i = 1; i <= rsMeta.getColumnCount(); i++){ 
       String value = assets.getString(i); 
       if(assets.wasNull()){ 
        insertSQL += "NULL,"; 
       }else{ 
        insertSQL += "'" + value + "',"; 
       }    
      } 
      insertSQL =insertSQL.substring(0, insertSQL.length()-1) + ")"; 

      try{ 
       dbDestStat.executeUpdate(insertSQL); 
      }catch(SQLException e){ 
       //TODO: attempt to update the row in the event of duplicate key 
      } 


     } 
     return; 
    } 

} 
Powiązane problemy