Ошибка вставки события WAS2 DAS (повторяющееся значение ключа нарушает уникальное ограничение) с PostgreSQL

Мы столкнулись с ошибкой в DAS (WSO2) при использовании базы данных PostgreSQL. По какой-то причине, которую мы не знаем, заполняется журнал PostgreSQL с некоторыми следами:

< 2017-02-23 14:04:52.276 CET >ERROR: relation "anx__8gohuwju" does not exist at character 15
< 2017-02-23 14:04:52.276 CET >STATEMENT: SELECT 1 FROM ANX__8GOHUwJU LIMIT 1
< 2017-02-23 14:04:52.277 CET >ERROR: relation "anx__8gaxmlni" does not exist at character 15
< 2017-02-23 14:04:52.277 CET >STATEMENT: SELECT 1 FROM ANX__8GAXMlnI LIMIT 1
< 2017-02-23 14:04:52.278 CET >ERROR: relation "anx__8gicci_y" does not exist at character 15
< 2017-02-23 14:04:52.278 CET >STATEMENT: SELECT 1 FROM ANX__8GICCI_Y LIMIT 1
...
...
...
< 2017-02-23 14:04:57.335 CET >STATEMENT: INSERT INTO ANX__7LvafTvw (partition_key, timestamp, data, record_id) VALUES ($1, $2, $3, $4)
< 2017-02-23 14:04:57.337 CET >ERROR: duplicate key value violates unique constraint "anx__7lvaftvw_pkey"
< 2017-02-23 14:04:57.337 CET >DETAIL: Key (record_id)=(770425a8-b65b-37ad-ad13-6bd45014ef9a) already exists.
< 2017-02-23 14:04:57.337 CET >STATEMENT: INSERT INTO ANX__7LvafTvw (partition_key, timestamp, data, record_id) VALUES ($1, $2, $3, $4)
< 2017-02-23 14:04:57.431 CET >ERROR: duplicate key value violates unique constraint "anx__7lvaftvw_pkey"
< 2017-02-23 14:04:57.431 CET >DETAIL: Key (record_id)=(da6cfb07-4aff-3bb2-9c71-8f3e6d749762) already exists.
< 2017-02-23 14:04:57.431 CET >STATEMENT: INSERT INTO ANX__7LvafTvw (partition_key, timestamp, data, record_id) VALUES ($1, $2, $3, $4)
< 2017-02-23 14:04:57.433 CET >ERROR: duplicate key value violates unique constraint "anx__7lvaftvw_pkey"
< 2017-02-23 14:04:57.433 CET >DETAIL: Key (record_id)=(da6cfb07-4aff-3bb2-9c71-8f3e6d749762) already exists.
< 2017-02-23 14:04:57.433 CET >STATEMENT: INSERT INTO ANX__7LvafTvw (partition_key, timestamp, data, record_id) VALUES ($1, $2, $3, $4)
< 2017-02-23 14:04:57.776 CET >ERROR: duplicate key value violates unique constraint "anx__7lvaftvw_pkey"
< 2017-02-23 14:04:57.776 CET >DETAIL: Key (record_id)=(c7c32813-51c6-34dd-8a34-e76add9839b6) already exists.
< 2017-02-23 14:04:57.776 CET >STATEMENT: INSERT INTO ANX__7LvafTvw (partition_key, timestamp, data, record_id) VALUES ($1, $2, $3, $4)*

Мы не знаем, потому что это происходит и является ли это ошибкой или ошибкой совместимости между DAS и PostgreSQL. Следы ошибок, которые появляются в журнале, повторяются каждые 5 секунд, не останавливая заполнение журналов базы данных и не останавливая работу системы.

Как видите, есть два типа ошибок:

  • "дубликат значения ключа нарушает уникальное ограничение XXX"
  • "отношение XXX не существует в символе 15"

Мы проверили его на нескольких экземплярах DAS и разных PostgresSQL, и результат один и тот же. в чем дело?

Я настроил DAS для использования базы данных PostgreSQL как для конфигурации (master-datasources.xml), так и для событий (analytics-datasources.xml). Тесты, которые мы провели, использовали PostgreSQL 9.3 и 9.6 с тем же результатом.

3 ответа

Решение

Несмотря на тревожную природу журналов, которые вы видите, насколько я могу судить, между DAS и PostgreSQL не возникает неожиданной ситуации.

Оба этих журнала ожидаются, поскольку для операций доступа к данным DAS проверяет, существует ли таблица перед фиксацией. Обычно это приводит к ошибке на стороне базы данных, если таблица не существует. Это нормально.

Кроме того, операции INSERT OVERWRITE для записей будут выполняться как INSERT, а затем, если запись уже существует (т.е. нарушение уникального ограничения), запись будет обновлена. Это связано с недоступностью оператора MERGE в PostgreSQL до версии 9.5, а также с относительными недостатками производительности при выполнении вызовов UPDATE все время.

Что касается вашего решения, раскомментирование "recordMergeQuery" вполне приемлемо, но только если вы используете PostgreSQL 9.5+. В противном случае операции записи завершатся неудачно. По этому поводу мы используем новый INSERT ... ON CONFLICT UPDATE синтаксис, предложенный Postgres (см. [2]).

Если вам нужны дальнейшие разъяснения, пожалуйста, не стесняйтесь спрашивать.

Ссылки:
[1] https://wiki.postgresql.org/wiki/SQL_MERGE
[2] https://github.com/wso2/carbon-analytics/blob/v1.3.6/features/analytics-data-connectors/org.wso2.carbon.analytics.datasource.rdbms.server.feature/src/main/resources/conf/analytics/rdbms-config.xml#L152

Проблема с "дубликатом ключа" была решена с помощью правильного запроса "recordMergeQuery". Но другая проблема с "отношением XXX не существует в символе 15" сохраняется. Мы изменили TABLE_NAME с двойными кавычками, но все равно появляется сообщение об ошибке.

Теперь в двойных кавычках журнал показывает одно и то же сообщение, поскольку таблица на самом деле не существует. Зачем? Мы не знаем, почему это происходит. Мы удалили все временные каталоги (tmp), solr, data. База данных чистая, построена с нуля.

Я обнаружил проблему и нашел решение. Проблема в том, что операция "слияния" для PostgreSQL отключена, и поэтому "вставки" завершаются неудачно, когда он должен выполнять "обновления".

Эта ошибка находится в файле "rdbms-config.xml". Тег "recordMergeQuery" в базе данных PostgreSQL комментируется.

Чтобы решить эту проблему, вы должны раскомментировать тег и изменить недопустимый запрос. Допустимый запрос:

<recordMergeQuery>INSERT INTO {{TABLE_NAME}} (partition_key, timestamp, data, record_id) VALUES (?, ?, ?, ?) ON CONFLICT (record_id) DO UPDATE SET partition_key = excluded.partition_key, timestamp = excluded.timestamp, data = excluded.data</recordMergeQuery>
Другие вопросы по тегам