postgresql技术大讲堂 -凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 524299
  • 博文数量: 467
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4736
  • 用 户 组: 普通用户
  • 注册时间: 2018-07-05 13:59
个人简介

ocp考试资料群:569933648 验证码:ocp ocp 12c 19c考试题库解析与资料群:钉钉群号:35277291

文章分类

全部博文(467)

文章存档

2023年(18)

2021年(151)

2020年(37)

2019年(222)

2018年(38)

我的朋友
最近访客
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: mysql/postgresql

2023-06-16 13:45:10


postgresql从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对pg基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱pg、学习pg的同学们有帮助,欢迎持续关注cuug pg技术大讲堂。

第19讲:冻结txids

内容1:postgresql txid介绍

内容2:postgresql txid使用原理使用

内容3:冻结txid来解决txid环绕问题

内容4:如何冻结tixd


txid介绍

· 事务id(txid)

当一个事务开始时,postgresql中的事务管理系统会为该事务分配一个唯一标识符,即事务id(txid).postgresql中的txid被定义为一个32位的无符号整数,也就是说,它能记录大约42亿个事务。通常txid对我们是透明的,但是我们可以利用postgresql内部的函数来获取当前事务的txid。

testdb=# begin;

begin

testdb=# select txid_current();

txid_current

--------------

100

(1 row)

请注意,begin命令没有指定txid。在postgresql中,当{banned}中国第一个命令在begin命令执行之后执行时,事务管理器会分配一个tixd,然后它的事务开始。


txid使用原理

· txid结构

txid=2的32次方=42亿

前21亿个txid是“过去的”

后21亿个txid是“未来的”


txid环绕

· txid环绕

假设元组tuple_1的txid为100,即tuple_1的t_xmin为100。服务器已经运行很长一段时间了,tuple_1没有被修改。当前的txid是21亿 100,执行select命令。此时,tuple_1可见,因为txid 100是过去的。接着,又执行相同的select命令,此时当前的txid就变成是21亿 101了,根据行可见性规则判断tuple_1就不再可见,因为txid 100变成是未来的了。


冻结txid

· 解决txid环绕问题的方法—冻结txid

解决事务环绕问题的方法是冻结,其做法是把21亿以前事务所修改的行做一个标记位(即冻结),根据行可见性规则,凡是被标识位冻结行在判断的时候就不依赖t_xmin了,让行数据变成可见。

若txid使用过一轮以后,被冻结的行如果被新事务修改,则原来的标记位就会消除(即解冻),此时此行是否可见,就要根据行可见性规则进行判断。


冻结处理

· 冻结处理有两种模式

lazy mode (惰性模式)

eager mode (急切模式)

· lazy mode

冻结极限txid定义如下:

freezelimit_txid=(oldestxmin-vacuum_freeze_min_age)

autovacuum操作会进行冻结操作,每分钟都会执行一次,被选中的表都会进行vacuum操作,包含冻结txid内容。

· eager mode

当满足以下条件时,执行紧急模式:

pg_database.datfrozenxid<(oldestxmin-vacuum_freeze_table_age)

· pg_database.datfrozenxid 和pg_class.relfrozenxid(s)之间的冻结对比

· 如何显示被冻结的对象信息

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

· 显示被冻结的数据库信息

testdb=# select datname, datfrozenxid from pg_database where datname = 'testdb';

datname | datfrozenxid

--------- --------------

testdb | 1821

(1 row)

· 使用vm提高冻结效率



以上就是part 19 - 冻结txids 的内容,欢迎一起探讨交流,往期视频,联系cuug

阅读(595) | 评论(0) | 转发(0) |
0

上一篇:postgresql技术大讲堂 - 第18讲:tuning autovacuum

下一篇:没有了

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图