Вариант через дамп и загрузку данных
Основной процесс
- Ставим новую версию (ставится в слот, так что будет одновременно 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