BEGIN;
-SET autocommit TO 'on';
CREATE FUNCTION "recordchange" () RETURNS trigger AS
'$libdir/pending.so', 'recordchange' LANGUAGE 'C';
PRIMARY KEY (SeqId)
);
-CREATE INDEX "dbmirror_Pending_XID_Index" ON dbmirror_Pending (XID);
+CREATE INDEX dbmirror_Pending_XID_Index ON dbmirror_Pending (XID);
CREATE TABLE dbmirror_PendingData (
SeqId int4 NOT NULL,
UPDATE pg_proc SET proname='nextval_pg' WHERE proname='nextval';
CREATE FUNCTION pg_catalog.nextval(text) RETURNS int8 AS
-'/usr/local/postgresql-7.4/lib/pending.so', 'nextval' LANGUAGE 'C' STRICT;
+'$libdir/pending.so', 'nextval' LANGUAGE 'C' STRICT;
UPDATE pg_proc set proname='setval_pg' WHERE proname='setval';
-CREATE FUNCTION pg_catalog.setval(text,int4) RETURNS int8 AS
-'/usr/local/postgresql-7.4/lib/pending.so', 'setval' LANGUAGE 'C' STRICT;
+CREATE FUNCTION pg_catalog.setval("unknown",integer,boolean) RETURNS int8 AS
+'$libdir/pending.so', 'setval' LANGUAGE 'C' STRICT;
+CREATE FUNCTION pg_catalog.setval("unknown",integer) RETURNS int8 AS
+'$libdir/pending.so', 'setval' LANGUAGE 'C' STRICT;
-COMMIT;
\ No newline at end of file
+COMMIT;
-PgPerl (http://gborg.postgresql.org/project/pgperl/projdisplay.php)
+Upgrading from versions prior to 8.0
+---------------------------------------
+Users upgrading from a version of dbmirror prior to the one shipped with
+Postgresql 8.0 will need to perform the following steps
+
+1. Dump the database then drop it (dropdb no not use the -C option)
+2. Create database with createdb.
+3. Run psql databasename -f MirrorSetup.sql
+4. Restore the database(do not use the -C option of pg_dump/pg_restore)
+5. run the SQL commands: DROP "Pending";DROP "PendingData"; DROP "MirrorHost";
+ DROP "MirroredTransaction";
+
+The above steps are needed A) Because the names of the tables used by dbmirror
+to store data have changed and B) In order for sequences to be mirrored properly
+all serial types must be recreated.
+
+
+
Installation Instructions
------------------------------------------------------------------------
+
1) Compile pending.c
The file pending.c contains the recordchange trigger. This runs every
# GNU General Public License for more details.
#
##############################################################################
-# $PostgreSQL: pgsql/contrib/dbmirror/clean_pending.pl,v 1.4 2003/11/29 22:39:19 pgsql Exp $
+# $PostgreSQL: pgsql/contrib/dbmirror/clean_pending.pl,v 1.5 2004/09/10 04:31:06 neilc Exp $
##############################################################################
#delete all transactions that have been sent to all mirrorhosts
#or delete everything if no mirror hosts are defined.
-# Postgres takes the "SELECT COUNT(*) FROM "MirrorHost" and makes it into
+# Postgres takes the "SELECT COUNT(*) FROM dbmirror_MirrorHost and makes it into
# an InitPlan. EXPLAIN show's this.
-my $deletePendingQuery = 'DELETE FROM "Pending" WHERE (SELECT ';
-$deletePendingQuery .= ' COUNT(*) FROM "MirroredTransaction" WHERE ';
-$deletePendingQuery .= ' "XID"="Pending"."XID") = (SELECT COUNT(*) FROM ';
-$deletePendingQuery .= ' "MirrorHost") OR (SELECT COUNT(*) FROM ';
-$deletePendingQuery .= ' "MirrorHost") = 0';
+my $deletePendingQuery = 'DELETE FROM dbmirror_Pending WHERE (SELECT ';
+$deletePendingQuery .= ' COUNT(*) FROM dbmirror_MirroredTransaction WHERE ';
+$deletePendingQuery .= ' XID=dbmirror_Pending.XID) = (SELECT COUNT(*) FROM ';
+$deletePendingQuery .= ' dbmirror_MirrorHost) OR (SELECT COUNT(*) FROM ';
+$deletePendingQuery .= ' dbmirror_MirrorHost) = 0';
my $result = $dbConn->exec($deletePendingQuery);
unless ($result->resultStatus == PGRES_COMMAND_OK ) {
die;
}
$dbConn->exec("COMMIT");
-$result = $dbConn->exec('VACUUM "Pending"');
+$result = $dbConn->exec('VACUUM dbmirror_Pending');
unless ($result->resultStatus == PGRES_COMMAND_OK) {
printf($dbConn->errorMessage);
}
-$result = $dbConn->exec('VACUUM "PendingData"');
+$result = $dbConn->exec('VACUUM dbmirror_PendingData');
unless($result->resultStatus == PGRES_COMMAND_OK) {
printf($dbConn->errorMessage);
}
-$result = $dbConn->exec('VACUUM "MirroredTransaction"');
+$result = $dbConn->exec('VACUUM dbmirror_MirroredTransaction');
unless($result->resultStatus == PGRES_COMMAND_OK) {
printf($dbConn->errorMessage);
}
/****************************************************************************
* pending.c
- * $Id: pending.c,v 1.19 2004/08/29 05:06:35 momjian Exp $
- * $PostgreSQL: pgsql/contrib/dbmirror/pending.c,v 1.19 2004/08/29 05:06:35 momjian Exp $
+ * $Id: pending.c,v 1.20 2004/09/10 04:31:06 neilc Exp $
+ * $PostgreSQL: pgsql/contrib/dbmirror/pending.c,v 1.20 2004/09/10 04:31:06 neilc Exp $
*
* This file contains a trigger for Postgresql-7.x to record changes to tables
* to a pending table for mirroring.
#define BUFFER_SIZE 256
#define MAX_OID_LEN 10
-#define DEBUG_OUTPUT 1
+/*#define DEBUG_OUTPUT 1 */
extern Datum recordchange(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(recordchange);
text *sequenceName;
- Oid setvalArgTypes[2] = {TEXTOID, INT4OID};
+ Oid setvalArgTypes[3] = {TEXTOID, INT4OID,BOOLOID};
int nextValue;
void *setvalPlan = NULL;
- Datum setvalData[2];
- const char *setvalQuery = "SELECT setval_pg($1,$2)";
+ Datum setvalData[3];
+ const char *setvalQuery = "SELECT setval_pg($1,$2,$3)";
int ret;
+ char is_called;
sequenceName = PG_GETARG_TEXT_P(0);
nextValue = PG_GETARG_INT32(1);
+ is_called = PG_GETARG_BOOL(2);
setvalData[0] = PointerGetDatum(sequenceName);
setvalData[1] = Int32GetDatum(nextValue);
+ if(PG_NARGS() > 2)
+ {
+ setvalData[2] = BoolGetDatum(is_called);
+ }
+ else
+ {
+ setvalData[2]=1;
+ }
if (SPI_connect() < 0)
{
return -1;
}
- setvalPlan = SPI_prepare(setvalQuery, 2, setvalArgTypes);
+ setvalPlan = SPI_prepare(setvalQuery, 3, setvalArgTypes);
if (setvalPlan == NULL)
{
ereport(ERROR, (errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
# It contains configuration information to mirror data from
# the master database to a single slave system.
#
-# $PostgreSQL: pgsql/contrib/dbmirror/slaveDatabase.conf,v 1.2 2003/11/29 22:39:19 pgsql Exp $
+# $PostgreSQL: pgsql/contrib/dbmirror/slaveDatabase.conf,v 1.3 2004/09/10 04:31:06 neilc Exp $
#######################################################################
$masterHost = "masterMachine.mydomain.com";
# Where to email Error messages to
# $errorEmailAddr = "me@mydomain.com";
+$slaveInfo->{"slaveName"} = "backupMachine";
$slaveInfo->{"slaveHost"} = "backupMachine.mydomain.com";
$slaveInfo->{"slaveDb"} = "myDatabase";
+$slaveInfo->{"slavePort"} = 5432;
$slaveInfo->{"slaveUser"} = "postgres";
$slaveInfo->{"slavePassword"} = "postgrespassword";
+# If uncommented then text files with SQL statements are generated instead
+# of connecting to the slave database directly.
+# slaveDb should then be commented out.
+# $slaveInfo{"TransactionFileDirectory"} = '/tmp';
+#
+# The number of seconds dbmirror should sleep for between checking to see
+# if more data is ready to be mirrored.
+$sleepInterval = 60;
+
+#If you want to use syslog
+# $syslog = 1;