11
回答
杯具了,postgresql数据未导出,有办法吗?
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

一台IBM服务器硬盘坏掉了。系统进入只读状态。

上面运行的postgresql的备份文件拷贝出来的时候,发现有几个数据库没有备份成*.sql文件,即,它们还在/var/lib/pgsql/data里面呢。

这时候,已经无法进行pg_dump操作了。于是把整个data目录拷贝出来。

在本地一台电脑上安装了postgresql,

1、把data替换掉,postgresql无法启动

2、su postgres,进去/usr/bin/postmaster -i -D /dataold(即拷贝下来的那个目录),提示对/pg_hba.conf无操作权限。也是无法启动。

3、拷贝/dataold/base下的所有文件夹,除了已经存在的1和另外两个之外,启动了,无数据

大家帮帮忙,有没有办法呢?

举报
张瑞旗
发帖于3年前 11回/826阅
共有11个答案 最后回答: 3年前

拷贝整个pgdata目录也是pg支持的一种备份方式。至于无法启动,看看pgstartup.log启动日志

也许是两台机器上postges用户的uid和gid不一致吧。用chown更新下

--- 共有 1 条评论 ---
张瑞旗这个提示太重要了,我很少用这个数据库,根本就不知道有这样一个日志存在。谢谢。请指点一下,下面我发了图片。 3年前 回复

请原谅我的无知,我根本就不知道看那个日志。

在pg_log目标下,看周六的日志,就是今天的吧?如下:

LOG:  unexpected EOF on client connection
ERROR:  column "regcode" of relation "ecfsl" already exists
ERROR:  column "optduser" of relation "ecfvd" already exists
ERROR:  column "optduser" of relation "ecfvd_edlog" already exists
ERROR:  trigger "ecfvd_delchk" for relation "ecfvd" already exists
ERROR:  relation "vtestmacc" already exists
ERROR:  column "agent" of relation "ecfsl" already exists
ERROR:  column "optduser" of relation "ecftfl" already exists
ERROR:  trigger "ecftfl_tlog" for relation "ecftfl" already exists
ERROR:  column "optduser" of relation "ecftfd" already exists
ERROR:  trigger "ecftfd_tlog" for relation "ecftfd" already exists
LOG:  could not receive data from client: Connection timed out
LOG:  unexpected EOF on client connection
LOG:  could not receive data from client: Connection timed out
LOG:  unexpected EOF on client connection

 

LOG:  logger shutting down
FATAL:  incorrect checksum in control file

明明是180k的图片,非说超过200k了,还是上传文字吧。

求指点

#su postgres

#/usr/bin/postmaster -i -D /var/lib/pgsql/data-remote(data-remote就是下载拷贝过来的,没有备份的那个数据目录)

在pgstarup.log中的错是:FATAL:  incorrect checksum in control file

肿么办?

--- 共有 3 条评论 ---
张瑞旗回复 @mark35 : 谢谢你的提醒。 3年前 回复
张瑞旗回复 @mark35 : 都是32位的,版本有差别。新安装的是9.2.4,yum安装的,没有psql命令行工具。只好编译安装了。我把base里的拷贝过去,又拷贝了pg_control里的pg_database,可以成功启动。但是用pg_admin查看,数据库是0,base里拷贝了十几个数据库的文件。谢谢。 3年前 回复
mark35新老系统的pgsql版本是否一致(包括32/64bit区别) 3年前 回复
恢复的时候注意系统的环境和数据库的版本信息等,尽量保持一致
--- 共有 2 条评论 ---
kenyon_君羊回复 @张瑞旗 : 把原先的DATA目录重命名,再把拷贝过来的DATA拿过来恢复,先把数据库恢复出来在说,如果表空间另外分配的也要注意一下恢复 3年前 回复
张瑞旗 好像有人说,data目录下有些要保留,有些可以替换,有没有具体的清单呢?请指教。 3年前 回复
现在如何了?@ 张瑞旗
--- 共有 1 条评论 ---
张瑞旗谢谢关心,还没有导出来。我拷贝了base下面的文件夹到新安装的postgresql下,可以启动了。但是在pg_admin里显示有0个数据库。 3年前 回复
不行。Postgres这一点不好。mysql很直观的,数据库名就是文件夹名称。
--- 共有 3 条评论 ---
mark35mysql文件恢复要简单些,直接拷贝进去就可以用。pgsql要繁琐些,直接拷贝进去不能用 3年前 回复
mark35pgsql和mysql都支持文件级别的备份(即拷贝目录)。mysql的都在一个目录下面好复制,pgsql的除了base下面的,xlog下面的可能也需要(如果进程异常退出有未提交和写入的事务) 3年前 回复
kenyon_君羊PG的数据库是按文件夹分类的,一般是以数字为标识,和MYSQL异曲同工。很奇怪你整个拷贝过去怎么启动了会没显示DB呢,详细的日志贴一下看看 3年前 回复

引用来自“张瑞旗”的评论

不行。Postgres这一点不好。mysql很直观的,数据库名就是文件夹名称。

好了,导出来了!

你说要保持版本一致,我没当回事。

昨天万般无奈之下,才想到试一试。还有另外一台服务器跟那台坏掉一样的版本,于是查了版本号是8.1.23。于是在本地一台服务器安装8.1.23后:

1)service postgresql stop,先停掉它。

2)cp -r /somewhere/data/* /usr/local/pgsql/data,把原先备份的那个整个data目录拷过来,替换掉安装后生成的data。这个是我手动安装的目录。缺省安装的目录文件放得到处都是,不喜。

3)cd /usr/local/pgsql/data

4)chown -R postgres:postgres ./* 把本目录下所文件的权限授予postgres用户,postgres用户组。

5)vi pg_hba.conf,添加 host    all     all     192.168.1.0/24   md5

是不是192.168.1.0,或者是192.168.0.0或者168.XX.XX.XX视局域网设置而定

6)重启Postgresql,再用pg_admin连接上去,数据库都好好的。这一次发现有10个数据库没有备份,并非是3个。

好惊险。很高兴,来这里汇报一下,看看是不是对其他有帮助。

谢谢你和几位不厌其烦地指导,谢谢!

--- 共有 1 条评论 ---
张瑞旗kenyon_君羊,谢谢。引用评论,结果还是我自己的评论。 3年前 回复
顶部