阿里云 RDS PostgreSQL 隐藏开关 - hash to btree, unlogged to logged

less than 1 minute read

背景

为了保护用户数据的可靠性,阿里云RDS PostgreSQL做了一些保护机制。

1、例如PostgreSQL 10版本以前, HASH索引是不写WAL日志的,所以如果你使用了hash index,当数据库崩溃后,HASH INDEX是dirty的,走HASH INDEX SCAN可能导致数据不一致。

又或者你使用了standby,那么如果standby是物理standby,并且你用了这个standby作为HA节点或者作为只读节点,同样的道理,没有WAL日志的话,数据无法复制到这个备份节点,同样会导致一样的问题。

2、PostgreSQL支持unlogged table,也是不写日志的表,类似于TMP TABLE,但是它是全局(所有会话)可见,并共享一份数据的。那么如果你有同样的问题(数据库崩溃,使用了备库)同样将导致以上问题。

在崩溃后,UNLOGGED TABLE的数据会完全清空。

阿里云RDS PG做了一个保护,自动将hash index转换为btree index。自动将unlogged table 转换为普通记录WAL的表。

但是用户如果已知了这些问题的存在,并明确有使用需求怎么办呢?

例如想快速的导入数据,并且对数据的可靠性要求不高,并明确要用unlogged table。

或者PG 10以后,明确要用hash index。

隐藏参数

1、rds_force_unlogged_to_logged_table,设置为false,就可以创建unlogged table。

当前会话生效。

set rds_force_unlogged_to_logged_table=false;
... 然后再在当前会话中,create table

2、rds_force_hash_to_btree,设置为false,就可以创建hash index。

当前会话生效。

set rds_force_hash_to_btree=false
... 然后再在当前会话中,创建hash index。

Flag Counter

digoal’s 大量PostgreSQL文章入口