PostgreSQL - Slony > FATAL ERROR: двойное значение ключа нарушает уникальное ограничение "sl_nodelock-pkey"
Просто разместите это здесь и можете помочь другим:
Я получил эту ошибку, когда некоторое время назад у нас произошел сбой, и попытался перезапустить службу репликации слонов, поскольку репликация на самом деле НЕ реплицирует данные из MASTER в SLAVE:
FATAL localListenThread: "select "_MY_DATABASE_copy".cleanupNodelock(); insert into "_MY_DATABASE_copy".sl_nodelock values ( 1, 0, "pg_catalog".pg_backend_pid()); " - ERROR: duplicate key value violates unique constraint "sl_nodelock-pkey"
DEBUG2 slon_abort() from pid=xxxx
DEBUG1 slon: shutdown requested
3 ответа
Итак, вот как я это исправлю, но это не гарантирует, что это будет работать для всех:
- Проверьте слон процесс.
~# ps aux | grep slon
Затем убейте весь процесс, выполняющий службу репликации slon, которая будет выглядеть примерно так.
~# ps aux | grep slon root 8321 0.0 0.0 6528 1568 pts/2 S+ 10:35 0:00 slon MY_SCHEMA dbname=MY_DATABASE user=postgres host=169.1.1.1 password=password
Обычно в фоновом режиме работают два процесса, и это нормально, поэтому мы должны убить этот процесс.
~# kill -9 8321
Затем снова запустите сценарий службы репликации Slon.
В нашей среде это вызвано перебоями (запланированными или незапланированными), при которых Postgres выходит из строя до демонов slon. Часто перезапуск слонов не устраняет ошибку. Что решает это:
- остановить все слоны, которые ссылаются на отказавший / перезапущенный узел (если вы можете, просто остановите все слоны через
slon_kill
; намного проще). - войти в
sl_nodelock
таблицы на главном сервере базы данных и удалите все строки с nl_nodeid, соответствующим отказавшему / перезапущенному узлу. - начать любые остановленные слоны.
Я также получил эту ошибку, и в моем случае применено третье исправление. У нас случайно был "слон" процесс, работающий над будущим рабом. Наше решение состояло в том, чтобы закрыть этот процесс, а затем перезапустить процессы "slon" на ведущем устройстве.