【问题标题】:"row is too big (...) maximum size 8160" when running "grant connect on database"运行“在数据库上授予连接”时“行太大(...)最大大小 8160”
【发布时间】:2019-07-18 05:12:18
【问题描述】:

我在使用 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可用...

我无法想象 postgres 在运行简单授权时尝试插入超过 8k...?


编辑:

似乎已经问过类似的问题(架构的使用权限):

ERROR: row is too big: size 8168, maximum size 8164

因此,解决方案是创建一个角色,例如 connect_to_my_db 并授予该角色的连接权限,然后使用 GRANT connect_to_my_db 代替对每个用户运行 GRANT connect

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    你自己找到了解决办法,我补充一下错误原因:

    每个表行都存储在表的 8KB 块之一中,因此这是它的大小限制。

    普通表有一个TOAST 表,其中长属性可以离线存储。这允许 PostgreSQL 存储非常长的行。

    现在系统目录表没有 TOAST 表,因此行被限制为 8KB 大小。

    对象的访问控制列表存储在对象的目录中,因此对一个表的许多权限可能会超出限制。

    很高兴 - 如果您必须单独管理数千名用户的权限,那么无论如何您最终都会陷入 DBA 地狱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2020-01-02
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多