概述
Greenplum是基于Postgresql數據庫的分布式數據庫,而PG數據庫在事務及多版本并發控制的實現方式上很特別,采用的是遞增事務id的方法,事務id大的事務,認為比較新,反之事務id小,認為比較舊。
事務id的上限是21億,正常使用時,事務id只增不減,到達一定程度時,就會觸發數據庫告警直至數據庫只讀,無法創建新事務
減少事務id的方法是執行提供的回收命令。
gp一共是21億可以使用,使用超過5億就告警,超過11億就鎖庫
兩個重要參數
postgres=# show xid_warn_limit;xid_warn_limit
----------------500000000
(1 row)postgres=# show xid_stop_limit;xid_stop_limit
----------------1000000000
(1 row)
這個兩個參數是控制事務id剩余值多少時數據庫會告警,或切換為只讀的
注意:事務id的總值是21億
xid_warn_limit 當距離stop的值不足5億時,數據庫會觸發年齡告警
xid_stop_limit 當距離21億總值的剩余值不足10億時,數據庫會切換為只讀
簡單來說,針對默認的設置:
年齡1-5億:無年齡問題
年齡5-11億:會觸發年齡告警,但不影響數據庫使用
年齡11-21億:數據庫為只讀,不能創建新事務
如何檢查數據庫年齡?
1.執行命令時年齡告警
查詢表統計數據是出現異常提示:
WARNNING:database “XXX” must be vacuumed within 177009986 transactions
HINT: To avoid a database shutdown,execute a database-wide VACUUM in “XXX”
當數據庫查詢或者日志中出現上面告警時,說明需要對GP事務id進行清理
If these warnings are ignored, the system will shut down and refuse to start any new transactions ince there are fewer than 1 million transactions left until wraparound:
ERROR: database is not accepting commands to avoid wraparound data loss in database “XXXX”
當數據庫查詢或者日志中出現上面告警時,說明GP停止對外提供服務
2.查詢當前數據庫年齡
SELECT gp_segment_id,datname, age(datfrozenxid) FROM gp_dist_random(‘pg_database’) ORDER BY 3 DESC;
例子:
比如這里查詢當前年齡,最上面的值為2億多,說明年齡在2億左右
postgres=# SELECT gp_segment_id,datname, age(datfrozenxid) FROM gp_dist_random('pg_database') ORDER BY 3 DESC;gp_segment_id | datname | age
---------------+--------------------------------------------+-----------0 | test01 | 2707979230 | test02 | 2707979230 | test03 | 270797923
如果是11億,告警鎖庫了
3.如何界定年齡是否要處理
如果出現上面1 的告警,說明年齡已經到達警戒值,需要處理。
如果2 年齡超過5億,說明即將告警,也需要處理
超過11億,數據庫就會鎖庫
告警年齡處理
在年齡到達告警值且未到鎖庫值的時候,此時數據庫服務正常,就是命令會有warning輸出
此時需要再master daedb用戶下執行
nohup vacuumdb -F -a >/home/gpadmin/vacuumdb.log &
該命令執行時間可能很長,并且會消耗一定資源,如果過于影響客戶使用,請選擇執行時間,保證執行時間有5+ 小時
數據庫鎖庫處理
還有一種情況,就是數據庫已經到達只讀閾值, 數據庫只讀了,因為vacuumdb的命令也需要創建事務,所以直接運行命令會報錯,無法進行回收
就需要先修改上面的參數閾值,使其能正常運行事務
1.停止數據庫
gpstop -M fast -aps -ef|grep postgres 關閉確保進程都不在了,再繼續
2.找到所有數據目錄
在master的daedb用戶下執行:
gpstate -s|grep -E 'Address|Datadir'
該命令會將集群所有的數據目錄及對應的主機名打印出來
另外有兩臺master,一般是在/gpmaster/gpseg-1 里,可以使用gpstate -f 查看
3.修改所有節點數據目錄里配置文件參數
修改配置,找到所有節點的postgresql.conf,為其增加或修改參數
xid_stop_limit=800000000 #改為8億,或者更小
全部修改完成之后,啟動數據庫:gpstart -a
啟動完成以后,此時數據庫就可以正常使用了
4.回收數據庫年齡
此時需要再master 數據庫用戶下執行
nohup vacuumdb -F -a >/home/gpadmin/vacuumdb.log &
5.還原參數
改完還有個事,要將上面加的參數,全部注釋掉 。有個簡便方法,find 出來后替換
find /* -name 'postgresql.conf'|xargs sed -i 's/xid_stop_limit=500000000/#xid_stop_limit=500000000/g'
重啟數據庫生效:
gpstop -M fast -agpstart -a