PostgreSQL INITDB 初始化失败问题
今天遇到一个诡异的问题,在龙蜥 Anolis 8.8 上初始化数据库的提示这样的一个问题。 下面是报错的信息
running bootstrap script ... 2024-01-30 09:07:15.568 CST [2151614] FATAL: could not create shared memory segment: No space left on device
2024-01-30 09:07:15.568 CST [2151614] DETAIL: Failed system call was shmget(key=17825800, size=56, 03600).
2024-01-30 09:07:15.568 CST [2151614] HINT: This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.
The PostgreSQL documentation contains more information about shared memory configuration.
查看操作系统的磁盘和内存都还是有剩余的 FREE 看内存 free 部分还有 24 GB,磁盘空间也是很大。
从上面的报错以及提示我们看到这应该是操作系统的某个东西设置引起的,这里他提示我们需要关注下内核参数 SHMMNI。
内核参数 SHMMAX
该参数定义了共享内存段的最大尺寸以字节为单位。SHMMAX 设置不足可能会导致以下问题:unable to attach to shared memory segment
可以通过执行以下命令来确定 SHMMAX 的值:
# cat /proc/sys/kernel/shmmax
假设这个值为 33554432 表示 32MB 大小。编辑文件 /etc/sysctl.conf 可以将其固化在系统中。
# vi /etc/sysctl.conf
kernel.shmmax=2147483648
设置 SHMMNI
这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096。这一数值已经足够,通常不需要更改。
可以通过执行以下命令来确定 SHMMNI 的值:
# cat /proc/sys/kernel/shmmni
类似的我们也可以通过如下的方法来将其固化在系统内核中。
# vi /etc/sysctl.conf
kernel.shmmni=8192
备注:上面的报错就是提示我们需要处理这个参数。
# sysctl -p
然后再重新初始化问题解决。