复制(复制?导出和导入?)大型、很少更改的 postgreSQL 数据库的最简单方法

Easiest way to replicate (copy? Export and import?) a large, rarely changing postgreSQL database

我已经将大约 200 GB 的人口普查数据导入到 Windows 7 box 上的 postgreSQL 9.3 数据库中。导入过程涉及很多文件,复杂且耗时。我只是将数据库用作方便的容器。现有数据几乎不会改变,并且最多每季度使用外部数据更新一次(尽管我会更频繁地添加和修改中间结果列。我将调用数据库中的数据在我的桌面上是“主人”。所有查询都来自同一台机器,而不是远程终端。

我想将所有这些数据的副本放在其他三台机器上:两台笔记本电脑,一台 windows 7 和一台 Windows 8,以及 Ubuntu 虚拟机我的 Windows 7 桌面也是如此。我已经在每台这些机器上安装了 postgreSQL 9.3 的副本,目前没有数据。我需要能够在副本上进行读写操作。如果子数据库中的更改不会向后传播到我桌面上的主数据库,那没关系,而且我确实更愿意这样做。我想每年更新主人的女儿 1 到 4 次。如果这消除了子数据库的中间结果,这不会打扰我。

我读过的大多数复制技术似乎都担心实时和不断变化的服务器的逐个事务复制,以及查询和更改的完美历史。这对我来说太过分了。有没有一种方法可以通过将某些文件从一个 postgreSQL 实例复制到另一个实例来进行复制? (如果复制是特定复制形式的名称,我想问的是更通用的问题)。或者也许通过从主服务器的备份文件中恢复每个(空)实例?或者要求 postgreSQL 创建和导出(最好在外部硬盘驱动器上)某种 postgreSQL 二进制数据,另一个 postgreSQL 实例可以导入,而无需我再次定义所有表和数据类型等等?

这个问题的动机也是因为我想解决一个非常慢的家庭 wifi/lan 设置——文件复制到外部硬盘驱动器的速度的十分之一或更少。因此,如果有一种直接的方法可以通过传输(最好是压缩的)二进制文件将导入的数据从一台机器获取到另一台机器,那么这最适合我的情况。

虽然您可以像 Nick Barnes 在上面的评论中提到的那样直接复制数据目录,但我建议使用 pg_dump and pg_restore 的组合,这将转储一个独立的文件,然后可以将其分散到其他副本。

您可以 运行 pg_dump 在 master 上获取数据库的转储。我建议使用选项 -Fc -j3 来使用自定义二进制格式(而不是以 SQL 格式转储;这应该小得多,也许也更快)并且一次转储 3 个表(这可以根据您机器的磁盘吞吐能力和它拥有的内核数量进行上下调整。

然后你运行dropdb就复制一份,createdb重新创建一个同名的空DB,然后运行 pg_restore 在新的空数据库上将转储文件恢复到数据库。您可能希望使用选项 -d <dbname> -f <dump_file> -j3(再次根据机器的能力调整 -j 的数量)。

当您想使用主数据库中的新内容刷新副本时,只需重复上述步骤