目录
一:PostgreSQL
1.简介
2.特点
3.优势
4.架构
5.应用场景
6.结论
二:安装PostgreSQL
1.编译安装
(1)安装编译安装所需环境
(2)编译安装
(3)配置环境变量
(4)登录数据库
2.Dnf安装
(1)安装PostgreSQL
(2)初始化数据库
(3)登录数据库
三:PostgreSQL结构
1.PG的逻辑结构
2.PG的物理结构
(1)软件安装目录
(2)数据库目录结构
(3)数据库有两个基础的对象 一个是oid,一个是表空间
(4)base的物理布局设计
(5)表空间跟数据库关系
PostgreSQL,作为一个功能强大且开源的对象关系型数据库管理系统(ORDBMS),自其诞生以来,便以其卓越的性能和丰富的特性赢得了全球开发者和企业的青睐。源自加利福尼亚大学伯克利分校的 PostgreSQL,不仅继承了其前身 Ingres 的精髓,更在不断的发展中推陈出新,成为了现代数据库领域的佼佼者。
PostgreSQL 的架构设计体现了其高性能和可扩展性的特点。在逻辑层面上,PostgreSQL 包含了数据库集群、表空间、数据库、Schema、表、索引等结构;在物理层面上,则包括数据文件、日志文件、参数文件、控制文件等物理存储方式。其中,数据块(Page)作为数据读写的基本单位,在 PostgreSQL 中扮演着至关重要的角色。通过优化数据块的读写效率和布局方式,PostgreSQL 能够进一步提高其性能表现。
PostgreSQL 广泛应用于各种业务场景中,包括但不限于以下方面:
综上所述,PostgreSQL 作为一款功能强大、开源的数据库管理系统,在现代信息化建设中发挥着越来越重要的作用。其丰富的特性、卓越的性能、灵活的应用场景以及强大的社区支持使得 PostgreSQL 成为了众多企业和开发者的首选数据库产品。随着技术的不断进步和应用的不断扩展,相信 PostgreSQL 将在未来继续引领数据库技术的发展潮流。
安装 PostgreSQL 所需依赖
[root@localhost ~]#yum -y install gcc gcc-c++ make libicu libicu-devel readline-devel zlib zlib-devel
# 解压源码包
[root@localhost ~]#tar -zxvf postgresql-16.3.tar.gz
# 切换目录
[root@localhost ~]#cd postgresql-16.3
# --prefix指定安装目录
[root@localhost postgresql-16.3]#./configure --prefix=/usr/local/pgsql
# 编译以及安装
[root@localhost postgresql-16.3]#make && make install
# 创建用户
[root@localhost ~]#adduser postgres
# 创建数据存储目录
[root@localhost ~]#mkdir /usr/local/pgsql/data
# 更改数据存储目录的归属用户
[root@localhost ~]#chown postgres /usr/local/pgsql/data
[root@localhost ~]#cat >> /etc/profile << 'EOF'
# 配置共享库
LD_LIBRARY_PATH=/usr/local/pgsql/lib
export LD_LIBRARY_PATH
# 配置命令可搜索路径
PATH=/usr/local/pgsql/bin:$PATH
export PATH
EOF
#刷新环境变量
[root@localhost ~]#sour /etc/profile
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data/
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data/ -l logfile start
登录数据库:psql
本文是以 OpenEuler24 版本的操作系统为基础使用 dnf 部署的 15.12 版本的 PostgreSQL。
[root@localhost ~]# dnf install -y postgresql-server
[root@localhost ~]# postgresql-setup --initdb
* Initializing database in '/var/lib/pgsql/data'
* Initialized, logs are in '/var/lib/pgsql/initdb_postgresql.log'
注意:不要使用 root 用户登录,切换到 postgres 这个用户登录
[root@bogon ~]# psql
psql: FATAL: role "root" does not exist
[root@bogon ~]# su - postgres
-bash-4.2$ psql
psql (9.2.24)
Type "help" for help.
postgres=#
PG 采用了多层逻辑结构:第一层为实例,第二层为数据库(每个实例下可有多个相互独立的数据库),第三层为 Schema(每个数据库下包含多个 Schema)。每个 Schema 下可以创建表、视图、索引、函数等数据库对象。
PostgreSQL 数据库的软件目录通常是在 /usr 目录下(也可自定义位置),使用 pg_config 命令可以看到当前数据库的基本情况,也可以在环境变量中看到。最直接可以使用 which 命令看到。
安装目录里的基本内容如下
[postgres@localhost ~]$ which psql
/usr/local/pgsql/bin/psql
[postgres@localhost ~]$ cd /usr/local/pgsql
[postgres@localhost pgsql]$ ll
总计 20
drwxr-xr-x 2 root root 4096 3月31日 19:09 bin
drwx------ 19 postgres root 4096 3月31日 19:10 data
drwxr-xr-x 6 root root 4096 3月31日 19:09 include
drwxr-xr-x 4 root root 4096 3月31日 19:09 lib
drwxr-xr-x 6 root root 4096 3月31日 19:09 share
其中各个目录里的内容及用途:
-bash-4.2$ tree -L 1 -d /usr/local/pgsql/data/
/usr/local/pgsql/data/
├── base # 表和索引文件存放目录
├── global # 影响全局的系统表存放目录
├── pg_commit_ts # 事务提交时间戳数据存放目录
├── pg_dynshmem # 被动态共享所使用的文件存放目录
├── pg_logical # 用于逻辑复制的状态数据
├── pg_multixact # 多事务状态的数据
├── pg_notify # LISTEN/NOTIFY状态的数据
├── pg_replslot # 复制槽数据存放目录
├── pg_serial # 已提交的可序列化信息存放目录
├── pg_snapshots # 快照
├── pg_stat # 统计信息
├── pg_stat_tmp # 统计信息子系统临时文件
├── pg_subtrans # 子事务状态数据
├── pg_tblspc # 表空间
├── pg_twophase # 预备事务状态文件
├── pg_wal # 事务日志(预写日志)
└── pg_xact # 日志提交状态的数据存放目录
文件和目录相关作用描述
files | description |
---|---|
PG_VERSION | 包含 postgresql 主版本号的文件 |
pg_hba.conf | 控制 postgresql 客户验证的文件,控制 PG 客户认证文件、主机、数据库、用户、IP 地址认证方式 |
pg_ident.conf | 控制 postgresql 用户映射的文件,配置操作系统用户和数据库服务器上的用户映射 |
postgresql.conf | 配置参数文件 |
postgresql.auto.conf | 用于存储在 ALTER SYSTEM(版本 3.4 或更高版本)中设置的配置参数的文件 |
postmaster.opts | 记录服务器上一次启动的命令行选项 |
subdirectories | description |
base/ | 包含每个数据库子目录的子目录 |
global/ | 包含全局数据库的子目录,例如 pg_database 和 pg_control |
pg_commit_ts/ | 包含事务提交时间戳数据的子目录,9.5 版本以后 |
pg_clog/ (Version 9.6 or earlier) | 包含事务提交状态数据的子目录,它在版本 10 中重命名为 pg_xact,CLOG 将在 5.4 章节中讲解 |
pg_dynshmem/ | 包含动态共享内存子系统使用的文件的子目录,9.4 版本以后 |
pg_logical/ | 包含逻辑解码的状态数据的子目录,9.4 版本以后 |
pg_multixact/ | 包含多事务状态数据的子目录(用于 shared row locks) |
pg_notify/ | 包含 LISTEN / NOTIFY 状态数据的子目录 |
pg_replslot/ | 包含复制槽数据的子目录(9.1 版本以后) |
pg_serial/ | 包含有关已提交的可序列化事务(9.1 版本以后)信息的子目录 |
pg_snapshots/ | 包含导出快照的子目录(9.2 版本以后),PostgreSQL 的函数 pg_export_snapshot 在此子目录中创建快照信息文件 |
pg_stat/ | 包含统计子系统永久文件的子目录 |
pg_stat_tmp/ | 包含统计子系统临时文件的子目录 |
pg_subtrans/ | 包含子事务状态数据的子目录 |
pg_tblspc/ | 表空间符号链接目录 |
pg_twophase/ | 包含 prepare 事务的状态文件 |
pg_wal/ (Version 10 or later) | 包含 WAL(Write Ahead Logging)段文件的子目录,在版本 10 中 pg_xlog 重命名为此 |
pg_xact/ (Version 10 or later) | 包含事务提交状态数据的子目录,在版本 10 中 pg_clog 重命名为此,CLOG 将在 5.4 章节中讲解 |
pg_xlog/ (Version 9.6 or earlier) | 包含 WAL(Write Ahead Logging)段文件的子目录,在版本 10 中重命名为 pg_or earlier |
OID(Object Identifier)是数据库对象的唯一标识符。
表空间实际上是文件系统中的一个位置链接,即一个目录,它是一个逻辑上的概念,目录是它的物理存在方式。数据库中创建的对象(表、索引、数据库对象)都保存在表空间中。postgresql 初始化完成后,会有两个默认的表空间,一个是 pg_default,如果用户建表时没有指定表空间,所有新建的表都会放在 pg_default 中,另一个是 pg_global,存放的是整个实例数据库所共享的系统表。
每个数据库都会在$PGDATA/base
下面生成一个子目录,如下图,都会一一对应。
[root@localhost base]# ls /usr/local/pgsql/data/base/
1 4 5
postgres=# select datname,oid from pg_database;
datname | oid
----------+-----
postgres | 5
template1| 1
template0| 4
(3行记录)
在 Oracle 数据库中,一个表空间只属于一个数据库使用;而一个数据库可以拥有多个表空间。属于 “一对多” 的关系。
在 PostgreSQL 集群中,一个表空间可以让多个数据库使用;而一个数据库可以使用多个表空间。属于 “多对多” 的关系。
系统自带表空间: