如何防止PostgreSQL文件在Kali重启后被删除?服务启动异常求助
解决Kali重启后PostgreSQL无法启动及统计文件损坏警告的问题
你遇到的问题其实有两个核心原因:一是/var/run/postgresql/10-main.pg_stat_tmp/目录在重启后消失(因为/var/run是临时文件系统,重启会清空),二是手动创建的空global.stat文件不符合PostgreSQL的预期格式。下面是分步解决方法:
临时修复:立即消除警告
先清理无效的手动创建文件,让PostgreSQL重新生成合法的统计文件:
- 停止PostgreSQL服务:
sudo systemctl stop postgresql@10-main - 删除空的无效统计文件:
sudo rm /var/run/postgresql/10-main.pg_stat_tmp/global.stat - 重新启动服务,PostgreSQL会自动生成格式正确的
global.stat:sudo systemctl start postgresql@10-main
此时查看日志,应该不会再出现"corrupted statistics file"的警告了。
永久解决:重启后不再丢失目录
因为/var/run是tmpfs临时文件系统,系统重启后所有内容都会被清空,所以每次手动创建目录不是长久之计。推荐两种方案:
方案1:通过Systemd自动创建目录
修改PostgreSQL的Systemd服务配置,让服务启动前自动生成所需目录并设置正确权限:
- 编辑服务文件:
sudo nano /lib/systemd/system/postgresql@10-main.service - 在
[Service]区块下添加两行命令:ExecStartPre=/usr/bin/mkdir -p /var/run/postgresql/10-main.pg_stat_tmp ExecStartPre=/usr/bin/chown postgres:postgres /var/run/postgresql/10-main.pg_stat_tmp - 重新加载Systemd配置:
sudo systemctl daemon-reload - 重启服务验证:
sudo systemctl restart postgresql@10-main
以后重启系统,Systemd会自动帮你创建好目录,PostgreSQL启动时就能正常生成统计文件了。
方案2:将统计目录迁移到持久化位置
把统计文件目录从临时的/var/run转移到PostgreSQL的数据目录下,这样重启后文件不会丢失:
- 停止服务:
sudo systemctl stop postgresql@10-main - 创建新的持久化统计目录:
sudo mkdir -p /var/lib/postgresql/10/main/pg_stat_tmp sudo chown postgres:postgres /var/lib/postgresql/10/main/pg_stat_tmp - 编辑PostgreSQL配置文件:
sudo nano /etc/postgresql/10/main/postgresql.conf - 找到
stats_temp_directory参数,修改为新目录:stats_temp_directory = '/var/lib/postgresql/10/main/pg_stat_tmp' - 启动服务:
sudo systemctl start postgresql@10-main
这个方案更彻底,统计数据会持久化保存,同时从根源避免了临时目录的问题。
补充说明:为什么手动创建的global.stat会报错?
PostgreSQL的global.stat不是一个空文件,它存储了数据库的统计信息,有特定的二进制格式。你手动用touch创建的空文件完全不符合PostgreSQL的预期,所以会被判定为损坏,从而持续抛出警告。让PostgreSQL自己生成这个文件才是正确的做法。
内容的提问来源于stack exchange,提问作者jiggaboo 209
相关产品推荐
相关产品推荐

