我用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是否有任何限制,除了它必须在复制集群中是唯一的?
答案 0 :(得分:1)
有限制吗?
没有硬性限制,除了它应该是int
。
但为什么会失败?
如图所示,由于这些ID的存储方式,使用高ID会耗尽一些内存。根据{{3}}:
请注意,Slony-I生成一个内存数组,指示所有完全限定的表名;如果使用大型表ID号,那么使用稀疏的阵列可能会导致大量内存浪费。每个可能的表ID都使用指向char的指针,通常在32位体系结构上每个表ID占4个字节,在64位体系结构上每个表ID占8个字节。
这意味着,如果您为100个表生成一组ID最大的ID,例如5000,那么slony 将(尝试)创建一个能够容纳5000个表的数组条目。只有4900个条目未被使用。
对于ID为2015051162
,您必须为此阵列保留4个字节(32位)的空间* 2015051162 =约8GB,因此段错误可能只是对操作系统的未填充请求记忆。