Attached is a patch that provides *VERY* limited support for multiple slave 
servers.  I haven't tested it very well, so use at your own risk (and I 
recommend against using it in production).

Basically, I have a central database server that has 4 summary tables inside 
it replicated to a remote slave (these database tables are for my mail server 
authentication, so these are replicated to another server tuned for many 
connections, and so I don't have postgres connections opened straight to my 
back-end database server).

Unfortunately, I also wanted to implement a replication database server for 
hot-backups.  I realized, too late, that the replication process is pretty 
greedy and will try to replicate all tables marked as a "MasterAddTable".

To make a long story, I made a patch to RServ.pm and Replicate that allows you 
to specify, on the command line, a list of tables that you want to 
replicate...it'll ignore all others.

I haven't finished, since this has to be integrated with CleanLog for 
instance, but this should (and does) suffice for the moment.

I have yet to test it with two slaves, but at least my mail server replication 
database now works (it was failing every time it tried to replicate, for a 
variety of reasons).

Anyone have any suggestions on how to improve on this?  (or, if someone more 
familiar with this code wants to take the ball and run with it, you're 
welcome to).

-- 
Michael A Nachbaur <[EMAIL PROTECTED]>
diff -pur rserv/Replicate rserv-new/Replicate
--- rserv/Replicate	2003-06-19 19:15:09.000000000 -0700
+++ rserv-new/Replicate	2003-06-19 19:14:23.000000000 -0700
@@ -32,6 +32,7 @@ if (defined($opt_help) || (scalar(@ARGV)
 
 my $master = $ARGV[0] || "master";
 my $slave = $ARGV[1] || "slave";
+my $tables = $#ARGV < 2 ? undef : { map {($_, undef)} @ARGV[2..$#ARGV] };
 my $server = 0;
 
 my $minfo = "dbname=$master";
@@ -56,7 +57,7 @@ SyncSync($mconn, $sconn);
 my $outf = new IO::File;
 open $outf, ">$snapshot";
 print "\n>>>>>>>>>>>>> Prepare Snapshot\n\n" if ($verbose);
-$res = PrepareSnapshot($mconn, $outf, $server);
+$res = PrepareSnapshot($mconn, $outf, $server, $tables);
 close $outf;
 die "\n>>>>>>>>>>>>> ERROR\n" if $res < 0;
 if ($res == 0)
@@ -68,7 +69,7 @@ if ($res == 0)
 my $inpf = new IO::File;
 open $inpf, "<$snapshot";
 print "\n>>>>>>>>>>>>> Apply Snapshot\n\n" if ($verbose);
-$res = ApplySnapshot($sconn, $inpf);
+$res = ApplySnapshot($sconn, $inpf, $tables);
 close $inpf;
 die "\n>>>>>>>>>>>>> ERROR\n" if $res < 0;
 
diff -pur rserv/RServ.pm rserv-new/RServ.pm
--- rserv/RServ.pm	2003-06-19 19:14:59.000000000 -0700
+++ rserv-new/RServ.pm	2003-06-19 19:34:47.000000000 -0700
@@ -19,7 +19,7 @@ my %Stables = ();
 
 sub PrepareSnapshot
 {
-	my ($conn, $outf, $server) = @_; # (@_[0], @_[1], @_[2]);
+	my ($conn, $outf, $server, $onlytables) = @_; # (@_[0], @_[1], @_[2]);
 
 	my $result = $conn->exec("BEGIN");
 	if ($result->resultStatus ne PGRES_COMMAND_OK)
@@ -52,6 +52,10 @@ sub PrepareSnapshot
 	while (@row = $result->fetchrow)
 	{
 	#	printf "$row[0], $row[1], $row[2]\n";
+		if (ref($onlytables) eq 'HASH') {
+			next unless (exists $onlytables->{$row[1]});
+			$onlytables->{$row[1]} = $row[0] unless ($onlytables->{$row[1]});
+		}
 		push @{$Mtables{$row[0]}}, $row[1], $row[2];
 	}
 
@@ -232,7 +236,7 @@ sub GetSYNCID
 
 sub CleanLog
 {
-	my ($conn, $howold) = @_; # (@_[0], @_[1]);
+	my ($conn, $howold, $onlytables) = @_; # (@_[0], @_[1]);
 
 	my $result = $conn->exec("BEGIN");
 	if ($result->resultStatus ne PGRES_COMMAND_OK)
@@ -274,6 +278,11 @@ sub CleanLog
 	my $alist = join(',', keys %active);
 	my $sinfo = "logid < $maxid";
 	$sinfo .= " and logid not in ($alist)" if $alist ne '';
+	#if (ref($onlytables) eq 'HASH') {
+	#	foreach my $onlytable (keys %{$onlytables}) {
+	#		$sinfo
+	#	}
+	#}
 	
 	$sql = "delete from _RSERV_LOG_ where " . 
 		"logtime < now() - '$howold second'::interval and $sinfo";
@@ -302,7 +311,7 @@ sub CleanLog
 
 sub ApplySnapshot
 {
-	my ($conn, $inpf) = @_; # (@_[0], @_[1]);
+	my ($conn, $inpf, $onlytables) = @_; # (@_[0], @_[1]);
 
 	my $result = $conn->exec("BEGIN");
 	if ($result->resultStatus ne PGRES_COMMAND_OK)
@@ -336,6 +345,10 @@ sub ApplySnapshot
 	while (@row = $result->fetchrow)
 	{
 	#	printf "	%s	%s\n", $row[1], $row[0];
+		if (ref($onlytables) eq 'HASH') {
+			next unless (exists $onlytables->{$row[1]});
+			$onlytables->{$row[1]} = $row[0] unless ($onlytables->{$row[1]});
+		}
 		push @{$Stables{$row[1]}}, $row[0], $row[2], $row[3];
 	}
 
Only in rserv-new: RServ.pm~
Only in rserv-new: .RServ.pm.swp
---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faqs/FAQ.html

Reply via email to