我正在尝试在本地计算机上启动 PostgreSQL 服务器。 但我收到一条错误消息:
FATAL: could not create shared memory segment: Invalid argument
DETAIL: Failed system call was shmget(key=5432001, size=9781248, 03600).
HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter. You can either reduce the request size or reconfigure the kernel with larger SHMMAX. To reduce the request size (currently 9781248 bytes), reduce PostgreSQL's shared_buffers parameter (currently 1024) and/or its max_connections parameter (currently 13).
If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.
The PostgreSQL documentation contains more information about shared memory configuration.
我搜索并查看了文档,但我尝试设置 kern.sysv.shmmax 和 kern.sysv.shmall 的所有操作都有效。 Snow Leopard 上的正确设置是什么?我用 macports 安装了 postgres。
您必须将内核的最大共享内存限额增加到高于 Postgres 尝试分配的值。 (您还可以减少 postgresql.conf 中的共享缓冲区或最大连接设置,以使 Postgres 要求更少的内存,但对于大多数用例来说,默认值已经相当小了。)
一次性执行此操作,持续到下次重新启动:
sudo sysctl -w kern.sysv.shmmax=12582912
sudo sysctl -w kern.sysv.shmall=12582912
根据您的 Postgres 设置更改确切的数字;它必须大于 Postgres 在日志文件中要求的大小。完成这两项操作后,您应该能够启动 Postgres。
要使更改在重新启动后持续存在,请编辑 /etc/sysctl.conf 并在其中设置相同的值。
Apple 在此记录了如何针对 Snow Leopard 调整它们:
http://support.apple.com/kb/HT4022:Mac OS X Server v10.6:调整共享内存段值
sysctl 确实允许您临时更改它们。
我知道这是一个老问题,但我认为可能值得注意的是如果您只是将 PostgreSQL 用于开发目的您可能可以安全地进入 postgres.conf (您之后的数据目录)已经完成了 initdb)并将
shared_buffers
变量更改为稍微低一些的值。它默认为 28MB 或其他。
但这样你就不会弄乱系统共享内存变量。
警告:此答案已被较新版本的 OS X 废弃。请参考下面 Paul Legato 的答案。
在 Mac OS X 中,系统启动后无法更改 shmmax。 您需要编辑 /etc/rc 或 /etc/sysctl.conf,并记住它需要是 4096 的倍数。请参见此处 http://www.postgresql.org/docs/8.4/static/kernel-resources.html
基于此论坛帖子。
在较新的 OSX(Catalina 之后)上 sysctl.conf 不再工作。
因此,对于永久配置,您应该创建 plist 文件:
/Library/LaunchDaemons/ShmemConfig.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>shmemsetup</string>
<key>UserName</key>
<string>root</string>
<key>GroupName</key>
<string>wheel</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/sysctl</string>
<string>-w</string>
<string>kern.sysv.shmmax=268435456</string>
<string>kern.sysv.shmmni=128</string>
<string>kern.sysv.shmseg=32</string>
<string>kern.sysv.shmall=65536</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>