PostgreSQL教程(1)PGSQL体系结构与安装部署

PostgreSQL教程(1)PGSQL体系结构与安装部署

一、PostgreSQL 特性

PostgreSQL(简称 PGSQL)是一款功能强大的开源企业级关系型数据库,拥有众多高级特性,包括多版本并发控制(MVCC)、按时间点恢复(PITR)、异步复制、在线热备、读写分离、分布式架构、数据水平拆分等,广泛适用于金融、电信、政府、互联网等对高可用性和大规模并发有较高要求的场景,在全球范围内广受欢迎。

由于其开源免费的特性,成为众多国产数据库的基础版本,约90%的国产数据库都是在 PostgreSQL 基础上进行二次开发的,例如华为的 GaussDB、人大金仓的 KingBase、阿里的 PolarDB-Postgres 以及腾讯的 TDSQL-Postgres。

PostgreSQL 在架构设计上采用多进程模型,相较于 MySQL 的多线程机制,在处理复杂场景(如高并发、大量计算任务)时具有更优的性能表现。PostgreSQL 在数据类型方面,拥有比一般数据库更丰富的类型,包括数组、IP地址、JSON、XML、几何类型、复合类型等,能够满足多样化的数据存储需求。它也完全支持标准的 SQL 查询语言。在跨平台兼容性上也非常优秀,能够运行于 Linux、Windows、macOS 等多种操作系统之上,具备高度的可移植性。通过丰富的开发语言支持,提供了多种编程语言 API 接口,如 C、C++、Java、Python、Go、PHP 。

在管理工具方面,PostgreSQL 社区提供了大量免费高质量的图形化管理工具和辅助软件,如 pgAdmin 4 等,极大地提升了数据库的可视化管理体验。在安全性方面也具备完善的认证机制与访问控制策略,能够为企业提供稳定、可靠、安全的数据支撑环境。

二、PostgreSQL 体系结构

1、进程结构

PostgreSQL是一个多进程架构的数据库管理系统,服务启动后由多个进程来共同维护数据库的工作,以下是各进程的作用介绍:

· postgres:它是数据库实例启动后运行的第一个进程,也是所有进程的父进程。早期版本为PostMaster进程,现在为postgres的软连接。该进程用于控制整个实例的运行、内存分配、建立客户端连接等

· background writer:后台写进程(BgWriter),用于把共享内存中的脏页写到磁盘的进程,可以提高性能、释放内存块

· WAL Writer:预写日志进程,类似MySQL中的redo log

· CheckPoint:检查点进程,数据库发生宕机重启后以最近的检查点为参考,将未完成的事务前滚,再重放检查点之后的WAL日志,保证数据一致

· SysLogger系统日志进程,当postgres.conf中的logging_collection参数为on时才会启动该进程,用于对日志进行管理

· PgArch:归档进程,当开启归档模式后才会存在该进程。该进程用于对WAL预写日志进行归档备份,避免早期WAL日志被循环写入而覆盖,通过归档日志可以实现将数据恢复到任一有记录的时间点
· AutoVacuum:自动清理进程,当数据库中的数据被执行删除操作后,会先标记为删除状态,当没有其他事务读这些数据时才会由AutoVacuum进行清理

· statistics collector:统计收集进程(PgStat),进行数据统计、收集工作,便于优化器做出正确的判断

2、数据结构

在PostgreSQL是最像Oralce的开源数据库。在 PGSQL 中,数据的存储结构分为逻辑存储结构和物理存储结构。

2.1 逻辑存储结构

数据库内部组织和管理数据的方式,包括数据库集群、数据库、表、索引、表空间等所有数据库对象

· 表空间(tablespace)

从逻辑上将数据库分成多个存储单元,通过表空间把逻辑上相关的数据存放在一起。在初始化数据库时,会自动创建pg_default和pg_global两个表空间。pg_default是在后面创建表时默认使用的表空间;pg_default用于存放系统表

· 模式(schema)

