PostgreSQL初试

文章目录

1 PostgreSQL 简介

PostgreSQL 是一个功能强大、开源的对象-关系型数据库系统,以其可靠性、数据完整性、可扩展性而著称,底层使用 C 语言实现。

它采用与 Linux 内核相同的开源协议 ------ BSD 协议

这一协议非常宽松,与 MIT 协议类似,允许你在遵守基础条款的前提下进行二次开发,甚至将其商业化并收费。

自 1986 年起由加州大学伯克利分校开始开发,PostgreSQL 目前在全球范围拥有活跃的社区和商业支持。

PostgreSQL 最初的前身是名为 Ingres 的数据库系统。

后来为了改进 Ingres 的架构并解决其存在的问题,开发者将新系统命名为 Postgres,意指 "Ingres 的后继者(Post-Ingres)"。

随后,为了强调其对 SQL 的支持,最终定名为 PostgreSQL

PostgreSQL 拥有一个非常活跃的开源社区,通常每三个月会发布一个小版本,频繁的更新使得常见的 bug 能够被及时修复。

虽然 PostgreSQL 在国外应用广泛,但在国内目前仍以 MySQL 为主流。

不过,许多国产数据库产品都是基于 PostgreSQL 二次开发的,例如:

  • 华为的 GaussDB
  • 腾讯的 TBase

此外,许多企业从 Oracle 迁移数据库时,也选择 PostgreSQL 作为替代方案,各大云厂商(如阿里云、腾讯云、华为云)均已支持 PostgreSQL。

得益于开源生态,PostgreSQL 社区提供了大量的数据迁移工具,方便用户从其他数据库系统平滑迁移(pgloader)。

主要特性:

  • 完整的 ACID 支持
  • 支持复杂查询、并发控制、多版本并发控制(MVCC)
  • 支持存储过程、触发器、自定义类型、扩展模块
  • 原生 JSON/JSONB 支持,适合构建混合结构的数据系统

PostgreSQL 官方网站:https://www.postgresql.org/

PostgreSQL 中文社区:http://www.postgres.cn/index.php/v2/home

2 PostgreSQL 与 MySQL 的区别

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

对比项 PostgreSQL 15 MySQL 8.0
数据类型 丰富(布尔、网络地址、XML、数组...) 支持类型较基础
序列(Sequence)机制 支持 不支持
扩展性 高,支持扩展、插件、自定义操作符 较低
并发控制 MVCC(40 亿事务版本号) MVCC(不同的实现)
高并发读写 性能指标强(极限负载) 出现波峰后下滑
JSON 支持 原生 JSON/JSONB,强大查询功能 支持 JSON,但功能弱
同步复制机制 异步、同步 只支持异步
存储过程 支持多种语言(PL/pgSQL、Python、JavaScript 等) 主要是 SQL 和最近支持的其他语言
适用场景 企业级复杂系统、GIS、大数据处理 轻量应用、Web 项目、CMS 系统
开源协议 BSD 协议 GPL 协议(严格)

总结:MySQL 轻便易用,适合中小项目;PostgreSQL 功能强大,更适合对复杂业务和数据一致性有高要求的系统。


3 PostgreSQL 的安装

仅在Linux中尝试安装,不推荐大家在Windows下安装。

1_Linux部署

进入官网选择Linux和对应的发型商,比如我的是红帽系的系统:

点击后跳转到如下地址:https://www.postgresql.org/download/linux/redhat/

选择好对应的PostgreSQL版本、服务器型号和架构后将出现安装命令,直接复制即可。

命令如下(如果网络不好直接粘贴下面命令即可):

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

可能出现的问题:镜像不存在或镜像仓库问题(可以使用国内镜像源比如阿里镜像站)、插件等相关依赖不存在(配置 Epel 镜像即可解决)、端口占用、Linux网络问题等等。。。。

2_容器化部署

如果有docker直接运行如下命令即可:

shell 复制代码
# 指定好容器名、用户、密码、默认数据库、容器内数据存放路径、端口号、卷挂载路径
docker run -d \
  --name postgres \
  -e POSTGRES_PASSWORD=postgres \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_DB=postgres \
  -e PGDATA=/var/lib/postgresql/data/pg_data \
  -p 5432:5432 \
  -v pg_data:/var/lib/postgresql/data/pg_data \
  postgres:15
# 可以使用 docker volume inspect pg_data 查看挂载路径
# 默认在/var/lib/docker/volumes/pg_data/_data目录下

4 PostgreSQL的配置

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

配置文件通常位于:

shell 复制代码
/var/lib/pgsql/<version>/data # version = 15

主要文件:

  • postgresql.conf:设置端口、日志、连接数等
  • pg_hba.conf:配置客户端认证方式(local/host/md5/trust 等)

查看 data 目录下的所有配置文件

shell 复制代码
ll /var/lib/pgsql/15/data

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

1_远程连接配置

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

也就是说PostgreSQL也要基于配置文件修改,才能制定用户是否可以远程连接。

直接去修改pg_hba.conf配置文件,用户以及对应数据库和连接方式的编写模板

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

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

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

shell 复制代码
# postgres密码不管,直接root用户
sudo systemctl restart postgresql-15

2_配置数据库的日志

查看postgresql.conf文件

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

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

3_设置数据库密码

默认的用户和密码配置

