AntDB/PostgreSQL内部原理:表Page结构解析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AntDB/PostgreSQL内部原理:表Page结构解析相关的知识,希望对你有一定的参考价值。
参考技术A PostgreSQL 中 Page 是一个磁盘 Block 上的一个抽象结构,用于描述 Block 内部的数据结构与组织形式。
所有数据块在读写时,必须按 Page 格式进行访问操作。
PostgreSQL 11 的 Page 格式(包含 3 行数据)如下:
行指针之前的 Page Header 总空间消耗为: (64 + 16 * 6 + 32) bit / 8 = 24 Byte
以下分别对这些结构以及对应的标志位的值进行说明:
Tuple 类型和行中各列数据的头部信息共享相同的数据结构,所以可以用相同的方法来构建和检查。但需求略有不同,数据不需要事务可见性信息,它需要一个长度字段和一些嵌入式类型信息。我们可以通过覆盖 Heap Tuple 上的 xmin/cmin/xmax/cmax/xvac 字段来实现数据上的需求。
Heap tuple 的头部信息,为了避免空间浪费,应该将字段以一种避免结构扩充的方式来布局。
通常,内存中所有的 tuples 都会使用数据字段进行初始化,当一个 tuple 需要写入表中时,事务相关的字段将会被写入,并覆盖数据字段。
Heap tuple 的整体结构包括:
通过 pageinspect 扩展模块,可以在低层次观察 page 中的实际数据,而不用考虑事务及相关可见性限制,这通常用于 DEBUG 目的的数据研究。
其常用函数说明如下:
创建模块
创建测试表
查看 Page Header
数据含义解析:
查看 Page 中的记录(Tuple)
数据含义解析:
解析 Tuple 数据
尝试多次更新同一条一条数据
再次查看页面数据
数据含义解析:
删除一条数据
再次查看页面数据
数据含义解析:
通过跟踪 t_xmin, t_xmax, t_ctid 三个字段的变化,可以得到 Tuple 数据的多版本变化历史,这也是 PostgreSQL 的 MVCC 实现原理
PostgreSQL 的多版本(MVCC)与 Oracle 有很大的不同,在于其将多版本信息与表数据存储在一起,这种多版本实现方式有其优势与局限性。
优势
劣势
CentOS平台源码编译安装AntDB数据库
CentOS平台源码编译安装AntDB数据库
准备工作
1.创建用户
在root用户下执行:useradd antdb
进行antdb用户的创建。
执行:passwd antdb
修改antdb用户密码。
2.配置用户limit参数
编辑/etc/security/limits.conf
文件,配置antdb用户参数:
antdb soft nproc 65536
antdb hard nproc 65536
antdb soft nofile 278528
antdb hard nofile 278528
antdb soft stack unlimited
antdb soft core unlimited
antdb hard core unlimited
antdb soft memlock 250000000
antdb hard memlock 250000000
保存文件后,执行su - antdb
切换到antdb
用户
执行ulimit -a
检查是否生效。
3.配置用户sudo权限
在安全允许的条件下,建议给antdb
用户加上sudo
权限。
root
用户执行visudo
进行编辑界面,找到 Allow root to run any commands anywhere
所在行,在行下面添加:
antdb ALL=(ALL) ALL
保存文件退出。su - antdb
切换到antdb
用户,执行sudo id
,预期会提示输入用户密码,输出为:
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
表示sudo权限添加成功。
安装依赖
在cento或者redhat操作系统下,执行如下命令安装依赖:
yum install -y perl-ExtUtils-Embed
yum install -y flex
yum install -y bison
yum install -y readline-devel
yum install -y zlib-devel
yum install -y openssl-devel
yum install -y pam-devel
yum install -y libxml2-devel
yum install -y libxslt-devel
yum install -y openldap-devel
yum install -y python-devel
yum install -y gcc-c++
yum install -y libssh2-devel
安装AntDB
单机版
创建相关目录
mkdir -p ./data/antdb/data,tools,app,soft_src
chown -R antdb:antdb ./data/antdb
chmod -R 755 ./data/antdb
创建好后续需要用到的目录:
data
:AntDB的数据目录。
tools
:存放相关工具
app
:程序目录
soft_src
: AntDB以及其他工具的源码目录
需要根据实际情况修改目录路径。
修改环境变量
vim .bashrc
export ADB_HOME=/home/antdb/data/antdb/app/antdb
export PATH=$ADB_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ADB_HOME/lib:$LD_LIBRARY_PATH
export PGPORT=5432
export PGDATABASE=postgres
执行 source ~/.bashrc使环境变量生效。
源码安装
拉取源码:AntDB源码地址,点击前往
接着就可以进行编译安装:
在源码同级目录下创建 build 目录: mkdir build
由于用同一份代码生成了mgr,gtmcoord,所以需要在源码的同级目录下单独创建build编译目录;
在 bulid 目录下 执行 configure:
../ant-db_source/configure --prefix=/home/antdb/antdb --enable-debug --disable-cluster
其中: --prefix 目录为准备安装的目录,可以根据需求灵活设置。-disable-cluster 表示编译的是单机版本。
编译安装: make install-world-contrib-recurse
操作完成后再 --prefix 指定的目录中,可以看到安装后的文件。便可进行数据库的初始化和使用
[antdb@local102 antdb]$ cd bin/
[antdb@local102 bin]$ ls
clusterdb dropdb initdb pg_basebackup pg_config pg_dump pg_isready pg_resetwal pg_standby pg_upgrade postgres reindexdb
createdb dropuser oid2name pgbench pg_controldata pg_dumpall pg_receivewal pg_restore pg_test_fsync pg_verifybackup postmaster vacuumdb
createuser ecpg pg_archivecleanup pg_checksums pg_ctl pg_extendpage pg_recvlogical pg_rewind pg_test_timing pg_waldump psql vacuumlo
[antdb@local102 bin]$ initdb -D /home/antdb/data/antdb/data --wal-segsize=1024
bash: initdb: command not found...
[antdb@local102 bin]$ ./initdb -D /home/antdb/data/antdb/data --wal-segsize=1024
The files belonging to this database system will be owned by user "antdb".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
fixing permissions on existing directory /home/antdb/data/antdb/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... PRC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
initdb: warning: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
./pg_ctl -D /home/antdb/data/antdb/data -l logfile start
[antdb@local102 bin]$ ./pg_ctl -D /home/antdb/data/antdb/data start
waiting for server to start....2021-08-26 16:10:41.316 CST [46045] LOG: starting PostgreSQL 13beta1 ADB 6.2devel 15e1a46 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.1.0, 64-bit
2021-08-26 16:10:41.319 CST [46045] LOG: listening on IPv6 address "::1", port 5432
2021-08-26 16:10:41.319 CST [46045] LOG: listening on IPv4 address "127.0.0.1", port 5432
2021-08-26 16:10:41.321 CST [46045] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
2021-08-26 16:10:41.322 CST [46046] LOG: database system was shut down at 2021-08-26 16:10:13 CST
2021-08-26 16:10:41.323 CST [46045] LOG: database system is ready to accept connections
done
server started
[antdb@local102 bin]$ ./psql
psql (13beta1)
Type "help" for help.
postgres=#
postgres=#
postgres=# \\d
Did not find any relations.
postgres=#
以上是关于AntDB/PostgreSQL内部原理:表Page结构解析的主要内容,如果未能解决你的问题,请参考以下文章