postgres将数据库复制到另一台服务器可减少数据库大小

时间:2014-02-24 09:59:10

标签: postgresql postgresql-9.1

在机器中安装了postgres 9.1。

最初数据库大小为7052 MB,然后我使用以下命令复制到另一台服务器。

pg_dump -C dbname | bzip2 | ssh  remoteuser@remotehost "bunzip2 | psql dbname"

成功复制后,在目标计算机上检查大小,显示为6653 MB。

然后我检查表计数相同。

数据丢失了吗?是否缺少数据?

注意: 两台机器具有相同的硬件和软件配置。

我用过:

SELECT pg_size_pretty(pg_database_size('dbname'));

2 个答案:

答案 0 :(得分:3)

看起来很正常。恢复后数据库通常较小,因为新创建的b树索引比插入逐步构建的索引更紧凑。此外,UPDATEDELETE会在表格中留下空白区域。

所以你没什么值得担心的。您会发现,如果您从旧数据库中分离SQL转储并从刚刚恢复的数据库中获取转储,除了注释之外,它们将是相同的。

答案 1 :(得分:3)

PostgreSQL最复杂的功能之一是所谓的多版本并发控制(MVCC),这是一种避免数据库中同一对象的读写冲突的标准技术。 MVCC保证每个事务通过读取由并发事务修改的对象的非当前数据来查看数据库的一致视图。感谢MVCC,PostgreSQL具有出色的可扩展性,强大的热备份工具以及与最先进的商业数据库相当的许多其他优秀功能。

不幸的是,MVCC存在一个缺点,数据库往往会随着时间的推移而增长,有时可能会出现问题。在PostgreSQL的最新版本中,有一个名为autovacuum守护程序(pg_autovacuum)的独立服务器进程,其目的是使数据库大小合理。它通过尝试恢复数据库文件的可重用块来实现。尽管如此,有许多场景会迫使数据库增长,即使其中有用数据的数量没有真正改变。如果在使用数据库的应用程序中有大量UPDATE和/或DELETE语句,通常会发生这种情况。

执行复制时,可以恢复无关的空间,因此复制的数据库会显得较小。