postgresql/pg_migrate

changeset 300
382048971a24
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/postgresql/pg_migrate	Mon Nov 22 16:54:26 2010 +0100
     1.3 @@ -0,0 +1,220 @@
     1.4 +#!/bin/sh
     1.5 +##
     1.6 +##  pg_migrate -- PostgreSQL Database Migration Utility
     1.7 +##  Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>
     1.8 +##  Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>
     1.9 +##
    1.10 +##  Permission to use, copy, modify, and distribute this software for
    1.11 +##  any purpose with or without fee is hereby granted, provided that
    1.12 +##  the above copyright notice and this permission notice appear in all
    1.13 +##  copies.
    1.14 +##
    1.15 +##  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
    1.16 +##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    1.17 +##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    1.18 +##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
    1.19 +##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    1.20 +##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    1.21 +##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    1.22 +##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    1.23 +##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    1.24 +##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
    1.25 +##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    1.26 +##  SUCH DAMAGE.
    1.27 +##
    1.28 +
    1.29 +#   configuration
    1.30 +l_prefix="@l_prefix@"
    1.31 +l_rusr="@l_rusr@"
    1.32 +l_rgrp="@l_rgrp@"
    1.33 +
    1.34 +#   load superuser information
    1.35 +l_pgdata=""
    1.36 +l_pguser=""
    1.37 +l_pgpass=""
    1.38 +if [ ! -r $l_prefix/var/postgresql/db/pg_superuser.conf ]; then
    1.39 +    echo "$0:ERROR: unable to read file \"$l_prefix/var/postgresql/db/pg_superuser.conf\" (use pg_passwd(1) to create)" 1>&2
    1.40 +    exit 1
    1.41 +fi
    1.42 +eval `. $l_prefix/var/postgresql/db/pg_superuser.conf; \
    1.43 +      echo l_pgdata=\"$superuser_database\"; \
    1.44 +      echo l_pguser=\"$superuser_username\"; \
    1.45 +      echo l_pgpass=\"$superuser_password\"`
    1.46 +
    1.47 +#   establish sane environment
    1.48 +LC_CTYPE=C
    1.49 +export LC_CTYPE
    1.50 +umask 022
    1.51 +
    1.52 +#   check command line
    1.53 +if [ $# -ne 1 -a $# -ne 2 ]; then
    1.54 +    echo "$0:ERROR: invalid command line" 1>&2
    1.55 +    echo "$0:USAGE: $0 dump|restore [<password>]" 1>&2
    1.56 +    exit 1
    1.57 +fi
    1.58 +cmd="$1"; shift
    1.59 +if [ $# -eq 1 ]; then
    1.60 +    l_pgpass="$1"; shift
    1.61 +fi
    1.62 +
    1.63 +#   dispatch into commands
    1.64 +case $cmd in
    1.65 +    dump )
    1.66 +        echo "++ enforcing full-superuser access policy"
    1.67 +        cp -p $l_prefix/var/postgresql/db/pg_hba.conf \
    1.68 +              $l_prefix/var/postgresql/db/pg_hba.conf.orig
    1.69 +        ( echo "local all all trust"
    1.70 +          echo "host all all 127.0.0.1/32 trust"
    1.71 +        ) >$l_prefix/var/postgresql/db/pg_hba.conf
    1.72 +
    1.73 +        ( eval `${l_prefix}/bin/openpkg rc postgresql status 2>/dev/null`
    1.74 +          echo "postgresql_active=\"$postgresql_active\""
    1.75 +        ) 2>/dev/null
    1.76 +        if [ ".$postgresql_active" = .yes ]; then
    1.77 +            echo "++ reloading already running database engine"
    1.78 +            $l_prefix/bin/openpkg rc postgresql reload
    1.79 +            sleep 2
    1.80 +            epilog=reload
    1.81 +        else
    1.82 +            echo "++ temporarily starting database engine"
    1.83 +            $l_prefix/bin/openpkg rc postgresql start 
    1.84 +            sleep 4
    1.85 +            epilog=stop
    1.86 +        fi
    1.87 +
    1.88 +        echo "++ rotating dump files $l_prefix/var/postgresql/db.dump*.sql.bz2"
    1.89 +        i=9
    1.90 +        rm -f $l_prefix/var/postgresql/db.dump.$i.sql.bz2 >/dev/null 2>&1 || true
    1.91 +        while [ $i -gt 0 ]; do
    1.92 +            j=$i
    1.93 +            i=`expr $i - 1`
    1.94 +            if [ $i -eq 0 ]; then
    1.95 +                prev="$l_prefix/var/postgresql/db.dump.sql.bz2"
    1.96 +                next="$l_prefix/var/postgresql/db.dump.$j.sql.bz2"
    1.97 +            else
    1.98 +                prev="$l_prefix/var/postgresql/db.dump.$i.sql.bz2"
    1.99 +                next="$l_prefix/var/postgresql/db.dump.$j.sql.bz2"
   1.100 +            fi
   1.101 +            if [ -f $prev ]; then
   1.102 +                mv $prev $next
   1.103 +            fi
   1.104 +        done
   1.105 +
   1.106 +        echo "++ dumping all databases into $l_prefix/var/postgresql/db.dump.sql.bz2"
   1.107 +        PGPASSWORD="$l_pgpass" \
   1.108 +        $l_prefix/bin/pg_dumpall \
   1.109 +            -U "$l_pguser" -o |\
   1.110 +            $l_prefix/lib/openpkg/bzip2 -9 \
   1.111 +                >$l_prefix/var/postgresql/db.dump.sql.bz2
   1.112 +        chown ${l_rusr}:${l_rgrp} $l_prefix/var/postgresql/db.dump.sql.bz2
   1.113 +        chmod 700 $l_prefix/var/postgresql/db.dump.sql.bz2
   1.114 +
   1.115 +        echo "++ restoring original access policy"
   1.116 +        cp -p $l_prefix/var/postgresql/db/pg_hba.conf.orig \
   1.117 +              $l_prefix/var/postgresql/db/pg_hba.conf
   1.118 +        rm -f $l_prefix/var/postgresql/db/pg_hba.conf.orig
   1.119 +
   1.120 +        if [ ".$epilog" = .reload ]; then
   1.121 +            echo "++ reloading already running database engine (again)"
   1.122 +            $l_prefix/bin/openpkg rc postgresql reload
   1.123 +            sleep 2
   1.124 +        else
   1.125 +            echo "++ stopping temporarily started database engine"
   1.126 +            $l_prefix/bin/openpkg rc postgresql stop 
   1.127 +            sleep 4
   1.128 +        fi
   1.129 +        ;;
   1.130 +
   1.131 +    restore )
   1.132 +        if [ ".`$l_prefix/bin/openpkg rc postgresql status 2>&1 | grep 'is running'`" != . ]; then
   1.133 +            echo "++ stopping already running database engine"
   1.134 +            $l_prefix/bin/openpkg rc postgresql stop
   1.135 +            sleep 2
   1.136 +            epilog=start
   1.137 +        else
   1.138 +            epilog=none
   1.139 +        fi
   1.140 +
   1.141 +        echo "++ rotating database directories $l_prefix/var/postgresql/db.old*/"
   1.142 +        i=9
   1.143 +        rm -rf $l_prefix/var/postgresql/db.old.$i >/dev/null 2>&1 || true
   1.144 +        while [ $i -gt 0 ]; do
   1.145 +            j=$i
   1.146 +            i=`expr $i - 1`
   1.147 +            if [ $i -eq 0 ]; then
   1.148 +                prev="$l_prefix/var/postgresql/db"
   1.149 +                next="$l_prefix/var/postgresql/db.old.$j"
   1.150 +            else
   1.151 +                prev="$l_prefix/var/postgresql/db.old.$i"
   1.152 +                next="$l_prefix/var/postgresql/db.old.$j"
   1.153 +            fi
   1.154 +            if [ -d $prev ]; then
   1.155 +                mv $prev $next
   1.156 +            fi
   1.157 +        done
   1.158 +
   1.159 +        echo "++ creating new database directory $l_prefix/var/postgresql/db/"
   1.160 +        mkdir $l_prefix/var/postgresql/db
   1.161 +        chown ${l_rusr}:${l_rgrp} $l_prefix/var/postgresql/db
   1.162 +        chmod 700 $l_prefix/var/postgresql/db
   1.163 +
   1.164 +        su - ${l_rusr} -c \
   1.165 +            "LC_CTYPE=C; export LC_CTYPE; umask 022; \
   1.166 +            echo $l_pgpass >$l_prefix/var/postgresql/run/pw; \
   1.167 +            $l_prefix/bin/pg_initdb \
   1.168 +                -U $l_pguser --pwfile=$l_prefix/var/postgresql/run/pw \
   1.169 +                -D $l_prefix/var/postgresql/db; \
   1.170 +            rm -f $l_prefix/var/postgresql/run/pw" 2>&1 |\
   1.171 +        $l_prefix/lib/openpkg/shtool prop \
   1.172 +            -p "++ creating new database data"
   1.173 +
   1.174 +        echo "++ restoring database configurations"
   1.175 +        for conf in pg_hba.conf pg_ident.conf postgresql.conf; do
   1.176 +            cp -p $l_prefix/var/postgresql/db.old.1/$conf \
   1.177 +                  $l_prefix/var/postgresql/db/
   1.178 +        done
   1.179 +
   1.180 +        echo "++ enforcing full-superuser access policy"
   1.181 +        cp -p $l_prefix/var/postgresql/db/pg_hba.conf \
   1.182 +              $l_prefix/var/postgresql/db/pg_hba.conf.orig
   1.183 +        ( echo "local all all trust"
   1.184 +          echo "host all all 127.0.0.1/32 trust"
   1.185 +        ) >$l_prefix/var/postgresql/db/pg_hba.conf
   1.186 +
   1.187 +        if [ ".$epilog" = .start ]; then
   1.188 +            echo "++ starting database engine"
   1.189 +        else
   1.190 +            echo "++ temporarily starting database engine"
   1.191 +        fi
   1.192 +        $l_prefix/bin/openpkg rc postgresql start
   1.193 +        sleep 4
   1.194 +
   1.195 +        echo "++ restoring all databases from $l_prefix/var/postgresql/db.dump.sql.bz2"
   1.196 +        $l_prefix/lib/openpkg/bzip2 -c -d \
   1.197 +            $l_prefix/var/postgresql/db.dump.sql.bz2 |\
   1.198 +                $l_prefix/bin/psql -U "$l_pguser" -d "$l_pgdata" 2>&1 |\
   1.199 +                    tee $l_prefix/var/postgresql/db.log |\
   1.200 +                        $l_prefix/lib/openpkg/shtool prop \
   1.201 +                            -p "++ restoring data (see $l_prefix/var/postgresql/db.log)"
   1.202 +
   1.203 +        echo "++ restoring original access policy"
   1.204 +        cp -p $l_prefix/var/postgresql/db/pg_hba.conf.orig \
   1.205 +              $l_prefix/var/postgresql/db/pg_hba.conf
   1.206 +        rm -f $l_prefix/var/postgresql/db/pg_hba.conf.orig
   1.207 +
   1.208 +        if [ ".$epilog" = .start ]; then
   1.209 +            echo "++ reloading already running database engine"
   1.210 +            $l_prefix/bin/openpkg rc postgresql reload
   1.211 +            sleep 2
   1.212 +        else
   1.213 +            echo "++ stopping temporarily started database engine"
   1.214 +            $l_prefix/bin/openpkg rc postgresql stop 
   1.215 +            sleep 4
   1.216 +        fi
   1.217 +        ;;
   1.218 +    * )
   1.219 +        echo "$0:ERROR: unknown command \"$cmd\"" 1>&2
   1.220 +        exit 1
   1.221 +        ;;
   1.222 +esac
   1.223 +

mercurial