PostgreSQL: Перенос базы c timescaledb с обновлением
Есть сервер (CentOS 7) БД (PostgreSQL 12.4) для Zabbix. База для Zabbix использует timescaledb (1.7.2).
Есть задача: перенести (с обновлением) и базу и сам Zabbix. Для БД развёрнут сервер RedOS 8, на котором развёрнут PostgreSQL 16.2 и установлен TimeScaleDB 2.14.2. Создана база, активировано в ней расширение (разобрался с лицензиями и пр.):
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
Всё нормально:
Список установленных расширений
Имя | Версия | Схема | Описание
-------------+--------+--------+--------------------------------------------------------------------------------------
timescaledb | 2.14.2 | public | Enables scalable inserts and complex queries for time-series data (Apache 2 Edition)
(1 строка)
Изначально пробовал перенести простым:
pg_dump ... | psql ...
Но получил множественные ошибки. Например:
ОШИБКА: функция public.pg_stat_statements_reset() не существует
ОШИБКА: отношение "_timescaledb_catalog.continuous_aggs_completed_threshold" не существует
ОШИБКА: столбец "modification_time" в таблице "continuous_aggs_hypertable_invalidation_log" не существует
неверная команда \.
ОШИБКА: столбец "modification_time" в таблице ОШИБКА: отношение "_timescaledb_catalog.hypertable_compression" не существует
Нашёл пакет утилит ts-dump / ts-restore https://github.com/timescale/timescaledb-backup/releases, сделал бэкап, но при попытке восстановить получаю ошибку:
2024/05/06 09:13:16 Error creating extension in correct schema and at correct version: ОШИБКА: для расширения "timescaledb" не определён путь установки или обновления для версии "1.7.2" (SQL
STATE 22023)
И вот что делать дальше - пока нет идей: параметров у ts-restore немного, значит, вероятно, что-то на стороне СУБД надо сделать. Вопрос: что?
Или более обще: как провести перенос БД с timescaledb с обновлением?
Ответы (1 шт):
Довольно давно я последний раз видел timescaledb
, но помню что оно с приключениями. Проверка фактов по документации раз и два (вторая про переезд в облако, похоже в стремлении засадить в своё облако из документации удалили статью про restore из дампа, но основные грабли те же самые)
Итак, ключевое тут:
You need to upgrade PostgreSQL and TimescaleDB in two separate steps. This is so that you can make sure each upgrade completes
properly. For example, if you are running PostgreSQL 10 and TimescaleDB 1.7.5, and you want to upgrade to PostgreSQL 13 and TimescaleDB 2.2, upgrade in this order:
Upgrade PostgreSQL 10 to PostgreSQL 12 Upgrade TimescaleDB 1.7.5 to TimescaleDB 2.2 on PostgreSQL 12 Upgrade PostgreSQL 12 to PostgreSQL 13 with TimescaleDB 2.2 installed
It is very important that the version of the TimescaleDB extension is the same in the source and target databases. This requires upgrading the TimescaleDB extension in the source database before migrating.
Обе ссылки документации открыто говорят, что версия TimescaleDB меняться при апгрейде самой базы не должна, это отдельный процесс со своей документацией. При том, по таблице совместимости версий множества TimescaleDB 1.7 и postgresql 16 не пересекаются вовсе, так и на postgresql 12 не поставить достаточно новый TimescaleDB. Чтобы следовать инструкциям, необходим какой-то промежуточный апгрейд. Например, сперва обновить TimescaleDB до 2.10 (и обязательно postgresql до 12.18), затем обновить postgresql до 13, 14 или 15, затем обновить TimescaleDB до 2.14 (предварительно проверьте, что такая версия существует для более старой базы, т.к. документация упоминает только 2.13), затем обновить postgresql до 16.
Альтернативно, выгрузить данные из Timescale таблиц вручную и вручную же их записать в целевую базу. Уверен, что использовать TimescaleDB по-прежнему решает и внедряет не сам zabbix, а администратор. Так что заранее известно, какие таблицы преобразованы в TimescaleDB. Нужно исключить их из дампа флагом --exclude-table=
Далее нужно выяснить как исключить часть TimescaleDB из pg_dump. На сколько я помню, они расположены в отдельной schema, так что --exclude-schema=
решит вопрос.
Итак:
- остановили zabbix и прочую активность в базе
- сняли pg_dump без данных TimescaleDB
- выгрузили данные из TimescaleDB таблиц, простой
copy tablename to filename
сгодится - восстановили базу из pg_dump на postgresql 16/timescaleDB 2.14
- инициализировали таблицы TimescaleDB как при начале использования
- используя
copy tablename from filename
записали данные в пустые TimescaleDB таблицы