阿里云 RDS PostgreSQL 隐藏开关 - hash to btree, unlogged to logged
背景
为了保护用户数据的可靠性,阿里云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。