【问题标题】:synchronize two pg databases同步两个pg数据库
【发布时间】:2010-11-20 11:55:54
【问题描述】:

我有一个 postgresql 服务器进程,每个进程都在我的台式机和笔记本电脑上运行。

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

我通常将主键分开,以免它们相互冲突。例如:笔记本电脑的奇数 pkey 和台式机的偶数。

现在如何干净利落地同步台式机和笔记本之间的数据?

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

DESK 使用 1001... 之类的 pkey 进行插入
LAP 使用 2001... 之类的 pkey 进行插入

我需要更新已修改记录和插入新记录。但是怎么做呢?

【问题讨论】:

    标签: postgresql replication


    【解决方案1】:

    要添加到 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;
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      使用Slony-I做postgreSQL同步。

      【讨论】:

      • Slony-I 不支持多主复制,所以在这里不起作用。
      【解决方案3】:

      请参阅 PostgreSQL 文档以获取 High Availability, Load Balancing, and Replication

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 嗯,它会按照你写的方式工作。通常,一切都取决于您的应用程序对数据库的操作。简单的方法:检查复制到另一个数据库的最新 id,并复制所有新的。
        • 那么修改后的数据呢?我不知道如何以简单的方式同步它
        • 将触发器设置的“最后修改”时间戳添加到“now()”,就完成了。现在不再比较 id,而是比较最大的 last_modified
        【解决方案5】:

        看起来rubyrep 适合你。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        相关资源
        最近更新 更多