PostgreSQL 初体验

目录

前言
在数据驱动的时代,掌握 PostgreSQL 这一全球顶尖的开源关系型数据库,意味着拥有了一把开启高效数据处理与复杂业务支撑的钥匙。作为兼具 ACID 事务特性、多版本并发控制、丰富扩展能力与跨平台兼容性的数据库系统,PostgreSQL 不仅能支撑高并发 OLTP 场景,更擅长处理空间数据、JSON 等非结构化信息,其活跃的开源社区与持续迭代的生态工具链(如 PostGIS、TimescaleDB)使其成为从初创项目到企业级应用的首选方案。学习PostgreSL,不仅是为了掌握一款功能全面的数据库工具,更是为了构建应对大数据量、高可靠性要求、复杂查询场景的技术底层思维,为人工智能、物联网、金融分析等前沿领域的数据服务需求奠定坚实基础,让技术学习直接转化为解决真实问题的硬核能力。

PostgreSQL

简介

PostgreSQL,作为一个功能强大且开源的对象关系型数据库管理系统(ORDBMS),自其诞生以来,便以其卓越的性能和丰富的特性赢得了全球开发者和企业的青睐。源自加利福尼亚大学伯克利分校的PostgreSQL,不仅继承了其前身 Ingres 的精髓,更在不断的发展中推陈出新,成为了现代数据库领域的佼佼者

特点

开源与自由:PostgreSQ 完全开源,遵循PostgreSQL许可证,这一特性使得用户可以自由地使用、修改和分发 PostgreSqL,无需担心版权问题,同时也促进了全球开发者的积极参与和贡献

标准符合性:PostgreS高度符合 SQL 标准,支持复杂的査询语法、子査询、窗口函数、公共表表达式(CTE)等高级特性,使得开发者可以更加灵活地编写高效、易读的 SQL代码

数据类型丰富:PostgreSq,提供了丰富的数据类型,包括基本类型(如整数、浮点数、字符串等)、日期和时间类型数组、枚举、范围类型、JSON、地理空间类型等,这些类型极大地扩展了PostareSQL 的应用范围,使其能够处理各种复杂的数据场景

事务与并发:PostareSQL采用多版本并发控制(MVCC)机制,确保了在高并发环境下的数据一致性和隔离性。同时,PostgreSQ还支持复杂的事务处理,包括嵌套事务、保存点等,为开发者提供了强大的事务管理能力

扩展性:PostgreSgL支持扩展和插件机制,允许用户根据需要定义新的数据类型、函数、操作符、索引方法等。这一特性使得 PostgreSQL 能够不断适应新的业务需求和技术发展

安全性:PostareSqL 提供了细粒度的访问控制、加密传输、审计日志等安全特性,确保了数据库的安全性和数据的保密性

优势

高性能:PostgreSQ 通过优化査询计划、支持并行査询、分区表等特性,提供了卓越的性能表现。即使在处理大规模数据和高并发访问时,也能保持高效的响应速度

高可用性:PostgreSQ支持主从复制、流复制和逻辑复制等多种复制方式,使得数据库系统能够轻松实现高可用性和容灾备份。在发生故障时,能够快速恢复服务,确保业务的连续性

灵活性:PostgreSQ的丰富数据类型和高级特性使得它能够灵活应对各种复杂的业务场景。无论是处理结构化数据还是非结构化数据,PostgreSQL都能提供强大的支持

社区支持:PostgreSqL拥有一个活跃的开发者社区和丰富的生态系统。社区中不仅有大量的教程、文档和插件可供使用,还有众多经验丰富的开发者愿意分享经验和解答问题

成本效益:作为开源软件,PostgreSQ降低了企业的成本投入。同时,其卓越的性能和广泛的应用场景也使得 PostgreSQL 成为了许多企业的首选数据库产品

架构

PostgreSQL 的架构设计体现了其高性能和可扩展性的特点。在逻辑层面上,PostgreSQL 包含了数据库集群、表空间、数据库、Schema、表、索引等结构;在物理层面上,则包括数据文件、日志文件、参数文件、控制文件等物理存储方式。其中,数据块(Page)作为数据读写的基本单位,在PostgreSQL 中扮演着至关重要的角色。通过优化数据块的读写效率和布局方式,PostgreSQL能够进步提高其性能表现

