本期分享如下:
- ACL默认显示问题
- 关于发布的两个小知识
- Drop Table后空间未释放
- DBeaver阻止并行
- 映射bit类型
一、ACL(Access Control List)在psql显示问题
为什么表查看ACL时为空呢?
这个并不奇怪,当没有做任何显式权限分配时,ACL为空是正常的,此时并不会显示owner的权限信息,因为owner比较特殊。
当我们使用grant分配权限之后,就可以查看完整的ACL信息,此时会暴露出owner的权限信息。
对象的owner的权限信息默认不会展示,首次使用grant语句分配触发后即可暴露。
二、逻辑复制关于发布的两个小知识
参考链接:https://www.modb.pro/db/1764583511357460480
- 作为发布的无主键表做update和delete会报错,解决办法:创建主键/非空唯一索引,并指定唯一索引为复制标识或指定全列为复制标识
- 当发布所有表时,新创建的表会自动被认为是需要发布的表,可通过pg_publication_tables视图查看
三、Drop Table后磁盘空间未及时释放
参考链接:https://www.modb.pro/db/1767100886471512064
使用12.3版本的时候遇到一个问题,会话1查询了一个大于1G的表之后未做其他操作且会话一直保持,会话2执行drop table后,磁盘空间一直未释放,直到会话1再执行其他操作或者结束会话,磁盘才会释放空间。
在12.6的官网发布说明中有该问题的相关描述:
Ensure that disk space allocated for a dropped relation is released promptly at commit (Thomas Munro)
Previously, if the dropped relation spanned multiple 1GB segments, only the first segment was truncated immediately. Other segments were simply unlinked, which doesn’t authorize the kernel to release the storage so long as any other backends still have the files open.
如果更老的版本,需要注意该问题。
四、DBeaver客户端为什么阻止查询使用并行
参考链接:https://mp.weixin.qq.com/s/RbgJRWFUtoeDbG5yUflVdQ
DBeaver客户端使用JDBC协议来访问数据库,连接上默认使用setMaxRows()方法来限制结果集的大小为200,如下图所示:可以将该限制设置为0来启用并行。
五、Java如何映射bit数据类型
使用bit比特类型时,Java里最合适的映射类型是String,如果是bit(1)一个比特位,也可以使用boolean类型。下面的示例演示使用String及int类型来映射bit(3)。
首先进行表结构创建及数据插入
postgres=> create table tab_bit(bt bit(3));
CREATE TABLE
postgres=> insert into tab_bit values(B'001'),(B'010'),(B'100');
INSERT 0 3
使用String类型接收:
使用int类型接收:
从测试结果看,使用int并不合适,会直接将比特串强转为int。
关联推荐
- PostgreSQL知识问答分享-第37期
- PostgreSQL知识问答分享-第36期
- PostgreSQL知识问答分享-第35期
- PostgreSQL知识问答分享-第34期
- PostgreSQL知识问答分享-第33期
- PostgreSQL知识问答分享-第32期
- PostgreSQL知识问答分享-第31期
- PostgreSQL知识问答分享-第30期
- PostgreSQL知识问答分享-第29期
- PostgreSQL知识问答分享-第28期
如果有任何问题需要讨论交流的朋友,欢迎添加本人微信号skypkmoon。