Poloautomatická migrace na vyšší verzi s využitím pg upgrade
Skočit na navigaci
Skočit na vyhledávání
#!/bin/bash
# set -x
echo "ATTENTION!!! Break script immediately when it try to upgrade to unexpected release"
# Expects configuration files in PG_DATA. PG_BASE_DIR should be writable
# for postgres user.
PG_BASE_DIR="/var/lib/pgsql"
PG_DATA="/var/lib/pgsql/data"
PG_VERSION=`cat $PG_DATA/PG_VERSION`
# target major and minor release
MAJOR_RELEASE="9.2"
MINOR_RELEASE="7-9"
TARGET_RELEASE="$MAJOR_RELEASE.$MINOR_RELEASE.*"
PACKAGE="postgresql"
POSTGRES="$PACKAGE-$TARGET_RELEASE"
SERVER="$PACKAGE-server-$TARGET_RELEASE"
LIBS="$PACKAGE-libs-$TARGET_RELEASE"
CONTRIB="$PACKAGE-contrib-$TARGET_RELEASE"
UPGRADE="$PACKAGE-upgrade-$TARGET_RELEASE"
DEVEL="$PACKAGE-devel-$TARGET_RELEASE"
if [[ "$PG_VERSION" >= "$TARGET_RELEASE" ]]; then
echo "migration was processed, server is $MAJOR_RELEASE already"
exit 1;
fi
set -e
while true; do
read -p "Do you wish to upgrade PostgreSQL to $MAJOR_RELEASE? (y/n) " yn
case $yn in
[Yy]* ) break;;
[Nn]* ) exit 1;;
* ) echo "Please answer yes or no.";;
esac
done
set +e
echo "stop postgresql"
su postgres -c "cd;pg_ctl stop -D $PG_DATA -m fast"
STATUS=$?
if [ $STATUS != 1 -a $STATUS != 0 ]; then
su postgres -c "cd;pg_ctl status -D $PG_DATA"
while [ $? != 1 ]; do
sleep 1
su postgres -c "cd;pg_ctl status -D $PG_DATA"
done
fi
yum clean all
# Attention: yum with --noplugis ignores version lock!!!
echo "verify postgresql target release binaries"
yum list $POSTGRES -y --noplugins
if [ $? -ne 0 ]; then
echo "missing PostgreSQL $TARGET_RELEASE packages"
exit 1;
fi
# don't allow errors
set -e
echo "upgrade postgresql binaries"
yum upgrade $POSTGRES $SERVER $LIBS $CONTRIB $DEVEL --noplugins
yum install $UPGRADE -y --noplugins
echo "backup postgresql databases"
su postgres -c "mkdir $PG_BASE_DIR/data$MAJOR_RELEASE"
su postgres -c "/usr/bin/initdb -D $PG_BASE_DIR/data$MAJOR_RELEASE/"
echo "fix configuration"
# sed -i "s/shared_preload_libraries/#shared_preload_libraries/" $PG_DATA/postgresql.conf
echo "start upgrade"
su postgres -c "mkdir $PG_BASE_DIR/upgrade_data"
su postgres -c "cd $PG_BASE_DIR/upgrade_data; pg_upgrade -b /usr/lib64/pgsql/postgresql-$PG_VERSION/bin -B /usr/bin/ -d $PG_DATA -D $PG_BASE_DIR/data$MAJOR_RELEASE -k"
echo "revert back changes in configuration"
# sed -i "s/#shared_preload_libraries/shared_preload_libraries/" $PG_DATA/postgresql.conf
sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/" $PG_DATA/postgresql.conf
echo "switch data dir"
mv $PG_DATA $PG_BASE_DIR/data$PG_VERSION
mv $PG_BASE_DIR/data$MAJOR_RELEASE $PG_DATA
echo "clean"
rm -f -r $PG_BASE_DIR/upgrade_data
echo "reuse original pg_hba.conf and postgresql.conf"
'cp' -rf $PG_BASE_DIR/data$PG_VERSION/pg_hba.conf $PG_DATA
'cp' -rf $PG_BASE_DIR/data$PG_VERSION/postgresql.conf $PG_DATA
echo "uninstall postgresql-upgrade package"
yum remove $UPGRADE -y
echo "fix selinux labeling, reboot is required"
restorecon -R $PG_DATA
echo "start services"
/etc/init.d/postgresql start
echo "migration to PostgreSQL $TARGET_RELEASE is done"
Případný downgrade:
- Zastavit PostgreSQL
- Předchozí adresář (např. /var/lib/pgsql/data91) přejmenovat zpět (na /var/lib/pgsql/data).
yum remove postgresql-upgrade yum downgrade postgresql postgresql-server postgresql-contrib postgresql-libs postgresql-devel