From ebf57dd08288b7a6b267c6a4121ab8af22c3abeb Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 14 Jan 2002 22:54:44 +0000 Subject: [PATCH] Update permissions? --- contrib/pg_upgrade/README | 32 +++++------ contrib/pg_upgrade/pg_upgrade | 94 ++++++++++++++++++------------- contrib/pg_upgrade/pg_upgrade.man | 29 +++++----- 3 files changed, 87 insertions(+), 68 deletions(-) diff --git a/contrib/pg_upgrade/README b/contrib/pg_upgrade/README index 3844735e64..f5fb65e7d4 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- @@ -124,7 +125,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 61916f37d6..939bf0ed80 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 82914b388f..f4b28d15b9 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) -- 2.40.0