PostgreSQL技術(shù)大講堂 - 第19講:凍結(jié)TXIDS概述

PostgreSQL從小白到專(zhuān)家,是從入門(mén)逐漸能力提升的一個(gè)系列教程,內(nèi)容包括對(duì)PG基礎(chǔ)的認(rèn)知、包括安裝使用、包括角色權(quán)限、包括維護(hù)管理、、等內(nèi)容,希望對(duì)熱愛(ài)PG、學(xué)習(xí)PG的同學(xué)們有幫助,歡迎持續(xù)關(guān)注CUUG PG技術(shù)大講堂。
第19講:凍結(jié)TXIDS
內(nèi)容1:PostgreSQL TXID介紹
內(nèi)容2:PostgreSQL TXID使用原理使用
內(nèi)容3:凍結(jié)TXID來(lái)解決TXID環(huán)繞問(wèn)題
內(nèi)容4:如何凍結(jié)TIXD
TXID介紹
· 事務(wù)id(txid)
當(dāng)一個(gè)事務(wù)開(kāi)始時(shí),PostgreSQL中的事務(wù)管理系統(tǒng)會(huì)為該事務(wù)分配一個(gè)唯一標(biāo)識(shí)符,即事務(wù)ID(txid).PostgreSQL中的txid被定義為一個(gè)32位的無(wú)符號(hào)整數(shù),也就是說(shuō),它能記錄大約42億個(gè)事務(wù)。通常txid對(duì)我們是透明的,但是我們可以利用PostgreSQL內(nèi)部的函數(shù)來(lái)獲取當(dāng)前事務(wù)的txid。
testdb=# BEGIN;
BEGIN
testdb=# SELECT txid_current();
txid_current
--------------
100
(1 row)
請(qǐng)注意,BEGIN命令沒(méi)有指定txid。在PostgreSQL中,當(dāng)?shù)谝粋€(gè)命令在BEGIN命令執(zhí)行之后執(zhí)行時(shí),事務(wù)管理器會(huì)分配一個(gè)tixd,然后它的事務(wù)開(kāi)始。
TXID使用原理
· TXID結(jié)構(gòu)
TxID=2的32次方=42億
前21億個(gè)TxID是“過(guò)去的”
后21億個(gè)TxID是“未來(lái)的”

TXID環(huán)繞
· TXID環(huán)繞
假設(shè)元組tuple_1的txid為100,即tuple_1的t_xmin為100。服務(wù)器已經(jīng)運(yùn)行很長(zhǎng)一段時(shí)間了,Tuple_1沒(méi)有被修改。當(dāng)前的txid是21億+100,執(zhí)行SELECT命令。此時(shí),Tuple_1可見(jiàn),因?yàn)閠xid 100是過(guò)去的。接著,又執(zhí)行相同的SELECT命令,此時(shí)當(dāng)前的txid就變成是21億+101了,根據(jù)行可見(jiàn)性規(guī)則判斷Tuple_1就不再可見(jiàn),因?yàn)閠xid 100變成是未來(lái)的了。

凍結(jié)TXID
· 解決TXID環(huán)繞問(wèn)題的方法—凍結(jié)TXID
解決事務(wù)環(huán)繞問(wèn)題的方法是凍結(jié),其做法是把21億以前事務(wù)所修改的行做一個(gè)標(biāo)記位(即凍結(jié)),根據(jù)行可見(jiàn)性規(guī)則,凡是被標(biāo)識(shí)位凍結(jié)行在判斷的時(shí)候就不依賴t_xmin了,讓行數(shù)據(jù)變成可見(jiàn)。
若TXID使用過(guò)一輪以后,被凍結(jié)的行如果被新事務(wù)修改,則原來(lái)的標(biāo)記位就會(huì)消除(即解凍),此時(shí)此行是否可見(jiàn),就要根據(jù)行可見(jiàn)性規(guī)則進(jìn)行判斷。

凍結(jié)處理
· 凍結(jié)處理有兩種模式
lazy mode (惰性模式)
eager mode (急切模式)
· Lazy Mode
凍結(jié)極限txid定義如下:
freezeLimit_txid=(OldestXmin-vacuum_freeze_min_age)
AutoVacuum操作會(huì)進(jìn)行凍結(jié)操作,每分鐘都會(huì)執(zhí)行一次,被選中的表都會(huì)進(jìn)行vacuum操作,包含凍結(jié)txid內(nèi)容。

· Eager Mode
當(dāng)滿足以下條件時(shí),執(zhí)行緊急模式:
pg_database.datfrozenxid<(OldestXmin-vacuum_freeze_table_age)

· pg_database.datfrozenxid 和pg_class.relfrozenxid(s)之間的凍結(jié)對(duì)比

· 如何顯示被凍結(jié)的對(duì)象信息
testdb=# VACUUM table_1;
VACUUM
testdb=# SELECT n.nspname as "Schema", c.relname as "Name", c.relfrozenxid
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
AND n.nspname <> 'information_schema' AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY c.relfrozenxid::text::bigint DESC;
Schema | Name | relfrozenxid
------------+-------------------------+--------------
public | table_1 | 100002000
public | table_2 | 1846
pg_catalog | pg_database | 1827
pg_catalog | pg_user_mapping | 1821
pg_catalog | pg_largeobject | 1821
· 顯示被凍結(jié)的數(shù)據(jù)庫(kù)信息
testdb=# SELECT datname, datfrozenxid FROM pg_database WHERE datname = 'testdb';
datname | datfrozenxid
---------+--------------
testdb | 1821
(1 row)
· 使用VM提高凍結(jié)效率


以上就是Part 19 - 凍結(jié)TXIDS 的內(nèi)容,歡迎進(jìn)群一起探討交流,往期視頻,聯(lián)系cuug