PostgreSQL数据库深度剖析

2个月前发布 gsjqwyl
40 0 0

一、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

二、PostgreSQL和MySQL的区别

技术并无优劣之分,关键在于是否契合业务需求,能否解决业务问题。同时也需考量社区活跃度与更新频次。

MySQL存在几处不足:
* MySQL的数据类型不够丰富。
* MySQL不支持序列概念(Sequence)。
* 网上可用的MySQL插件相对较少。
* MySQL的性能优化监控工具不多,定位问题成本较高。
* MySQL的主从复制缺乏官方同步策略,同步问题较难解决。
* 尽管MySQL开源,但不够彻底。

相较于MySQL,PostgreSQL具备以下特点:
* PostgreSQL的数据类型极为丰富。
* PostgreSQL支持序列概念。
* PostgreSQL的插件十分丰富。
* PostgreSQL支持主从复制同步操作,可实现数据的0丢失。
* PostgreSQL的MVCC实现与MySQL不同,PostgreSQL一行数据会存储多个版本,最多可存储40亿个事务版本。

三、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 postgresql12-server
# 数据库初始化
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
# 设置开机启动项并设为开机自启
sudo systemctl enable postgresql-12
# 启动PGSQL
sudo systemctl start postgresql-12

这属于Windows下的傻瓜式安装,一般不会出错。若出错,可能是以下情况:
* 安装Linux时需选择最小安装
* 你的Linux无法连接外网
* Linux中的5432端口可能被占用

PostgreSQL不建议用root管理,安装成功后默认会创建一个postgres用户

使用前需切换到postgres用户

su postgres

切换到postgres用户后,直接输入psql即可进入PostgreSQL客户端

# 进入命令行
psql
# 查看有哪些库,新安装时通常有三个库,分别是postgres、template0、template1
\l  

不推荐下载Windows版本使用

若非要下载:https://sbp.enterprisedb.com/getfile.jsp?fileid=1258242

四、PostgreSQL的配置

需要配置两个方面的信息,一是PostgreSQL的远程连接配置,二是PostgreSQL的日志配置。

PostgreSQL的主要配置文件位于数据目录下的postgresql.conf和pg_hba.conf

这些配置文件存放在

# 该目录下
/var/lib/pgsql/12/data
image.png

上图可见,PostgreSQL的核心文件归postgres用户所有,操作时尽量不用root用户,最好先切换到postgres用户操作。

4.1 远程连接配置

PostgreSQL默认不支持远程连接,这与MySQL类似

  • MySQL通过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连接,将其配置为*即可解决问题

image.png

注意,为使配置生效,务必重启

# postgres密码无需关注,直接用root用户
sudo systemctl restart postgresql-12

4.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

五、PostgreSQL的基操

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

可直接基于psql查看信息,也可进入命令行后进行具体操作

image.png

可直接基于psql操作

可输入psql --help查看psql命令
能直接进入命令行是因为psql默认以postgres用户连接本地pgsql,所以可直接进入
下图为默认连接方式
image.png

后续均基于psql命令行(客户端)操作

命令无需死记,使用时可找帮助文档,在psql命令行中输入

\help可查看数据库级命令
\?可查看服务级命令

5.1 用户操作

创建用户命令很简单

# 区别在于create user默认有连接权限,create role无,不过可通过选项设置
CREATE USER 名称 [ [ WITH ] 选项 [ ... ] ]
create role 名称 [ [ WITH ] 选项 [ ... ] ]

创建一个超级管理员用户

create user root with SUPERUSER PASSWORD 'root';
image.png

退出psql命令行image.png

尝试用root用户登录psql命令

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

5.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

小任务

创建一个用户(自己名字)

创建一个数据库

在该数据库下创建一个schema(数据库默认有public schema)

将该schema的权限赋予用户

在该schema下创建一张表

将表的select、update、insert权限赋予用户

完成上述操作

-- 准备用户
create user laozheng with password 'laozheng';
-- 准备数据库
create database laozheng;
-- 切换数据库
\c laozheng;
-- 创建schema
create schema laozheng;
-- 将schema的拥有者改为laozheng用户
alter schema laozheng owner to laozheng;
-- 将laozheng库下laozheng schema中的表的增、改、查权限赋予laozheng用户
grant select,insert,update on all tables in schema laozheng to laozheng;
-- 用postgres用户先创建一张表
create table laozheng.test(id int);
-- 切换到laozheng用户。
\c laozheng -laozheng 
-- 报错:
-- 致命错误:  对用户"-laozheng"的对等认证失败
-- Previous connection kept
-- 上述方式失败,原因是匹配连接方式时基于pg_hba.conf文件从上往下找
-- 找到第一个local,匹配上。发现连接方式是peer。
-- peer代表用当前系统用户连接PostgreSQL
-- 当前系统用户只有postgres,无laozheng,无法用peer连接
-- 构建laozheng用户时,发现PostgreSQL所有文件拥有者和所属组都是postgres,且只能由拥有者操作
image.png
-- 基于上述问题,不采用本地连接即可。
-- 采用远程连接。
psql -h 192.168.11.32 -p 5432 -U laozheng -W
-- 这样跳过local连接方式匹配,直接锁定到后面的host,host连接方式是md5,md5是密码加密。
-- 登录后,直接输入
\dn
-- 查看到当前database下有两个schema

这种权限赋予方式,可用管理员用户构建整体表结构,进而分配指定用户不同权限,避免用户误操作。

六、图形化界面安装

有多种图形化界面可连接PGSQL,如收费的Navicat。

也可使用PostgreSQL官方提供的免费图形化界面。

官方提供的:https://www.pgadmin.org/

直接点击下载~~~

https://www.postgresql.org/ftp/pgadmin/pgadmin4/v6.9/windows/

傻瓜式安装~~~

打开pgAdmin

image.png

添加新连接

image.png

直接save即可连接到老郑信息

image.png

可切换语言

image.png

七、数据类型

PGSQL支持的类型极为丰富,大多类型与MySQL对应

名称 说明 对比MySQL
布尔类型 boolean,标准布尔类型,只能存储true、false
MySQL中虽无对应boolean,但有替代类型,数值的tinyint类型与PGSQL的boolean均占1字节。
整型 smallint(2字节)、integer(4字节)、bigint(8字节) 与MySQL无异。
浮点型 decimal、numeric(与decimal相同,精准浮点型)、real(float)、double precision(double)、money(货币类型)
与MySQL基本无异,MySQL支持float、double、decimal,无货币类型。
字符串类型 varchar(n)(character varying)、char(n)(character)、text
与MySQL基本无异。
PGSQL存储的varchar类型可存储1G,MySQL存储量不同。
日期类型 date(年月日)、time(时分秒)、timestamp(年月日时分秒)(time和timestamp可设时区)
与MySQL基本无异。
MySQL有datetime。
二进制类型 bytea-存储二进制类型 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/12/datatype.html

八、PostgreSQL基本操作&数据类型

8.1 单引号和双引号

© 版权声明

相关文章

没有相关内容!

暂无评论

none
暂无评论...