PostgreSQL的神秘现象

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:

今天进行了一个小实验,发现一个奇怪的现象:

我当前有这样的数据:

 

postgres=# select * from tab01;

 

复制代码
 id | val 
----+-----
  1 | 100
  2 | 200
  3 | 300
(3 rows)

postgres=# 
复制代码

并且通过查询数据字典,知道 tab01 对应的文件名是:

/usr/local/pgsql/data/base/12788/16385 

然后重新启动数据库。开启两个psql 客户端

第一个客户端执行: 

postgres=# select * from tab01 where id=1;
 id | val 
----+-----
  1 | 100
(1 row)

然后对 16385文件进行改名: mv 16385  16385.bak

此时在第二个客户端执行:

postgres=# select * from tab01 where val=300;

得到提示:

ERROR:  could not open file "base/12788/16385": No such file or directory

这倒也很是正常,表所对应的文件已经不存在了。

然后奇怪的事情发生在这里:

我在第一个客户端对表 tab01继续执行查询会怎么样:

复制代码
postgres=# select * from tab01 where val=200;
 id | val 
----+-----
  2 | 200
(1 row)

  postgres=# select * from tab01 where val=300;
   id | val 
   ----+-----
   3 | 300
  (1 row)

复制代码

查询完全没有问题。

难道是第一个客户端记录了缓存?

我们再来看下面实验:

把前面的16385.bak 文件再次改回 16385。

开第三个psql客户端,写入新数据:

postgres=# insert into tab01 values(5,500);
INSERT 0 1
postgres=# 

这是,我再把 16385改名为  16385.bak,那么第一个客户端还能查到这条新数据吗?

居然毫无问题,可以查询到新增的数据!

复制代码
postgres=# select * from tab01 where val=500;
 id | val 
----+-----
  5 | 500
(1 row)

postgres=# 
复制代码

这个现象应该是和PostgreSQL的查询实现方式有关,具体原因需要进一步分析。

询问了Linux方面的牛人,据说是由于OS级别,对文件也提供了类似数据库的多用户视图。就是我们rm或mv一个文件,之前打开此文件的程序仍然能够持续地看到内容。只有rm/mv 动作之后再打开此文件的程序和用户才会受到影响。







本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2013/05/23/3094149.html,如需转载请自行联系原作者

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
Rust 区块链
学Rust不学Cargo,等于没学Rust:features特性详解
在 Rust 中,Cargo 的 "features" 是一种条件编译机制,允许在编译 crate 时编译部分代码。这样可以在一个 crate 中提供多个功能,并根据需要选择性地启用或禁用这些功能。
410 1
|
存储 编译器 程序员
C/C++中的内建函数介绍:介绍C/C++中内建函数的基本概念、用途和作用
C/C++中的内建函数介绍:介绍C/C++中内建函数的基本概念、用途和作用
330 0
|
API 数据格式
IIIF 标准
IIIF 标准
613 0
|
开发工具 git 开发者
【GitHub】如何在github上提交PR(Pull Request) + 多个pr同时提交、互不干扰
【GitHub】如何在github上提交PR(Pull Request) + 多个pr同时提交、互不干扰
3718 6
|
编译器 Linux C语言
【C语言】字符串函数的介绍二( strcmp、strncpy、strncat、strncmp)
【C语言】字符串函数的介绍二( strcmp、strncpy、strncat、strncmp)
645 0
|
弹性计算
阿里云带宽计费模式按固定宽带和按使用流量区别对比及选择方法
阿里云服务器公网IP带宽计费方式分为按固定宽带和按使用流量,按固定宽带和按使用流量有什么区别?阿里云公网带宽计费模式如何选择?需要根据大家实际的应用场景来选择
5931 0
阿里云带宽计费模式按固定宽带和按使用流量区别对比及选择方法
|
Web App开发 算法 前端开发
Cesium开发: Draco模型压缩
Cesium开发: Draco模型压缩
803 1
|
NoSQL Cloud Native 关系型数据库
阿里云数据库有哪些?主要用于哪些使用场景?
阿里云数据库有哪些?主要用于哪些使用场景?
842 0
|
安全 Linux
Linux更改文件和目录的所有权经常使用的命令:chown 和 chgrp
Linux更改文件和目录的所有权经常使用的命令:chown 和 chgrp
945 0
|
C语言 Android开发
(C语言)学生成绩的平均分与总分的计算
编写程序,进行学生成绩的平均分与总分的计算。
968 0