Как мне сбросить таблицу со слона - PullRequest
1 голос
/ 09 февраля 2011

У меня есть база данных, резервное копирование которой осуществляется с помощью 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 - это NODE # для MASTER, а ZZZ - это ID # в sl_table.

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

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

Ответы [ 2 ]

1 голос
/ 28 марта 2012

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

Это важно de "_" перед YOURCLUSTERNAME.

4 ШАГИ крешить беспорядок:

1.Получите tab_id

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

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

2.Триггеры удаления

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

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

select _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: имя кластера = MYCLUSTER;NODE 1 ADMIN CONNINFO = 'имя_базы = имя_базы_данных_ хоста = пользователь HOST1_MASTER = порт postgres = 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

1 голос
/ 03 ноября 2011

Авторитетная документация по сбросу вещей из Slony: здесь .

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

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

ERROR:  "table_pkey" is an index

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

Решение состоит в том, чтобы выполнить команду «DROP TABLE» через slonik_execute_script. Если вы уже физически сбросили таблицу на ведущем устройстве, вы можете использовать опцию «ВЫПОЛНИТЬ ТОЛЬКО ВКЛЮЧЕНО», чтобы выполнить команду только для определенного ведомого устройства. См. Документы для EXECUTE SCRIPT для деталей.

...