成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

PostgreSQL處理膨脹與事務(wù)回卷

IT那活兒 / 2949人閱讀
PostgreSQL處理膨脹與事務(wù)回卷

一、表膨脹查詢與處理


1、創(chuàng)建擴(kuò)展

create extension pgstattuple;

2、表膨脹查詢

如下查詢出來(lái)表的怕膨脹系數(shù)為81%。

select *, 1.0 - tuple_len::numeric / table_len as bloat from pgstattuple(tab_brin1);

占用2414個(gè)page。

select * from pg_relpages(tab_brin1);

3、表膨脹處理

vacuum (verbose,full,analyze) tab_brin1;

Vacuum

它將進(jìn)行普通的垃圾收集,將垃圾空間標(biāo)識(shí)為可用的狀態(tài)。它不會(huì)影響其它事務(wù)發(fā)出的表上的讀操作和寫(xiě)操作,因?yàn)槠胀ǖ睦占粫?huì)在表上加一個(gè)互斥鎖。

VacuumFull

啟動(dòng)完全垃圾收集,完全垃圾收集會(huì)在表上加一個(gè)互斥鎖,對(duì)表進(jìn)行垃圾回收期間,其它的事務(wù)不能對(duì)表進(jìn)行讀操作和寫(xiě)操作。VACUUMFULL比VACUUM的執(zhí)行時(shí)間要長(zhǎng)一些,執(zhí)行的操作也多一些,它在進(jìn)行垃圾收集的過(guò)程中,可能會(huì)將一個(gè)記錄從一個(gè)數(shù)據(jù)塊轉(zhuǎn)移到另一個(gè)數(shù)據(jù)塊。

Vacuumanalyze

除了回收垃圾空間還收集優(yōu)化器統(tǒng)計(jì)數(shù)據(jù)

Vacuumverbose

輸出垃圾收集的詳細(xì)數(shù)據(jù)。

回收完后,膨脹系數(shù)降到3%。

select *, 1.0 - tuple_len::numeric / table_len as bloat from pgstattuple(tab_brin1);

表占用473個(gè)page。

select * from pg_relpages(tab_brin1);



二、數(shù)據(jù)庫(kù)防止事務(wù)回卷


VacuumFreeze

為了保證同一個(gè)數(shù)據(jù)庫(kù)中的最新和最舊的兩個(gè)事務(wù)之間的年齡不超過(guò)2^31,postgresql引入了凍結(jié)(freeze)功能。


涉及到的術(shù)語(yǔ):

1、表年齡:當(dāng)前事務(wù)號(hào)距上一次執(zhí)行freeze操作的事務(wù)id的差值

2、元組年齡:當(dāng)前元組的xmin距上一次執(zhí)行freeze操作的事務(wù)id的差值

如果發(fā)生當(dāng)新老事務(wù)id差超過(guò)21億的時(shí)候,事務(wù)號(hào)會(huì)發(fā)生回卷,此時(shí)數(shù)據(jù)庫(kù)會(huì)報(bào)出如下錯(cuò)誤并且拒絕接受所有連接,必須進(jìn)入單用戶模式執(zhí)行vacuumfreeze操作。

事務(wù)凍結(jié)操作:

vacuum freeze tab_brin1;

查看指定表的年齡

SELECT relname, age(relfrozenxid) as xid_age,pg_size_pretty(pg_table_size(oid)) as table_size FROM pg_class WHERE relname = tab_brin1;

查詢所有數(shù)據(jù)庫(kù)的年齡:

select datname, age(datfrozenxid) from pg_database;

通常報(bào)錯(cuò)如下:

error:database is not accepting commands to avoid wraparound data loss indatabase “mydb”

hint:stop the postmaster and vacuum that database in single-user mode


參數(shù)設(shè)置:

在postgresql中,vacuum是一個(gè)比較耗費(fèi)io的過(guò)程,而vacuumfreeze更是被稱為“凍結(jié)炸彈”,因?yàn)樯婕暗搅舜罅康淖x寫(xiě)io,讀io(datafile)和寫(xiě)io(datafile以及寫(xiě)wal)。對(duì)于業(yè)務(wù)繁忙的庫(kù),可能會(huì)出現(xiàn)如下情況:

可能有很多大表的年齡會(huì)先后到達(dá)2億,數(shù)據(jù)庫(kù)的autovacuum會(huì)開(kāi)始對(duì)這些表依次進(jìn)行vacuumfreeze,從而集中式的爆發(fā)大量的讀寫(xiě)io,數(shù)據(jù)庫(kù)和操作系統(tǒng)響應(yīng)遲緩,如果又碰上業(yè)務(wù)高峰,會(huì)出現(xiàn)很不好的影響。


