天天看點

阿裡雲 RDS PostgreSQL 隐藏開關 - hash to btree, unlogged to logged

标簽

PostgreSQL , 阿裡雲 , rds , 隐藏開關

https://github.com/digoal/blog/blob/master/201803/20180308_02.md#%E8%83%8C%E6%99%AF 背景

為了保護使用者資料的可靠性,阿裡雲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。

https://github.com/digoal/blog/blob/master/201803/20180308_02.md#%E9%9A%90%E8%97%8F%E5%8F%82%E6%95%B0 隐藏參數

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。