2009-08-18 292 views
7

我有一个postgresql服务器进程,每个在我的桌面和笔记本电脑上运行。同步两个数据库

两台服务器都有一个名为MG的数据库,其方案和布局完全相同。现在我将数据输入到类似的表格中,但在不同的时间。

我通常保持主键分开,以便它们不会相互冲突。例如:用于笔记本电脑的oddnumber pkey和用于桌面的偶数号码。

现在我该如何清洁地同步台式机和笔记本电脑之间的数据?

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

DESK使用pkeys像1001 ...对于插入
LAP使用pkeys像2001年......对于插入

我同时需要更新修改记录,插入新记录。但是如何?

回答

4

它看起来像rubyrep会为你工作。

+1

还有没有其他的选择吗? – yjfuk 2009-08-18 08:28:32

+0

@yjfuk:和rubyrep有什么问题? – 2009-08-18 10:06:18

+1

'rubyrep'现在似乎已经过时了。它似乎不是非常强大:我无法轻松地在两个数据库之间进行同步。请参阅http://stackoverflow.com/questions/13941430/rubyrep-with-postgres-pgerror-connection-is-closed-when-trying-to-scan – fatuhoku 2013-02-01 11:35:37

1

最简单的方法是编写一个自定义脚本/程序。这并不难,而且你肯定会知道并理解它是如何工作的,所以扩展它将是微不足道的。

+0

你会给我一些原理如何工作? – yjfuk 2009-08-19 08:42:54

+0

那么,它会按照你写它的方式工作。一般来说,一切都取决于应用程序对数据库的处理。简单的方法:检查最新的id复制到另一个数据库,并复制所有新的数据库。 – 2009-08-19 10:30:44

+0

以及修改后的数据呢?我无法弄清楚如何以简单的方法同步它 – sacabuche 2011-05-13 17:20:36

2

使用Slony-I做PostgreSQL的同步。

+0

Slony-I不支持多主复制,所以它在这里不起作用。 – Tometzky 2009-08-20 13:06:06

0

为了增加user80168的答案,这里是一个潜在的合并表:

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; 
    } 

}