应用场景

PostgreSQl 广泛应用于各种业务场景中,包括但不限于以下方面

企业应用:如ERP、CRM、HRM等系统,需要处理复杂的事务和查询操作。PostgreSqL 凭借其高性能和事务处理能力,能够为企业应用提供稳定可靠的数据支持

数据分析:在数据仓库和商业智能领域,PostgreSqL凭借其丰富的数据类型和高级查询特性,能够轻松应对大规模数据分析和挖掘任务

Web 应用:对于需要高并发访问和实时数据处理的 Web 应用来说,PostgreSQl的 MVCC 机制和扩展性特性使得其成为了一个理想的选择

地理信息系统(GIS):通过PostGIS扩展,PostgreSQL能够支持地理空间数据的存储和分析功能,为GIS 应用提供了强大的数据支持

物联网与大数据:随着物联网和大数据技术的不断发展,PostgreSQL凭借其高性能、可扩展性和丰富的数据类型特性,在物联网和大数据领域中也得到了广泛的应用

结论

综上所述,PostgreSQL 作为一款功能强大、开源的数据库管理系统,在现代信息化建设中发挥着越来越重要的作用。其丰富的特性、卓越的性能、灵活的应用场景以及强大的社区支持使得 PostgresqL 成为了众多企业和开发者的首选数据库产品。随着技术的不断进步和应用的不断扩展,相信PostgreSQL将在未来继续引领数据库技术的发展潮流

安装 PostgreSQL

编译安装

本文是以 0penEuler24 版本的操作系统为基础采用编译安装的方式安装16.3 版本的 PostgreSQL

安装编译安装所需环境

安装PostgreSQL 所需依赖

复制代码
[root@localhost ~]# dnf -y install gcc make libicu libicu-devel readline-devel zlib zlib-devel
编译安装
复制代码
##解压源码包

[root@localhost ~]# tar zxf postgresql-15.4.tar.gz

##切换目录

[root@localhost ~]# cd postgresql-15.4

##--prefix 指定安装目录

[root@localhost postgresql-15.4]# ./configure --prefix=/usr/local/pgsql


##编译以及安装

[root@localhost postgresql-15.4]# make && make install

配置环境

##创建用户

[root@localhost ~]# useradd postgres

##创建数据存储目录

[root@localhost ~]# mkdir /usr/local/pgsql/data

##更改数据存储目录的归属用户

[root@localhost ~]# chown -R postgres /usr/local/pgsql/data
配置环境变量
复制代码
[root@localhost ~]# vim /etc/profile
export PATH=/usr/local/pgsql/bin:$PATH                                ##配置命令可搜索路径
export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH         ##配置共享库
##刷新环境变量
[root@localhost ~]# source /etc/profile
登录数据库

注意:不要使用 root 用户登录,切换到postgres 这个用户

复制代码
[root@localhost ~]# su - postgres
[postgres@localhost ~]$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data/
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "zh_CN.UTF-8".
The default database encoding has accordingly been set to "UTF8".
initdb: could not find suitable text search configuration for locale "zh_CN.UTF-8"
The default text search configuration will be set to "simple".

Data page checksums are disabled.

fixing permissions on existing directory /usr/local/pgsql/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 ... Asia/Shanghai
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
initdb: hint: 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:

    /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data/ -l logfile start
[postgres@localhost ~]$ /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
waiting for server to start.... done
server started
[postgres@localhost ~]$ /usr/local/pgsql/bin/psql 
psql (15.4)
Type "help" for help.

postgres=#

Dnf 安装

安装 PostgreSQL
复制代码
[root@localhost ~]# dnf -y install 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@localhost ~]# su - postgres
[postgres@localhost ~]$ pg_ctl start
等待服务器进程启动 ....2025-04-29 15:48:28.468 CST [2647] 日志:  日志输出重定向到日志收集进程
2025-04-29 15:48:28.468 CST [2647] 提示:  后续的日志输出将出现在目录 "log"中.
 完成
