久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

PostgreSQL中commit log有什么作用

共計(jì) 3775 個(gè)字符,預(yù)計(jì)需要花費(fèi) 10 分鐘才能閱讀完成。

本篇內(nèi)容主要講解“PostgreSQL 中 commit log 有什么作用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓丸趣 TV 小編來(lái)帶大家學(xué)習(xí)“PostgreSQL 中 commit log 有什么作用”吧!

Concurrency Control 并發(fā)控制是一種機(jī)制,在并發(fā)進(jìn)行多個(gè)事務(wù)時(shí)維護(hù)一致性 (Consistency) 和隔離性 (Isolation),一致性和隔離性是數(shù)據(jù)庫(kù)事務(wù) ACID(Atomicity, Consistency, Isolation, Durability) 屬性中的 C 和 I。
多版本并發(fā)控制 (MVCC) 是廣泛使用的并發(fā)控制技術(shù), 其主要優(yōu)勢(shì)是讀不會(huì)阻塞寫,而寫也不會(huì)阻塞讀。MVCC 有很多種變體,PostgreSQL 使用一種稱為快照隔離 Snapshot Isolation (SI)的 MVCC 變體實(shí)現(xiàn)并發(fā)控制。
在 MVCC 中,每個(gè) DML 操作創(chuàng)建一個(gè)數(shù)據(jù)(包括 Index)的新版本,同時(shí)保留之前的舊版本。當(dāng)事務(wù)讀取數(shù)據(jù)時(shí),選擇其中一個(gè)“正確”的版本,以確保各個(gè)事務(wù)之間的隔離。

Multi Version Heap Tuple
這一章節(jié)中提到事務(wù)回滾后, 新寫入的數(shù)據(jù)仍存儲(chǔ)在 heap 中,PostgreSQL 如何識(shí)別產(chǎn)生這些數(shù)據(jù)的事務(wù)的狀態(tài) (提交 / 回滾 / 進(jìn)行中), 從而確定哪些 tuple 可見(jiàn)不可見(jiàn)?PG 通過(guò) clog(commit log) 存儲(chǔ)每個(gè)事務(wù)的狀態(tài), 在數(shù)據(jù)庫(kù)啟動(dòng)時(shí),clog 文件會(huì)加載到共享內(nèi)存中,checkpoint 時(shí)會(huì)把共享內(nèi)存中的事務(wù)狀態(tài)信息刷新到磁盤上.

一、基本概念

事務(wù) ID
當(dāng)一個(gè)事務(wù)開(kāi)啟時(shí),PostgreSQL 事務(wù)管理器會(huì)為該事務(wù)分配一個(gè)唯一的事務(wù) ID(txid, 無(wú)符號(hào) 32bit 整型).
通過(guò) txid_current()函數(shù)可獲取當(dāng)前事務(wù)號(hào).

testdb=# begin;
BEGIN
testdb=# select txid_current();
 txid_current 
--------------
 2308
(1 row)
testdb=#

在 PG 中, 以下為系統(tǒng)保留使用的 txid:
txid = 0, 表示 Invalid txid,用于判斷 txid 的有效性
txid = 1, 表示 Bootstrap txid,在 intidb 初始化數(shù)據(jù)庫(kù)時(shí)使用
txid = 2, 表示 Frozen txid,在事務(wù) ID 回卷時(shí), 通過(guò) vacuum 進(jìn)程處理時(shí)使用

事務(wù)狀態(tài)
PostgreSQL 定義了四種事務(wù)狀態(tài), 分別是 IN_PROGRESS(進(jìn)行中), COMMITTED(已提交), ABORTED(已回滾), 和 SUB_COMMITTED(子事務(wù)已提交).

/*
 * Possible transaction statuses --- note that all-zeroes is the initial
 * state.
 *  可能的事務(wù)狀態(tài)  ---  注意初始狀態(tài)全部為 ASCII 0
 *
 * A  subcommitted  transaction is a committed subtransaction whose parent
 * hasn t committed or aborted yet.
 *  subcommitted 事務(wù)是指已提交的子事務(wù), 而該子事務(wù)所在的父事務(wù)尚未提交或者回滾.
 */
typedef int XidStatus;
#define TRANSACTION_STATUS_IN_PROGRESS 0x00
#define TRANSACTION_STATUS_COMMITTED 0x01
#define TRANSACTION_STATUS_ABORTED 0x02
#define TRANSACTION_STATUS_SUB_COMMITTED 0x03

二、clog 文件

物理文件
clog 文件存儲(chǔ)在 $PGDATA/pg_xact 目錄中

[xdb@localhost pg_xact]$ ll
total 8
-rw-------. 1 xdb xdb 8192 Jan 8 15:55 0000
[xdb@localhost pg_xact]$

clog segment
如前所述, 事務(wù)號(hào)是無(wú)符號(hào)的 32bit 整型,PG 通過(guò)以下公式邏輯上把 clog 劃分為 N 個(gè) segment:
N = 0xFFFFFFFF/CLOG_XACTS_PER_PAGE/SLRU_PAGES_PER_SEGMENT
其中:
CLOG_XACTS_PER_PAGE 定義為