用于将数据库里的对象(表、索引、函数等)逻辑上组织在一起,便于控制管理。通常建议根据业务进行对象分类,不同的业务放在不同的模式下,模式之间的数据是互相隔离的(类似于MySQL中的不同database)。一个用户可以创建多个模式,而一个模式只能属于一个用户。在创建数据库时,如果没有声明模式,默认属于PUBLIC模式下。PUBLIC模式下所有用户都有CREATE和USAGE权限,所以建议创建一个自定义模式然后让模式所有者来进行授权。

· 其他对象

块、区、段和其他对象。在PostgreSQL所有的数据对象都由一个对象标识符(OID)管理。数据库的OID存储在系统表pg_database中;表、索引等数据库对象存放在系统表pg_class中

#查询库OID
SELECT oid,datname FROM pg_database;

#查询表OID
SELECT relname, relfilenode FROM pg_class WHERE relname='mytable';

2.2 物理存储结构

PostgreSQL 存储在磁盘上的各种文件,包括数据文件、WAL 日志、配置文件、控制文件等,这些物理文件保存在指定的数据目录中(初始化时会进行指定

· 参数文件

文件
current_logfiles
记录当前正在使用的日志文件
PG_VERSION
记录数据库版本
pg_hba.conf客户端认证配置文件
postgresql.conf
数据库静态配置文件
pg_ident.conf
用户映射文件
postgresql.auto.conf存储ALTER SYSTEM修改后生成的参数
postmaster.opts
记录上次启动服务时的选项
目录base每个逻辑数据库的目录,OID形式命名
log日志目录
global数据库系统对象文件和pg_control文件

· 数据文件

用于存储数据,文件以OID命名。超过1G大小的文件,将自动被拆分为多个文件进行存储

#查询表OID与存放路径
select sys_relation_filepath('table_name')

· 日志文件

PostgreSQL日志分为运行日志、预写日志(重做日志)、事务日志和服务器日志

· 控制文件

记录数据库运行信息,如OID、是否为打开状态、检查点信息、预写日志位置等。控制文件默认保存路径为$PGDATA/global/pg_control目录下,该文件需要使用bin/pg_controldata工具查看

bin/pg_controldata /data

三、PostgreSQL 安装部署

PostgreSQL安装方式分为源码编码安装和YUM安装,两种安装包都可以通过官方下载地址https://www.postgresql.org/download/获取,下载的时候可以根据提示选择合适的版本 

pgsql1.jpg

1、YUM安装PostgreSQL

安装过程简单,但是不能灵活定义一些参数

#配置yum仓库并yum安装
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql14-server

#初始化数据库
/usr/pgsql-14/bin/postgresql-14-setup initdb

#启动数据库,默认监听5432端口
systemctl enable postgresql-14
systemctl start postgresql-14

使用YUM安装后会自动创建一个拥有数据库登录权限的用户postgres。必须切换到postgres用户才能进行数据库连接,原因在于pg_hba.conf中还没有相应的配置项,后面文章会进行相关配置讲解

su - postgres
psql  #运行该命令进入pgsql交互界面

2、编译安装PostgreSQL

需要自行安装依赖,但是最为灵活,生产环境推荐使用

· 安装编译工具和依赖

yum install cmake gcc zlib zlib-devel gcc-c++ perl readline readline-devel ncurses-devel

· 下载PGSQL源码包

pgsql2.png

· 编译安装

安装完成后输出"PostgreSQL installation complete"代表成功

wget --no-check-certificate https://ftp.postgresql.org/pub/source/v14.6/postgresql-14.6.tar.gz
tar zxf postgresql-14.6.tar.gz
cd postgresql-14.6
./configure --prefix=/usr/local/postgersql14.6 [--without-readline] [--with-blocksize=32K]
# --without-readline 是否显示PG操作的历史命令,为了数据库安全可以取消安装
# --with-blocksize 数据库块大小,默认为8K,可以调大
make
make install

· 创建用户和数据目录

useradd pgadmin
mkdir /data/pgsql/{data,logs}
chown -R pguser. /data/pgsql

· 初始化PGSQL数据库

初始化完成后会创建template0、template1、postgres三个默认数据库,2个template数据库包含了系统的元数据表,用户后续创建数据库时都会以template1里的数据进行克隆,如果修改了template1里的信息,那新建的数据库就会继承这些设置。除此还会创建pg_default和pg_global两个表空间,pg_default存放于$pgdata/base目录,pg_global存放于$pgdata/global目录。编译完成后还会在数据目录下创建postgresql.conf和pg_hba.conf2个配置文件,这里暂时先不做配置

su - postgrels
/usr/local/pgsql/bin/initdb -D /data/pgsql/data -U postgres -E UTF8 -W -X /data/pgsql/logs
# -D:指定数据存放目录    
# -E:指定字符集
# -W:初始化时为管理员设置密码

四、PostgreSQL 进程管理

通过pg_ctl工具对数据库进行管理,如果没有配置环境变量的话都需要通过-D选项指定数据目录

· 启动PGSQL服务

大部分情况下都使用pg_ctl工具启动数据库,该工具实际上也是postgres命令的封装

#-D指定数据目录
#-l指定日志存储路径和文件名,否则默认输出在屏幕上,也可通过配置文件进行修改
pg_ctl -D /data/pg12/data -l logfile start

· 停止PGSQL服务

有3种关闭服务的方式可以选择

smart:等所有连接中止后再关闭数据库。 如果客户端连接不终止则无法关闭数据库

fast:快速关闭数据库。如果有客户端连接都会被断开,未完成的事务将被回滚

immediate:强行关闭数据库,相当于杀死数据库进程

#停止服务
pg_ctl -D /data/pg12/data/ stop [-m fast|smart|immediate]

· 查看PGSQL运行状态

pg_ctl -D /data/pg12/data/ status

· 重新加载PGSQL

#下面两种方法都可以
pg_ctl reload;
select pg_reload_conf();  #登录PGSQL后执行

文章评论

猜你喜欢

PostgreSQL教程(2)客户端工具psql的使用

PostgreSQL PostgreSQL教程(2)客户端工具psql的使用

一、命令行客户端psql 是 PostgreSQL 的命令行客户端工具,类似于MySQL中的mysql、Oracle中的sqlplus。通过psql可以实现对 PostgreSQL 数据库的...

MySQL教程(5)多表连接查询

MySQL MySQL教程(5)多表连接查询

一、MySQL 多表连接查询概述多表连接查询是指在多个表中,存在一个或多个相同的字段(这些字段的值必须一致),通过将这些字段连接起来,就能将不同表的数据整合在一起,形成一张包含所有相关信息的大表。这样...

MySQL教程(4)SQL语句介绍与数据增删改查

MySQL MySQL教程(4)SQL语句介绍与数据增删改查

一、SQL语言介绍SQL是结构化查询语言的英文单词缩写,用于存取、查询、更新、管理数据库系统中的数据。SQL是关系型数据库应用语言的标准,从推出以来先后有SQL 86\89\92\99等标准,其中最重...

MySQL教程(3)MySQL 常用数据类型与约束

MySQL MySQL教程(3)MySQL 常用数据类型与约束

一、MySQL 数据类型在任何的数据库管理系统中,数据类型的选择和使用都是设计数据库架构的基础之一。它们不仅决定了存储数据的方式,还直接影响着查询效率、存储空间的利用以及数据完整性。在 MySQL 中...

MySQL MySQL教程(2)MySQL 生产环境配置文件模板及参数详解

MySQL教程(2)MySQL 生产环境配置文件模板及参数详解

一、MySQL配置文件路径规则MySQL对于配置文件有一个顺序规则,它是按照/etc/my.cnf > /etc/mysql/my.cnf > /usr/local/mysql/etc/m...