Как удалить стол из slony

У меня есть база данных, резервная копия которой создается slony. Я удалил таблицу из реплицированной БД и заново создал ту же таблицу, используя сценарии sql, и ничего, используя сценарии slony.

Я нашел это в сообщении и попробовал:

  1. Воссоздать таблицу
  2. Получите OID для воссозданной таблицы: SELECT OID from pg_class WHERE relname = <your_table>' AND relkind = 'r';
  3. Обновите tab_reloid в sl_table для проблемной таблицы.
  4. Выполните SET DROP TABLE ( ORIGIN = N, ID = ZZZ);, где N — это УЗЕЛ # для ГЛАВНОГО, а ZZZ — это идентификатор # в sl_table.

Но, похоже, это не работает.

Как удалить таблицу из реплицированной БД? Или есть способ использовать вновь созданную таблицу вместо старой?


person user88071    schedule 09.02.2011    source источник


Ответы (2)


Официальная документация по удалению вещей из Slony находится здесь.

Не совсем понятно, в каком состоянии были вещи до того, как вы запустили приведенные выше команды, и вы не уточнили, что «похоже, не работает».

Есть одна существенная ошибка, которую я знаю, связанная с удалением таблиц из репликации с помощью Slony. После того, как вы удалите таблицу из репликации, у вас могут возникнуть проблемы с физическим удалением таблицы на подчиненных устройствах (но не на главном) с помощью Slony 1.2, что приведет к загадочной ошибке, подобной этой:

ERROR:  "table_pkey" is an index

Это может быть исправлено в Slony 2.0, но проблема здесь в том, что существует связь ссылочной целостности между нереплицируемой таблицей на ведомом устройстве и реплицируемой таблицей, а slony 1.2 преднамеренно испортил некоторые системные таблицы как часть своего дизайна, вызывая это. проблема.

Решение — запустить команду «DROP TABLE» через slonik_execute_script. Если вы уже физически сбросили таблицу на ведущем, вы можете использовать опцию «EXECUTE ONLY ON», чтобы запустить команду только на определенном ведомом. Подробнее см. в документации по ВЫПОЛНЕНИЕ СЦЕНАРИЯ.

person Community    schedule 03.11.2011

вы удалили таблицу из базы данных, но не удалили ее из таблицы _YOURCLUSTERNAME.sl_table.

Важно использовать "_" перед YOURCLUSTERNAME.

4 ШАГА, чтобы решить проблему:

<сильный>1. Получить tab_id

выберите tab_id из _YOURCLUSTERNAME.sl_table, где tab_relname='MYTABLENAME' и tab_nspname='MYSCHEMANAME'

Он возвращает номер 2 в MYDATABASE

<сильный>2. Удалить триггеры

выберите _YOURCLUSTERNAME.altertablerestore(2);

Это может вернуть ошибку. Т.к. пытается удалить триггеры в исходной таблице, а теперь там новая. <сильный>3. Удалить индекс slony, если он был создан

выберите _YOURCLUSTERNAME.tableDropKey(2); Это может вернуть ошибку. Т.к. пытается удалить индекс в исходной таблице, а теперь есть новая таблица.

<сильный>4. Удалить таблицу из sl_table

удалить из таблицы _YOURCLUSTERNAME.sl_table, где tab_id = 2;

Лучший способ удалить таблицу:

<сильный>1. Удалите таблицу из кластера:

выберите tab_id из _YOURCLUSTERNAME.sl_table, где tab_relname='MYTABLENAME' и tab_nspname='MYSCHEMANAME'

Он возвращает номер 2 в MYDATABASE

Выполнить с помощью slonik ‹ myfile.slonik

где myfile.slonik: имя кластера=MYCLUSTER; NODE 1 ADMIN CONNINFO = 'dbname=DATABASENAME host=HOST1_MASTER user=postgres port=5432'; NODE 2 ADMIN CONNINFO = 'dbname=DATABASENAME host=HOST2_SLAVE user=postgres port=5432';

SET DROP TABLE (id = 2, origin = 1);

2 — это tab_id из sl_table, а 1 — это NODE 1, HOST1_MASTER.

<сильный>2. Удалить таблицу из ведомого

с SQL DROP TABLE

person Oscar Raig Colon    schedule 28.03.2012