Reputation: 1445
I have a postgresql server process each running in my desktop and the laptop.
Both servers have a database called MG with exactly same scheme/layout. Now I enter the data in to similar tables but at differing times.
I generally keep the primary keys separate so that they don't clash with each other. eg: oddnumber pkey for laptop and even number for desktop.
Now how do I synchronize the data between the desktop and laptop cleanly?
DESK:ADDRESS ----- LAP:ADDRESS
DESK:TO_DO ----- LAP:TO_DO
DESK uses pkeys like 1001... for inserts
LAP uses pkeys like 2001... for inserts
I need both update for the modified records and insert for new records. But how?
Upvotes: 11
Views: 27713
Reputation: 4237
To add to user80168's answer, here is a potential table merger:
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;
}
}
Upvotes: 0
Reputation: 7259
Please refer to PostgreSQL documentation for High Availability, Load Balancing, and Replication
Upvotes: 0
Reputation:
The simplest way would be to write a custom script/program. It's not difficult, and definitely you will know and understand how it works, so extending it will be trivial.
Upvotes: 1