Postgres启动时遇到只读文件系统的错误

Postgres启动时遇到只读文件系统的错误

September 20, 2020

问题与解决方法

公司内部私有云由于断电,机器没有正常关机,结果导致 Postgres 服务器启动时,报错

2020-09-09 07:22:15.296 UTC [3876] FATAL:  could not remove old lock file "postmaster.pid": Read-only file system
2020-09-09 07:22:15.296 UTC [3876] HINT:  The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again.
pg_ctl: could not start server

尝试执行下面命令去重新挂载磁盘目录

mount -o remount -w /var/lib/postgresql/

但是报错

mount: /dev/vdb is write-protected but explicit `-w' flag given

尝试另外一个命令

umount /dev/vdb

但是还是报错

umount: /var/lib/postgresql: target is busy
        (In some cases useful info about processes that
         use the device is found by lsof(8) or fuser(1).)

这样的话, 看上去由于系统没有正常关机,导致虚拟磁盘出现文件系统错误。只能通过fsck手动修复。

由于上面出现提示设备忙,则可以用下面命令查看进程号

fuser -m /var/lib/postgresql
/var/lib/postgresql:  3760c

修改命令参数后可以查看进程,同时杀掉进程

fuser -mk /var/lib/postgresql
/var/lib/postgresql:  3760c

杀掉进程后,如果控制台中的ssh连接断开了,重连即可

接着,运行命令修复磁盘

fsck.ext3 -y /dev/vdb

然后重新挂载设备

mount /dev/vdb /var/lib/postgresql/

重启服务即可

service postgresql restart

关于fsck

ext3的文件系统使用fsck.ext3,ext4文件系统使用fsck.etx4。/dev/vda3是系统/根分区。运行完毕后,reboot重启系统就恢复正常

fsck不仅可以对文件系统进行扫描,还能修正文件系统的一些问题。注意的是fsck扫描文件系统时一定要在单用户模式、修复模式或把设备umount后进行。建议在单用户模式下运行。如果扫描正常运行中的系统,会造成系统文件损坏。

文件系统扫描工具有fsck、fsck.ext2、fsck.ext3、fsck.ext4、fsck.msdos、fsck.cramfs、fsck.ext4dev、fsck.vfat。最好是根据不同的文件系统来调用不同的扫描工具,比如ext3的文件系统使用fsck.ext3,ext4文件系统使用fsck.ext4等。


参考:

最后更新于