Postgresql中的unlogged table

news/2024/7/9 21:00:43 标签: postgresql, 数据库, sql

在PG中,有一种表的类型为unlogged table,名如其字,该种类型的表不会写入wal日志中,所以在写入的速度上比普通的堆表快很多,但是该表在数据库崩溃的时候,会被truncate,数据会丢失,而且该表也不支持流复制,所以在standby节点是无法查到该表数据的。在该表上创建的索引也是unlogged索引。最近看到一篇博客描述了unlogged table的一些优缺点。我这里也再次解读一下,留下一些自己的见解。

建表语句如下:

sql">create unlogged table unlogged_table (a int primary key);
CREATE TABLE
insert into unlogged_table select generate_series(1,1000000);
INSERT 0 1000000

unlogged表和logged表可以互相转换,如下例子:

sql">#接上面例子,主键索引也是unlogged
postgres=# \di+ unlogged_table_pkey 
                                          List of relations
 Schema |        Name         | Type  |  Owner   |     Table      | Persistence | Size  | Description 
--------+---------------------+-------+----------+----------------+-------------+-------+-------------
 public | unlogged_table_pkey | index | postgres | unlogged_table | unlogged    | 21 MB | 
(1 row)

#查看表物理存放路径
postgres=# select pg_relation_filepath('unlogged_table');
 pg_relation_filepath 
----------------------
 base/13580/43099
(1 row)

#转为logged表,物理文件路径已变更,说明表重建了,而且索引也重建了
postgres=# alter table unlogged_table set logged;
ALTER TABLE
postgres=# select pg_relation_filepath('unlogged_table');
 pg_relation_filepath 
----------------------
 base/13580/43104
(1 row)

postgres=# \di+ unlogged_table_pkey
                                          List of relations
 Schema |        Name         | Type  |  Owner   |     Table      | Persistence | Size  | Description 
--------+---------------------+-------+----------+----------------+-------------+-------+-------------
 public | unlogged_table_pkey | index | postgres | unlogged_table | permanent   | 21 MB | 
(1 row)

#转换回unlogged表,物理文件变化了,可见表和索引还是重建了
postgres=# alter table unlogged_table set unlogged;
ALTER TABLE
postgres=# select pg_relation_filepath('unlogged_table');
 pg_relation_filepath 
----------------------
 base/13580/43108
(1 row)

postgres=# select pg_relation_filepath('unlogged_table_pkey');
 pg_relation_filepath 
----------------------
 base/13580/43111
(1 row)

由以上实验得出,在互相转换的时候一定要注意,在表转换的时候是无法被操作的。如果表很大,那么也会额外占用资源。因为要重建表和索引。另外注意一点,从logged转为unlogged会相对好一些,因为不写wal日志,只写表数据。

unlogged表的优缺点:

  1. 在实例奔溃后,unlogged表数据会被truncate,也就是会丢失数据
  2. unlogged表只能在主节点访问,备节点无法访问
  3. unlogged表不支持物理复制,也不支持逻辑复制

在这里插入图片描述
解释一下上图:

  1. 由于unlogged表不写wal,所以dml的效率更高,比如insert ,update会更快。
  2. vacuum的影响也更小,因为unlogged表不需要写wal,vacuum的效率也会提升,正常表的vacuum会写wal。
  3. 因为不写wal,所以在备份的时候不会备份unlogged表,备份集会更小。
  4. 普通表,也就是logged表,不会因为数据库崩溃而截断表,丢失所有数据,物理复制和逻辑复制都可用。

总结:

  1. 一般情况下我们是不需要使用unlogged表的,因为不能保证数据的持久性,这对于数据库来说是致命的。
  2. 正常的关闭数据库,或者正常的重启数据库,unlogged表的数据不会丢失,只有在不干净的关闭数据库,比如断电,或者因为其他原因数据库crash了,那么unlogged表的数据会被截断,用一个空的xxxx_init表文件代替。
  3. unlogged表也是要写物理文件的,只是不写wal日志,所以不是内存表,不要以为unlogged表都是在内存中操作的。
  4. unlogged表在生产环境建议不要使用,测试环境可以把玩一下。

参考:
https://www.crunchydata.com/blog/postgresl-unlogged-tables
https://pganalyze.com/blog/5mins-postgres-unlogged-tables


http://www.niftyadmin.cn/n/108118.html

相关文章

549、RocketMQ详细入门教程系列 -【消息队列之 RocketMQ(三)】 2023.02.28

目录一、Spring 整合 RocketMQ1.1 消息生产者1.2 消息消费者1.3 Spring 配置文件1.4 运行实例程序二、参考链接一、Spring 整合 RocketMQ 不同于 RabbitMQ、ActiveMQ、Kafka 等消息中间件,Spring 社区已经通过多种方式提供了对这些中间件产品集成,例如通…

CSO面对面丨中核华辉刘博:应对大型央国企数字化转型道路上必须攻克的安全难题

“极致”,一直是大型央国企网络安全工作建设追求的目标。随着我国数字化转型全面走深向实,网络安全风险、数据管理、层出不穷的网络攻击,为各领域大型央国企数字化转型带来了更多的挑战。如何充分发挥优势、携手各方构筑网络安全屏障、提升安…

2022年中职网络空间赛项A模块总和(所有答案都有)

这里整理了2022年的十份试题A模块的综合,基本上题都有了,但是由于各省A模块的难度是不一定的,所以这里的题对于省赛的帮助可能没有那么大,如果你们往年省赛A模块与国赛的试题几乎一样的话,那这个应该还是有帮助的&…

第四阶段08-基于element-ui的vue2.0脚手架(续)

42. VUE脚手架项目嵌套路由 在配置路由&#xff08;配置/src/router/index.js&#xff09;时&#xff0c;如果配置的路由对象是routes常量的直接数组元素&#xff0c;则此路由配置的视图会显示在App.vue的<router-view/>中。 在设计视图时&#xff0c;可能会出现<ro…

Go defer用法

defer概览 defer是go语言里的一个关键字,在 函数内部使用;defer关键字后面跟一个 函数或匿名函数; defer用法 执行一些资源的收尾工作,如 关闭数据库连接,关闭文件描述符,释放资源等等;结合recover()函数使用,防止函数内部的异常导致整个程序停止;defer在遇到panic后,仍然会…

【LeetCode与《代码随想录》】栈与队列篇:做题笔记与总结-JavaScript版

文章目录代码随想录232.用栈实现队列225. 用队列实现栈20. 有效的括号1047. 删除字符串中的所有相邻重复项150. 逆波兰表达式求值239. 滑动窗口最大值&#xff08;困难-还没写&#xff09;347.前 K 个高频元素代码随想录 代码随想录 代码随想录CSDN官方 232.用栈实现队列 ht…

linux 软连接、硬链接

一、Linux链接概念 Linux链接分两种&#xff1a; 一种被称为硬链接&#xff08;Hard Link&#xff09; 一种被称为符号链接&#xff08;Symbolic Link&#xff09; 默认情况下&#xff0c;ln 命令产生硬链接、ln -s 命令产生软链接。 1、【硬连接】 硬连接指通过索引节点…

【数据结构】树与二叉树

目录 1、树的概念及结构 1.1、概念 1、树的特点 2、树与非树 1.2、概念 &#xff08;重要&#xff09; 1.3、树的表示形式 2、二叉树&#xff08;重点&#xff09; 2.1、概念 2.2、二叉树的特点 2.3、两种特殊的二叉树 1、满二叉树 2、完全二叉树 2.4、二叉树的性…