如何在不使用pg_dump和不重新生成索引的情况下在安装之间复制单个Postgres数据库?
我们部署了一个应用程序,它在Linux中使用Postgres 8.4.7数据库。我们有一个相当大的静态数据集(4GB),它是索引的。
使用pg_dump,一旦数据恢复到第二个Postgres实例,我们就必须对其进行索引。索引这些数据可能需要80分钟,所以我们宁愿使用已经生成的索引来部署数据库。
从postgres文档来看,数据库似乎包含在基于OID的postgresql/8.4/main/base下的子目录中。
我的第一次尝试是在Postgres中创建一个空数据库,关闭实例,然后将数据从现有实例复制到空数据库的OID目录中。这失败了,因为我的索引不起作用。预成型真空给了我以下错误:
WARNING: PD_ALL_VISIBLE flag was incorrectly set in relation "pg_type" page 6
WARNING: PD_ALL_VISIBLE flag was incorrectly set in relation "pg_depend" page 39
ERROR: xlog flush request 0/8B199518 is not satisfied --- flushed only to 0/8AF81680
CONTEXT: writing block 39 of relation base/17004/2608
发布于 2012-11-06 02:50:28
如果要在集群中复制完整的PostgreSQL数据库,最快的方法是在CREATE DATABASE
语句中将其作为TEMPLATE
使用。我引用手册:
默认情况下,将通过克隆标准系统数据库template1创建新数据库。可以通过编写模板名称来指定不同的模板。特别是,通过编写模板template0,您可以创建一个仅包含PostgreSQL版本预定义的标准对象的原始数据库。如果您希望避免复制可能添加到template1中的任何安装本地对象,这是非常有用的。
CREATE DATABASE db_copy TEMPLATE db_org;
这可以有效地复制底层文件,就像您手动尝试的那样。不过,那就是把一切都设置好才能正常工作。
在做(取决于)之前,您可能想要清理您的原始版本:
VACUUM FULL ANALYZE;
https://dba.stackexchange.com/questions/28223
复制相似问题