r/postgresql-server: Add script to upgrade database

The `postgresql-upgrade.sh` script arranges to run `pg_upgrade` after a
major PostgreSQL version update.  It's scheduled by a systemd unit,
_postgresql-upgrade.service_, which runs only after an OS update.
dynamic-inventory
Dustin 2024-11-16 11:52:14 -06:00
parent 0048a87630
commit 53b39338dd
4 changed files with 92 additions and 1 deletions

View File

@ -0,0 +1,18 @@
[Unit]
Description=Upgrade PostgreSQL database cluster
Before=postgresql.service
Before=systemd-update-done.service
After=local-fs.target
RequiresMountsFor=/var/lib/pgsql
DefaultDependencies=no
ConditionNeedsUpdate=/var
[Service]
Type=oneshot
User=postgres
ExecStart=+/usr/local/libexec/postgresql-upgrade
Environment=PG_COLOR=always
WorkingDirectory=~
[Install]
RequiredBy=postgresql.service

View File

@ -0,0 +1,40 @@
#!/bin/sh
# vim: set sw=4 ts=4 sts=4 et :
set -e
CONFIG_DIR=/etc/postgresql
data_directory=$(
runuser -u postgres -- postgres -D "${CONFIG_DIR}" -C data_directory
)
old_version=$(cat "${data_directory}"/PG_VERSION)
current_version=$(postgres --version | sed -r 's/.*\s+([0-9]+).*/\1/')
if [ "${old_version}" = "${current_version}" ]; then
exit 0
fi
config_dir_old="${CONFIG_DIR}.${old_version}"
rm -rf "${config_dir_old}"
cp -a "${CONFIG_DIR}" "${config_dir_old}"
sed -ri.orig \
-e 's/data_directory\s*=\s*'\''(.*?)'\''/data_directory = '\''\1.'"${old_version}"\''/' \
-e 's/^(\s*ssl\s*=\s*)(.*)$/\1off/' \
"${config_dir_old}"/postgresql.conf
sed -i.orig \
-e '$alocal all postgres peer' \
-e d \
"${config_dir_old}"/pg_hba.conf
mv "${data_directory}" "${data_directory}.${old_version}"
runuser -u postgres -- initdb -A peer --no-instructions "${data_directory}"
runuser -u postgres -- pg_upgrade \
-b "/usr/lib64/pgsql/postgresql-${old_version}"/bin \
-B /usr/bin \
-d "${config_dir_old}" \
-D "${CONFIG_DIR}" \
-o '-c restore_command= -c archive_command=' \
-O '-c restore_command= -c archive_command=' \
-k

View File

@ -0,0 +1,2 @@
dependencies:
- systemd-base

View File

@ -1,6 +1,8 @@
- name: ensure postgresql-server is installed
package:
name: postgresql-server
name:
- postgresql-server
- postgresql-upgrade
state: present
tags:
- install
@ -130,6 +132,35 @@
tags:
- systemd
- name: ensure postgresql-upgrade script is installed
copy:
src: postgresql-upgrade.sh
dest: /usr/local/libexec/postgresql-upgrade
owner: root
group: root
mode: u=rwx,go=rx
tags:
- postgresql-upgrade
- name: ensure postgresql-upgrade systemd unit is installed
copy:
src: postgresql-upgrade.service
dest: /etc/systemd/system/postgresql-upgrade.service
owner: root
group: root
mode: u=rw,go=r
notify:
- reload systemd
tags:
- postgresql-upgrade
- systemd
- name: ensure postgresql-upgrade service starts when needed
service:
name: postgresql-upgrade
enabled: true
tags:
- postgresql-upgrade
- service
- name: ensure postgresql starts at boot
service:
name: postgresql