diff --git a/doc/src/sgml/ref/pg_upgrade.sgml b/doc/src/sgml/ref/pg_upgrade.sgml index a7c0a502a52a7b3b5db1c35dd45f4971ac6bffc9..b90412ec5de33a79137f4cfa68f17a7b42e7d710 100644 --- a/doc/src/sgml/ref/pg_upgrade.sgml +++ b/doc/src/sgml/ref/pg_upgrade.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/ref/Attic/pg_upgrade.sgml,v 1.15 2002/01/10 04:58:19 momjian Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/ref/Attic/pg_upgrade.sgml,v 1.16 2002/01/11 04:39:19 momjian Exp $ PostgreSQL documentation --> @@ -24,7 +24,7 @@ PostgreSQL documentation <date>1999-07-31</date> </refsynopsisdivinfo> <synopsis> -pg_upgrade -s <replaceable class="parameter">filename</replaceable> [ -d <replaceable class="parameter">filename</replaceable> ] <replaceable class="parameter">old_data_dir</replaceable> +pg_upgrade -s <replaceable class="parameter">filename</replaceable> <replaceable class="parameter">old_data_dir</replaceable> </synopsis> </refsynopsisdiv> @@ -50,10 +50,14 @@ pg_upgrade -s <replaceable class="parameter">filename</replaceable> [ -d <replac <step performance="required"> <para> Back up your existing data directory, preferably by making a - complete dump with pg_dumpall. Those upgrading from 7.1 are - required to supply this dump filename to pg_upgrade with the - <option>-d</option> option. Other releases should not use the - <option>-d</option> option. + complete dump with pg_dumpall. + </para> + </step> + + <step performance="required"> + <para> + <command>VACUUM</command> your entire database using + <command>vacuumdb -a</command.> </para> </step> @@ -111,7 +115,7 @@ $ make install Change your working directory to the pgsql main directory, and type: <programlisting> -$ pg_upgrade -s schema.out -d data.out data.old +$ pg_upgrade -s schema.out data.old </programlisting> The program will do some checking to make sure everything is properly configured, and will run your db.out script to recreate all the databases @@ -130,12 +134,6 @@ $ pg_upgrade -s schema.out -d data.out data.old </para> </step> - <step performance="required"> - <para> - Stop and restart the postmaster. - </para> - </step> - <step performance="required"> <para> <emphasis>Carefully</emphasis> examine the contents of the upgraded @@ -154,6 +152,11 @@ $ pg_upgrade -s schema.out -d data.out data.old </para> </step> + <note> + <para> + pg_upgrade does not migrate large objects. + </para> + </note> </procedure> </refsect1> </refentry> diff --git a/src/bin/pg_dump/pg_upgrade b/src/bin/pg_dump/pg_upgrade index 63af1ceac163695edba05066759bd845b2d9b0af..9fdd11a68d111e1fe83ed02104d60ab38a76ab9e 100755 --- a/src/bin/pg_dump/pg_upgrade +++ b/src/bin/pg_dump/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/src/bin/pg_dump/Attic/pg_upgrade,v 1.23 2002/01/11 00:27:42 momjian Exp $ +# $Header: /cvsroot/pgsql/src/bin/pg_dump/Attic/pg_upgrade,v 1.24 2002/01/11 04:39:19 momjian Exp $ # # NOTE: we must be sure to update the version-checking code a few dozen lines # below for each new PostgreSQL release. @@ -13,7 +13,6 @@ TMPFILE="/tmp/pgupgrade.$$" trap "rm -f $TMPFILE" 0 1 2 3 15 SCHEMA="" -DATA="" while [ "$#" -gt 1 ] do if [ "X$1" = "X-s" ] @@ -23,20 +22,13 @@ do exit 1 fi shift 2 - elif [ "X$1" = "X-d" ] - then DATA="$2" - if [ ! -s "$DATA" ] - then echo "$DATA does not exist" 1>&2 - exit 1 - fi - shift 2 - else echo "Usage: $0 -s schema_dump [ -d data_dump ] old_data_dir" 1>&2 + else echo "Usage: $0 -s schema_dump old_data_dir" 1>&2 exit 1 fi done if [ "$#" -ne 1 -o ! "$SCHEMA" ] -then echo "Usage: $0 -s schema_dump [ -d data_dump ] old_data_dir" 1>&2 +then echo "Usage: $0 -s schema_dump old_data_dir" 1>&2 exit 1 fi @@ -86,21 +78,6 @@ SRC_VERSION=`cat ./$OLDDIR/PG_VERSION` # UPGRADE_VERSION is the expected output database version UPGRADE_VERSION="7.1" -if [ "$SRC_VERSION" = "7.1" -a ! "$DATA" ] -then echo "$0 requires a full data dump file to upgrade from version $SRC_VERSION." 1>&2 - echo "Use the '-d' parameter to specify the data dump file" 1>&2 - echo "If you don't have enough disk space to keep a dump file, grep out the '\\connect' and" 1>&2 - echo "'SELECT setval' lines from the dump file and pass that file to $0, e.g:" 1>&2 - echo 1>&2 - echo " pg_dumpall | egrep '^(\\connect)|SELECT setval \()[^ ]*$' > data.out" 1>&2 - exit 1 -fi - -if [ "$SRC_VERSION" != "7.1" -a "$DATA" ] -then echo "$0 does not require the -d option for this version." 1>&2 - exit 1 -fi - if [ "$DEST_VERSION" != "$UPGRADE_VERSION" -a "$DEST_VERSION" != "$SRC_VERSION" ] then echo "`basename $0` is for PostgreSQL version $UPGRADE_VERSION, but ./data/PG_VERSION contains $DEST_VERSION." 1>&2 echo "Did you run initdb for version $UPGRADE_VERSION?" 1>&2 @@ -134,8 +111,8 @@ Install a newer version from pgsql/contrib/pg_resetxlog and continue.; exiting" exit 1 fi -# We need a high XID number so there is 1 gig gap in XID numbers so the -# moved-over rows can be frozen on next VACUUM. +# 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. XID=`pg_resetxlog -n "$OLDDIR" | grep "NextXID" | awk -F' *' '{print $4}'` if [ "$SRC_VERSION" = "7.1" -a "$XID" -gt 2000000000 ] @@ -171,26 +148,11 @@ $0 aborted." 1>&2 exit 1 fi -# Set sequence values for 7.1-version sequences, which are int4. -if [ "$SRC_VERSION" != "7.1" ] -then echo "Input script $SCHEMA complete, fixing row commit statuses..." -else echo "Input script $SCHEMA complete, setting int8 sequences..." +echo "Input script $SCHEMA complete, fixing row commit statuses..." - # Set all the sequence counters because they are not brought over - # in the schema dump. - cat $DATA | egrep '^(\\connect)|SELECT setval \()[^ ]*$' | - psql "template1" - if [ $? -ne 0 ] - then echo "There were errors in setting the sequence values. -$0 aborted." 1>&2 - exit 1 - fi - - echo "Int8 sequences set, fixing row commit statuses..." -fi - -# Now vacuum each result database in case our transaction increase -# causes all the XID's to be marked with the frozen XID. +# XXX do we still need this? +# Now vacuum each result database because our movement of transaction log +# causes some committed transactions to appear as non-committed psql -d template1 -At -c "SELECT datname FROM pg_database" | while read DB do @@ -337,6 +299,82 @@ then echo "Unable to restart database server.; exiting" 1>&2 exit 1 fi +# Set sequence values for 7.1-version sequences, which were int4. +if [ "$SRC_VERSION" = "7.1" ] +else echo "Set int8 sequence values from 7.1..." + + psql -d template1 -At -c "SELECT datname FROM pg_database" | + while read DB + do + echo "$DB" + # XXX is concurrency a problem here? + psql -d "$DB" -At -c "SELECT relname FROM pg_class where relkind = 'S';" | + while read SEQUENCE + do + psql -d "$DB" -At <<SQL_END + +-- This table matches the 7.1 sequence schema +CREATE TABLE temp_seq_int4 ( + sequence_name name + last_value integer + increment_by integer + max_value integer + min_value integer + cache_value integer + log_cnt integer + is_cycled "char" + is_called "char" +); + +-- Move int8 version of sequence out of the way +UPDATE pg_attribute +SET attrelid = 1 -- OID of template1, not used anywhere else XXX correct? +WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = '$SEQUENCE'); + +-- Replace with int4 sequence schema +UPDATE pg_attribute +SET attrelid = (SELECT oid FROM pg_class WHERE relname = '$SEQUENCE') +WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'temp_seq_int4'); + +-- Select sequence value into temp table +CREATE TEMP TABLE hold_sequence AS +SELECT last_value +FROM "$SEQUENCE" + +-- Prepare int4 sequence table for removal and remove it +UPDATE pg_attribute +SET attrelid = (SELECT oid FROM pg_class WHERE relname = 'temp_seq_int4') +WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = '$SEQUENCE'); + +DROP TABLE temp_seq_int4; + +-- Restore int8 version of sequence +UPDATE pg_attribute +SET attrelid = (SELECT oid FROM pg_class WHERE relname = '$SEQUENCE') +WHERE attrelid = 1; + +-- Mark sequence as ordinary table and update it +UPDATE pg_class +SET relkind = 't' +WHERE relname = '$SEQUENCE'; + +UPDATE "$SEQUENCE" +SET last_value = (SELECT last_value FROM hold_sequence); + +-- Restore sequence flag +UPDATE pg_class +SET relkind = 'S' +WHERE relname = '$SEQUENCE'; + +SQL_END + if [ $? -ne 0 ] + then echo "There were errors during int4 sequence restore. + $0 aborted." 1>&2 + exit 1 + done + done +fi + echo "You may remove the $OLDDIR directory with 'rm -r $OLDDIR'." exit 0