awsdms_txn_state - двойное значение ключа нарушает уникальное ограничение "awsdms_txn_state_task_recovery_index" - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть настройка задачи 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 есть ошибка, и не должно быть определенного уникального индекса?

...