PostgreSQL中,有一种表的类型为unlogged table,该种类型的表不会写入wal日志中,所以在写入的速度上比普通的堆表快很多,但是该表在数据库崩溃的时候,会被truncate,数据会丢失,而且该表也不支持流复制,所以在standby节点是无法查到该表数据的。在该表上创建的索引也是unlogged索引。

创建 unlogged table :

CREATE UNLOGGED TABLE testtable  (id int);

转换 unlogged table :

ALTER TABLE unloggedtable_name  SET UNLOGGED;   
ALTER TABLE unloggedtable_name  SET LOGGED;

unlogged table 的优点:

  • wal日志量变少,省去重做日志文件,节省了一定的空间,同时减少备份wal的工作量。
  • vacuum影响减少,因为vacuum动作也会被wal日志写入
  • 并行创建大型表性能得到提升。

unlogged table 的缺点:

  • 故障恢复时会截断表。比如,在实例奔溃后,unlogged表数据会被truncate,会丢失数据。比如,在使用PITR增量备份恢复的情况下,也会丢失数据。
  • 使用UNLOGGED的表只能在主服务器上访问,而不能在副本(备服务器)上访问。
  • 使用UNLOGGED的表不能用于逻辑备份(pg_dump、pg_dumpall)或物理备份(关闭数据库直接文件拷贝、pg_start_backup、pg_basebackup)。

一个图示:

PostgreSQL-unlogged table_PostgreSQL

Faster writes:更快的写入。unlogged表不写wal,所以dml的效率更高,比如insert ,update会更快。

Less bloat/vacuum:无wal日志,低vacuum,因为unlogged表不需要写wal,vacuum的效率也会提升,正常表的vacuum会写wal。

Small backups:更小的备份集。因为不写wal,所以在备份的时候不会备份unlogged表,备份集会更小。

Durable on crash:实例崩溃时不支持,数据会丢失。

Available on replicas:副本不可用。这里指的应该是物理的备份。

Use logical replication:不支持逻辑复制。

普通表,也就是logged表,不会因为数据库崩溃而截断表,丢失所有数据,物理复制和逻辑复制都可用。

嗯,对于 unlogged table 的测试呢,网上真的太多了,随便找找都有,这里就不多说了。

来自别人的总结,这里复制粘贴一下:

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

参考两篇,在此谢谢:

Postgresql中的unlogged table_postgresql

PostgreSQL unlog表_postgresql unlogged