PostgreSQL - 如何恢复非常大的数据库

问题描述 投票:0回答:3

当我尝试在我的开发数据库节点上恢复大型数据库(自定义格式的近 32Go)时遇到了一些问题(该节点的 RAM、CPU...比我的生产服务器少)。

我的数据库转储是使用类似于以下的命令生成的:

pg_dump -F custom -b myDB -Z 9 > /backup/myDB-`date +%y%m%d`.pg91

当我恢复它时,我使用了以下命令:

pg_restore -F custom -j 5 -d myDB /backup/myDB-20130331.pg91

但是在这里,每次恢复命令都会失败,并出现如下错误:

pg_restore: [archiver (db)] error returned by PQputCopyData: server closed the connection unexpectedly
This probably means the server terminated abnormally
    before or while processing the request.
pg_restore: [archiver] worker process failed: exit code 1
pg_restore: [archiver (db)] error returned by PQputCopyData: server closed the connection unexpectedly
This probably means the server terminated abnormally
    before or while processing the request.
pg_restore: [archiver (db)] error returned by PQputCopyData: server closed the connection unexpectedly
This probably means the server terminated abnormally
    before or while processing the request.
pg_restore: [archiver (db)] error returned by PQputCopyData: server closed the connection unexpectedly
This probably means the server terminated abnormally
    before or while processing the request.

当我检查我的 postgresql 日志时,我可以读到:

   HINT:  In a moment you should be able to reconnect to the database and repeat your command.
   LOG:  all server processes terminated; reinitializing
   LOG:  database system was interrupted; last known up at 2013-04-02 11:41:48 UTC
   LOG:  database system was not properly shut down; automatic recovery in progress
   LOG:  redo starts at 86/26F302B0
   LOG:  unexpected pageaddr 85/E3F52000 in log file 134, segment 38, offset 16064512
   LOG:  redo done at 86/26F51FC0
   LOG:  last completed transaction was at log time 2013-04-02 11:50:47.663599+00
   LOG:  database system is ready to accept connections
   LOG:  autovacuum launcher started

很奇怪,我的 postgresql 服务器仅仅因为我的恢复而单独“重新启动”。 我尝试尽量减少工作数量(

-j 5
选项),但仍然遇到同样的问题。 然而,在具有更好规格的节点上,我可以毫无问题地恢复该数据库。 我不确定,但也许我的索引的更新(其中一个确实太大)可能是理解这个问题的线索?

所以我有一些问题:有没有更好的方法来恢复非常大的数据库?我是否遗漏了 pg_restore 命令中的某些内容?可能是我的开发服务器设置太低了?

任何线索将不胜感激。 预先感谢。

env:PostgreSQL 9.1(通过 Debian 软件包安装)

postgresql postgresql-9.1 restore dump pg-restore
3个回答
19
投票

对于这种大型工作,建议在恢复过程中禁用

autovacuum
(在
postgresql.conf
中将其设置为 off)。

看来它终于对我有用了。


0
投票

我在 pg_restore 中遇到了同样的错误。 当我查看 postgres 日志时,我发现我的磁盘大小(位于容器化数据库中)已 100% 已满。


0
投票

这已经在评论中告诉过,但我认为这值得一个单独的答案:

alter system set autovacuum = off

因为其他流程可能会出现其他问题;恢复后打开它可能会更好

alter system set autovacuum = on
© www.soinside.com 2019 - 2024. All rights reserved.