服务器进程已经启动
[postgres@localhost ~]$ psql
psql (15.12)
输入 "help" 来获取帮助信息.

postgres=# 

PostgreSQL 结构

PG 的逻辑结构

PG 采用了多层逻辑结构:第一层为实例,第二层为数据库(每个实例下可有多个相互独立的数据库),第三层为Schema(每个数据库下包含多个 Schema)每个 Schema 下可以创建表、视图、索引、函数等数据库对象。如下图所示:

Database cluster(数据库集簇):由postgresql server 管理的数据库的集合,下面由多个 database 组成。一个数据库集簇可以包含多个 Database、多个User,每个 Database 以及 Database 中的所有对象都有它们的所有者:User

Database 数据库:Postgres 默认数据库、Template0 最精简模板、Templatel默认模板;数据库本身也是数据库对象,并且在逻辑上彼此分离。存储 schema 的一个逻辑空间,对应在物理层面上也是一个目录

Schema:一个数据库可以有多个 User 用户,多个 Schema 模式,默认创建一个数据库会存储在默认表空间,它包含一个 Public 名称的 Schema 模式(拷贝自Template1 模板)。它可隔离多个用户之间相同名称的对象。一个数据库可以有多个 Schema 模式,他们互不相关互相隔离。实际存储数据库对象的逻辑空间->逻辑上的对象编号,schema 是依附于数据库而存在的

User 用户:postgres 用户是默认创建的超级管理员;每个数据库都有一个>OWNER 用户,每个用户可以 OWNER 多个数据库。数据库对象:这里包含了 table,index,view,序列,数等,数据最终存储在表中。表的组成表由多个page[ block]组成)一个page 包含(页头信息空闲空间 Tuple),实际存储数据的区域->对应到物理层面上就是文件 -->page构成

tablespace:存储数据库的一个逻辑空间,可以存放不同的数据库-->对应在物理层面上是一个目录

OID:所有数据库对象都有各自的 oid(object identifiers),oid 是一个无符号的四字节整数,相关对象的 oid 都存放在相关的 system catalog 表中,比如数据库的 oid 和表的 oid 分别存放在 pg_database,pg_class 表中

总结:

(1)从大小排列 database cluster-->databases-->schema-->objects

(2)Tablespace 是数据最大的存储空间, Database 是构成表空间的存储单元pages 是 PostgreSQl 数据库中最小的 10 单元

PG 的物理结构

数据库的文件默认保存在 initdb 时创建的数据目录中。在数据目录中有很多类型、功能不同的目录和文件,除了数据文件之外,还有参数文件、控制文件、数据库运行日志及预写日志等。本质上都是PG的相关一些文件

软件安装目录

PostgreSQL 数据库的软件目录通常是在/usr 目录下(也可自定义位置)使用 pg_confg 命令可以看到当前数据库的基本情况,也可以在环境变量中可以看到。最直接可以使用 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  4月 7日 16:47 bin
drwx------. 19 postgres root 4096  4月 7日 16:55 data
drwxr-xr-x.  6 root     root 4096  4月 7日 16:47 include
drwxr-xr-x.  4 root     root 4096  4月 7日 16:47 lib
drwxr-xr-x.  6 root     root 4096  4月 7日 16:47 share

其中各个目录里的内容及用途:

含义
bin 二进制可执行文件,是PG数据库的所有相关命令所在,为方便使用需设置到环境变量中
lib 动态库目录,PostgreSQL运行所需要的动态库都在此目录下
share 放有文档和配置模板文件,一些拓展插件的 SQL 文件在此目录下的extension中
data 目录是数据库集群的物理存储核心,包含用户数据、元数据和配置文件
include 目录则提供编译扩展和客户端程序所需的C语言头文件
数据库目录结构
复制代码
[root@localhost ~]# dnf -y install tree
[root@localhost ~]# 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                                                    --日志提交状态的数据存放目录

18 directories

文件和目录相关作用描述

