2009-08-18 53 views
7

Tôi có một quá trình máy chủ postgresql từng chạy trên máy tính để bàn và máy tính xách tay của mình.đồng bộ hóa hai cơ sở dữ liệu pg

Cả hai máy chủ đều có cơ sở dữ liệu được gọi là MG với cùng một sơ đồ/bố cục chính xác. Bây giờ tôi nhập dữ liệu vào các bảng tương tự nhưng vào các thời điểm khác nhau.

Tôi thường giữ riêng các khóa chính sao cho chúng không xung đột với nhau. ví dụ: oddnumber pkey cho máy tính xách tay và số chẵn cho máy tính để bàn.

Làm cách nào để đồng bộ hóa dữ liệu giữa máy tính để bàn và máy tính xách tay một cách sạch sẽ?

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

BÀN sử dụng pkeys như 1001 ... cho chèn
LAP sử dụng pkeys như năm 2001 ... cho chèn

tôi cần cả hai bản cập nhật cho các hồ sơ sửa đổi và chèn cho kỷ lục mới. Nhưng bằng cách nào?

Trả lời

4

Có vẻ như rubyrep sẽ phù hợp với bạn.

+1

là có bất kỳ lựa chọn nào khác? – yjfuk

+0

@yjfuk: và vấn đề với rubyrep là gì? –

+1

'rubyrep' có vẻ khá lỗi thời. Nó không có vẻ là rất mạnh mẽ: Tôi không thể làm cho nó đồng bộ giữa hai cơ sở dữ liệu một cách dễ dàng. Xem http://stackoverflow.com/questions/13941430/rubyrep-with-postgres-pgerror-connection-is-closed-when-trying-to-scan – fatuhoku

1

Cách đơn giản nhất là viết tập lệnh/chương trình tùy chỉnh. Nó không phải là khó khăn, và chắc chắn bạn sẽ biết và hiểu nó hoạt động như thế nào, vì vậy mở rộng nó sẽ là tầm thường.

+0

bạn sẽ cho tôi một số nguyên tắc về cách hoạt động? – yjfuk

+0

Vâng, nó sẽ hoạt động theo cách bạn sẽ viết nó. Nói chung tất cả mọi thứ phụ thuộc vào những gì các ứng dụng của bạn làm với cơ sở dữ liệu. Cách tiếp cận đơn giản: kiểm tra id mới nhất được sao chép sang cơ sở dữ liệu khác và sao chép tất cả các cơ sở dữ liệu mới. –

+0

và dữ liệu đã sửa đổi là gì? tôi không thể tìm ra cách để đồng bộ hóa nó theo cách tiếp cận đơn giản – sacabuche

2

Sử dụng Slony-I để làm đồng bộ hóa PostgreSQL.

+0

Slony-I không hỗ trợ sao chép đa chủ, vì vậy nó sẽ không hoạt động ở đây. – Tometzky

0

Để thêm vào câu trả lời của user80168, đây là một bảng sáp nhập tiềm năng:

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

} 
Các vấn đề liên quan