所以設(shè)置好參數(shù)尤為重要:

  1. 設(shè)置vacuum_cost_delay為一個(gè)比較高的數(shù)值(例如50ms),這樣可以減少普通vacuum對(duì)正常數(shù)據(jù)查詢的影響。

  2. autovacuum_freeze_max_age和vacuum_freeze_table_age的值也不適合設(shè)置過(guò)大,因?yàn)檫^(guò)大會(huì)造成pg_clog中的日志文件堆積,來(lái)不及清理。我們把a(bǔ)utovacuum_freeze_max_age設(shè)置為最大值20億。

  3. vacuum_freeze_table_age設(shè)置為0.95* autovacuum_freeze_max_age。

  4. vacuum_freeze_min_age不宜設(shè)置過(guò)小,比如我們freeze某個(gè)元組后,這個(gè)元組馬上又被更新,那么之前的freeze操作其實(shí)是無(wú)用功,freeze真正應(yīng)該針對(duì)的是那些長(zhǎng)時(shí)間不被更新的元組。

  5. 生產(chǎn)環(huán)境中做好pg_database.frozenxid的監(jiān)控,當(dāng)快達(dá)到觸發(fā)值時(shí),我們應(yīng)該選擇一個(gè)業(yè)務(wù)低峰期窗口主動(dòng)執(zhí)行vacuumfreeze操作,而不是等待數(shù)據(jù)庫(kù)被動(dòng)觸發(fā)。

  6. 分區(qū),把大表分成小表。每個(gè)表的數(shù)據(jù)量取決于系統(tǒng)的io能力,前面說(shuō)了vacuumfreeze是掃全表的,現(xiàn)代的硬件每個(gè)表建議不超過(guò)32gb,單表數(shù)據(jù)不要超過(guò)3000w。

  7. 對(duì)大表設(shè)置不同的vacuum年齡

  8. 用戶自己調(diào)度 freeze,如在業(yè)務(wù)低谷的時(shí)間窗口,對(duì)年齡較大,數(shù)據(jù)量較大的表進(jìn)行vacuumfreeze。

  9. 年齡只能降到系統(tǒng)存在的最早的長(zhǎng)事務(wù)即 min(pg_stat_activity.(backend_xid,backend_xmin))。因此也需要密切關(guān)注長(zhǎng)事務(wù)。


END


文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/129950.html

相關(guān)文章

  • PostgreSQL9.6:新增加“idle in transaction”超時(shí)空閑事務(wù)自動(dòng)查殺功能

    摘要:以上出自發(fā)行說(shuō)明,這段指出版本支持自動(dòng)查殺超過(guò)指定時(shí)間的空閑事務(wù)連接,下面演示下。修改以下參數(shù)備注參數(shù)單位為毫秒,這里設(shè)置超時(shí)空閑事務(wù)時(shí)間為秒。數(shù)據(jù)庫(kù)日志備注數(shù)據(jù)庫(kù)日志里清晰地記錄了進(jìn)程的連接由于空閑事務(wù)超時(shí)被斷開(kāi)連接。 熟悉 PostgreSQL 的朋友應(yīng)該知道 idle in transaction 進(jìn)程,引發(fā) idle in transaction 的原因很多,例如應(yīng)用代碼中忘記...

    meislzhua 評(píng)論0 收藏0
  • 深入解析 PostgreSQL 系列之并發(fā)控制事務(wù)機(jī)制

    摘要:深入解析系列之并發(fā)控制與事務(wù)機(jī)制并發(fā)控制旨在針對(duì)數(shù)據(jù)庫(kù)中對(duì)事務(wù)并行的場(chǎng)景,保證中的一致性與隔離。啟動(dòng)并執(zhí)行第一個(gè)命令。事務(wù)管理器分配,并返回事務(wù)快照,因?yàn)檎谶M(jìn)行中。意味著該行由另一個(gè)并發(fā)事務(wù)更新,并且其事務(wù)尚未終止。 showImg(https://segmentfault.com/img/remote/1460000018081793); 深入解析 PostgreSQL 系列整理...

    JohnLui 評(píng)論0 收藏0
  • 深入解析 PostgreSQL 系列之并發(fā)控制事務(wù)機(jī)制

    摘要:深入解析系列之并發(fā)控制與事務(wù)機(jī)制并發(fā)控制旨在針對(duì)數(shù)據(jù)庫(kù)中對(duì)事務(wù)并行的場(chǎng)景,保證中的一致性與隔離。啟動(dòng)并執(zhí)行第一個(gè)命令。事務(wù)管理器分配,并返回事務(wù)快照,因?yàn)檎谶M(jìn)行中。意味著該行由另一個(gè)并發(fā)事務(wù)更新,并且其事務(wù)尚未終止。 showImg(https://segmentfault.com/img/remote/1460000018081793); 深入解析 PostgreSQL 系列整理...

    leone 評(píng)論0 收藏0
  • 構(gòu)建可擴(kuò)展的PostgreSQL解決方案

    摘要:這可以通過(guò)負(fù)載平衡來(lái)實(shí)現(xiàn)數(shù)據(jù)分片當(dāng)問(wèn)題不是并發(fā)查詢的數(shù)量,而是數(shù)據(jù)庫(kù)的大小和單個(gè)查詢的速度時(shí),可以實(shí)現(xiàn)不同的方法。 showImg(https://segmentfault.com/img/remote/1460000018875091); 來(lái)源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slogan | 連接每個(gè)程序員的故事 網(wǎng)站 | http://chaindesk.cn...

    jonh_felix 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<