Настройка PostgreSQL для миграции базы данных на новую версию TimescaleDB
Содержание
Постановка задачи
Имеется база данных в PostgreSQL 12, использующая TimescaleDB версии 1.7.4. Нужно перенести её в PostgreSQL 13 с обновлением TimescaleDB до версии 2.7.0. Версии TimescaleDB 1.x и 2.x несовместимы между собой, так что при установке расширения версии 2.x перестают работать расширения версий 1.x. На сервере имеются другие базы данных, зависящие от расширения TimescaleDB, в которых нужно оставить расширение версии 1.x.
Для переноса базы данных с обновлением воспользуемся промежуточной виртуальной машиной с PostgreSQL версии 12, как на исходной СУБД. Восстановим на неё резервную копию базы данных, после чего обновим расширение и снимем резервную копию для переноса в целевую СУБД PostgreSQL версии 13.
Настройка виртуальной машины
Для сборки pg_repack понадобится настроить виртуальную машину, аналогичную используемой на том сервере, где собираемся использовать утилиту. В рассматриваемом примере это система Debian 8.11.1 LTS с кодовым именем Jessie. Получить образ установочного диска можно по ссылке debian-9.13.0-amd64-netinst.iso.
Настройка репозиториев
Для настройки репозиториев поместим в файл /etc/apt/sources.list
следующие строки:
deb http://mirror.ufanet.ru/debian/ stretch main contrib non-free
deb http://mirror.ufanet.ru/debian/ stretch-updates main contrib non-free
deb http://mirror.ufanet.ru/debian/ stretch-proposed-updates main contrib non-free
deb http://mirror.ufanet.ru/debian-security stretch/updates main contrib non-free
Отключаем установку предлагаемых зависимостей, создав файл /etc/apt/apt.conf.d/suggests
со следующим содержимым:
APT::Install-Suggests "false";
Отключаем установку рекомендуемых зависимостей, создав файл /etc/apt/apt.conf.d/recommends
со следующим содержимым:
APT::Install-Recommends "false";
Система apt сохраняет скачанные пакеты в каталоге /var/cache/apt/archives/
, чтобы при необходимости не скачивать их снова. Файлы в этом каталоге по умолчанию не удаляются, что может привести к переполнению диска. Чтобы отключить размер файлов в этом каталоге 200 мегабайтами, создадим файл /etc/apt/apt.conf.d/cache
со следующим содержимым:
APT::Cache-Limit "209715200";
Создадим файл /etc/apt/apt.conf.d/timeouts
с настройками таймаутов обращения к репозиториям:
Acquire::http::Timeout "5";
Acquire::https::Timeout "5";
Acquire::ftp::Timeout "5";
При необходимости, если репозитории доступны через веб-прокси, можно создать файл /etc/apt/apt.conf.d/proxy
, прописав в него прокси-серверы для протоколов HTTP, HTTPS и FTP:
Acquire::http::Proxy "http://10.0.25.3:8080";
Acquire::https::Proxy "http://10.0.25.3:8080";
Acquire::ftp::Proxy "http://10.0.25.3:8080";
Обновим список пакетов, доступных через репозитории:
# apt-get update
Обновим систему с использованием самых свежих пакетов, доступных через репозитории:
# apt-get upgrade
# apt-get dist-upgrade
Установим пакеты, необходимые для установки GPG-ключей и для использования репозиториев TimescaleDB:
# apt-get install apt-transport-https ca-certificates
Добавим в файл /etc/apt/sources.list
репозитории PostgresPro и TimescaleDB:
deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main
deb https://packagecloud.io/timescale/timescaledb/debian/ stretch main
Также нужно установить в систему публичные GPG-ключи, которыми подписаны репозитории PostgresPro и TimescaleDB:
# wget --quiet -O - http://repo.postgrespro.ru/keys/GPG-KEY-POSTGRESPRO | apt-key add -
# wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | apt-key add -
Обновим список пакетов, доступных через репозитории:
# apt-get update
Установка PostgreSQL и TimescaleDB
Установим PostgreSQL версии 12:
# apt-get install postgresql-12
Установим TimescaleDB версии 1.7.4:
# apt-get install timescaledb-1.7.4-postgresql-12
Пропишем расширение timescaledb
в опцию shared_preload_libraries
в файле конфигурации /etc/postgresql/13/main/postgresql.conf
:
shared_preload_libraries = 'timescaledb'
Чтобы расширение стало доступным, нужно перезапустить PostgreSQL:
# systemctl restart postgresql
Снятие резервной копии
Для снятия резервной копии с исходной базы данных воспользуемся такой командой, запущенной от имени пользователя postgres
:
$ pg_dump -Fc -d db | gzip -c > db.bak.gz
Восстановление резервной копии
Создадим владельца базы данных:
$ createuser owner
Создадим пустую базу данных db
, которой будет владеть пользователь owner
:
$ createdb db -O owner
Установим в пустую базу расширение TimescaleDB той версии, которое было установлено в базе данных перед снятием резервной копии:
$ psql -d db -c "CREATE EXTENSION IF NOT EXISTS timescaledb VERSION '1.7.4';"
Вызовем функцию подготовки к восстановлению базы данных из резервной копии:
$ psql -d db -c "SELECT timescaledb_pre_restore();"
Восстановим содержимое базы данных из резервной копии:
$ zcat db.bak.gz | pg_restore -Fc -d db
И вызовем функцию для завершения восстановления базы данных из резервной копии:
$ psql -d db -c "SELECT timescaledb_post_restore();"
Обновление TimescaleDB
Установим из репозитория свежую версию расширения timescaledb:
# apt-get install timescaledb-2-loader-postgresql-12 timescaledb-2-2.7.0-postgresql-12
И выполним обновление расширения до версии 2.7.0:
$ psql -d ucams_office -c "ALTER EXTENSION timescaledb UPDATE TO '2.7.0';"
Перенос обновлённой базы данных
Теперь можно снять резервную копию снова и восстановить её в целевой базе данных PostgreSQL 12 с установленным расширением 2.7.0, повторив описанные выше действия по резервному копированию и восстановлению в пустую базу данных на PostgreSQL 13, в которой на этот раз будет установлено расширение TimescaleDB версии 2.7.0.