У меня есть настройка задачи AWS DMS CDC от Oracle до Postgres.Флажок Создать таблицу восстановления установлен, и у меня есть "TaskRecoveryTableEnabled": true
в файле настроек
. Он создает awsdms_txn_state
таблицу в целевой базе данных со следующей настройкой
some_user@db => \d awsdms_txn_state
Table "some_user.awsdms_txn_state"
Column | Type | Collation | Nullable | Default
-------------+-----------------------------+-----------+----------+---------
SERVER_NAME | character varying(384) | | not null |
TASK_NAME | character varying(384) | | not null |
STATE_TIME | timestamp without time zone | | not null |
CHECKPOINT | character varying(3072) | | not null |
Indexes:
"awsdms_txn_state_task_recovery_index" UNIQUE, btree ("SERVER_NAME", "TASK_NAME")
Обратите внимание на наличие awsdms_txn_state_task_recovery_index
уникальный индекс
Теперь во время выполнения задачи CDC она непрерывно завершается с ошибкой:
[TARGET_APPLY ]E: Failed to execute statement: '' [1022502] (ar_odbc_stmt.c:2478)
[TARGET_APPLY ]E: RetCode: SQL_ERROR SqlState: 23505 NativeError: 1 Message: ERROR: duplicate key value violates unique constraint "awsdms_txn_state_task_recovery_index";, Error while executing the query [1022510] (ar_odbc_stmt.c:2484)
[TARGET_APPLY ]E: Error executing command [1022502] (streamcomponent.c:1676)
Причина очевидна.Он пытается вставить запись в эту таблицу, которая завершается с ошибкой в этом британском индексе
Удаление индекса "решает" проблему и начинает добавлять новые строки в эту таблицу
some_user@db => select * from awsdms_txn_state;
SERVER_NAME | TASK_NAME | STATE_TIME | CHECKPOINT
-----------------------+----------------------------+---------------------+--------------------------------------------------------------------------------------------------
localhost.localdomain | NM6KQWHZQL5RLONADKKONM5MCA | 2019-01-28 15:44:48 | checkpoint:V1#318064#0000002D0ABC5EB5010000010001458E00099A29016C00000000002D0ABC5D2B#0#0#*#0#73
some_user@db => drop index awsdms_txn_state_task_recovery_index;
DROP INDEX
some_user@db => \d awsdms_txn_state
Table "some_user.awsdms_txn_state"
Column | Type | Collation | Nullable | Default
-------------+-----------------------------+-----------+----------+---------
SERVER_NAME | character varying(384) | | not null |
TASK_NAME | character varying(384) | | not null |
STATE_TIME | timestamp without time zone | | not null |
CHECKPOINT | character varying(3072) | | not null |
some_user@db => select * from awsdms_txn_state;
SERVER_NAME | TASK_NAME | STATE_TIME | CHECKPOINT
-----------------------+----------------------------+---------------------+--------------------------------------------------------------------------------------------------
localhost.localdomain | NM6KQWHZQL5RLONADKKONM5MCA | 2019-01-28 15:44:48 | checkpoint:V1#318064#0000002D0ABC5EB5010000010001458E00099A29016C00000000002D0ABC5D2B#0#0#*#0#73
localhost.localdomain | NM6KQWHZQL5RLONADKKONM5MCA | 2019-02-05 11:24:02 |
localhost.localdomain | NM6KQWHZQL5RLONADKKONM5MCA | 2019-02-05 11:24:09 |
(3 rows)
Вопрос:
Какое правильное состояние для таблицы awsdms_txn_state
?
Должно ли оно всегда содержать одну запись, и теперь в CDC возникает ошибка, пытающаяся вставить новые строки вместо UPDATE?
Или в таблице ddl есть ошибка, и не должно быть определенного уникального индекса?