Настройка обработчика ошибок#
В целях отказоустойчивости при создании графа на все его соединения по умолчанию добавляется обработчик ошибок со следующими параметрами:
CONNECTION_ERROR
Действие: RETRY
Попыток реконнекта: 180
Таймаут реконнекта: 10.
Тип ошибки |
Описание ошибки |
Действия при возникновении ошибки |
Ребро применения |
|---|---|---|---|
ANY_ERROR |
Реакция на любую ошибку |
ABORT — прервать выполнение репликации |
Все ребра |
CONNECTION_ERROR |
Ошибка соединения приводящая к недоступности репликации |
ABORT — прервать выполнение репликации |
Все ребра |
DML_ERROR |
Выполнение операций, не соответствующих структуре базы-источника |
ABORT — прервать выполнение репликации |
Модуль Applier → БД приемника |
TRANSFORMATION_ERROR |
Проблемы при трансформации полей или их типов. |
ABORT — прервать выполнение репликации |
Модуль Capture → Kafka |
CONSTRAINT_VIOLATION |
Нарушений ограничений |
ABORT — прервать выполнение репликации |
Модуль Applier → БД приемника |
Типы ошибок#
При DML_ERROR обработчик фиксирует следующие виды ошибок:
Применение транзакций, не совпадающей со структурой таблицы БД приемника;
Отсутствие таблицы/колонок при применении транзакций;
Некорректный тип данных при применении транзакций.
При CONNECTION_ERROR обработчик фиксирует следующие виды ошибок:
Ошибки подключения к БД и Kafka . Сетевая проблема или проблема сервера БД, приводящая к недоступности соединения.
Ошибки соединения, возникающие при отсутствии системных топиков:
топика для хранения векторов изменений;
топика для хранения ошибок репликации;
Ошибки, возникающие при отсутствии слота/публикаций на БД источника.
При TRANSFORMATION_ERROR обработчик анализирует трансформации, настраиваемые за счет применения формул при конфигурировании маппинга колонок, и фиксирует следующие виды ошибок:
Несоответствие типов данных;
Ошибочное применение формул к объектам.
Тип ошибки CONSTRAINT_VIOLATION позволяет сконфигурировать поведение обработки:
Конфигурирование |
Описание |
Особенности конфигурирования |
|---|---|---|
Категория ошибки (subtype) |
- Нарушение первичного ключа (PK) |
- Такое конфигурирование возможно только для типа ошибки CONSTRAINT_VIOLATION; |
Категория выполняемой операции (opcode) |
- INSERT |
- Если категория выполняемой операции (opcode) не выбрана пользователем, то обработчик вызывается для всех операций (INSERT UPDATE DELETE) |
Максимальное количество ошибок (continue_max) |
- Целые, положительные числа |
- Доступно только для действия CONTINUE |
Предварительная очистка ошибок (purge_errors) |
- True/False |
- Если параметр True, то перед тем, как начать применять транзакции из trail’а, модуль применения считывает первый вектор изменений, читает из него идентификатор источника (source_id ) и удаляет командой DELETE все строки из таблицы ошибок, где значение колонки source_id равно этому идентификатору. |
При ANY_ERROR обработчик фиксирует все возможные виды ошибок:
DML_ERROR
CONNECTION_ERROR
TRANSFORMATION_ERROR
CONSTRAINT_VIOLATION
Сохранение данных некорректных транзакций#
По умолчанию ошибки записываются в топик Kafka с именем: {имя топика из Соединения Queue}-error.
Для типа ошибки CONSTRAINT_VIOLATION и действия CONTINUE для записи ошибки по умолчанию используется служебная таблица $CONFLICT_RESOLUTION_TX$, так же ошибки могу записываться в топик Kafka с именем: {имя топика из Соединения Queue}-conflict-tx, либо оба хранилища одновременно.
Настройка сохранения ошибочных транзакций.
Обработка ошибок CONSTRAINT VIOLATION
При применении изменений из trail-файла к реплике может произойти ошибка — например, при попытке вставить дублирующую строку, удалить строку, на которую ссылается другая таблица, или записать недопустимое значение.
Нарушение первичного ключа (PK) — например, вставка уже существующего ключа.
Нарушение внешнего ключа (FK) — Попытка вставить ссылку на несуществующий ключ (INSERT, UPDATE) или попытка удалить из родительской таблицы ключ, на который есть ссылка в дочерней таблице.
Невыполнение проверок — недопустимое или отсутствующее значение, которое не проходит проверку типа CHECK (включая NOT NULL).
Ошибки обрабатываются через обработчик ошибок, привязанный к модулю.
Ошибочные транзакции сохраняются в отдельное хранилище — теневую таблицу $CONFLICT_RESOLUTION_TX$.
Для создания таблицы пропишите и выполните в редакторе СУБД SQL-скрипт:
CREATE TABLE public."$CONFLICT_RESOLUTION_TX$" (
source_id bigint NOT NULL,
gradely_id bigint NOT NULL,
change_vector_seq int NOT NULL,
transaction_id bigint NOT NULL,
table_schema varchar(128) NOT NULL,
table_name varchar(128) NOT NULL,-
opcode char(1) NOT NULL,
error_code char(1) NOT NULL,
error_message text,
vector_data jsonb NOT NULL,
error_handle_action char(1) NOT NULL
PRIMARY KEY (source_id, gradely_id, change_vector_seq)
);
Ошибочные транзакции сохраняются в теневой таблице, если в поле options для соединения базы данных параметр save.skipped.tx.to.db: true.
По умолчанию save.skipped.tx.to.db: true.
По умолчанию таблица находится в схеме public.
Структура теневой таблицы:
Колонка |
Тип |
Описание |
|---|---|---|
source_id |
bigint |
ID базы-источника |
gradely_id |
bigint |
внутренний ID транзакции GraDeLy |
change_vector_seq |
int |
порядковый номер вектора изменений в транзакции |
transaction_id |
bigint |
ID транзакции |
table_schema |
varchar(128) |
Схема таблицей-приемником |
table_name |
varchar(128) |
Название таблицы-приемника |
opcode |
char(1) |
Операция (I, U, D) |
error_code |
char(1) |
Тип ошибки (F — нарушение внешнего ключа, P — нарушение первичного ключа, C — нарушение проверки значений) |
error_message |
varchar2(256) |
Человекочитаемое описание ошибки |
vector_data |
json |
JSON с содержимым вектора |
error_handle_action |
char(1) |
Тип реакции на ошибку ( A — ABORT, C — CONTINUE) |
Если указаны кластер и топик, GraDeLy может также сохранять ошибочные векторы в Kafka.
Ошибочные транзакции сохраняются в Kafka topic, если в поле options для соединения базы данных параметр save.skipped.tx.to.kafka: true.
По умолчанию save.skipped.tx.to.kafka: false.
Структура сообщения об ошибке в Kafka topic:
openapi: 3.1.0
info:
title: Error message for REP020
description: Структура сообщения об ошибке
version: 0.0.1
paths:
/:
description: Фиктивный path
components:
schemas:
LogMessage:
description: JSON, который записывается в поле сообщения
type: object
properties:
gradely_id:
description: Идентификатор транзакции, в которой произошла ошибка
type: integer
format: int64
minimum: 1
maximum: 9223372036854775807
example: 83487
source_id:
description: Источник, из которого пришло изменение
type: integer
format: int64
minimum: -9223372036854775808
maximum: 9223372036854775807
example: 87238507
opcode:
description: Код операции
type: string
enum: [ I, U, D ]
exception:
description: Ошибка, полученная драйвером jdbc
type: object
properties:
sql_state:
description: SQLException.getSQLState()
type: string
maxLength: 5
example: 0A000
vendor_code:
description: SQLException.getErrorCode()
type: integer
minimum: -9223372036854775808
maximum: 9223372036854775807
example: 600
additionalProperties: false
vector:
description: Вектор изменений
type: object
additionalProperties:
description: Описание полей
type: string
maxLength: 128
example: The event description
required: [ gradely_id, source_id, opcode, exception, vector ]
additionalProperties: false
Предусловия#
Настройка обработчика ошибок доступна пользователю с ролью APPADMIN.
Операции с обработчиком ошибок#
Сценарии работы обработчика ошибок#
Сценарии работы при ошибке TRANSFORMATION_ERROR#
Описание |
Действие при ошибке |
Сценарий |
|---|---|---|
Остановка репликации, в случае некорректно примененной формулы для трансформации маппинга колонок на модуле захвата. |
ABORT |
В GUI подготавливается граф репликации; |
В случае некорректного применения формулы трансформации маппинга колонок на модуле применителе, репликация данных не останавливается, ошибка фиксируется в топике Kafka и таблице ошибок на БД приемнике |
CONTINUE |
В GUI подготавливается граф репликации; |
Сценарии работы при ошибке DML_ERROR#
Описание |
Действие при ошибке |
Сценарий |
|---|---|---|
Остановка репликации в случае применения транзакции на таблицу с некорректной структурой данных, ошибка фиксируется в топике Kafka |
ABORT |
В GUI подготавливается граф репликации; |
В случае применения транзакции на таблицу с некорректной структурой данных, репликация данных не останавливается, ошибка фиксируется в топике Kafka и таблице ошибок на БД приемнике |
CONTINUE |
В GUI подготавливается граф репликации; |
Сценарии работы при ошибке CONSTRAINT_VIOLATION#
Сценарий работы обработчика ошибок при нарушении уникальности (UNIQUE):
Описание |
Действие при ошибке |
Сценарий |
|---|---|---|
Остановка репликации, в случае если поле в целевой таблице имеет ограничение UNIQUE, а реплицируемые данные уже существуют в колонке — возникнет нарушение ограничения |
ABORT |
В GUI подготавливается граф репликации; |
В случае применения транзакции, данные которой уже существует в колонке таблицы применителя, репликация данных не останавливается, ошибка фиксируется в топике Kafka и таблице ошибок на БД приемнике |
CONTINUE |
В GUI подготавливается граф репликации; |
Сценарий работы обработчика ошибок при нарушении внешнего ключа (FOREIGN KEY):
Описание |
Действие при ошибке |
Сценарий |
|---|---|---|
Остановка репликации, если реплицируемые данные содержат значения внешних ключей, отсутствующих в родительской таблице |
ABORT |
В GUI подготавливается граф репликации; |
В случае применения транзакции, данные которой содержат значения внешних ключей, отсутствующих в родительской таблице, репликация данных не останавливается, ошибка фиксируется в топике Kafka и таблице ошибок на БД приемнике |
CONTINUE |
В GUI подготавливается граф репликации; |
Сценарий работы обработчика ошибок при невозможности хранения пустого значения (NOT NULL):
Описание |
Действие при ошибке |
Сценарий |
|---|---|---|
Остановка репликации, если реплицируемый набор данных содержит null-значения, при этом целевое поле не допускает пустых значений |
ABORT |
В GUI подготавливается граф репликации; |
В случае применения транзакции, данные которой содержат null значения, при этом целевое поле не допускает пустых значений, репликация данных не останавливается, ошибка фиксируется в топике Kafka и таблице ошибок на БД приемнике |
CONTINUE |
В GUI подготавливается граф репликации; |
Сценарии работы при ошибке CONNECTION_ERROR#
Сценарий работы обработчика ошибок при ошибке соединения к БД источнику:
Описание |
Действие при ошибке |
Сценарий |
|---|---|---|
Остановка и возобновление репликации после восстановления соединения к БД источнику |
RETRY |
В GUI подготавливается граф репликации; |
Остановка репликации при ошибке соединения к БД источнику |
ABORT |
В GUI подготавливается граф репликации; |
Сценарий работы обработчика ошибок при недоступности кластера Kafka:
Описание |
Действие при ошибке |
Сценарий |
|---|---|---|
Остановка и возобновление репликации после восстановления соединения к кластеру Kafka |
RETRY |
В GUI подготавливается граф репликации; |
Остановка репликации при ошибке соединения к кластеру Kafka |
ABORT |
В GUI подготавливается граф репликации; |
Сценарий работы обработчика ошибок при недоступности системных топиков:
Описание |
Действие при ошибке |
Сценарий |
|---|---|---|
Остановка репликации при удалении системных топиков в Kafka, с последующем восстановлении работы при создании топиков |
RETRY |
В Kafka изменяется параметр автосоздания топиков на False |
Остановка репликации при отсутствии системных топиков в Kafka |
ABORT |
В GUI подготавливается граф репликации; |
Сценарий работы обработчика ошибок при удалении слота БД-источника:
Описание |
Действие при ошибке |
Сценарий |
|---|---|---|
Остановка репликации при удалении слота БД-источника, с последующем восстановлении работы при восстановлении слота |
RETRY |
В GUI подготавливается граф репликации; |
Остановка репликации при отсутствии слота БД-источника |
ABORT |
В GUI подготавливается граф репликации; |
Сценарий работы обработчика ошибок при удалении публикации БД-источника:
Описание |
Действие при ошибке |
Сценарий |
|---|---|---|
Остановка репликации при удалении публикации БД-источника |
RETRY |
В GUI подготавливается граф репликации; |
Сценарии работы при ошибке ANY_ERROR#
Тип ANY_ERROR реагирует на любую ошибку, появившуюся в процессе репликации. При этом в топике Kafka и таблице для записей ошибок присутствует информация о не примененных транзакциях.