使用背景
在过去的几年中,PostgreSQL的使用量逐渐增加,而Oracle和MySQL的使用量则有所下降。这主要是由于以下几个原因:开源和免费、功能丰富、可扩展性强、安全性高、跨平台支持好、社区活跃、成熟稳定。这些因素使得PostgreSQL成为了许多开发者和组织的首选数据库解决方案,从而推动了它的流行。下面介绍一下这款关系型数据库PostgreSQL。
目录
一、PostgreSQL 介绍
1. 概念
PostgreSQL 是当前功能最强大的开源的关系型数据库系统,支持跨平台的多种操作系统, 基于C语言开发。通常简称为PG或PGSQL。 PostgreSQL是100%社区驱动的开源项自,由全球范围内千人以上的社区责献者共同维护。PostgreSQL提供了一个完整功能的瓶本,而不像MySQL那样提供多个不同的版本,如社区版、商业版及企业版。
官网:PostgreSQL: The world's most advanced open source database
中文社区: PostgreSQL中文社区:: 世界上功能最强大的开源数据库...
中文手册: PostgreSQL 14.1 手册
2. 特点
① 开源和免费:是一款完全开源的数据库系统,用户可以免费使用、修改和分发它。
② 功能丰富:具有许多高级功能,包括复杂查询、事务支持、触发器、存储过程、视图、全文搜索、地理空间数据处理等。
③ 可扩展性:具有良好的可扩展性,支持水平扩展和垂直扩展。通过使用分区表、复制、流复制等功能,可以轻松地扩展数据库以满足不断增长的需求。
④ 安全性:注重数据安全性,提供了各种安全功能,如访问控制、SSL支持、加密存储、审计功能等,可以帮助保护数据免受恶意攻击和数据泄露。
⑤ 跨平台支持:可以在各种操作系统上运行,包括Linux、Unix、Windows和macOS等,这使得它具有很好的跨平台兼容性。
⑥ 社区支持:拥有一个庞大的全球开发者社区,提供了丰富的文档、教程和支持资源。用户可以通过邮件列表、论坛等渠道获得帮助和交流经验。
⑦ 成熟稳定:已经存在了30多年,经过了多次的版本迭代和改进,已经非常成熟和稳定。许多大型企业和组织都在使用PostgreSQL来处理他们的关键业务数据。
3. 作用
PostgreSQL是一款功能丰富、可靠稳定、安全性高的开源数据库管理系统,适用于各种规模的应用程序和企业,可以满足各种复杂的数据需求。
① 数据存储和管理:PostgreSQL可以存储和管理大量的数据,包括结构化数据、半结构化数据和非结构化数据。
② 数据查询和分析:PostgreSQL提供了强大的查询和分析功能,包括复杂查询、聚合函数、窗口函数、分析函数等。
③ 数据安全:PostgreSQL提供了各种安全功能,如访问控制、SSL支持、加密存储、审计功能等,可以帮助保护数据免受恶意攻击和数据泄露。
④ 数据一致性和完整性:PostgreSQL支持事务,可以确保数据的一致性和完整性。
⑤ 数据复制和高可用性:PostgreSQL支持数据复制和流复制,可以提供数据的备份和高可用性。
⑥ 数据分区和分布式处理:PostgreSQL支持分区表,可以将数据分布到多个物理存储设备上,从而提高查询性能。
⑦ 地理信息系统(GIS):PostgreSQL具有强大的地理信息系统支持,包括地理空间数据类型、索引和查询功能。
⑧ 全文搜索:PostgreSQL提供了全文搜索功能,包括全文索引和全文搜索查询。
4. 使用场景
① Web应用程序:PostgreSQL是许多Web应用程序的首选数据库解决方案,包括许多大型的社交网络、电子商务网站、新闻门户等。它的高级功能和可扩展性使得它能够处理大量的数据和复杂的查询需求。
② 地理信息系统(GIS):PostgreSQL具有强大的地理信息系统支持,包括地理空间数据类型、索引和查询功能。因此,它被许多GIS应用程序用作后端数据库。
③ 全文搜索:PostgreSQL提供了全文搜索功能,包括全文索引和全文搜索查询。这使得它成为许多需要全文搜索功能的应用程序的首选数据库解决方案。
④ 大数据处理:PostgreSQL的可扩展性和高级功能使得它能够处理大量的数据,包括大数据处理、数据仓库等。
⑤ 金融和电信行业:PostgreSQL被许多金融和电信公司用于处理他们的关键业务数据,包括交易数据、客户数据等。它的高级功能和数据安全性使得它成为这些行业的首选数据库解决方案。
⑥ 科学研究:PostgreSQL被许多科学研究机构用于处理和分析科学数据,包括天文学、生物学、气象学等。它的高级功能和可扩展性使得它能够满足这些领域的复杂数据需求。
5. PostgreSQL 与 MySQL 对比
5.1 PG 相对于 MySQL 的优势
- 在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨。
- 对表连接支持较完整,优化器的功能较完整,支持的索引类型很多,复杂查询能力较强。
- PG主表采用堆表存放,MySQL采用索引组织表,能够支持比MySQL更大的数据量。
- PG的主备复制属于物理复制,相对于MySQL基于biniog的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小。
- PostgreSQL支持ISON和其他NOSQL功能,如本机XML支持和使用HSTORE的键值对。它还支持索引SON数据以加快访问速度,特别是10版本JSONB更是强大。
- PostgreSQL完全免费,而且是BSD协议,如果你把PostgreSQL改一改,然后再拿去卖钱,也没有人管你,这一点很重要,这表明了PostgresQl数据库不会被其它公司控制。相反,MySQL现在主要是被Oracle公司控制。
5.2 MySQL 相对于 PG 的优势
- innodb的基于回滚段实现的MVCC机制,相对PG新老数据一起存放的基于XID的MVCC机制,是占优的。新老数据一起存放,需要定时触 发VACUUM,会带来多余的IO和数据库对象加锁开销,引起数据库整体的并发能力下降。而且VACUUM清理不及时,还可能会引发数据膨胀。
- MySQL采用索引组织表,这种存储方式非常适合基于主键匹配的查询、制改操作,但是对表结构设计存在约束。
- MySQL的优化器较简单,系统表、运算符、数据类型的实现都很精简,非常适合简单的查询操作。
- MySQL相对于PG在国内的流行度更高,PG在国内显得就有些落了。
- MySQL的存储引擎插件化机制,使得它的应用场景更加广泛,比如除了innodb适合事务处理场景外,mvisam适合静态数据的查询场暴。
总结
从应用场景来说,PG更加适合严格的企业应用场景(比如金融、电信、ERP、CRM),但不仅仅限制于此,PostareSQl的ison,isonb,hstore等数据格式,特别适用于一些大数据格式的分析;而MySQL更加适合业务逻辑相对简单、数据可靠性要求较低的互联网场景(比如google、acebook、albaba),当然现在MySQL的在innodb引擎的大力发展,功能表现良好。
二、PostgreSQL 部署
1. Yum 安装 PG
使用官方源: PostgreSQL: Downloads
1.1 选择操作系统及版本
1.2 选择需要安装的软件版本及环境
1.3 安装并运行
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 使用yum包管理器安装PostgreSQL的官方YUM存储库。这个存储库包含了PostgreSQL的二进制安装包,可以让你使用yum来安装和更新PostgreSQL。
sudo yum install -y postgresql14-server
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
# 使用PostgreSQL 14的postgresql-14-setup脚本初始化一个新的PostgreSQL 14数据库。
sudo systemctl enable postgresql-14
sudo systemctl start postgresql-14
1.4 登录数据库
方法一:在默认配置下,本机访问 PostgreSQL
[root@localhost ~]# su - postgres # 切换 postgres 用户
上一次登录:日 3月 24 12:49:21 CST 2024pts/0 上
-bash-4.2$ psql # 登录 PostgreSQL 控制台
psql (14.11)
输入 "help" 来获取帮助信息.
postgres=# # 此时说明用 postgres 身份登录数据库,且不需要密码
postgres=# \password postgres # 给 postgres 用户设置密码
Enter new password for user "postgres":
再输入一遍:
方法二:创建新用户来访问 PostgreSQL
[root@localhost ~]# su - postgres # 切换linux用户postgres
上一次登录:日 3月 24 13:03:32 CST 2024pts/0 上
-bash-4.2$ psql # 执行psql
psql (14.11)
输入 "help" 来获取帮助信息.
postgres=# CREATE USER dbfql WITH PASSWORD '123456'; # 创建数据库用户dbfql
CREATE ROLE
postgres=# CREATE DATABASE db1 OWNER dbfql; # 创建数据库db1
CREATE DATABASE
postgres=# GRANT ALL PRIVILEGES ON DATABASE db1 TO dbfql; # 将db1数据库的所有权都赋予dbdql
GRANT
postgres=# \q-bash-4.2$ exit
登出
[root@localhost ~]# useradd dbfql # 创建普通用户dbfql
[root@localhost ~]# passwd dbfql
[root@localhost ~]# su - dbfql
上一次登录:日 3月 24 13:42:25 CST 2024pts/0 上
[dbfql@localhost ~]$ psql -d db1
psql (14.11)
输入 "help" 来获取帮助信息.
db1=>
方法三:已存在普通用户,在数据库创建同名用户和数据库
[root@localhost ~]# id lisi
uid=1002(lisi) gid=1002(lisi) 组=1002(lisi)
[root@localhost ~]# su - postgres
上一次登录:日 3月 24 13:29:32 CST 2024pts/0 上
-bash-4.2$ psql
psql (14.11)
输入 "help" 来获取帮助信息
postgres=# CREATE USER lisi WITH PASSWORD '123456';
CREATE ROLE
postgres=# CREATE DATABASE lisidb OWNER lisi;
CREATE DATABASE
postgres=# GRANT ALL PRIVILEGES ON DATABASE lisidb TO lisi;
GRANT
postgres=# \q
-bash-4.2$ exit
登出
[root@localhost ~]# su - lisi
上一次登录:日 3月 24 13:51:56 CST 2024pts/0 上
[lisi@localhost ~]$ psql -d lisidb
psql (14.11)
输入 "help" 来获取帮助信息.
lisidb=>
2. 编译安装
2.1 安装依赖包
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y gcc.x86_64 make readline-devel zlib-devel
2.2 源码编译安装
[root@localhost opt]# wget https://ftp.postgresql.org/pub/source/v14.1/postgresql-14.1.tar.gz
[root@localhost opt]# ls
postgresql-16.2.tar.gz rh
[root@localhost opt]# tar xf postgresql-14.1.tar.gz
[root@localhost opt]# cd postgresql-14.1/
[root@localhost postgresql-14.1]# ./configure --prefix=/apps/pgsql --with-pgport=5432
[root@localhost postgresql-14.1]# make -j 2 && make install
2.3 创建数据库用户和组
PostgreSQL 默认不支持 以 root 身份启动服务,虽然也可修改源码实现 root 启动,但基于安全考虑不建议,因此必须创建一个用于启动 PostgrepSQL 的普通用户。
[root@localhost postgresql-14.1]# useradd -s /bin/bash -m -d /home/postgres postgres
# 创建数据库用户和组,注意此用户需要可以交互登录
[root@localhost postgresql-14.1]# echo "123123" | passwd --stdin postgres
更改用户 postgres 的密码 。
passwd:所有的身份验证令牌已经成功更新。
# 修改postgres密码
2.4 创建数据目录并授权
[root@localhost postgresql-14.1]# mkdir /pgsql/data -pv
[root@localhost postgresql-14.1]# chown postgres.postgres /pgsql -R
2.5 设置环境变量
[root@localhost ~]# vim /etc/profile.d/pgsql.sh
export PGHOME=/apps/pgsql
export PATH=$PGHOME/bin/:$PATH
export PGDATA=/pgsql/data
export PGUSER=postgres
export MANPATH=/apps/pgsql/share/man:$MANPATH
2.6 初始化数据库
[root@localhost ~]# su - postgres
[postgres@localhost ~]$ initdb -D /pgsql/data # -D 指定数据目录
2.7 启动和关闭服务
[postgres@localhost ~]$ pg_ctl start
#开启
[postgres@localhost ~]$ pg_ctl stop
#停止
[postgres@localhost ~]$ pg_ctl -l logfile start
#将日志记录到文件中,不加就打印在屏幕上
[postgres@localhost ~]$ pg_ctl restart
#重启
2.8 创建 service 文件
[root@localhost ~]# vim /lib/systemd/system/postgresql.service
[Unit]
Description=PostgreSQL database server
After=network.target
[Service]
User=postgres
Group=postgres
ExecStart=/apps/pgsql/bin/postmaster -D /pgsql/data
ExecReload=/bin/kill -HUP
[Install]
WantedBy=multi-user.target
[root@localhost ~]# systemctl start postgresql.service
[root@localhost ~]# systemctl status postgresql
● postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled; vendor preset: disabled)
Active: active (running) since 日 2024-03-24 15:17:25 CST; 2s ago
2.9 登录数据库
[root@localhost ~]# su - postgres
上一次登录:日 3月 24 15:01:04 CST 2024pts/0 上
[postgres@localhost ~]$ psql
psql (14.1)
Type "help" for help.
postgres=#
三、PostgreSQL 远程登录
1. 编辑配置文件
[root@localhost ~]# vim /pgsql/data/postgresql.conf
listen_address = '*'
# 在所有IP地址上监听,从而允许远程连接到数据库服务器
[root@localhost ~]# vim /pgsql/data/pg_hba.conf
host all all 0.0.0.0/0 md5
# 允许任意用户从任意地址上以密码方式访问数据库
[root@localhost ~]# su - postgres
上一次登录:日 3月 24 15:17:53 CST 2024pts/1 上
[postgres@localhost ~]$ psql
psql (14.1)
Type "help" for help.
postgres=# alter user postgres with password '123123'; # 登录数据修改密码
ALTER ROLE
2. 重启数据库服务
[root@localhost ~]# systemctl restart postgresql.service
3. 远程登录
[root@localhost ~]# psql -U postgres -h 192.168.190.104
用户 postgres 的口令:
psql (14.11, 服务器 14.1)
输入 "help" 来获取帮助信息.
postgres=#