Вариант через дамп и загрузку данных

Основной процесс

Ставим новую версию (ставится в слот, так что будет одновременно 2 версии)

Дампим старую базу

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

Проверяем, что переключились

Стопаем старую версию

Инитим новую версию

Стартуем новую версию

Восстанавливаем данные

Правим ранлевел

emerge -avt postgresql-server pg_dumpall -f file.sql eselect postgresql list ; eselect postgresql set new_version pg_dumpall --version # должно показать новую версию /etc/init.d/postgresql-old_version stop emerge postgresql-server --config -a /etc/init.d/postgresql-new_version start psql -f backup.sql postgres rc-update del postgresql-old_version default rc-update add postgresql-new_version default

Варианты задампить старую базу

Дамп всех БД на сервере (кластере) в простой SQL:

pg_dumpall -f file.sql

Дамп конкретной базы (зажатый):

pg_dump -Fc -b -f file.backup db_name

Дамп конкретной таблицы (зажатый):

pg_dump -Fc -b -f file.backup -t table_name db_name

Дамп только информации о пользователях:

pg_dumpall -r -f file.sql

Дамп каждой базы в отдельный файл:

for db in $( psql -qAt -c 'select datname from pg_database where not datistemplate' ); do pg_dump -Fc -b -f ${db}.backup ${db}; done

Получение схемы базы, либо конкретной таблицы:

pg_dump -s db_name pg_dump -s -t table_name db_name

Варианты восстановления

Восстановление из SQL файла:

psql -f file.sql db_name

Восстановление из зажатого дампа базы:

pg_restore -d db_name -v file.backup

Восстановление таблицы из зажатого дампа:

pg_restore -d db_name -a -t table_name -v file.backup

Вариант через pg_upgrade

Ставим новую версию, смотрим, какие версии у нас есть:

emerge -avt postgresql-server eselect postgresql list old=10 # старая версия new=11 # новая версия

Инитим новую базу:

mcedit /etc/conf.d/postgresql-${new} # PG_INITDB_OPTS="--locale=ru_RU.UTF-8" emerge --config dev-db/postgresql:${new} # говорим yes и создаем файлы данных

Добавляем local all all trust в следующие 2 файла:

mcedit /etc/postgresql-${old}/pg_hba.conf mcedit /etc/postgresql-${new}/pg_hba.conf

Копируем конфиг от старой версии. Кроме того, т.к. pg_upgrade не позволяет указывать где лежать конфиги постгреса, мы копируем их в директорию с дата-файлами:

cp /etc/postgresql-${old}/postgresql.conf /etc/postgresql-${new}/ cp /etc/postgresql-${old}/*.conf /var/lib/postgresql/${old}/data/ cp /etc/postgresql-${new}/*.conf /var/lib/postgresql/${new}/data/ chown postgres:postgres /var/lib/postgresql/${old}/data/*.conf /var/lib/postgresql/${new}/data/*.conf

Убеждаемся, что обе версии постгреса остановлены и пеключаемся на новую:

/etc/init.d/postgresql-${old} stop /etc/init.d/postgresql-${new} stop eselect postgresql set ${new} rc-update del postgresql-${old} default rc-update add postgresql-${new} default

Выплняем, собственно, апгрейд:

su - postgres cd /var/lib/postgresql old=10 # старая версия new=11 # новая версия pg_upgrade \ -d /var/lib/postgresql/${old}/data/ \ -b /usr/lib64/postgresql-${old}/bin/ \ -D /var/lib/postgresql/${new}/data/ \ -B /usr/lib64/postgresql-${new}/bin/

Удаляем local all all trust из конфига, а потом чистим мусор:

mcedit /etc/postgresql-${new}/pg_hba.conf emerge --depclean =dev-db/postgresql-server-${old} rm -rfv /etc/conf.d/postgresql-${old} /var/lib/postgresql/${old} /etc/postgresql-${old} rm /var/lib/postgresql/${new}/data/*.conf

Тешим паранойю и стартуем новую версию:

chown postgres:postgres /etc/postgresql-${new}/* chmod 600 /etc/postgresql-${new}/* /etc/init.d/postgresql-${new} start

Tracedump:

newBaseSize: 16pt
newBaseSizeInPt: 16