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) 按理这里不应该是脏块才对 过段时间,此现象消失,再查询它不会出现脏块中。 我查看过读取缓存的代码,目前没有发现。 此外,脏块的标记并不是靠块状态,而是块描述符,描述符是在数据库运行过程之中维护,无法理解怎么会存在这种现象。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |