aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/pg_upgrade/README32
-rwxr-xr-xcontrib/pg_upgrade/pg_upgrade94
-rw-r--r--contrib/pg_upgrade/pg_upgrade.man29
3 files changed, 87 insertions, 68 deletions
diff --git a/contrib/pg_upgrade/README b/contrib/pg_upgrade/README
index 3844735e646..f5fb65e7d4f 100644
--- a/contrib/pg_upgrade/README
+++ b/contrib/pg_upgrade/README
@@ -12,21 +12,21 @@ SSYYNNOOPPSSIISS
data
DDEESSCCRRIIPPTTIIOONN
- pg_upgrade is a utility for upgrading from a previous
+ ppgg__uuppggrraaddee is a utility for upgrading from a previous
PostgreSQL release without reloading all the data. Not all
- PostgreSQL releases can be handled this way. Check the
+ PostgreSQL releases can use this utility. Check the
release notes for details about your version.
- pg_upgrade must be run in two stages. In phase one you
- must run pg_upgrade with your old database installation in
- place. In phase two, pg_upgrade must be run on a freshly
- initdb'ed current install. In both phases, the same
- pg_upgrade script matching the newly installed version
+ ppgg__uuppggrraaddee must be run in two stages. In phase one you
+ must run ppgg__uuppggrraaddee with your old database installation in
+ place. In phase two, ppgg__uuppggrraaddee must be run on a freshly
+ iinniittddbb'ed current install. In both phases, the same
+ ppgg__uuppggrraaddee script matching the newly installed version
must be used.
UUppggrraaddiinngg PPoossttggrreeSSQQLL wwiitthh ppgg__uuppggrraaddee
1) Back up your existing data directory, preferably by
- making a complete dump with pg_dumpall.
+ making a complete dump with ppgg__dduummppaallll..
2) Copy the program _p_g_s_q_l_/_c_o_n_t_r_i_b_/_p_g___u_p_g_r_a_d_e_/_p_g___u_p_g_r_a_d_e
from the current PostgreSQL distribution somewhere into
@@ -52,7 +52,7 @@ UUppggrraaddiinngg PPoossttggrreeSSQQLL wwiitthh ppgg_
$$ mmaakkee iinnssttaallll
to install the _p_g___r_e_s_e_t_x_l_o_g utility which is needed by
- pg_upgrade.
+ ppgg__uuppggrraaddee.
6) Run initdb to create a new template1 database contain-
ing the system tables for the new release. Make sure you
@@ -76,7 +76,7 @@ PG_UPGRADE(1) PostgreSQL Client Applications PG_UPGRADE(1)
alter pg_hba.conf temporarily.)
8) Change your working directory to the pgsql main direc-
- tory, and type:
+ tory again, and type:
$$ ppgg__uuppggrraaddee --22
@@ -92,12 +92,13 @@ PG_UPGRADE(1) PostgreSQL Client Applications PG_UPGRADE(1)
10) Carefully examine the contents of the upgraded
databases. If you detect problems, you'll need to recover
- by restoring from your full pg_dump backup. You can delete
- the _p_g___u_p_g_r_a_d_e___i_n_f_o_/ directory when you are satisfied.
+ by restoring from your full ppgg__dduummppaallll backup. You can
+ delete the _p_g___u_p_g_r_a_d_e___i_n_f_o_/ directory when you are satis-
+ fied.
- The upgraded databases will be in an un-vacuumed state.
- You will probably want to run a _V_A_C_U_U_M _A_N_A_L_Y_Z_E bbeeffoorree
- bbeeggiinnnniinngg pprroodduuccttiioonn wwoorrkk..
+ The upgraded databases will be in an un-vacuumed state.
+ You will probably want to run a _V_A_C_U_U_M _A_N_A_L_Y_Z_E before
+ beginning production work.
SSEEEE AALLSSOO
initdb(1), postmaster(1), pg_dump(1), pg_dumpall(1), vacu-
@@ -126,7 +127,6 @@ SSEEEE AALLSSOO
-
14 Jan 2002 PG_UPGRADE(1) 2
diff --git a/contrib/pg_upgrade/pg_upgrade b/contrib/pg_upgrade/pg_upgrade
index 61916f37d62..939bf0ed80d 100755
--- a/contrib/pg_upgrade/pg_upgrade
+++ b/contrib/pg_upgrade/pg_upgrade
@@ -3,7 +3,7 @@
# pg_upgrade: update a database without needing a full dump/reload cycle.
# CAUTION: Read the manual page before trying to use this!
-# $Header: /cvsroot/pgsql/contrib/pg_upgrade/Attic/pg_upgrade,v 1.1 2002/01/14 17:32:07 momjian Exp $
+# $Header: /cvsroot/pgsql/contrib/pg_upgrade/Attic/pg_upgrade,v 1.2 2002/01/14 22:54:44 momjian Exp $
#
# NOTE: we must be sure to update the version-checking code a few dozen lines
# below for each new PostgreSQL release.
@@ -30,6 +30,7 @@ CUR_VERSION="7.2"
trap "rm -f /tmp/$$.*" 0 1 2 3 15
PHASE=""
+
if [ "$#" -eq 1 ]
then
if [ "X$1" = "X-1" ]
@@ -38,26 +39,41 @@ then
elif [ "X$1" = "X-2" ]
then PHASE="2"
shift
+ elif [ "X$1" = "X-D" ]
+ then DATADIR="$2"
+ shift
fi
fi
if [ "$PHASE" = "" ]
then echo "You must run $0 in either mode 1 or mode 2." 1>&2
- echo "Usage: $0 [ -1 | -2 ]" 1>&2
+ echo "Usage: $0 [-D datadir] -1 | -2" 1>&2
+ exit 1
+fi
+
+if [ "$DATADIR" = "" ]
+then echo "You must set the DATADIR environment variable or specify it with -D." 1>&2
+ echo "Usage: $0 [-D datadir] -1 | -2" 1>&2
exit 1
fi
-if [ ! -e data ]
-then echo "$0 must be run from the directory above your /data directory.
+if [ ! -d "$DATADIR" ]
+then echo "$DATADIR does not exist.
$0 aborted." 1>&2
if [ "$PHASE" -eq 2 ]
- then echo "You must run initdb to create a template1 database." 1>&2
+ then echo "Perhaps you didn't run initdb." 1>&2
fi
exit 1
fi
+if [ "$USER" = "root" -o ! -r "$DATADIR"/PG_VERSION ]
+then echo "You must run this as the PostgreSQL superuser.
+$0 aborted." 1>&2
+ exit 1
+fi
+
INFODIR="pg_upgrade_info"
-OLDDIR="$INFODIR/data"
+SAVEDATA="$INFODIR"/"`basename \"$DATADIR\"`"
make_dbobjoidmap()
{
@@ -99,13 +115,15 @@ move_objfiles()
{
# Test to make sure there is a matching file in each place
- if [ ! -e "$OLDDIR"/base/"$SRC_DBOID"/"$SRC_OID" ]
+ if [ ! -f "$SAVEDATA"/base/"$SRC_DBOID"/"$SRC_OID" -a \
+ ! -h "$SAVEDATA"/base/"$SRC_DBOID"/"$SRC_OID" ]
then echo "Move of database $DB, OID $SRC_OID, object $OBJ failed.
File not found; exiting" 1>&2
exit 1
fi
- if [ ! -e data/base/"$DST_DBOID"/"$DST_OID" ]
+ if [ ! -f "$DATADIR"/base/"$DST_DBOID"/"$DST_OID" -a \
+ ! -h "$DATADIR"/base/"$DST_DBOID"/"$DST_OID" ]
then echo "Move of database $DB, OID $DST_OID, object $OBJ failed.
File not found; exiting" 1>&2
exit 1
@@ -113,7 +131,7 @@ File not found; exiting" 1>&2
# Move files
- mv -f "$OLDDIR"/base/"$SRC_DBOID"/"$SRC_OID" data/base/"$DST_DBOID"/"$DST_OID"
+ mv -f "$SAVEDATA"/base/"$SRC_DBOID"/"$SRC_OID" "$DATADIR"/base/"$DST_DBOID"/"$DST_OID"
if [ "$?" -ne 0 ]
then echo "Move of database $DB, OID $SRC_OID, object $OBJ
to $DST_OID failed.; exiting" 1>&2
@@ -122,10 +140,10 @@ to $DST_OID failed.; exiting" 1>&2
# handle table extents
- ls "$OLDDIR"/base/"$SRC_DBOID"/"$SRC_OID".* 2>/dev/null | while read FILE
+ ls "$SAVEDATA"/base/"$SRC_DBOID"/"$SRC_OID".* 2>/dev/null | while read FILE
do
EXT=`basename "$FILE" | sed 's/^.*\.\(.*\)$/\1/'`
- mv -f "$FILE" data/base/"$DST_DBOID"/"$DST_OID"."$EXT"
+ mv -f "$FILE" "$DATADIR"/base/"$DST_DBOID"/"$DST_OID"."$EXT"
if [ "$?" -ne 0 ]
then echo "Move of database $DB, OID $SRC_OID, object $OBJ
to $DST_OID failed.; exiting" 1>&2
@@ -142,15 +160,15 @@ then
##########################
- if [ ! -d data/base/1 ]
- then echo "There is no database template1 in data/base." 1>&2
+ if [ ! -d "$DATADIR"/base/1 ]
+ then echo "There is no database template1 in $DATADIR/base." 1>&2
exit 1
fi
# get version
- SRC_VERSION="`cat data/PG_VERSION`"
+ SRC_VERSION=`cat "$DATADIR"/PG_VERSION`
if [ "$SRC_VERSION" = "" ]
- then echo "$0 can not find PostgreSQL version file 'data/PG_VERSION'.
+ then echo "$0 can not find PostgreSQL version file '$DATADIR/PG_VERSION'.
$0 aborted." 1>&2
exit 1
fi
@@ -258,9 +276,9 @@ $0 aborted." 1>&2
exit 1
fi
- mv data "$INFODIR"
+ mv "$DATADIR" "$INFODIR"
if [ $? -ne 0 ]
- then echo "Can not move old /data out of the way.
+ then echo "Can not move old /$DATADIR out of the way.
$0 aborted." 1>&2
exit 1
fi
@@ -283,38 +301,38 @@ then echo "There is no '$INFODIR' directory from a phase 1 run of $0." 1>&2
exit 1
fi
-if [ ! -e "$OLDDIR" ]
-then echo "There is no '$OLDDIR' directory from the phase 1 run of $0." 1>&2
+if [ ! -d "$SAVEDATA" ]
+then echo "There is no '$SAVEDATA' directory from the phase 1 run of $0." 1>&2
exit 1
fi
-if [ ! -f "$OLDDIR/PG_VERSION" ]
-then echo "Cannot read '$OLDDIR/PG_VERSION' --- something is wrong." 1>&2
+if [ ! -f "$SAVEDATA/PG_VERSION" ]
+then echo "Cannot read '$SAVEDATA/PG_VERSION' --- something is wrong." 1>&2
exit 1
fi
-if [ ! -f "data/PG_VERSION" ]
-then echo "Cannot read 'data/PG_VERSION' --- something is wrong." 1>&2
+if [ ! -f "$DATADIR/PG_VERSION" ]
+then echo "Cannot read '$DATADIR/PG_VERSION' --- something is wrong." 1>&2
exit 1
fi
-if [ ! -d "data/base/1" ]
-then echo "Cannot find database template1 in 'data/base'." 1>&2
+if [ ! -d "$DATADIR/base/1" ]
+then echo "Cannot find database template1 in '$DATADIR/base'." 1>&2
echo "Are you running $0 as the postgres superuser?" 1>&2
exit 1
fi
# Get the actual versions seen in the data dirs.
-SRC_VERSION=`cat "$OLDDIR"/PG_VERSION`
-DST_VERSION=`cat data/PG_VERSION`
+SRC_VERSION=`cat "$SAVEDATA"/PG_VERSION`
+DST_VERSION=`cat "$DATADIR"/PG_VERSION`
# Check for version compatibility.
# This code will need to be updated/reviewed for each new PostgreSQL release.
if [ "$DST_VERSION" != "$CUR_VERSION" ]
then echo "$0 is for PostgreSQL version $CUR_VERSION
-but data/PG_VERSION contains $DST_VERSION." 1>&2
+but $DATADIR/PG_VERSION contains $DST_VERSION." 1>&2
echo "Did you run initdb for version $UPGRADE_VERSION by mistake?" 1>&2
exit 1
fi
@@ -349,17 +367,17 @@ fi
# If the XID is > 2 billion, 7.1 database will have non-frozen XID's in
# low numbers, and 7.2 will think they are in the future --- bad.
-SRC_XID=`pg_resetxlog -n "$OLDDIR" | grep "NextXID" | awk -F' *' '{print $4}'`
+SRC_XID=`pg_resetxlog -n "$SAVEDATA" | grep "NextXID" | awk -F' *' '{print $4}'`
if [ "$SRC_VERSION" = "7.1" -a "$SRC_XID" -gt 2000000000 ]
then echo "XID too high for $0.; exiting" 1>&2
exit 1
fi
-DST_XID=`pg_resetxlog -n data | grep "NextXID" | awk -F' *' '{print $4}'`
+DST_XID=`pg_resetxlog -n "$DATADIR" | grep "NextXID" | awk -F' *' '{print $4}'`
# compare locales to make sure they match
-pg_resetxlog -n "$OLDDIR" | grep "^LC_" > /tmp/$$.0
-pg_resetxlog -n data | grep "^LC_" > /tmp/$$.1
+pg_resetxlog -n "$SAVEDATA" | grep "^LC_" > /tmp/$$.0
+pg_resetxlog -n "$DATADIR" | grep "^LC_" > /tmp/$$.1
if ! diff /tmp/$$.0 /tmp/$$.1 >/dev/null
then echo "Locales do not match between the two versions.; exiting" 1>&2
exit 1
@@ -470,7 +488,7 @@ then MAX_XID="$SRC_XID"
else MAX_XID="$DST_XID"
fi
-pg_resetxlog -x "$MAX_XID" data
+pg_resetxlog -x "$MAX_XID" "$DATADIR"
if [ "$?" -ne 0 ]
then echo "Unable to set new XID.; exiting" 1>&2
exit 1
@@ -478,18 +496,18 @@ fi
# Move over old WAL
-rm -r data/pg_xlog
-mv -f "$OLDDIR"/pg_xlog data
+rm -r "$DATADIR"/pg_xlog
+mv -f "$SAVEDATA"/pg_xlog "$DATADIR"
# Set last log file id and segment from old database
-LOG_ID=`pg_resetxlog -n "$OLDDIR" | grep "Current log file id:" |
+LOG_ID=`pg_resetxlog -n "$SAVEDATA" | grep "Current log file id:" |
awk -F' *' '{print $5}'`
if [ "$LOG_ID" = "" ]
then echo "Unable to get old log file id.; exiting" 1>&2
exit 1
fi
-SEG_ID=`pg_resetxlog -n "$OLDDIR" | grep "Next log file segment:" |
+SEG_ID=`pg_resetxlog -n "$SAVEDATA" | grep "Next log file segment:" |
awk -F' *' '{print $5}'`
if [ "$SEG_ID" = "" ]
then echo "Unable to get old log segment id.; exiting" 1>&2
@@ -498,7 +516,7 @@ fi
# Set checkpoint location of new database
-pg_resetxlog -l "$LOG_ID" "$SEG_ID" data
+pg_resetxlog -l "$LOG_ID" "$SEG_ID" "$DATADIR"
if [ "$?" -ne 0 ]
then echo "Unable to set new log file/segment id.; exiting" 1>&2
exit 1
diff --git a/contrib/pg_upgrade/pg_upgrade.man b/contrib/pg_upgrade/pg_upgrade.man
index 82914b388fa..f4b28d15b9e 100644
--- a/contrib/pg_upgrade/pg_upgrade.man
+++ b/contrib/pg_upgrade/pg_upgrade.man
@@ -1,23 +1,23 @@
.TH PG_UPGRADE 1 "PG_UPGRADE(1)" "14 Jan 2002" "PostgreSQL Client Applications" ""
.SH NAME
-pg_upgrade \- upgrade tool
+pg_upgrade \- upgrading from a previous release without reloading
.SH SYNOPSIS
-Allows upgrading from a previous release without reloading data
+pg_upgrade [-D \fIdata_dir\fP] -1 | -2
.SH DESCRIPTION
-pg_upgrade is a utility for upgrading from a previous PostgreSQL release
-without reloading all the data. Not all PostgreSQL releases can be
-handled this way. Check the release notes for details about your
+\fBpg_upgrade\fP is a utility for upgrading from a previous PostgreSQL release
+without reloading all the data. Not all PostgreSQL releases can use
+this utility. Check the release notes for details about your
version.
.LP
-pg_upgrade must be run in two stages. In phase one you must run
-pg_upgrade with your old database installation in place. In phase two,
-pg_upgrade must be run on a freshly initdb'ed current install.
-In both phases, the same pg_upgrade script matching the newly installed
+\fBpg_upgrade\fP must be run in two stages. In phase one you must run
+\fBpg_upgrade\fP with your old database installation in place. In phase two,
+\fBpg_upgrade\fP must be run on a freshly \fBinitdb\fP'ed current install.
+In both phases, the same \fBpg_upgrade\fP script matching the newly installed
version must be used.
.SH Upgrading PostgreSQL with pg_upgrade
.LP
1) Back up your existing data directory, preferably by making a complete
-dump with pg_dumpall.
+dump with \fBpg_dumpall.\fP
.LP
2) Copy the program \fIpgsql/contrib/pg_upgrade/pg_upgrade\fP from the current
PostgreSQL distribution somewhere into your path.
@@ -27,6 +27,7 @@ PostgreSQL distribution somewhere into your path.
.B $ pg_upgrade -1
.sp
to collect information about the old database needed for the upgrade.
+You may use \fI-D\fP to specify the data directory, or use PGDATA.
.LP
4) Do:
.LP
@@ -41,7 +42,7 @@ to install the new binaries.
.B $ make install
.sp
to install the \fIpg_resetxlog\fP utility which is needed by
-pg_upgrade.
+\fBpg_upgrade\fP.
.LP
6) Run initdb to create a new template1 database containing the system
tables for the new release. Make sure you use settings similar to those
@@ -51,7 +52,7 @@ used in your previous version.
to the server until the upgrade is complete. You may wish to start the
postmaster without -i or alter pg_hba.conf temporarily.)
.LP
-8) Change your working directory to the pgsql main directory, and type:
+8) Change your working directory to the pgsql main directory again, and type:
.LP
.B $ pg_upgrade -2
.sp
@@ -66,10 +67,10 @@ subdirectories.
.LP
10) Carefully examine the contents of the upgraded databases. If you
detect problems, you'll need to recover by restoring from your full
-pg_dump backup. You can delete the \fIpg_upgrade_info/\fP directory when you
+\fBpg_dumpall\fP backup. You can delete the \fIpg_upgrade_info/\fP directory when you
are satisfied.
.LP
The upgraded databases will be in an un-vacuumed state. You will
-probably want to run a \fIVACUUM ANALYZE\fB before beginning production work.
+probably want to run a \fIVACUUM ANALYZE\fP before beginning production work.
.SH SEE ALSO
initdb(1), postmaster(1), pg_dump(1), pg_dumpall(1), vacuumdb(1)