当前位置: 首页 > news >正文

关系型数据库-PostgreSQL

文章目录

  • 关系型数据库-PostgreSQL
    • 1 PostgreSQL介绍与安装
      • 1.1 PostgreSQL介绍
      • 1.2 PostgreSQL和MySQL的区别
      • 1.3 PostgreSQL的安装
    • 2 PostgreSQL的配置
      • 2.1 远程连接配置
      • 2.2 配置数据库的日志
    • 3 PostgreSQL的基本操作
      • 3.1 用户操作
      • 3.2 权限操作
      • 3.3 小练习
      • 3.4 安装图形化界面
    • 4 PostgreSQL的数据类型
      • 4.1 单引号和双引号
      • 4.2 数据类型转换
      • 4.3 布尔类型
      • 4.4 数值类型
        • 整型
        • 浮点型
        • 序列
        • 数值的常见操作
      • 4.5 字符串类型
      • 4.6 日期类型
      • 4.7 枚举类型
      • 4.8 IP类型
      • 4.9 JSON&JSONB类型
      • 4.10 复合类型
      • 4.11 数组类型
    • 5 PostgreSQL的表
      • 5.1 约束
        • 主键
        • 非空
        • 唯一
        • 检查
        • 外键(不玩)
        • 默认值
      • 5.2 触发器
      • 5.3 表空间(问题填坑)
      • 5.4 索引
        • 索引的基本概念
        • 索引的分类
        • 创建索引看效果
      • 5.5 视图
      • 5.6 物化视图
    • 6 PostgreSQL的事务
      • 6.1 什么是ACID?(常识)
      • 6.2 事务的基本使用
      • 6.3 保存点(了解)
      • 6.4 事务的隔离级别
      • 6.5 MVCC
    • 7 PostgreSQL的锁
      • 7.1 表锁
      • 7.2 行锁
    • 8 PostgreSQL的备份&恢复
      • 8.1 逻辑备份&恢复
      • 8.2 物理备份(归档+物理)
      • 8.3 物理恢复(归档+物理)
      • 8.4 实战练习
        • 模拟场景
        • 准备场景和具体操作
    • 9 PostgreSQL的数据迁移
      • 9.1 数据准备
      • 9.2 虚拟机安装pgloader
      • 9.3 docker安装pgloader
    • 10 PostgreSQL的主从操作
      • 10.1 主从实现(异步流复制)
        • 准备环境
        • 给主准备一些数据
        • 配置主节点信息
        • 从节点加入到主节点
      • 10.2 主从切换
      • 10.3 主从故障切换

关系型数据库-PostgreSQL

1 PostgreSQL介绍与安装

1.1 PostgreSQL介绍

PostgreSQL是一个功能强大的 开源 的关系型数据库。底层基于C实现。

PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。BDS协议,这个协议基本和MIT开源协议一样,说人话,就是你可以对PostgreSQL进行一些封装,然后商业化是收费。

PostgreSQL的名字咋来的。之前叫Ingres,后面为了解决一些ingres中的一些问题,作为后面的ingres,就起名叫postgre。

PostgreSQL版本迭代的速度比较快,现在最新的正式的发布版本,已经到了15.RELEASE。

PGSQL的版本选择一般有两种:

  • 如果为了稳定的运行,推荐使用12.x版本。
  • 如果想体验新特性,推荐使用14.x版本。

PGSQL允许跨版本升级,而且没有什么大问题。

PGSQL社区特别活跃,基本是三个月一发版。意味着很多常见的BUG都可以得到及时的修复。

PGSQL其实在国外使用的比较多,国内暂时还是以MySQL为主。

但是国内很多国产数据库都是基于PGSQL做的二次封装:比如华为GaussDB,还有腾讯的Tbase等等。真实很多公司原来玩的Oracle,直接平转到PGSQL。同时国内的很多云产品都支持PGSQL了。

PGSQL因为开源,有很多做数据迁移的工具,可以让你快速的从MySQL,SQLServer,Oracle直接平转到PGSQL中内部,比如pgloader这样的数据迁移工具。

PGSQL的官方地址:https://www.postgresql.org/

PGSQL的国内社区:http://www.postgres.cn/v2/home

1.2 PostgreSQL和MySQL的区别

技术没有好坏之分,只是看一下是否符合你的业务,能否解决你的业务需求。其次也要查看社区的活跃度以及更新的频次。

MySQL不支持的几点内容:

  • MySQL的数据类型不够丰富。
  • MySQL不支持序列概念,Sequence。
  • 使用MySQL时,网上比较好用的插件。
  • MySQL的性能优化监控工具不是很多,定位问题的成本是比较高。
  • MySQL的主从复制没有一个官方的同步策略,同步问题难以解决。
  • MySQL虽然开源,但不够彻底。

