0%

参考:

0x00 可变长类型

0. Datum 的 typlen 的约定

如果Datum 类型是 “byVal”,则Datum表示一个值。如果Datum 类型不是”byVal“,则Datum 表示一个指针:

typlen > 0, Datum 就指向固定长度字节流,比如int类型 typlen == -1, Datum 指向一个变长 varlena 结构体,比如char,varchar类型 typlen == -2, Datum 指向一个C语言风格的字符串;

因此,查看所有的变长数据类型:

1
SELECT typname FROM pg_type WHERE typlen = -1
阅读全文 »

转载自

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,密码也是随机的。
阅读全文 »