Re: Rolling my own replication

From: Rob Brown-Bayliss <rob(at)zoism(dot)org>
To: Shanmugasundaram Doraisamy <shan(at)ceedees(dot)com>
Cc: PostgreSQL General List <pgsql-general(at)postgresql(dot)org>, Pypgsql List <pypgsql-users(at)lists(dot)sourceforge(dot)net>
Subject: Re: Rolling my own replication
Date: 2002-07-25 20:14:55
Message-ID: 1027628094.1830.41.camel@everglade.zoism.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Fri, 2002-07-26 at 00:30, Shanmugasundaram Doraisamy wrote:
> Dear Rob,
> Your posting was something simillar to what we were just going to
> start. We have not yet formulated a way of doing it. We will keep you
> posted if we hit upon any solution. Also please do let us know if it
> worked and if you don't mind the final code that worked. Thanks in
> advance,
>
> Yours sincerely,
> Shan.

Teh upload of updated rows workes, but I have only tested it on two
machines over a lan, with 10 or so over a dial up I am expecting timing
issues...

The code is fiarly simple at the moment, and I shall be cleaning it up
soon. But I am still a bit unsure of how it will all work in the field,
and then with more than one slave I am unsure yet how to handle multiple
updates to the same data, or to even check for them at the moment...

basically I have a table in the database listing all tables I need to
sync with the master db, A conection is opend to each database.

I select * from eactable where f_new = True then take the results and
insert them into the master like so (in python):

def send_new():
"Hunts through the tables for new rows to sync with master"
Lcr = DBcon.cursor()
Mcr = MasterDBcon.cursor()
sql = "SELECT * FROM syncro_tables"
if verbose:
print sql
#ask master for tables to update.
Mcr.execute(sql)
tables = Mcr.fetchall()
for i in tables:
if log:
syslog(LOG_INFO,"Scanning table " + i[0] + " for new data.")
sql = "SELECT * from "
sql = sql + i[0]
sql = sql + " WHERE f_new='TRUE'"
if verbose:
print "Scanning table " + i[0] + " for new data."
print sql
Lcr.execute(sql)
for j in range(Lcr.rowcount):
result = Lcr.fetchone()
sql = "INSERT INTO " + i[0] + " VALUES ("
for k in range(len(result)):
if result[k] == None:
sql = sql + "NULL, "
else:
sql = sql + "'" + str(result[k]) + "', "
sql = sql[:-2]
sql = sql + ")"
if verbose:
print sql
try:
Mcr.execute(sql)
except Error, Msg:
msg = "SQL Statement was -> "
msg = msg + sql
if verbose:
print Msg, msg
if log:
syslog(LOG_WARNING, "SQL Error on Master Database")
syslog(LOG_WARNING, str(Msg))
syslog(LOG_WARNING, msg)
MasterDBcon.commit()
#reset new flag
sql = "UPDATE " + i[0] + " SET f_update='RESET' WHERE f_new='FALSE'"
if verbose:
print sql
Lcr.execute(sql)
Lcr.close()
DBcon.commit()
Mcr.close()
MasterDBcon.commit()

def send_update():
"Hunts through the tables for updated rows to sync with master"
Lcr = DBcon.cursor()
Mcr = MasterDBcon.cursor()
sql = "SELECT * FROM syncro_tables"
if verbose:
print sql
#ask master for tables to update.
Mcr.execute(sql)
tables = Mcr.fetchall()
for i in tables:
if log:
syslog(LOG_INFO,"Scanning table " + i[0] + " for updated data.")
sql = "select attname from pg_class,pg_attribute where
(pg_class.relname='" + i[0] +"') and
(pg_class.oid=pg_attribute.attrelid) and (pg_attribute.attnum >= 0)
order by attnum"
Lcr.execute(sql)
columns = Lcr.fetchall()
if verbose:
print "Columns in table " + i[0] +": "
for l in range(len(columns)):
print columns[l]
sql = "SELECT * from "
sql = sql + i[0]
sql = sql + " WHERE f_update='YES' "
if verbose:
print "Scanning table " + i[0] + " for updated data."
print sql
Lcr.execute(sql)
# build update and update master
for j in range(Lcr.rowcount):
result = Lcr.fetchone()
sql = "UPDATE " + i[0] + " SET "
# range from 5 as we dont want to update control fields
for k in range(5,len(result)):
cname = columns[k]
sql = sql + cname[0] + " = "
if result[k] == None:
sql = sql + "NULL, "
else:
sql = sql + "'" + str(result[k]) + "', "
sql = sql[:-2]
sql = sql + " WHERE (sequence_key = '" + str(result[0]) + "') and
(location_key = '" +str(result[1]) + "')"
if verbose:
print sql
try:
Mcr.execute(sql)
except Error, Msg:
msg = "SQL Statement was -> "
msg = msg + sql
if verbose:
print Msg, msg
if log:
syslog(LOG_WARNING, "SQL Error on Master Database")
syslog(LOG_WARNING, str(Msg))
syslog(LOG_WARNING, msg)
MasterDBcon.commit()
#reset new flag
sql = "UPDATE " + i[0] + " SET f_update='RESET' WHERE f_update='YES' "
if verbose:
print sql
Lcr.execute(sql)
Lcr.close()
DBcon.commit()
Mcr.close()
MasterDBcon.commit()

--

*
* Rob Brown-Bayliss
*

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Rob Brown-Bayliss 2002-07-25 20:16:22 Re: Rolling my own replication
Previous Message Robert Treat 2002-07-25 20:12:17 Re: archives dead again?