0%

转载自

1. 表文件

PostgreSQL提供了可靠、稳定、有序的数据存储、检索管理。即使在不知道其背后运行原理的情况下,也没有多大关系,因为我们只需要按部就班地执行建库、建表然后插入数据结构这几个流程,就可以如愿以偿地实现将我们的数据持久化于PostgreSQL数据库中。于是我们不得不好奇,这些数据最终落盘于磁盘上的哪个位置?又是以什么样的形式存储?存储的格式又是什么?在这几个疑问的驱动下,本文将通过源码结合数据入库实践操作的方式,来详细地对PostgreSQL底层数据的存储方式进行详细的解读。

阅读全文 »

1
2
3
4
5
test=# select pg_relation_filenode('pg_attribute'); 
pg_relation_filenode
----------------------
24621
(1 row)

这个命令可以找到表文件在哪里存着

转载自

前言

系统表是整个 PostgreSQL 数据库存储体系中最重要的一部分数据,它们用来组织管理PostgreSQL 的数据空间,将用户自己定义的数据集合更好得以一个或者多个表组织起来。它们本质也是一个个表对象,相比于普通表是存储的元数据。

这里的元数据可以理解为描述数据的数据。比如,用户创建的表有 (c1 int, c2 text)两种列类型,这一些类型 int, text 会被单独存放在 pg_type的系统表中,同时 c1, c2 列名字则会被存放在 pg_attribute的系统表中,并和 pg_type 形成关联。这一些 pg_type, pg_attribute 类型的表可以建立对用户表的关系描述,所以它们可以被称为元数据。

阅读全文 »

转载自

如果使用MYSQL 相对页面的层次进行一些了解,估计你就的找大佬们的工具集合,并且为此膜拜大佬们,但PG并不需要这样,PG自身自带的pageinspect 工具,就可以让你对页面级别的层次来进行一个 “透心凉” 的查看和分析,并不在为此苦恼。

阅读全文 »

参考:

0x01 PostgreSQL中MVCC原理

PostgreSQL中,对于每一行数据(称为一个tuple),包含有4个隐藏字段。这四个字段是隐藏的,但可直接访问。

  • xmin 在创建(insert)记录(tuple)时,记录此值为插入tuple的事务ID
  • xmax 默认值为0.在删除tuple时,记录此值
  • cmin和cmax 标识在同一个事务中多个语句命令的序列值,从0开始,用于同一个事务中实现版本可见性判断

下面通过实验具体看看这些标记如何工作。在此之前,先创建测试表

1
2
3
4
5
CREATE TABLE test 
(
id INTEGER,
value TEXT
);
阅读全文 »

一、安装并配置,并设置远程登陆的用户名和密码

1、安装postgreSQL

1
2
3
4
5
6
sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main"
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

sudo apt-get update

sudo apt-get install postgresql-9.6
  • 在Ubuntu下安装Postgresql后,会自动注册为服务,并随操作系统自动启动。
  • 在Ubuntu下安装Postgresql后,会自动添加一个名为postgres的操作系统用户,密码是随机的。并且会自动生成一个名字为postgres的数据库,用户名也为postgres,密码也是随机的。
阅读全文 »

0x00 背景介绍

多个线程访问同一个互斥资源的时候,需要保证数据的正确性,其中一个方案就是加锁。spinlock(自旋锁)尽可能的减少线程的阻塞,这对于锁的竞争不激烈,且占用锁时间非常短的代码块来说性能能大幅度的提升,因为自旋的消耗会小于线程阻塞挂起再唤醒的操作的消耗,这些操作会导致线程发生两次上下文切换!

但是如果锁的竞争激烈,或者持有锁的线程需要长时间占用锁执行同步块,这时候就不适合使用自旋锁了,因为自旋锁在获取锁前一直都是占用 cpu 做无用功,同时有大量线程在竞争一个锁,会导致获取锁的时间很长,线程自旋的消耗大于线程阻塞挂起操作的消耗,其它需要 cpu 的线程又不能获取到 cpu,造成 cpu 的浪费。所以这种情况下我们要关闭自旋锁。

阅读全文 »