从已装入的卷恢复PostgreSQL数据库

时间:2012-03-30 08:46:39

标签: database postgresql amazon-web-services hard-drive

我的EC2数据库服务器失败,阻止了SSH或其他访问(不确定为什么...... grrr AWS ......这是另一个故事)。

我能够制作EBS根卷的快照。我无法从此卷启动新实例(我猜测启动分区已损坏)。但是,我可以在新实例上附加和装载卷。

现在我需要在新机器(Ubuntu 10.04)上安装PostgreSQL 8.4以从已安装的卷加载数据。这可能吗?我试过了:

pg_ctl start -D /<mount_dir>/etc/postgresql/8.4/main/

但没有快乐...... PostgreSQL只是从空表开始。

/etc/postgresql/8.4/main/是PostgreSQL数据文件的正确位置吗?

有没有办法以PostgreSQL可以再次读取的方式从挂载的卷恢复数据?

1 个答案:

答案 0 :(得分:5)

(您应该使用此类系统管理员问题指定您的发行版和版本等。)

如上所示,通过pg_ctl运行Pg应该有效,假设原始数据库来自Pg 8.4,那么您尝试使用它来启动它的二进制文件也是如此。也许你忘了停止由发行版自动启动的PostgreSQL实例?或者连接在错误的端口上,所以你在另一个端口(或不同的unix套接字路径,unix套接字)上得到了发行版的默认实例而不是你的数据库?

就我个人而言,我不会做你正在做的事情。首先,在我做任何其他事情之前,我整个数据目录进行完整备份,因为您显然没有良好的备份,否则您将不会担心这个。现在就拿走它们吧,因为如果你在恢复的过程中打破了某些东西,你就会恨自己。正如此故障所证明的那样,信任亚马逊的存储(快照或其他)可能还不够好。

完成上述操作后:恢复数据库的最简单方法是,在知道的新实例上,您没有任何重要数据,相同原始实例安装的postgresql的 主要 版本(例如“8.4”或“9.0”):

/etc/init.d/postgresql-8.4 stop 
datadir=/var/lib/postgresql/8.4/main
rm -rf "$datadir"
cp -aR /<mount_dir>/etc/postgresql/8.4/main/ "$datadir"
chown -R postgres:postgres "$datadir"
/etc/init.d/postgresql-8.4 start

换句话说:拿一份副本,修复权限,启动数据库。

您可能需要修改/etc/postgresql/8.4/main/postgresql.conf和/或/etc/postgresql/8.4/main/pg_hba.conf,因为您对原件所做的任何修改都不再存在;他们在你腐败的根FS上。数据库中的postgresql.confpg_hba.conf只是Debian中等等的符号链接 - 我理解背后的理由,但不爱。

一旦你开始运行,立即执行pg_dumpall 和/或只是重要数据库的pg_dump,然后将其复制到安全的地方。