首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >复制具有实例间索引的Postgres数据库

复制具有实例间索引的Postgres数据库
EN

Database Administration用户
提问于 2012-11-05 19:53:53
回答 1查看 1.1K关注 0票数 3

如何在不使用pg_dump和不重新生成索引的情况下在安装之间复制单个Postgres数据库?

我们部署了一个应用程序,它在Linux中使用Postgres 8.4.7数据库。我们有一个相当大的静态数据集(4GB),它是索引的。

使用pg_dump,一旦数据恢复到第二个Postgres实例,我们就必须对其进行索引。索引这些数据可能需要80分钟,所以我们宁愿使用已经生成的索引来部署数据库。

从postgres文档来看,数据库似乎包含在基于OID的postgresql/8.4/main/base下的子目录中。

我的第一次尝试是在Postgres中创建一个空数据库,关闭实例,然后将数据从现有实例复制到空数据库的OID目录中。这失败了,因为我的索引不起作用。预成型真空给了我以下错误:

代码语言:javascript
运行
复制
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
EN

回答 1

Database Administration用户

发布于 2012-11-06 02:50:28

如果要在集群中复制完整的PostgreSQL数据库,最快的方法是在CREATE DATABASE语句中将其作为TEMPLATE使用。我引用手册:

默认情况下,将通过克隆标准系统数据库template1创建新数据库。可以通过编写模板名称来指定不同的模板。特别是,通过编写模板template0,您可以创建一个仅包含PostgreSQL版本预定义的标准对象的原始数据库。如果您希望避免复制可能添加到template1中的任何安装本地对象,这是非常有用的。

代码语言:javascript
运行
复制
CREATE DATABASE db_copy TEMPLATE db_org;

这可以有效地复制底层文件,就像您手动尝试的那样。不过,那就是把一切都设置好才能正常工作。

在做(取决于)之前,您可能想要清理您的原始版本:

代码语言:javascript
运行
复制
VACUUM FULL ANALYZE;
票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/28223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档