PostgreSQL相对MySQL上述问题的特点:

  • PostgreSQL的数据类型嘎嘎丰富。
  • PostgreSQL是有序列的概念的。
  • PostgreSQL的插件特别丰富。
  • PostgreSQL支持主从复制的同步操作,可以实现数据的0丢失。
  • PostgreSQL的MVCC实现和MySQL不大一样。PostgreSQL一行数据会存储多个版本。最多可以存储40亿个事务版本。

1.3 PostgreSQL的安装

咱们只在Linux中安装,不推荐大家在Windows下安装。

Linux的版本尽量使用7.x版本,最好是7.6或者是7.8版本。

去官网找按照的方式

image.png

选择好PGSQL的版本,以及Linux的发行版本

image.png

拿到命令,直接扔到Linux中运行即可

# 下载PGSQL的rpm包
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 安装PGSQL12的软件程序,需要下载,需要等一会,一般不会失败,即便失败,他也会重新帮你找镜像
sudo yum install -y postgresql14-server
# 数据库初始化
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
# 设置开机启动项,并设置为开启自行启动
sudo systemctl enable postgresql-14
# 启动PGSQL
sudo systemctl start postgresql-14

这种属于Windows下的傻瓜式安装,基本不会出错。如果出错,可能是那些问题:

  • 安装Linux的时候,一定要选择最小安装
  • 你的Linux不能连接外网
  • Linux中的5432端口,可能被占用了

PostgreSQL不推荐使用root管理,在安装成功postgreSQL后,他默认会给你创建一个用户:postgres

玩PGSQL前,先切换到postgres

su postgres

奇幻到postgres用户后,直接输入psql即可进入到postgreSQL提供的客户端

# 进入命令行
psql
# 查看有哪些库,如果是新安装的,有三个库,一个是postgres,template0,template1
\l  

其次不推荐下载Windows版本去玩,如果非要下载:https://sbp.enterprisedb.com/getfile.jsp?fileid=1258242

2 PostgreSQL的配置

要搞两个配置信息,一个关于postgreSQL的远程连接配置以及postgreSQL的日志配置。

PostgreSQL的主要配置放在数据目录下的, postgresql.conf 以及 pg_hba.conf 配置文件

这些配置文件都放在了

# 这个目录下
/var/lib/pgsql/14/data

image.png

上图可以看到,postgreSQL的核心文件,都属于postgres用户,操作的时候,尽可能的别用root用户,容易玩出坑,尽可能先切换到postgres用户去玩。

2.1 远程连接配置

PostgreSQL默认情况下不支持远程连接的,这个跟MySQL几乎一样

  • MySQL给mysql.user追加用户,一般是采用grant的命令去玩。
  • PostgreSQL要基于配置文件修改,才能指定用户是否可以远程连接。

直接去修改 pg_hba.conf 配置文件

用户以及对应数据库和连接方式的编写模板

image.png

# 第一块
local:代表本地连接,host代表可以指定连接的ADDRESS
# 第二块
database编写数据库名,如果写all,代表所有库都可以连接
# 第三块
user编写连接的用户,可以写all,代表所有用户
# 第四块
address代表那些IP地址可以连接
# 第五块
method加密方式,这块不用过多关注,直接md5
# 直接来个痛快的配置吗,允许任意地址的全部用户连接所有数据库
host    all             all             0.0.0.0/0               md5

image.png

为了实现远程连接,除了用户级别的这种配置,还要针对服务级别修改一个配置,服务级别的配置在 postgresql.conf

image.png

发现默认情况下,PGSQL只允许localhost连接,直接配置为*即可解决问题。为了生效,一定要重启

# postgres密码不管,直接root用户
sudo systemctl restart postgresql-14

2.2 配置数据库的日志

查看postgresql.conf文件

image.png

postgreSQL默认情况下,只保存7天的日志,循环覆盖。

# 代表日志是开启的
logging_collector = on
# 日志存放的路径,默认放到当前目录下的log里
log_directory = 'log'
# 日志的文件名,默认是postgresql为前缀,星期作为后缀
log_filename = 'postgresql-%a.log'
# 默认一周过后,日志文件会被覆盖
log_truncate_on_rotation = on
# 一天一个日志文件
log_rotation_age = 1d
# 一个日志文件,没有大小限制
log_rotation_size = 0

3 PostgreSQL的基本操作

只在psql命令行(客户端)下,执行了一次 \l,查看了所有的库信息

