1

我有一个由 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);where Nis the NODE # for the MASTER, and ZZZ is the ID # in sl_table

但这似乎不起作用。

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

4

2 回答 2

1

关于从 Slony 中删除东西的权威文档在这里

在您运行上述命令之前,尚不清楚事情处于什么状态,并且您还没有澄清“似乎不起作用”。

我知道一个重要的“陷阱”是从使用 Slony 的复制中删除表。从复制中删除表后,您可能会在使用 Slony 1.2 时实际将表物理地删除到从属服务器(但不是主服务器)上,从而得到一个如下所示的神秘错误:

ERROR:  "table_pkey" is an index

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

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

于 2011-11-03T15:28:57.337 回答
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中删除表

从 tab_id = 2 的 _YOURCLUSTERNAME.sl_table 中删除;

删除表的最佳方法是:

1. 从集群中删除表:

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

它在 MYDATABASE 中返回一个数字 2

使用 slonik < myfile.slonik 执行

其中 myfile.slonik 是:集群名称=MYCLUSTER;节点 1 ADMIN CONNINFO = 'dbname=DATABASENAME host=HOST1_MASTER user=postgres port=5432'; 节点 2 ADMIN CONNINFO = 'dbname=DATABASENAME host=HOST2_SLAVE user=postgres port=5432';

设置删除表(id = 2,origin = 1);

2 是来自 sl_table 的 tab_id,1 是 NODE 1,HOST1_MASTER

2.从slave中删除表

使用 SQL 删除表

于 2012-03-28T09:36:22.697 回答