diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 98ad33866be2878a8c9e03f7d60d7f3aa74838a2..90e5c2b96c42c096b420382f18da9876a494e0cc 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.135 2002/08/02 22:36:05 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.136 2002/08/04 06:26:38 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -223,6 +223,7 @@ BootstrapMain(int argc, char *argv[]) int flag; int xlogop = BS_XLOG_NOP; char *potential_DataDir = NULL; + char *potential_XLogDir = NULL; /* * initialize globals @@ -250,17 +251,22 @@ BootstrapMain(int argc, char *argv[]) if (!IsUnderPostmaster) { InitializeGUCOptions(); - potential_DataDir = getenv("PGDATA"); /* Null if no PGDATA - * variable */ + /* Null if no PGDATA variable */ + potential_DataDir = getenv("PGDATA"); + /* Null if no PGXLOG variable */ + potential_XLogDir = getenv("PGXLOG"); } - while ((flag = getopt(argc, argv, "B:d:D:Fo:px:")) != -1) + while ((flag = getopt(argc, argv, "B:d:D:X:Fo:px:")) != -1) { switch (flag) { case 'D': potential_DataDir = optarg; break; + case 'X': + potential_XLogDir = optarg; + break; case 'd': { /* Turn on debugging for the bootstrap process. */ @@ -315,6 +321,7 @@ BootstrapMain(int argc, char *argv[]) proc_exit(1); } SetDataDir(potential_DataDir); + SetXLogDir(potential_XLogDir); } /* Validate we have been given a reasonable-looking DataDir */ diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index f84bf27e92ba2778bfd206c6f92a09432371d8ca..acc4d0090b229f298aaa9b8f3c3cd8eda21632ba 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -37,7 +37,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.281 2002/07/13 01:02:14 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.282 2002/08/04 06:26:38 thomas Exp $ * * NOTES * @@ -347,6 +347,7 @@ PostmasterMain(int argc, char *argv[]) int status; char original_extraoptions[MAXPGPATH]; char *potential_DataDir = NULL; + char *potential_XLogDir = NULL; *original_extraoptions = '\0'; @@ -405,10 +406,11 @@ PostmasterMain(int argc, char *argv[]) InitializeGUCOptions(); potential_DataDir = getenv("PGDATA"); /* default value */ + potential_XLogDir = getenv("PGXLOG"); /* default value */ opterr = 1; - while ((opt = getopt(argc, argv, "A:a:B:b:c:D:d:Fh:ik:lm:MN:no:p:Ss-:")) != -1) + while ((opt = getopt(argc, argv, "A:a:B:b:c:D:X:d:Fh:ik:lm:MN:no:p:Ss-:")) != -1) { switch (opt) { @@ -431,6 +433,9 @@ PostmasterMain(int argc, char *argv[]) case 'D': potential_DataDir = optarg; break; + case 'X': + potential_XLogDir = optarg; + break; case 'd': { /* Turn on debugging for the postmaster. */ @@ -565,6 +570,7 @@ PostmasterMain(int argc, char *argv[]) checkDataDir(potential_DataDir); /* issues error messages */ SetDataDir(potential_DataDir); + SetXLogDir(potential_XLogDir); ProcessConfigFile(PGC_POSTMASTER); diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 976d366fe78472f1293dad4019f237702c489da8..d117f844603b170a1c73446abf0af9daf57a0c18 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.277 2002/08/04 04:31:44 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.278 2002/08/04 06:26:33 thomas Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -1146,6 +1146,7 @@ PostgresMain(int argc, char *argv[], const char *username) StringInfo parser_input; char *potential_DataDir = NULL; + char *potential_XLogDir = NULL; /* * Catch standard options before doing much else. This even works on @@ -1190,6 +1191,7 @@ PostgresMain(int argc, char *argv[], const char *username) { InitializeGUCOptions(); potential_DataDir = getenv("PGDATA"); + potential_XLogDir = getenv("PGXLOG"); } /* ---------------- @@ -1214,7 +1216,7 @@ PostgresMain(int argc, char *argv[], const char *username) ctx = PGC_POSTMASTER; gucsource = PGC_S_ARGV; /* initial switches came from command line */ - while ((flag = getopt(argc, argv, "A:B:c:CD:d:Eef:FiNOPo:p:S:st:v:W:x:-:")) != -1) + while ((flag = getopt(argc, argv, "A:B:c:CD:X:d:Eef:FiNOPo:p:S:st:v:W:x:-:")) != -1) switch (flag) { case 'A': @@ -1246,6 +1248,11 @@ PostgresMain(int argc, char *argv[], const char *username) potential_DataDir = optarg; break; + case 'X': /* PGXLOG directory */ + if (secure) + potential_XLogDir = optarg; + break; + case 'd': /* debug level */ { /* Set server debugging level. */ @@ -1537,8 +1544,10 @@ PostgresMain(int argc, char *argv[], const char *username) proc_exit(1); } SetDataDir(potential_DataDir); + SetXLogDir(potential_XLogDir); } Assert(DataDir); + Assert(strlen(XLogDir) > 0); /* * Set up signal handlers and masks. @@ -1693,7 +1702,7 @@ PostgresMain(int argc, char *argv[], const char *username) if (!IsUnderPostmaster) { puts("\nPOSTGRES backend interactive interface "); - puts("$Revision: 1.277 $ $Date: 2002/08/04 04:31:44 $\n"); + puts("$Revision: 1.278 $ $Date: 2002/08/04 06:26:33 $\n"); } /* diff --git a/src/bin/initdb/initdb.sh b/src/bin/initdb/initdb.sh index 007805992e51e4d9008264b49844a9ffc5b71e63..162a090c307c493e1d74366802c36ffce2f0bcfa 100644 --- a/src/bin/initdb/initdb.sh +++ b/src/bin/initdb/initdb.sh @@ -27,7 +27,7 @@ # Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # -# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.163 2002/07/29 22:14:11 tgl Exp $ +# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.164 2002/08/04 06:26:38 thomas Exp $ # #------------------------------------------------------------------------- @@ -252,6 +252,19 @@ do -D*) PGDATA=`echo $1 | sed 's/^-D//'` ;; +# Directory to hold WAL log files. + --pgxlog|-X) + PGXLOG="$2" + defined_pgxlog=yes + shift;; + --pgxlog=*) + PGXLOG=`echo $1 | sed 's/^--pgxlog=//'` + defined_pgxlog=yes + ;; + -X*) + PGXLOG=`echo $1 | sed 's/^-X//'` + defined_pgxlog=yes + ;; # The directory where the .bki input files are stored. Normally # they are in PREFIX/share and this option should be unnecessary. -L) @@ -341,6 +354,7 @@ if [ "$usage" ]; then echo echo "Options:" echo " [-D, --pgdata] DATADIR Location for this database cluster" + echo " [-X, --pgxlog] XLOGDIR Location for the cluster transaction logs" echo " -W, --pwprompt Prompt for a password for the new superuser" if [ -n "$MULTIBYTE" ] ; then echo " -E, --encoding ENCODING Set default encoding for new databases" @@ -369,7 +383,7 @@ fi if [ "$MULTIBYTE" ] then MULTIBYTEID=`$PGPATH/pg_encoding -b $MULTIBYTE` - if [ "$?" -ne 0 ] + if [ "$?" -ne 0 ] then ( echo "$CMDNAME: pg_encoding failed" @@ -401,6 +415,11 @@ then exit 1 fi +if [ -z "$PGXLOG" ] +then + PGXLOG="$PGDATA"/pg_xlog +fi + #------------------------------------------------------------------------- # Find the input files @@ -418,7 +437,7 @@ then ( echo echo "initdb variables:" - for var in PGDATA datadir PGPATH MULTIBYTE MULTIBYTEID \ + for var in PGDATA PGXLOG datadir PGPATH MULTIBYTE MULTIBYTEID \ POSTGRES_SUPERUSERNAME POSTGRES_BKI \ POSTGRES_DESCR POSTGRESQL_CONF_SAMPLE \ PG_HBA_SAMPLE PG_IDENT_SAMPLE ; do @@ -503,44 +522,61 @@ then echo "$CMDNAME: The directory $PGDATA exists but is not empty." echo "If you want to create a new database system, either remove or empty" echo "the directory $PGDATA or run initdb with" - echo "an argument other than $PGDATA." + echo "an argument for -D other than $PGDATA." + ) 1>&2 + exit 1 +fi + +# find out if transaction log directory is empty +pgxlog_contents=`ls -A "$PGXLOG" 2>/dev/null` +if [ x"$pgxlog_contents" != x ] +then + ( + echo "$CMDNAME: The directory $PGXLOG exists but is not empty." + echo "If you want to create a new transaction log, either remove or empty" + echo "the directory $PGXLOG or run initdb with" + echo "an argument for -X other than $PGXLOG." ) 1>&2 exit 1 +fi + +if [ ! -d "$PGDATA" ]; then + $ECHO_N "creating directory $PGDATA... "$ECHO_C + mkdir -p "$PGDATA" >/dev/null 2>&1 || mkdir "$PGDATA" || exit_nicely + made_new_pgdata=yes else - if [ ! -d "$PGDATA" ]; then - $ECHO_N "creating directory $PGDATA... "$ECHO_C - mkdir -p "$PGDATA" >/dev/null 2>&1 || mkdir "$PGDATA" || exit_nicely - made_new_pgdata=yes - else - $ECHO_N "Fixing permissions on existing directory $PGDATA... "$ECHO_C - chmod go-rwx "$PGDATA" || exit_nicely - fi - echo "ok" + $ECHO_N "Fixing permissions on existing directory $PGDATA... "$ECHO_C +chmod go-rwx "$PGDATA" || exit_nicely +fi +echo "ok" - if [ ! -d "$PGDATA"/base ] - then - $ECHO_N "creating directory $PGDATA/base... "$ECHO_C - mkdir "$PGDATA"/base || exit_nicely - echo "ok" - fi - if [ ! -d "$PGDATA"/global ] - then - $ECHO_N "creating directory $PGDATA/global... "$ECHO_C - mkdir "$PGDATA"/global || exit_nicely - echo "ok" - fi - if [ ! -d "$PGDATA"/pg_xlog ] - then - $ECHO_N "creating directory $PGDATA/pg_xlog... "$ECHO_C - mkdir "$PGDATA"/pg_xlog || exit_nicely - echo "ok" - fi - if [ ! -d "$PGDATA"/pg_clog ] - then - $ECHO_N "creating directory $PGDATA/pg_clog... "$ECHO_C - mkdir "$PGDATA"/pg_clog || exit_nicely - echo "ok" - fi +if [ ! -d "$PGXLOG" ]; then + $ECHO_N "creating directory $PGXLOG... "$ECHO_C + mkdir -p "$PGXLOG" >/dev/null 2>&1 || mkdir "$PGXLOG" || exit_nicely + made_new_pgxlog=yes +else + $ECHO_N "Fixing permissions on existing directory $PGXLOG... "$ECHO_C +chmod go-rwx "$PGXLOG" || exit_nicely +fi +echo "ok" + +if [ ! -d "$PGDATA"/base ] +then + $ECHO_N "creating directory $PGDATA/base... "$ECHO_C + mkdir "$PGDATA"/base || exit_nicely +echo "ok" +fi +if [ ! -d "$PGDATA"/global ] +then + $ECHO_N "creating directory $PGDATA/global... "$ECHO_C + mkdir "$PGDATA"/global || exit_nicely +echo "ok" +fi +if [ ! -d "$PGDATA"/pg_clog ] +then + $ECHO_N "creating directory $PGDATA/pg_clog... "$ECHO_C + mkdir "$PGDATA"/pg_clog || exit_nicely +echo "ok" fi @@ -549,7 +585,7 @@ fi # RUN BKI SCRIPT IN BOOTSTRAP MODE TO CREATE TEMPLATE1 # common backend options -PGSQL_OPT="-F -D$PGDATA" +PGSQL_OPT="-F -D$PGDATA -X$PGXLOG" if [ "$debug" = yes ] then @@ -677,7 +713,6 @@ EOF echo "ok" fi - $ECHO_N "enabling unlimited row size for system tables... "$ECHO_C "$PGPATH"/postgres $PGSQL_OPT template1 >/dev/null <<EOF @@ -1058,14 +1093,24 @@ echo "ok" # # FINISHED +postmaster_startup="$PGPATH/postmaster -D $PGDATA" +if [ x"$defined_pgxlog" != x ]; then + postmaster_startup="$postmaster_startup -X $PGXLOG" +fi +pg_ctl_startup="$PGPATH/pg_ctl -D $PGDATA" +if [ x"$defined_pgxlog" != x ]; then + pg_ctl_startup="$pg_ctl_startup -X $PGXLOG" +fi +pg_ctl_startup="$pg_ctl_startup -l logfile start" + echo echo "Success. You can now start the database server using:" echo "" -echo " $PGPATH/postmaster -D $PGDATA" +echo " $postmaster_startup" echo "or" # (Advertise -l option here, otherwise we have a background # process writing to the terminal.) -echo " $PGPATH/pg_ctl -D $PGDATA -l logfile start" +echo " $pg_ctl_startup" echo exit 0 diff --git a/src/bin/pg_ctl/pg_ctl.sh b/src/bin/pg_ctl/pg_ctl.sh index 618153387861d9f772c61f4bbfd97f80f2a28824..28459274d6c67dca1dddcf7639cc50e25aa6204e 100755 --- a/src/bin/pg_ctl/pg_ctl.sh +++ b/src/bin/pg_ctl/pg_ctl.sh @@ -8,7 +8,7 @@ # # # IDENTIFICATION -# $Header: /cvsroot/pgsql/src/bin/pg_ctl/Attic/pg_ctl.sh,v 1.27 2002/07/19 15:31:42 momjian Exp $ +# $Header: /cvsroot/pgsql/src/bin/pg_ctl/Attic/pg_ctl.sh,v 1.28 2002/08/04 06:26:38 thomas Exp $ # #------------------------------------------------------------------------- @@ -19,20 +19,23 @@ $CMDNAME is a utility to start, stop, restart, reload configuration files, or report the status of a PostgreSQL server. Usage: - $CMDNAME start [-w] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"] + $CMDNAME start [-w] [-D DATADIR] [-s] [-X PGXLOG] [-l FILENAME] [-o \"OPTIONS\"] $CMDNAME stop [-W] [-D DATADIR] [-s] [-m SHUTDOWN-MODE] - $CMDNAME restart [-w] [-D DATADIR] [-s] [-m SHUTDOWN-MODE] [-o \"OPTIONS\"] + $CMDNAME restart [-w] [-D DATADIR] [-s] [-X PGXLOG] [-m SHUTDOWN-MODE] [-o \"OPTIONS\"] $CMDNAME reload [-D DATADIR] [-s] $CMDNAME status [-D DATADIR] Common options: -D DATADIR Location of the database storage area + -X XLOGDIR Location of the WAL log file storage area -s Only print errors, no informational messages -w Wait until operation completes -W Do not wait until operation completes (The default is to wait for shutdown, but not for start or restart.) If the -D option is omitted, the environment variable PGDATA is used. +If the -X option is omitted, the environment variable PGXLOG is used +or the postmaster defaults to looking in $PGDATA/pg_xlog. Options for start or restart: -l FILENAME Write (or append) server log to FILENAME. The @@ -132,6 +135,12 @@ do PGDATA="$1" export PGDATA ;; + -X) + shift + # pass environment into new postmaster + PGXLOG="$1" + export PGXLOG + ;; -l) logfile="$2" shift;; diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 42241aee82e6243e639b441298049c296298bb97..19ff8dd2ce8cf3b588dcc699d391e35f581eb251 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: xlog.h,v 1.31 2002/06/20 20:29:43 momjian Exp $ + * $Id: xlog.h,v 1.32 2002/08/04 06:26:38 thomas Exp $ */ #ifndef XLOG_H #define XLOG_H @@ -175,6 +175,9 @@ typedef struct XLogRecData struct XLogRecData *next; } XLogRecData; +/* XLOG directory name */ +extern char XLogDir[]; + extern StartUpID ThisStartUpID; /* current SUI */ extern bool InRecovery; extern XLogRecPtr MyLastRecPtr; @@ -189,6 +192,7 @@ extern int XLOG_DEBUG; extern char *XLOG_sync_method; extern const char XLOG_sync_method_default[]; +extern void SetXLogDir(char *path); extern XLogRecPtr XLogInsert(RmgrId rmid, uint8 info, XLogRecData *rdata); extern void XLogFlush(XLogRecPtr RecPtr);