bash 复制代码
sudo -u postgres psql
\password postgres

5 PostgreSQL 基本操作

由于当前PostgreSQL服务就在本机,所以直接执行以下命令

bash 复制代码
# 切换到postgres用户
su postgres
# 进入 PostgreSQL 命令行
psql

使用 psql --help,查看psql命令的完整参数如下:

PostgreSQL中类似于MySQL中的 DQL、DDL、DML 这些数据库级别的命令基本相同。

我们主要看一些PostgreSQL特有的服务级别的命令,常用命令如下:

sql 复制代码
\dt         	-- 查看所有表
\l          	-- 查看所有数据库
\du         	-- 查看所有用户
\q          	-- 退出 psql
\? [commands]   -- 显示反斜线命令的帮助
\? options      -- 显示 psql 命令行选项的帮助
\? variables 	-- 显示特殊变量的帮助
\h [NAME]   	-- SQL命令语法上的说明,用*显示全部命令的语法说明

PostgreSQL默认会为我们生成三个库,如下

1_用户操作

构建用户命令巨简单

sql 复制代码
-- 区别就是create user默认有连接权限,create role没有,不过可以基于选项去设置
CREATE USER 名称 [ [ WITH ] 选项 [ ... ] ]
create role 名称 [ [ WITH ] 选项 [ ... ] ]

构建一个超级管理员用户

sql 复制代码
create user root with SUPERUSER PASSWORD 'root';

退出psql命令行

尝试使用root用户登录PostgreSQL命令行

shell 复制代码
psql -h 192.168.200.129 -p 5432 -U root -W
# psql: 错误: 连接到"192.168.200.129"上的服务器,端口5432失败:FATAL:  database "root" does not exist

发现,只有用户不让登录,用户需要有一个数据库,直接构建一个root库

sql 复制代码
create database root; -- 使用postgre创建

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

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

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

sql 复制代码
# 修改用户,直接基于ALTER命令操作
# 删除用户,直接基于DROP命令操作

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

2_权限操作

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

逻辑结构图

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

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

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

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

namespace、schema级别:不用过多了解这个~~

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

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

sql 复制代码
-- 查看grant命令
\help grant

3_创建一个自己的用户

整体流程如下:

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

-- 基于上述问题,不采用本地连接即可。
-- 采用远程连接。
psql -h 192.168.200.129 -p 5432 -U shenyang -W
-- 这样依赖,跳过了local链接方式的匹配,直接锁定到后面的host,host的连接方式是md5,md5其实就是密码加密了。
-- 登录后,直接输入
\dn

查看到当前database下有两个schema

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

4_差异补充

还有很重要的一点需要补充:

PostgreSQL填充关键字时并不像MySQL使用````````反引号标记,而是使用双引号""


6 安装图形化界面

1_使用 pgAdmin(官方推荐)

2_DBeaver(多数据库通用)

3_DataGrip(JetBrains 出品)

  • 强大的 SQL 编辑器和数据库管理工具,适合高级用户

4_Navicat for PostgreSQL(商业)

  • 功能完整,适合商业场景,但非免费

7 总结

1_安全卸载

使用如下命令完全卸载PostgreSQL,容器化安装则无需考虑数据残留问题

shell 复制代码
# 卸载PostgreSQL,清空全部数据
version=15 # 定义你自己的版本号
sudo systemctl stop postgresql-${version} # 停止服务
sudo yum remove -y postgresql${version}\* # 卸载软件和软件包
# 删除所有相关目录
sudo rm -rf /var/lib/pgsql/${version}/
sudo rm -rf /usr/pgsql-${version}/
sudo rm -rf /var/log/pgsql/
# 删除用户和用户组
sudo userdel postgres
# sudo groupdel postgres
# 删除仓库配置
sudo yum remove -y pgdg-redhat-repo
# 完整清理检查
sudo find / -name "*pgsql*" -o -name "*postgres*" 2>/dev/null

2_结语

PostgreSQL 是一个值得深入掌握的数据库系统,它不仅稳定高效,而且功能强大,支持丰富的扩展能力。

无论是从性能、SQL 规范支持,还是企业级部署能力来看,它都具备成为核心数据库的实力。

相关推荐
5177 分钟前
pymysql
java·数据库·oracle
2022计科一班唐文34 分钟前
数据库所有知识
数据库·mysql
木木子99991 小时前
SQL中的Subquery & CTE & Temporary Table 区别
数据库·sql
钢铁男儿1 小时前
C# 类的基本概念(从类的内部访问成员和从类的外部访问成员)
java·数据库·c#
草药味儿の岁月2 小时前
使用Docker Compose定义服务依赖:构建高可用Django+PostgreSQL+Redis架构
docker·postgresql·django
deepdata_cn3 小时前
开源分布式数据库(TiDB)
数据库·分布式
在未来等你3 小时前
互联网大厂Java面试:从Spring到微服务的技术探讨
数据库·spring boot·微服务·java面试·技术栈·互联网大厂
小小不董3 小时前
Oracle RAC ‘Metrics Global Cache Blocks Lost‘告警解决处理
linux·服务器·数据库·oracle·dba
江沉晚呤时4 小时前
深入解析 SqlSugar 与泛型封装:实现通用数据访问层
数据结构·数据库·oracle·排序算法·.netcore
木木子99994 小时前
MySQL中的窗口函数
数据库·mysql