如何从slony中删除表

时间:2011-02-09 17:02:17

标签: slony

我有一个由slony备份的数据库。我从复制的数据库中删除了一个表,并使用sql脚本重新创建了同一个表,而没有通过slony脚本创建任何表。

我在帖子上找到了这个并试了一下:

  1. 重新制作表格
  2. 获取重新创建的表格的OID:SELECT OID from pg_class WHERE relname = <your_table>' AND relkind = 'r';
  3. 更新问题表的sl_table中的tab_reloid。
  4. 执行SET DROP TABLE ( ORIGIN = N, ID = ZZZ);其中N是MASTER的NODE#,ZZZ是sl_table中的ID#。
  5. 但它似乎不起作用。

    如何从复制的数据库中删除表格?或者有没有办法使用新创建的表代替旧表?

2 个答案:

答案 0 :(得分:1)

关于从Slony丢弃内容的权威文档是here

在您运行上述命令之前,状态尚不清楚并且您尚未明确“似乎无法正常工作”。

我知道有一个重要的“问题”是使用Slony从复制中删除表。从复制中删除表后,您可能无法使用Slony 1.2实际上将表丢弃在从属服务器上(但不在主服务器上),这样会产生一个神秘的错误:

ERROR:  "table_pkey" is an index

这可以在Slony 2.0中修复,但这里的问题是从属服务器上的未复制表与复制表之间存在引用完整性关系,并且slony 1.2故意破坏了系统表,作为其设计的一部分,导致这个问题。

解决方案是通过slonik_execute_script运行“DROP TABLE”命令。如果您已经在主服务器上物理删除了表,则可以使用“EXECUTE ONLY ON”选项仅在特定从服务器上运行该命令。有关详细信息,请参阅EXECUTE SCRIPT的文档。

答案 1 :(得分:1)

您已从数据库中删除了表,但尚未从_YOURCLUSTERNAME.sl_table中删除。

在YOURCLUSTERNAME之前,它是重要的“_”。

4步解决问题:

<强> 1。获取tab_id

从_YOURCLUSTERNAME.sl_table中选择tab_id,其中tab_relname ='MYTABLENAME'和tab_nspname ='MYSCHEMANAME'

它在MYDATABASE中返回2号

<强> 2。删除触发器

选择_YOURCLUSTERNAME.altertablerestore(2);

这可能会返回错误。因为它试图删除原始表中的触发器,现在有一个新的触发器。 第3。如果已创建,则删除slony索引

选择_YOURCLUSTERNAME.tableDropKey(2); 这可能会返回错误。 因为它试图删除原始表中的索引,现在有一个新表。

<强> 4。从sl_table

中删除表格

从_YOURCLUSTERNAME.sl_table中删除tab_id = 2;

删除表格的最佳方式是:

<强> 1。从群集中删除表格:

从_YOURCLUSTERNAME.sl_table中选择tab_id,其中tab_relname ='MYTABLENAME'和tab_nspname ='MYSCHEMANAME'

它在MYDATABASE中返回2号

执行slonik&lt; myfile.slonik

其中myfile.slonik是: cluster name = 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是sl_table的tab_id,1是NODE 1,HOST1_MASTER

<强> 2。从奴隶中删除表格

使用SQL DROP TABLE