0

我正在使用 slony 设置 postgres 复制。我有许多包含相同(或非常相似)表集的模式,因此我为每个模式创建单独的复制集。每个模式都有特定的唯一编号,因此该编号成为集合的 id。

然后我将表添加到复制中。据我所知,每个表都必须在所有表中具有唯一的 ID。因为每个月都会创建表,所以表的 id 由年、月和集合 id 连接而成。一切正常,但是当 set id 有四位数字时(例如,表 id 将是:)2015051162,在将表添加到复制后给我一个错误:

 2015-05-29 10:09:20 CEST INFO   remoteWorkerThread_1: syncing set 101162 with 1 table(s) from provider 1
 2015-05-29 10:09:22 CEST CONFIG slon: child terminated signal: 11; pid: 18738, current worker pid: 18738
 2015-05-29 10:09:22 CEST CONFIG slon: restart of worker in 10 seconds

在我看来,这个表 id 太大了,因为对于具有个位数 id 的集合,一切都正确复制。表 id 是否有任何限制,除了它在复制集群中必须是唯一的?

4

1 回答 1

1

有限制吗?

没有硬性限制,只是它应该是int.

但为什么会失败?

看起来,由于这些 ID 的存储方式,使用高 ID 确实会占用一些内存。根据精美的文档

请注意,Slony-I 会生成一个内存数组,指示所有完全限定的表名;如果您使用较大的表 ID 号,使用稀疏的数组会导致大量内存浪费。每个潜在的表 ID 使用一个指向 char 的指针,通常在 32 位架构上每个表 ID 需要 4 个字节,在 64 位架构上每个表 ID 需要 8 个字节。

这意味着,如果您为 100 个表生成一组最大 ID 为 5000 的 ID,则 slony(尝试)创建一个能够容纳 5000 个表条目的数组。只是,这 4900 个条目将未被使用。

对于您的 ID,2015051162您必须为该数组保留 4 个字节(32 位)* 2015051162 = 大约 8GB 的​​空间,因此段错误可能只是对操作系统对该内存的未填充请求。

于 2015-05-29T11:19:46.317 回答