files description
PG_VERSION 包含postgresql主版本号的文件
pg_hba.conf 控制postgresql客户端验证的文件 控制PG客户端认证文件 主机 数据库 用户 ip地址认证方式
pg_ident.conf 控制postgresql用户名映射的文件,配置操作系统用户和数据库服务器上的用户映射
postgresql.conf 配置参数文件
postgresql.auto.conf 用于存储在ALTER SYSTEM(版本9.4或更高版本)中设置的配置参数的文件
postmaster.opts 记录服务端上一次启动的命令行选项
subdirectories description
base/ 包含每个数据库子目录的子目录
global/ 包含群集范围表的子目录,例如pg database和pgcontrol
pg commit ts/ 包含事务提交时间戳数据的子目录。9.5版本以后
pg clog/(Version 9.6or 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_repslot/ 包含复制槽数据的子目录(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 orlater) 包含WAL(Write Ahead Logging)段文件的子目录。在版本10中从pg _xlog重命名而来.
pg_xact/(Version 10 or later) 包含事务提交状态数据的子目录。在版本10中从pg_clog重命名而来.CLOG将在5.4章节中详解
pg_xlog/ (Version 9.6or earlier) 包含WAL(Write Ahead Logging)段文件的子目录。在版本10中重命名为pg_
数据库两个基础的对象 (oid,表空间)

0ID(0bject Identifier)是数据库对象的唯一标识符

表空间实际上是文件系统中的一个位置链接,即一个目录,它是一个逻辑上的概念,目录是它的物理存在方式。数据库中创建的对象(表、索引、数据库对象)都保存在表空间中。postgresq1初始化完成后,会有两个默认的表空间,一个是 pg_default,如果用户建表时没有指定表空间,所有新建的表都会放在pg_default 中,另一个是 pg_global,存放的是整个实例数据库所共享的系统表

base的物理布局设计

每个数据库都会在$PGDATA/base 下面生成一个子目录,如下图,都会一一对应

复制代码
[root@localhost ~]# ls /usr/local/pgsql/data/base/
1  4  5

[root@localhost ~]# su - postgres
[postgres@localhost ~]$ psql 
psql (15.4)
Type "help" for help.

postgres=# select datname,oid from pg_database;
  datname  | oid 
-----------+-----
 postgres  |   5
 template1 |   1
 template0 |   4
(3 rows)
表空间跟数据库关系

在 0racle 数据库中;一个表空间只属于一个数据库使用;而一个数据库可以拥有多个表空间。属于"一对多"的关系

在 PostgreSqL 集群中;一个表空间可以让多个数据库使用;而一个数据库可以使用多个表空间.属于"多对多"的关系

系统自带表空间:

表空间 pg default: 是用来存储系统目录对象、用户表、用户表 index、和临时表、临时表 index、内部临时表的默认空间。对应存储目录$PADATA/base/

表空间pgglobal:用来存放系统字典表;对应存储目录$PADATA/global

相关推荐
chanalbert19 分钟前
数据库连接池深度研究分析报告
数据库·spring
snpgroupcn1 小时前
泰国零售巨头 CJ Express 借助 SAP 内存数据库实现高效数据管理
数据库·express·零售
明月看潮生3 小时前
青少年编程与数学 01-011 系统软件简介 19 SSMS 数据库管理工具
数据库·青少年编程·编程与数学
blammmp3 小时前
Redis : set集合
数据库·redis·缓存
翔云1234563 小时前
精准测量 MySQL 主从复制延迟—pt-heartbeat工具工作原理
数据库·mysql
厚衣服_33 小时前
第15篇:数据库中间件高可用架构设计与容灾机制实现
java·数据库·中间件
明月看潮生4 小时前
青少年编程与数学 01-011 系统软件简介 13 Microsoft SQL Server数据库
数据库·microsoft·青少年编程·系统软件
LUCIAZZZ5 小时前
项目拓展-Jol分析本地对象or缓存的内存占用
java·开发语言·jvm·数据库·缓存·springboot
寒山李白5 小时前
MySQL分库分表面试题深度解析
数据库·mysql·面试题
入眼皆含月5 小时前
docker安装mysql数据库及简单使用
数据库·mysql·docker