可以直接基于psql查看一些信息,也可以基于psql进入到命令行后,再做具体操作

image.png

可以直接基于psql去玩

  • 可以数据psql --help,查看psql的命令。可以直接进入到命令行的原因,是psql默认情况下,就是以postgres用户去连接本地的pgsql,所以可以直接进入,下图是默认的连接方式

image.png

后面都基于psql的命令行(客户端)去进行操作

命令绝对不要去背,需要使用的时候,直接找帮助文档,在psql命令行中,直接注入

\help,即可查看到数据库级别的一些命令
\?,可以查看到服务级别的一些命令

3.1 用户操作

创建用户命令巨简单

# 区别就是create user默认有连接权限,create role没有,不过可以基于选项去设置
create user 名称 [ [ WITH ] 选项 [ ... ] ]
create role 名称 [ [ WITH ] 选项 [ ... ] ]

创建一个超级管理员用户

create user root with SUPERUSER PASSWORD 'root';

退出psql命令行 \q

image.png

编写psql命令尝试去用root用户登录

psql -h 192.168.11.32 -p 5432 -U root -W

发现,光有用户不让登录,得让用户有一个数据库,直接创建一个root库

create database root;

image.png

可以在不退出psql的前提下,直接切换数据库

image.png

也可以退出psql,重新基于psql命令去切换用户以及数据库

如果要修改用户信息,或者删除用户,可以查看

# 修改用户,直接基于ALTER命令操作
# 删除用户,直接基于DROP命令操作

如果要查看现在的全部用户信息

image.png

3.2 权限操作

权限操作前,要先掌握一下PGSQL的逻辑结构

逻辑结构图
image.png

可以看到PGSQL一个数据库中有多个schema,在每个schema下都有自己的相应的库表信息,权限粒度会比MySQL更细一些。

在PGSQL中,权限的管理分为很多多层

server、cluster、tablespace级别:这个级别一般是基于pg_hba.conf去配置

database级别:通过命令级别操作,grant

namespace、schema级别:玩的不多……不去多了解这个~~

对象级别:通过grant命令去设置

后面如果需要对database或者是对象级别做权限控制,直接基于grant命令去操作即可

# 查看grant命令
\help grant

image.png

3.3 小练习

  • 创建一个用户(你自己名字)
  • 创建一个数据库
  • 在这个数据库下创建一个schema(数据库默认有一个public的schema)
  • 将这个schema的权限赋予用户
  • 在这个schema下创建一个表
  • 将表的 select、update、insert 权限赋予用户
-- 准备用户
create user laoyang with password 'laoyang';
-- 准备数据库
create database laoyang;
-- 切换数据库
\c laoyang;
-- 创建schema
create schema laoyang;
-- 将schema的拥有者修改为laoyang用户
alter schema laoyang owner to laoyang;
-- 将laoyang库下的 laoyang 的schema中的表的增,改,查权限赋予给 laoyang 用户
grant select,insert,update on all tables in schema laoyang to laoyang;
-- 用postgres用户先创建一张表
create table laoyang.test(id int);
-- 切换到 laoyang用户
\c laoyang -laoyang 
-- 报错:
-- 致命错误:  对用户"-laoyang"的对等认证失败
-- Previous connection kept
-- 上述方式直接凉凉,原因是匹配连接方式时,基于pg_hba.conf文件去从上往下找
-- 找到的第一个是local,匹配上的。发现连接方式是peer。
-- peer代表用当前系统用户去连接PostgreSQL
-- 当前系统用户只有postgres,没有 laoyang,无法使用peer连接
-- 想创建 laoyang 用户时,发现postgreSQL的所有文件拥有者和所属组都是postgres,并且能操作的只有拥有者

基于上述问题,不采用本地连接即可,采用远程连接。

psql -h 192.168.254.10 -p 5432 -U laoyang -W
-- 这样一来,跳过了local链接方式的匹配,直接锁定到后面的host,host的连接方式是md5,md5其实就是密码加密了。
-- 登录后,直接输入
\dn
-- 查看到当前database下有两个schema

image.png

如果使用 postgres 用户在数据库 laoyang 下创建表,拥有者是 postgres。当切换到 laoyang 用户下操作表时,是无权限的。

image.png

这种权限的赋予方式,可以用管理员用户去创建整体表结构,如此一来,分配指定用户,赋予不同的权限,就不怕用户误操了。

3.4 安装图形化界面

图形化界面可以连接PGSQL的很多,Navicat(收费),或破解版。

也可以直接使用PostgreSQL官方提供的图形化界面。(完全免费)

  • 官方提供的:https://www.pgadmin.org/,直接点击就可以下载,傻瓜式安装

