加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL缓存脏块的一个奇怪现象

发布时间:2020-12-13 17:34:13 所属栏目:百科 来源:网络整理
导读:这是我在写程序过程中发现的,一个不应该为脏的块被标记为脏,PostgreSQL 9.3.1。 出现步骤(用UPDATE语句也同样出现) 创建表并插入一条数据 create table t1(c1 integer); insert into t1 values(1); 此时 postgres=# select * from pg_buffercache where i
这是我在写程序过程中发现的,一个不应该为脏的块被标记为脏,PostgreSQL 9.3.1。

出现步骤(用UPDATE语句也同样出现)

创建表并插入一条数据
create table t1(c1 integer);
insert into t1 values(1);

此时
postgres=# select * from pg_buffercache where isdirty;
bufferid | relfilenode | reltablespace | reldatabase | relforknumber | relblocknumber | isdirty | usagecount
----------+-------------+---------------+-------------+---------------+----------------+---------+------------
..........若干
196 | 16385 | 1663 | 12896 | 0 | 0 | t | 1

写出缓存
postgres=# checkpoint ;
CHECKPOINT
postgres=# select * from pg_buffercache where isdirty;
bufferid | relfilenode | reltablespace | reldatabase | relforknumber | relblocknumber | isdirty | usagecount
----------+-------------+---------------+-------------+---------------+----------------+---------+------------
(0 rows)
可以看到脏块已经消失

重启
pg_ctl stop -D ../data
pg_ctl start -D ../data

查询t1
postgres=# select * from t1;
c1
----
1
(1 row)

查看脏块
postgres=# select * from pg_buffercache where isdirty;
bufferid | relfilenode | reltablespace | reldatabase | relforknumber | relblocknumber | isdirty | usagecount
----------+-------------+---------------+-------------+---------------+----------------+---------+------------
86 | 16385 | 1663 | 12896 | 0 | 0 | t | 1
(1 row)

按理这里不应该是脏块才对 过段时间,此现象消失,再查询它不会出现脏块中。 我查看过读取缓存的代码,目前没有发现。 此外,脏块的标记并不是靠块状态,而是块描述符,描述符是在数据库运行过程之中维护,无法理解怎么会存在这种现象。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读