Postgresql ugrade

Для начала создадим файл с переменными

1
2
3
4
5
6
cat > /tmp/pq_upgrade << EOL
export OLD_VER=12
export NEW_VER=13
export DBDIR="/var/lib/pgsql/"
export BINDIR="/usr/lib/postgresql"
EOL

Устанавливаем новые пакеты

1
2
source /tmp/pq_upgrade
zypper in $(rpmqpack | grep "^postgresql${OLD_VER}" | sed -e "s|${OLD_VER}|${NEW_VER}|g")

Перенесем конфиги в /etc/postgresql если не перенесли ранее

1
2
3
4
source /tmp/pq_upgrade
mkdir -p /etc/postgresql
cp ${DBDIR}/data/*conf /etc/postgresql/
chown postgres:postgres /etc/postgresql/*

Инициализация новой БД

1
2
3
4
5
6
7
su - postgres
source /tmp/pq_upgrade
cd ${DBDIR}
install -d -m 0700 -o postgres -g postgres data${NEW_VER}
cd ${DBDIR}/data${NEW_VER}
${BINDIR}/bin/initdb .

1
2
3
4
5
6
7
8
9
10
11
su - postgres
source /tmp/pq_upgrade
cd ${DBDIR}/data${NEW_VER}

for i in pg_hba.conf pg_ident.conf postgresql.conf postgresql.auto.conf ; do
old $i
ln -s /etc/postgresql/$i .;
# diff $i $i-$(date +"%Y%m%d")
done

exit

Сама миграция

1
2
3
4
5
6
7
8
9
10
systemctl stop postgresql

su - postgres
source /tmp/pq_upgrade
cp -R ${DBDIR}/data ${DBDIR}/data${OLD_VER}
pg_upgrade --link \
--old-bindir="${BINDIR}${OLD_VER}/bin" \
--new-bindir="${BINDIR}${NEW_VER}/bin" \
--old-datadir="${DBDIR}/data${OLD_VER}/" \
--new-datadir="${DBDIR}/data${NEW_VER}/"

Переключаемся на новую БД

1
2
3
source /tmp/pq_upgrade
cd ${DBDIR}
ln -fs data${NEW_VER} data

Или альтернативный способ через sysconfig

1
2
source /tmp/pq_upgrade
echo "POSTGRES_DATADIR='${DBDIR}/data${NEW_VER}'" >> /etc/sysconfig/postgresql

Очистка

1
2
3
4
5
6
7
8
9
sudo -i -u postgres
source /tmp/pq_upgrade
${BINDIR}${NEW_VER}/bin/vacuumdb \
--all \
--analyze-in-stages

${BINDIR}${NEW_VER}/bin/reindexdb \
--all \
--concurrently