4 PostgreSQL的数据类型

PGSQL支持的类型特别丰富,大多数的类型和MySQL都有对应的关系

名称 说明 对比MySQL
布尔类型 boolean 标准的布尔类型,只能存储true、false MySQL中没有boolean
但有替换的类型tinyint,占1个字节
整型 smallint(2字节)
integer(4字节)
bigint(8字节)
跟MySQL没啥区别。
浮点型 decimal
numeric(和decimal一样,精准浮点型)
real(float)
double precision(double)
money(货币类型)
和MySQL基本也没区别
MySQL支持
float
double
decimal
MySQL没有这个货币类型
字符串类型 varchar(n)(character varying)
char(n)(character)
text
这里和MySQL基本没区别。
PG的varchar类型,可以存储一个G
日期类型 date(年月日)
time(时分秒)
timestamp(年月日时分秒)
(time和timestamp可以设置时区)
没啥说的,和MySQL基本没区别
MySQL有个datetime
二进制类型 bytea 存储二进制类型 MySQL也支持,MySQL中是blob
位图类型 bit(n)(定长位图)
bit varying(n)(可变长度位图)
就是存储0、1。
MySQL也有,只是这个类型用的不多
枚举类型 enum,跟Java的enum一样 MySQL也支持。
几何类型 点、直线、线段、圆 MySQL没有,但一般开发也用不到
数组类型 在类型后,追加[],代表存储数组 MySQL没有
JSON类型 json(存储JSON数据的文本)
jsonb(存储JSON二进制)
可以存储JSON,MySQL8.x也支持
ip类型 cidr(存储ip地址) MySQL也不支持
等等 http://www.postgres.cn/docs/14/datatype.html

4.1 单引号和双引号

在PGSQL中,写SQL语句时,单引号用来标识实际的值。双引号用来标识一个关键字,比如表名,字段名。

-- 单引号写具体的值,双引号类似MySQL的``标记,用来填充关键字
-- 下面的葡萄牙会报错,因为葡萄牙不是关键字
select 1.414,'卡塔尔',"葡萄牙";

4.2 数据类型转换

第一种方式:只需要在值的前面,添加上具体的数据类型即可

-- 将字符串转成位图类型
select bit '010101010101001';

第二种方式:也可以在具体值的后面,添加上 :: 类型来指定

-- 数据类型
select '2025-11-01'::date;
select '101010101001'::bit(20);
select '13'::int;

第三种方式:使用CAST函数

-- 类型转换的完整写法
select CAST(varchar '100' as int);

4.3 布尔类型

布尔类型可以存储三个值:true、false、null

-- 布尔类型的约束没有那么强,true,false大小写随意,他会给你转,同时yes,no这种他也认识,但是需要转换
select true,false,'yes'::boolean,boolean 'no',True,FaLse,NULL::boolean;

boolean类型在做and和or的逻辑操作时,结果

字段A 字段B a and b a or b
true true true true
true false false true
true NULL NULL true
false false false false
false NULL false NULL
NULL NULL NULL NULL

4.4 数值类型

整型

整型比较简单,主要就是三个:

  • smallint、int2:2字节
  • integer、int、int4:4字节
  • bigint、int8:8字节

正常没啥事就integer,如果要存主键,比如雪花算法,那就bigint。空间要节约,根据情况smallint

浮点型

浮点类型就关注2个(其实是一个)

  • decimal(n,m):本质就是numeric,PGSQL会帮你转换
  • numeric(n,m):PGSQL本质的浮点类型

针对浮点类型的数据,就使用 numeric

序列

MySQL中的主键自增,是基于auto_increment去实现,MySQL里没有序列的对象。

PGSQL和Oracle十分相似,支持序列:sequence,可没有auto_increment。

序列的正常创建方式:

create sequence laoyang.table_id_seq;
-- 查询下一个值
select nextval('laoyang.table_id_seq');
-- 查询当前值
select currval('laoyang.table_id_seq');

默认情况下,seqeunce的起始值是0,每次nextval递增1,最大值9223372036854775807

告诉缓存,插入的数据比较多,可以指定告诉缓存,一次性计算出20个后续的值,nextval时,就可以不去计算,直接去高速缓存拿值,效率会有一点提升。

序列大多数的应用,是用作表的主键自增效果。

-- 表自增
create table laoyang.xxx(id int8 default nextval('laoyang.table_id_seq'),name varchar(16)
);
insert into laoyang.xxx (name) values ('xxx');
select * from laoyang.xxx;

