2015-05-29 54 views
0

我正在用slony设置postgres复制。我有很多包含相同(或非常相似)的表的模式,所以我为每个模式创建单独的复制集。每个模式都有特定的唯一编号,所以这个编号成为该组的编号。slony中表id的局限性是什么?

然后我添加表复制。据我所知,每张桌子都必须在所有桌子上都有唯一的ID。由于表格是每月创建的,因此表格的ID将从年份,月份和集合ID进行连接。一切工作正常,但是当集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是否有任何限制,除非它在复制群集中必须是唯一的?

+0

这似乎是复制期间的错误;你有没有得到任何其他错误,slony是否接受配置,当你加载它? – knitti

+0

我没有得到任何错误,我通过日志搜索。 Slony接受创建集合,添加表来设置和订阅这个集合。 – qiubix

+0

是的,我稍后阅读文档(请参阅我的答案),此行为将适合 – knitti

回答

1

有限制吗?

没有硬限制,除了应该是int

但为什么会失败?

看起来,由于存储这些ID的方式,使用高ID会占用一些内存。按照fine documentation

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

这意味着,如果你生成的,比方说,5000 100桌的最大的ID的集ID,Slony聚(尝试)创建一个数组,这将能容纳5000个表项。只有那4900个条目才会被使用。

对于ID为2015051162,您必须保留4个字节的空间(32位)* 2015051162 =该阵列大约为8GB,因此segfault可能仅仅是针对该内存的操作系统的未填充请求。

+0

我在slony的文档中阅读了此说明,但我认为“内存浪费”不会导致段错误,只是复制会使用比实际更多的资源需要。现在我通过从广泛的值生成随机ID来解决问题,这应该足够了,因为一次不会有超过5000个表被复制。 – qiubix

+0

尽量保持您的最大ID尽可能低,请参阅我的关于100个表的5000 ID的编辑。 – knitti

+0

好吧,现在看到它为什么会导致问题。所以最好的解决方案是迭代'_cluster._sl_table'中的'tab_id'的值并选择第一个未使用的ID? – qiubix