/* We need two bits per xact, so four xacts fit in a byte */
#define CLOG_BITS_PER_XACT 2 -- 每個(gè)事務(wù)狀態(tài)使用 2bits 表示
#define CLOG_XACTS_PER_BYTE 4 -- 每個(gè) Byte 可存儲(chǔ) 4 個(gè)事務(wù)狀態(tài)
#define CLOG_XACTS_PER_PAGE (BLCKSZ * CLOG_XACTS_PER_BYTE) -- 每個(gè) page 可存儲(chǔ) 8192* 4 個(gè)事務(wù)狀態(tài)

即 CLOG_XACTS_PER_PAGE = 8192*4
SLRU_PAGES_PER_SEGMENT 定義為

#define SLRU_PAGES_PER_SEGMENT 32

代入公式中:
N = 0xFFFFFFFF/CLOG_XACTS_PER_PAGE/SLRU_PAGES_PER_SEGMENT
 = 0xFFFFFFFF/(8192*4)/32
 = 4096

物理上, 每個(gè) segment 有 32 個(gè) Pages(SLRU_PAGES_PER_SEGMENT = 32), 則每個(gè) segment file 大小為 8K*32=256K.

三、txid clog

給定一個(gè)事務(wù)號(hào), 如何獲取該事務(wù)對(duì)應(yīng)的狀態(tài)?
PG 首先通過(guò)該事務(wù)號(hào)獲得該事務(wù)狀態(tài)存儲(chǔ)在 clog 中哪個(gè) page 中(即 pageno), 然后再定位存儲(chǔ)事務(wù)狀態(tài)的 Byte 在該 page 中的偏移以及在該 Byte 中的偏移.

 #define TransactionIdToPage(xid) ((xid) / (TransactionId) CLOG_XACTS_PER_PAGE)
 #define TransactionIdToPgIndex(xid) ((xid) % (TransactionId) CLOG_XACTS_PER_PAGE)
 #define TransactionIdToByte(xid) (TransactionIdToPgIndex(xid) / CLOG_XACTS_PER_BYTE)
 #define TransactionIdToBIndex(xid) ((xid) % (TransactionId) CLOG_XACTS_PER_BYTE)

如給定事務(wù)號(hào) 2308, 根據(jù)上述公式可得到:
Page = 2308 / (8192*4) = 0 — 第 0 號(hào) page
PageIndex = 2308 % (8192*4) = 2308 — Page 內(nèi)偏移
ByteInPage = 2308 / 4 = 577 — 該 Page 內(nèi)的第 577 個(gè) Byte
ByteIndex = 2304 % 4 = 0 — 該字節(jié)中的首 2bits
下面通過(guò)實(shí)際案例驗(yàn)證
開(kāi)啟事務(wù)

testdb=# begin;
BEGIN
testdb=# select txid_current();
 txid_current 
--------------
 2308
(1 row)

查看 clog

[xdb@localhost pg_xact]$ hexdump -C ./0000 -s 577 -n 1
00000241 00 |.|
00000242

0x00 — TRANSACTION_STATUS_IN_PROGRESS

提交事務(wù)
執(zhí)行 checkpoint, 刷新到磁盤上

testdb=# commit;
COMMIT
testdb=# checkpoint;
CHECKPOINT

查看 clog

[xdb@localhost pg_xact]$ hexdump -C ./0000 -s 577 -n 1
00000241 01 |.|
00000242

值為 0x01 — TRANSACTION_STATUS_COMMITTED

重新開(kāi)啟一個(gè)事務(wù) 2309, 回滾該事務(wù),clog 中的值應(yīng)為 0x09(二進(jìn)制值為:0000 1001)

testdb=# begin;
BEGIN
testdb=# select txid_current();
 txid_current 
--------------
 2309
(1 row)
testdb=# select 2308%4;
 ?column? 
----------
 0
(1 row)
testdb=# rollback;
ROLLBACK
testdb=# checkpoint;
CHECKPOINT
testdb=#

clog 文件中的內(nèi)容 0x09, 與預(yù)期中的一致.

[xdb@localhost pg_xact]$ hexdump -C ./0000 -s 577 -n 1
00000241 09 |.|
00000242
[xdb@localhost pg_xact]$

到此,相信大家對(duì)“PostgreSQL 中 commit log 有什么作用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是丸趣 TV 網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-24發(fā)表,共計(jì)3775字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 璧山县| 平利县| 武宁县| 乐业县| 宁远县| 永康市| 沾益县| 凤冈县| 裕民县| 遂川县| 建始县| 射阳县| 西安市| 张掖市| 嘉善县| 南江县| 安吉县| 临漳县| 荔波县| 弥勒县| 苏尼特右旗| 益阳市| 瑞昌市| 醴陵市| 卫辉市| 循化| 石楼县| 双辽市| 永靖县| 固阳县| 高要市| 镇巴县| 宁国市| 三穗县| 吉安县| 泸水县| 确山县| 建水县| 克拉玛依市| 府谷县| 丰宁|