上面这种写法没有问题,但是很不爽~很麻烦。PGSQL提供了序列的数据类型,可以在声明表结构时,直接指定序列的类型即可。bigserial相当于给bigint类型设置了序列实现自增。

  • smallserial
  • serial
  • bigserial
-- 表自增(爽)
create table laoyang.yyy(id bigserial,   name varchar(16)
);
insert into laoyang.yyy (name) values ('yyy');

在drop表之后,序列不会被删除,但是序列会变为不可用的状态。因为序列在使用serial去创建时,会绑定到指定表的指定列上。

如果是单独创建序列,再创建表,使用传统方式实现,序列和表就是相对独立的。

数值的常见操作

针对数值咱们可以实现加减乘除取余这5个操作

还有其他的操作方式

操作符 描述 示例 结果
^ 2 ^ 3 8
|/ 平方根 |/ 36 6
@ 绝对值 @ -5 5
& 31 & 16 16
| 31|32 63
<< 左移 1<<1 2
>> 右移 16>>1 8

数值操作也提供了一些函数,比如:pi()、round(数值、位数)、floor()、ceil()

4.5 字符串类型

字符串类型用的是最多的一种,在PGSQL里,主要支持三种:

  • character(就是MySQL的char类型),定长字符串。(最大可以存储1G)
  • character varying(varchar),可变长度的字符串。(最大可以存储1G)
  • text(跟MySQL一样)长度特别长的字符串。

字符串常见的函数特别多。字符串的拼接一要要使用||来拼接。其他的函数,可以查看 http://www.postgres.cn/docs/14/functions-string.html

4.6 日期类型

在PGSQL中,核心的时间类型,就三个。

  • timestamp(时间戳,覆盖 年月日时分秒)
  • date(年月日)
  • time(时分秒)

在PGSQL中,声明时间的方式。

只需要使用字符串正常的编写 yyyy-MM-dd HH:mm:ss 就可以转换为时间类型。

直接在字符串位置使用之前讲到的数据类型转换就可以了。

当前系统时间

  • 可以使用now作为当前系统时间(没有时区的概念)
select timestamp 'now';
-- 直接查询now,没有时区的概念
select time with time zone 'now' at time zone '08:00:00';
  • 也可以使用current_timestamp的方式获取(推荐,默认东八区)

日期类型的运算

  • 正常对date类型做+,-操作,默认单位就是天~
  • date + time = timestamp
select date '2025-11-01' + time '12:12:12';
  • 可以针对timestamp使用interval的方式进行 +,-操作,在查询以时间范围为条件的内容时,可以使用。
select timestamp '2025-11-01 12:12:12' 
http://www.dtcms.com/a/585472.html

相关文章:

  • 英文网站定制哪家好wordpress上传主题提示要ftp
  • Vue 项目实战《尚医通》,已有医院数据的 TS 类型定义,笔记12
  • UE5 C++ 进阶学习 —— 02 - 小案例
  • Linux的waitpid函数:深入解析与应用实践
  • 历史数据分析——洛阳钼业
  • MySQL EXPLAIN 详解与优化指南
  • ADB 无线调试 APP 完全攻略(2025 最新版)—— 从连接到查看日志,一文搞定!
  • 商家入驻网站建设免费网站怎么做
  • C语言数据结构之堆
  • VIVO算法/大模型面试题及参考答案
  • 临海网站制作好了如何上线网站开发的要求
  • KingbaseES:从MySQL兼容到权限隔离与安全增强的跨越
  • 网站改版竞品分析怎么做可以先做网站再开公司吗
  • Go语言基础:语言特性、语法基础与数据类型
  • 解决 PyQt5 中 sipPyTypeDict() 弃用警告的完整指南
  • 内网门户网站建设要求西安摩高网站建设
  • github访问响应时间过长解决
  • Spring AoP的切点匹配
  • Cookie 与 Session 全解析:从属性原理到核心逻辑,吃透 Web 状态保持
  • STM32HAL库-F1内部Flash读写操作(官网驱动)
  • 辛集建设网站网络营销推广渠道
  • 外国排版网站企业名录2019企业黄页
  • 微信小程序开发实战:图片转 Base64 全解析
  • 秒杀-订单创建消费者CreateOrderConsumer
  • 单层前馈神经网络的万能逼近定理
  • C# 如何捕获键盘按钮和组合键以及KeyPress/KeyDown/KeyUp事件之间的区别
  • Windows系统不关闭防火墙,允许某个端口的访问怎么设置?
  • UniApp 多个异步开关控制教程
  • 邯郸哪家公司做企业网站比较专业中国制造网是干什么的
  • 做视频网站把视频放在哪里wordpress建站用什么意思