Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

FAQ по миграциям в ClickHouse Managed Postgres

Закрытая предварительная версия в ClickHouse Cloud

Многие вопросы о работе репликации Postgres — включая столбцы TOAST, слоты репликации, публикации, изменения схемы и сопоставление типов данных — освещены в FAQ по ClickPipes для Postgres. Эта информация также применима к миграциям ClickHouse Managed Postgres.

Во время репликации появляется ошибка "invalid input value for enum"

Эта ошибка возникает, когда в исходном Postgres есть значение enum, которого нет в целевом ClickHouse Managed Postgres. Логическая репликация не передаёт команды ALTER TYPE ... ADD VALUE автоматически, поэтому новые значения enum, добавленные в источнике после первоначальной настройки схемы, приведут к сбою вставки в целевой базе.

Чтобы исправить это, добавьте отсутствующее значение в тип enum в целевом Postgres:

ALTER TYPE your_enum_type ADD VALUE 'new_value';

Замените your_enum_type на имя вашего enum-типа, а 'new_value' — на отсутствующее значение из сообщения об ошибке.

Во время репликации возникает ошибка нарушения ограничения уникальности или проверки

Нарушения ограничений могут возникать при логической репликации, когда порядок репликации приводит к конфликту с существующим ограничением на целевой стороне.

  • Ограничения уникальности: Мы применяем изменения пакетами в виде операций MERGE/UPSERT, записывая последнее значение для каждого первичного ключа, поэтому порядок операций для конкретного ключа может не соответствовать порядку, ожидаемому уникальным индексом. Это может временно нарушать ограничение UNIQUE в рамках транзакции, хотя после завершения MERGE ограничение соблюдается. Postgres не может отложить проверку уникального индекса так же, как проверку внешних ключей, поэтому перенести эту проверку на конец транзакции невозможно. Это не влияет на согласованность данных: идентичность строки определяется первичным ключом, и логика MERGE использует тот же первичный ключ.
  • Ограничения проверки: Ограничение проверки на целевой стороне может быть строже, чем на стороне источника, либо промежуточное состояние при пакетном MERGE может не удовлетворять ограничению, хотя конечное состояние ему соответствует. Как и в случае с ограничениями уникальности, это не влияет на согласованность данных, поскольку MERGE использует первичный ключ, определяющий идентичность строки.

Чтобы возобновить репликацию, удалите проблемное ограничение в целевой базе данных Postgres:

-- Drop a unique constraint
ALTER TABLE your_table DROP CONSTRAINT your_constraint_name;

-- Drop a check constraint
ALTER TABLE your_table DROP CONSTRAINT your_check_constraint_name;

Найти сведения об ограничении можно по имени из сообщения об ошибке:

SELECT conname, conrelid::regclass, contype
FROM pg_constraint
WHERE conname = 'your_constraint_name';

Добавьте ограничения снова при переключении, после завершения репликации и отключения источника:

ALTER TABLE your_table ADD CONSTRAINT your_constraint_name UNIQUE (column1, column2);
ALTER TABLE your_table ADD CONSTRAINT your_check_constraint_name CHECK (column1 > 0);

При репликации возникает ошибка "cannot insert a non-DEFAULT value into column"

Эта ошибка возникает, когда столбец на целевой стороне — обычно первичный ключ — определён как GENERATED ALWAYS AS IDENTITY. Логическая репликация передаёт явные значения из источника, но столбец с GENERATED ALWAYS не принимает значения, отличные от DEFAULT, поэтому операция вставки завершается ошибкой:

cannot insert a non-DEFAULT value into column "id"

Чтобы устранить эту проблему, измените столбец в целевом Postgres так, чтобы он принимал значения, указанные пользователем. Столбец identity можно переключить на GENERATED BY DEFAULT AS IDENTITY:

ALTER TABLE your_table ALTER COLUMN id SET GENERATED BY DEFAULT;

GENERATED BY DEFAULT AS IDENTITY (или столбец serial/bigserial) по-прежнему автоматически генерирует значения, если они не заданы, но, в отличие от GENERATED ALWAYS, также допускает явно заданные значения, реплицированные из источника.

Во время миграции возникает ошибка "extension is not available"

Эта ошибка возникает при автоматизированной миграции схемы (pg_dump), если исходная схема зависит от расширения Postgres, которое не установлено или недоступно в целевом Managed Postgres. Она может проявляться в одном из следующих вариантов:

ERROR: extension "your_extension" is not available
ERROR: could not open extension control file ".../your_extension.control": No such file or directory

Замените your_extension на расширение, указанное в сообщении об ошибке.

Чтобы устранить проблему, выполните одно из следующих действий:

  • Пересоздайте пайп в режиме ручного экспорта схемы, чтобы изменить схему и удалить или заменить зависимость от неподдерживаемого расширения, или
  • Обратитесь в службу поддержки, чтобы включить расширение в целевом Managed Postgres.
Navigation