我在 postgres 11 中遇到了奇怪的问题。
我正在创建一堆用户,然后为他们分配一些角色,但也让他们连接到某个数据库。
成功创建 2478 个角色后,当我尝试创建新用户时,出现此错误:
db=# create user foo;
CREATE ROLE
db=# grant connect on database db to foo;
ERROR: row is too big: size 8168, maximum size 8160
数据库日志中显示相同的错误。
我检查了 db 卷是否空间不足,那里还有 1T 可以闲置......
我无法想象在运行简单授权时试图插入超过 8k 的 postgres ......?
编辑:
似乎已经提出了类似的问题(模式的使用权限(:
错误:行太大:大小为 8168,最大大小为 8164
因此,解决方案是创建一个角色,例如connect_to_my_db
并授予对该角色的连接,然后而不是对每个用户运行GRANT connect
执行GRANT connect_to_my_db
。
您自己找到了解决方案,让我添加错误原因的解释:
每个表行都存储在表的 8KB 块之一中,因此这是其大小限制。
普通表具有 TOAST 表,其中的长属性可以行外存储。这允许PostgreSQL存储非常长的行。
现在,系统目录表没有 TOAST 表,因此行的大小限制为 8KB。
对象的访问控制列表存储在对象的目录中,因此对表的许多权限可能会超过限制。
很高兴 - 如果您必须单独管理数千个用户的权限,那么您最终都会陷入DBA地狱。