我正在使用此查询生成虚拟数据:
INSERT INTO tbltest1 (id, kol1, kol2)
SELECT generate_series(1,10000), substr(md5(random()::text), 1, 25), substr(md5(random()::text), 1, 45)
FROM generate_series(1, 1000000);
然后,在这个过程的中间,出现了这个错误:无法写入文件“pg_wal/xlogtemp.2399”,设备上没有剩余空间。
显然,这表明我没有空间了。
psql
然后我想通过发出“ ”命令进入数据库。但是出现了这个错误“.s.PGSQL.5432”:连接到套接字“/var/run/postgresql/.s.PGSQL.5432”上的服务器失败。没有这样的文件或目录弹出。
我看到一些错误会导致这个“.s.PGSQL.5432”错误。这对我来说真的是一条死胡同。
为什么会发出 no space left 错误?为什么 WAL 文件没有被回收?我有archive_mode = off
,wal_level = logical
。WAL 应该在此设置中回收。我该怎么做才能再次打开数据库?
我看到我仍然有很多可用空间(大约 20GB 以上)我在运行在 Win 10 主机上的 VM 上运行。
它真的困扰着我。请帮忙
更新
由于没有剩余空间,postgre 似乎无法写入 pg_wal。
- 我检查使用
$root df -h
- 然后我增加空间:从 live USB (Ubuntu ISO) 启动。选择“Try Ubuntu” 打开 gparted 将 postgre 所在的 HDD 空间移动到磁盘末尾 展开以消耗可用空间 重新启动 VM,此处和此处也不使用 ISO Full 指令
- 使用引导光盘(上面的 Ubuntu ISO)执行
Memory Test
(memtest86+)。我不认为这一步是必要的。 - Reebot 来宾操作系统(我在 VMWare Workstation 上运行服务器)
- 确保 Ubuntu 占用了所有分配的空间。完整的说明在这里。根据您的需要进行调整。
- 再次重新启动。
- 像往常一样登录到 Ubuntu 并启动 postgres
现在postgres可以正常运行了。不再有“.s.PGSQL.5432”错误。
到目前为止,我的结论是 pg_wal 上没有剩余空间会导致 " .s.PGSQL.5432
" 错误。
现在我面临另一个错误。我可以做“ Select * from table Limit 10
”但我不能做像“ Select count(id) From table
”这样的查询。关于页面块有错误: 关系库/13462/16387的块62052中的无效页面
非常感谢任何评论或帮助。
Ubuntu 22.04 在 VM、Postgres 12 上运行。
[ 4
当 PostgreSQL 创建一个 WAL 段时,它首先使用名称创建它并将其
xlogtemp.<process id>
写入全零。只有这样,文件才会重命名为其最终名称。如果没有足够的磁盘空间供 PostgreSQL 创建和填充新的 WAL 段,服务器将崩溃。让它再次运行的唯一方法是增加文件系统并启动 PostgreSQL。
如果您在批量加载到数据库时遇到该问题,这并不意味着 WAL 归档或 WAL 回收有问题。这也可能意味着它
pg_wal
与数据目录位于同一文件系统上。对于生产系统,放置不同的文件系统并在数据目录中pg_wal
具有符号链接是个好主意。pg_wal