PostgreSQL - Slony › ФАТАЛЬНАЯ ОШИБКА: повторяющееся значение ключа нарушает уникальное ограничение sl_nodelock-pkey

Просто опубликуйте это здесь и может помочь другим:

Я получил эту ошибку, когда некоторое время назад произошел сбой, и я попытался перезапустить службу репликации slon, поскольку репликация на самом деле НЕ реплицирует данные с 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

person Experiment.Fail.Learn.Repeat.    schedule 15.09.2010    source источник


Ответы (3)


В нашей среде это вызвано простоями (запланированными или незапланированными), когда Postgres падает раньше демонов slon. Часто перезапуск slons не устраняет ошибку. Что решает это:

  1. остановите все slon, которые ссылаются на неисправный/перезапущенный узел (если можете, просто остановите все slon через slon_kill; намного проще).
  2. перейдите в таблицу sl_nodelock на главном сервере базы данных и удалите все строки с nl_nodeid, соответствующим отказавшему/перезапущенному узлу.
  3. запускать любые остановленные слоны.
person Zac B    schedule 14.02.2012

Я также получил эту ошибку, и в моем случае было применено третье исправление. У нас случайно был запущен процесс 'slon' на будущем рабе. Наше решение состояло в том, чтобы закрыть этот процесс, а затем перезапустить процессы slon на мастере.

person Mark Stosberg    schedule 26.10.2012
comment
Это похоже на проблему, которая у меня была. Мы клонировали производственный узел (ВМ), чтобы отключить промежуточную базу данных, и тот, кто это сделал, не убил процессы slon, когда они были завершены. Это, в сочетании с решением Zac B (хотя я удалил только то, что вызывало проблему), исправило это для меня. - person Kristopher; 10.06.2013

Итак, вот как я это исправляю, но это не гарантирует, что это сработает для всех:

  • Проверьте процесс slon. ~# 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 replicatin.


person Community    schedule 15.09.2010
comment
Это решение не сработало для меня. Когда я перезапустил сторожевой таймер, ошибка осталась. - person Kristopher; 10.06.2013