我正在使用slony设置postgres复制。我有许多包含相同(或非常相似)表集的模式,因此我为每个模式创建单独的复制集。每个模式都有特定的唯一编号,因此这个编号成为集合的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的集合,所有内容都可以正确复制。除了在复制集群中必须是唯一的之外,表id是否有任何限制?
发布于 2015-05-29 19:19:46
有限制吗?
除了必须是int之外,没有硬性限制。
但是为什么它会失败?
看起来,由于这些it的存储方式,使用高it确实会占用一些内存。根据fine documentation
请注意,Slony-I会生成一个内存中的数组,表示所有完全限定的表名称;如果使用较大的表ID号,则很少使用的数组可能会导致大量内存浪费。每个潜在的表ID消耗一个指向字符的指针,在32位架构上,每个表ID通常占用4个字节,在64位架构上,每个表ID占用8个字节。
这意味着,如果您为100个表生成一组最大ID为5000的ID,slony将(尝试)创建一个能够容纳5000个表条目的数组。只有这4900个条目才不会被使用。
对于2015051162的ID,您必须为此数组保留4字节( 32位)* 2015051162 =大约8 8GB的空间,因此段错误可能只是针对该内存向操作系统发出的未填满的请求。
https://stackoverflow.com/questions/30525993
复制相似问题