我在 Gentoo/Linux 2.6.14r5 上使用 PostgreSQL 8.1。我的数据库服务器的磁盘空间如下所示:
db postgresql # df -l
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 9775248 2018528 7756720 21% /
udev 1557872 88 1557784 1% /dev
shm 1557872 0 1557872 0% /dev/shm
/dev/sda4 281096760 244270836 36825924 87% /var/lib/postgresql
/dev/sdb1 961402192 244780080 667785712 27% /mnt/sdb1
无法重启 ./etc/init.d/postgresql,因为 /var/lib/postgresql 下的子目录 data 是空的。PostgreSQL8.1 是从 8.0 更新而来的,所以 /var/lib/postgresql 里有一个 data.old。执行 'du -b' 后,结果如下:
postgresql # du -b
471 ./.ssh
580 ./data
7697 ./paul/Fifthwindow-RogersBuck
19673 ./paul/Fifthwindow-Tattoo/Output
20633 ./paul/Fifthwindow-Tattoo
13762 ./paul/Fifthwindow-Beard/Output
14493 ./paul/Fifthwindow-Beard
3036 ./paul/Fifthwindow-Touch1/Output
10789 ./paul/Fifthwindow-Touch1
56931 ./paul
3624120 ./data.old/base/1
3624120 ./data.old/base/10792
3624120 ./data.old/base/10793
48 ./data.old/base/16394/pgsql_tmp
248802448893 ./data.old/base/16394
48 ./data.old/base/backup
248813321469 ./data.old/base
11370 ./data.old/paul/output_files
14332 ./data.old/paul
122952 ./data.old/pg_subtrans
48 ./data.old/pg_twophase
57416 ./data.old/pg_multixact/members
49224 ./data.old/pg_multixact/offsets
106736 ./data.old/pg_multixact
4880603 ./data.old/global
316494192 ./data.old/pg_clog
48 ./data.old/pg_xlog/archive_status
536872320 ./data.old/pg_xlog
48 ./data.old/pg_tblspc
249678076379 ./data.old
27023 ./scripts/cron/daily
917 ./scripts/cron/weekly
28036 ./scripts/cron
861 ./scripts/runOnce
599794 ./scripts/manual
628811 ./scripts
171463723 ./output
249850258001 .
当我执行'pg_dump -h my.host.ip.0 -p 5432 -U postgres -F t -b -v -f“/some/directory/backup.file”mydb'时,消息如下:
pg_dump: dumping contents of table _selections_by_content_last30days
pg_dump: dumping contents of table _selections_by_content_last365days
pg_dump: dumping contents of table actionlog
pg_dump: ERROR: could not count blocks of relation 1663/16394/17943: No such file or directory
pg_dump: SQL command to dump the contents of table "actionlog" failed: PQendcopy() failed.
pg_dump: Error message from server: ERROR: could not count blocks of relation 1663/16394/17943: No such file or directory
pg_dump: The command was: COPY public.actionlog (eventdetail, eventdatetime, eventtypeid, consoleid, albumid, trackid, sequenceid, sessionid, contentid, actionlogid, fileid) TO stdout;
pg_dump: *** aborted because of error
请帮助我!任何想法我都会感激不尽!
谢谢!
答案1
最后我终于搞明白了。这是因为磁盘分区文件夹1663/16394/17943
位于另一个物理硬盘上。所以我必须先将其挂载,然后再执行下一步。
那是一个非常古老的系统。幸运的是,我不再需要照顾它了。
答案2
您的 Postgres 服务器是否可以通过互联网访问?最近发布了一个 Postgres 漏洞,但自 2010 年以来版本 8.1 不再受支持,因此它没有收到安全更新。如果您的操作系统供应商不提供反向移植更新(例如 RHEL5 或 CentOS5),则使用此版本是不合理的。您的操作系统内核大约是 2006 年的——您的操作系统是否仍收到安全更新?
看起来您的系统已被入侵,所有数据都被删除了。如果您没有备份,那么我想这是无法恢复的(对于普通人来说)。如果您的数据库服务器仍在运行,您可以尝试从单个表中转储数据 - 看起来_selections_by_content_last30days
已_selections_by_content_last30days
成功转储,但actionlog
表没有。如果您的数据库仍在运行,它可能有一些打开的文件已被删除,但在它停止之前不会真正释放 - 那里可能有一些可恢复的数据。
旧 8.0 版本的数据仍然可以恢复,但这是一个复杂的操作,因为您需要编译并安装旧版本或 postgres 才能访问它。最好在另一台服务器上执行此操作 — 尽快将其复制到安全的地方!