文章目录
- [PostgreSQL 安装与全方位操作指南(附与 MySQL 对比)](#PostgreSQL 安装与全方位操作指南(附与 MySQL 对比))
-
- 一、前置知识
-
- [1.1 数据库在架构中的定位](#1.1 数据库在架构中的定位)
- [1.2 数据库基本概念](#1.2 数据库基本概念)
-
- [1.2.1 核心概念(与 MySQL 对比)](#1.2.1 核心概念(与 MySQL 对比))
- [1.2.2 DBMS 工作模式(PostgreSQL 流程)](#1.2.2 DBMS 工作模式(PostgreSQL 流程))
- [1.3 数据库发展史(PostgreSQL 演进)](#1.3 数据库发展史(PostgreSQL 演进))
- [1.4 关系型数据库(PostgreSQL 核心优势)](#1.4 关系型数据库(PostgreSQL 核心优势))
- [1.5 关系型 vs 非关系型数据库(补充 PostgreSQL 定位)](#1.5 关系型 vs 非关系型数据库(补充 PostgreSQL 定位))
- [二、PostgreSQL 安装(Linux 源码编译版,以 CentOS 7 为例)](#二、PostgreSQL 安装(Linux 源码编译版,以 CentOS 7 为例))
-
- [2.1 环境准备(依赖包安装)](#2.1 环境准备(依赖包安装))
- [2.2 创建 PostgreSQL 专用用户](#2.2 创建 PostgreSQL 专用用户)
- [2.3 源码下载与解压](#2.3 源码下载与解压)
- [2.4 编译配置(核心参数)](#2.4 编译配置(核心参数))
- [2.5 编译与安装](#2.5 编译与安装)
- [2.6 配置文件修改](#2.6 配置文件修改)
-
- [2.6.1 先初始化数据库(生成配置文件)](#2.6.1 先初始化数据库(生成配置文件))
- [2.6.2 修改 postgresql.conf(允许远程连接)](#2.6.2 修改 postgresql.conf(允许远程连接))
- [2.6.3 修改 pg_hba.conf(允许指定 IP 访问)](#2.6.3 修改 pg_hba.conf(允许指定 IP 访问))
- [2.7 环境变量设置](#2.7 环境变量设置)
- [2.8 服务管理(用 systemd 管理)](#2.8 服务管理(用 systemd 管理))
- [2.9 初始密码设置(postgres 用户)](#2.9 初始密码设置(postgres 用户))
- [三、PostgreSQL 数据库管理(核心操作+与 MySQL 对比)](#三、PostgreSQL 数据库管理(核心操作+与 MySQL 对比))
-
- [3.1 基础连接与导航](#3.1 基础连接与导航)
-
- [3.1.1 本地连接(psql 工具)](#3.1.1 本地连接(psql 工具))
- [3.1.2 常用 psql 命令(区别于 MySQL)](#3.1.2 常用 psql 命令(区别于 MySQL))
- [3.2 常用数据类型(PostgreSQL 特有)](#3.2 常用数据类型(PostgreSQL 特有))
- [3.3 数据库文件存储结构](#3.3 数据库文件存储结构)
- [3.4 SQL 语句分类与实操(重点差异)](#3.4 SQL 语句分类与实操(重点差异))
-
- [3.4.1 DDL 操作(数据定义语言)](#3.4.1 DDL 操作(数据定义语言))
-
- [1. 创建数据库](#1. 创建数据库)
- [2. 创建表(含自增与特色类型)](#2. 创建表(含自增与特色类型))
- [3. 修改表结构(ALTER TABLE)](#3. 修改表结构(ALTER TABLE))
- [4. 删除表与数据库](#4. 删除表与数据库)
- [3.4.2 DML 操作(数据操纵语言)](#3.4.2 DML 操作(数据操纵语言))
-
- [1. 插入数据(支持数组与 JSONB)](#1. 插入数据(支持数组与 JSONB))
- [2. 更新数据(支持 JSONB 字段更新)](#2. 更新数据(支持 JSONB 字段更新))
- [3. 删除与清空表](#3. 删除与清空表)
- [3.4.3 DQL 操作(数据查询语言,突出高级特性)](#3.4.3 DQL 操作(数据查询语言,突出高级特性))
-
- [1. 基础查询(LIMIT 语法一致,但支持 OFFSET 简写)](#1. 基础查询(LIMIT 语法一致,但支持 OFFSET 简写))
- [2. 数组与 JSONB 字段查询(PostgreSQL 特有)](#2. 数组与 JSONB 字段查询(PostgreSQL 特有))
- [3. CTE 公共表表达式(复杂查询简化,MySQL 8.0+ 支持)](#3. CTE 公共表表达式(复杂查询简化,MySQL 8.0+ 支持))
- [3.4.4 DCL 操作(用户与权限管理)](#3.4.4 DCL 操作(用户与权限管理))
-
- [1. 创建用户(角色)](#1. 创建用户(角色))
- [2. 授权用户](#2. 授权用户)
- [3. 查看与撤销权限](#3. 查看与撤销权限)
- [3.5 应急处理:忘记 postgres 密码](#3.5 应急处理:忘记 postgres 密码)
- [四、PostgreSQL 与 MySQL 核心差异总结](#四、PostgreSQL 与 MySQL 核心差异总结)
- 五、小结
PostgreSQL 安装与全方位操作指南(附与 MySQL 对比)
一、前置知识
1.1 数据库在架构中的定位
PostgreSQL 作为企业级开源关系型数据库,可无缝替代 LAMP/LNMP 架构中的 MySQL,成为核心数据存储引擎。其强事务一致性、丰富的数据类型和扩展能力,使其更适用于对数据完整性要求高的场景:
- 金融领域:存储交易记录、账户信息(依赖 ACID 事务保障)
- 大数据场景:结合 PostGIS 扩展存储地理信息(如外卖配送范围、地图数据)
- 复杂业务系统:电商订单、物流跟踪(支持复杂查询与自定义函数)
示例:
- 高德地图:用 PostGIS 扩展存储地理坐标与路径数据
- 网易邮箱:用 PostgreSQL 存储用户邮件内容与通讯录
- 阿里云 RDS:提供 PostgreSQL 实例,服务企业级客户
1.2 数据库基本概念
1.2.1 核心概念(与 MySQL 对比)
概念 | 定义 | PostgreSQL 特性差异 |
---|---|---|
数据 | 描述客观事物的符号记录(数字、文字、JSON、地理信息等) | 支持数组、JSONB、GEOMETRY等特殊类型(MySQL 需插件或自定义) |
表 | 行(记录)+ 列(字段)的二维结构 | 表默认使用 Heap 存储引擎,索引独立存储(无 MySQL 的 MyISAM/InnoDB 区分) |
数据库 | 表的集合,按业务逻辑分组 | 支持表空间(将不同表存储到不同磁盘,优化性能) |
DBMS | 操作和管理数据库的软件(PostgreSQL 核心程序) | 内置事务隔离(Serializable 级别)、WAL 日志(崩溃恢复),无需额外配置 |
DBS | 硬件+OS+数据库+DBMS+应用软件+用户 | DBA 需关注 WAL 日志管理、表空间分配(MySQL 更关注存储引擎选择) |
1.2.2 DBMS 工作模式(PostgreSQL 流程)
- 接收客户端请求(通过 psql、pgAdmin 或应用程序)
- 解析 SQL 语句,检查语法与权限
- 执行查询优化(生成最优执行计划,比 MySQL 更智能)
- 操作数据文件或索引,写入 WAL 日志(确保事务安全)
- 格式化结果并返回给用户
1.3 数据库发展史(PostgreSQL 演进)
PostgreSQL 是最悠久的开源关系型数据库之一,其发展历程体现了企业级特性的持续迭代:
- 1986 年:加州大学伯克利分校发布 Postgres(PostgreSQL 前身),首次支持复杂数据类型与事务
- 1996 年:加入 SQL 支持,更名为 PostgreSQL,成为开源项目
- 2005 年(8.0 版本):支持自增字段(SERIAL)、外键约束强化
- 2014 年(9.4 版本):引入 JSONB 类型(二进制 JSON,支持索引,远超 MySQL 的 JSON 性能)
- 2016 年(9.6 版本):支持并行查询(大表查询速度提升数倍)
- 2022 年(15 版本):增强权限管理、分区表性能优化,成为金融级首选开源数据库
1.4 关系型数据库(PostgreSQL 核心优势)
作为关系型数据库的"全能选手",PostgreSQL 除了支持传统二维表与 E-R 模型(实体-关系),还具备以下独有优势:
- 数据类型丰富 :除常规类型外,支持数组(
INT[]
)、JSONB(高效 JSON)、地理信息(GEOMETRY
)、范围类型(INT4RANGE
) - 事务强一致性 :完全支持 ACID,默认隔离级别为
READ COMMITTED
,最高支持SERIALIZABLE
(避免幻读,MySQL 需特殊配置) - 扩展能力极强:可通过插件扩展功能(如 PostGIS 处理地理数据、pg_stat_statements 分析 SQL 性能)
- 复杂查询支持:原生支持 CTE(公共表表达式)、窗口函数、递归查询,适合复杂业务分析
1.5 关系型 vs 非关系型数据库(补充 PostgreSQL 定位)
特性 | 关系型数据库(PostgreSQL/MySQL) | 非关系型数据库(Redis/MongoDB) |
---|---|---|
数据结构 | 二维表(行+列),支持关联 | KV 键值对、文档、列式存储 |
核心优势 | 事务安全、复杂查询、SQL 通用 | 高并发、低延迟、格式灵活 |
适用场景 | 业务数据存储(订单、账户) | 缓存、日志、非结构化数据 |
PostgreSQL 特有 | 支持 JSONB、地理信息、并行查询 | - |
实际应用搭配:PostgreSQL(存储核心业务数据)+ Redis(缓存热点数据)+ MongoDB(存储用户行为日志)
二、PostgreSQL 安装(Linux 源码编译版,以 CentOS 7 为例)
2.1 环境准备(依赖包安装)
PostgreSQL 编译需依赖以下工具与库,执行命令安装:
bash
# 安装编译工具与依赖库
yum -y install gcc gcc-c++ make readline-devel zlib-devel openssl-devel
# 说明:
# readline-devel:支持命令行历史记录与编辑(psql 工具依赖)
# zlib-devel:支持数据压缩(WAL 日志压缩依赖)
# openssl-devel:支持 SSL 加密连接(远程安全访问依赖)
2.2 创建 PostgreSQL 专用用户
PostgreSQL 不允许用 root 启动服务,需创建专用用户 postgres
:
bash
# 创建用户(禁止登录 shell,仅用于运行服务)
useradd -M -s /sbin/nologin postgres
# 1. 创建家目录 /home/postgres
mkdir -p /home/postgres
# 2. 修改家目录的所有者为 postgres(确保用户有权访问)
chown -R postgres:postgres /home/postgres
# 3. (可选)设置家目录权限(仅用户自身可读写,增强安全性)
chmod 700 /home/postgres
# 创建数据目录(后续初始化用)
mkdir -p /usr/local/pgsql/data
# 授权:数据目录仅 postgres 用户可读写
chown -R postgres:postgres /usr/local/pgsql/
2.3 源码下载与解压
-
官网下载源码包(推荐 14.x 稳定版,长期支持):
地址:https://www.postgresql.org/ftp/source/bash# 下载 14.10 版本源码包到 /opt 目录(与后续解压目录一致,避免移动文件) wget https://ftp.postgresql.org/pub/source/v14.10/postgresql-14.10.tar.gz -P /opt/
-
解压到
/opt
目录:
bash
# 解压源码包(替换为实际下载的版本)
tar zxvf postgresql-14.10.tar.gz -C /opt
# 进入源码目录
cd /opt/postgresql-14.10/
2.4 编译配置(核心参数)
执行 configure
配置编译选项,重点指定安装路径与功能:
bash
./configure \
--prefix=/usr/local/pgsql \ # 安装路径(类似 MySQL 的 basedir)
--with-data-dir=/usr/local/pgsql/data \ # 数据目录(类似 MySQL 的 datadir)
--with-openssl \ # 启用 SSL 加密
--with-readline \ # 启用 readline 支持(psql 历史命令)
--with-zlib \ # 启用 zlib 压缩
--enable-thread-safety # 启用线程安全(多线程应用连接依赖)
==============================================================================
./configure \
--prefix=/usr/local/pgsql \
--with-data-dir=/usr/local/pgsql/data \
--with-openssl \
--with-readline \
--with-zlib \
--enable-thread-safety
注意 :若配置报错,需先解决依赖问题(如缺少 openssl-devel
),再重新执行 ./configure
。
2.5 编译与安装
bash
# 编译(-j 4 表示用 4 个线程,加速编译,根据 CPU 核心数调整)
make -j 4
# 安装(将编译结果复制到 --prefix 指定的路径)
make install
2.6 配置文件修改
PostgreSQL 有两个核心配置文件,位于 /usr/local/pgsql/data
(初始化后生成):
- postgresql.conf:主配置文件(服务端口、监听地址等)
- pg_hba.conf:访问控制文件(哪些 IP 可连接、认证方式)
2.6.1 先初始化数据库(生成配置文件)
切换到 postgres
用户,执行 initdb
初始化数据目录:
bash
# 切换用户
su - postgres -s /bin/bash
#若格式缺失,如-bash-4.2$,使用以下命令补全。
cp /etc/skel/.bash* ~/
source ~/.bashrc
# 初始化数据库(指定数据目录与编码)
/usr/local/pgsql/bin/initdb \
-D /usr/local/pgsql/data \ # 数据目录(与之前创建一致)
-U postgres \ # 超级用户(类似 MySQL 的 root)
-E UTF8 \ # 默认编码(避免中文乱码)
--locale=C # 区域设置(简化排序,避免中文排序问题)
==============================================================================
/usr/local/pgsql/bin/initdb \
-D /usr/local/pgsql/data \
-U postgres \
-E UTF8 \
--locale=C
初始化成功后,会提示"Success. You can now start the database server"。
2.6.2 修改 postgresql.conf(允许远程连接)
bash
# 编辑主配置文件(postgres 用户操作)
vi /usr/local/pgsql/data/postgresql.conf
# 修改以下参数:
listen_addresses = '*' # 60行 监听所有网卡(默认只监听 localhost)
port = 5432 #64行 端口(PostgreSQL 默认端口,区别于 MySQL 的 3306)
max_connections = 1000 #65行 最大连接数(根据服务器配置调整),若服务器内存 ≤ 4GB,建议改为 500 而非 1000,避免内存不足;内存 ≥ 8GB 可设 1000。
shared_buffers = 1GB #127行 共享内存(建议设为物理内存的 1/4,如 4GB 内存设 1GB)
wal_level = replica #205行 WAL 日志级别(支持主从复制,默认已开启)
2.6.3 修改 pg_hba.conf(允许指定 IP 访问)
控制哪些 IP 可以连接数据库,添加远程访问规则:
bash
# 编辑访问控制文件(postgres 用户操作)
vi /usr/local/pgsql/data/pg_hba.conf
# 在末尾添加(允许 192.168.1.0/24 网段用密码连接):
host all all 192.168.100.0/24 scram-sha-256
# 说明:
# host:表示 TCP/IP 连接
# all all:允许所有数据库、所有用户
# 192.168.1.0/24:允许的网段(根据实际环境修改)
# scram-sha-256:加密认证方式(比 MySQL 的 mysql_native_password 更安全)
2.7 环境变量设置
为方便全局使用 psql
等命令,添加环境变量:
bash
# 编辑全局环境变量(root 用户操作)
vi /etc/profile
# 添加以下内容:
export PATH=$PATH:/usr/local/pgsql/bin
export PGDATA=/usr/local/pgsql/data # 数据目录(可选,简化命令)
# 生效环境变量
source /etc/profile
2.8 服务管理(用 systemd 管理)
PostgreSQL 源码安装默认不生成 systemd 服务文件,需手动创建:
bash
# 创建服务文件(root 用户操作)
vi /usr/lib/systemd/system/postgresql.service
# 写入以下内容:
[Unit]
Description=PostgreSQL Database Server
After=network.target
[Service]
Type=forking
User=postgres
Group=postgres
Environment=PGDATA=/usr/local/pgsql/data
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D $PGDATA -s -o "-p 5432"
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D $PGDATA -s -m fast
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D $PGDATA -s
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动与设置开机自启
bash
# 重新加载 systemd 配置
systemctl daemon-reload
# 启动服务
systemctl start postgresql
# 设为开机自启
systemctl enable postgresql
# 检查服务状态(确保 active (running))
systemctl status postgresql
# 检查端口(默认 5432)
netstat -anpt | grep 5432
2.9 初始密码设置(postgres 用户)
PostgreSQL 初始化后,postgres
用户默认无密码,需手动设置:
bash
# 1. 连接数据库(postgres 用户操作,无需密码)
su - postgres -s /bin/bash
psql -U postgres -d postgres
# -U postgres:指定连接数据库的用户名(这里是超级用户 postgres,类似 MySQL 的 root)
# -d postgres:指定要连接的数据库名(这里是默认初始化的 postgres 数据库,作为管理员初始连接的默认库)
# 2. 在 psql 命令行中设置密码
ALTER USER postgres WITH PASSWORD '123456'; # 替换为实际密码
# 3. 退出 psql
\q
三、PostgreSQL 数据库管理(核心操作+与 MySQL 对比)
3.1 基础连接与导航
3.1.1 本地连接(psql 工具)
bash
# 方式1:切换到 postgres 用户连接
su - postgres -s /bin/bash
psql -U postgres -d postgres # -U 用户名,-d 数据库名(默认 postgres 库)
# 方式2:root 用户直接连接(需指定密码)
psql -U postgres -d postgres -h localhost -p 5432
# 输入密码后进入 psql 交互界面,提示如下:
# postgres=#
3.1.2 常用 psql 命令(区别于 MySQL)
功能 | PostgreSQL(psql)命令 | MySQL 命令 |
---|---|---|
查看所有数据库 | \l | SHOW DATABASES; |
切换数据库 | \c 数据库名 | USE 数据库名; |
查看当前库的表 | \d | SHOW TABLES; |
查看表结构 | \d 表名 | DESC 表名; |
查看用户权限 | \du | SHOW GRANTS; |
退出 | \q | exit; 或 \q |
3.2 常用数据类型(PostgreSQL 特有)
除了 MySQL 支持的 INT
、VARCHAR
、TIMESTAMP
等,PostgreSQL 还提供以下特色类型:
数据类型 | 说明 | 示例 |
---|---|---|
SERIAL | 自增整数(类似 MySQL 的 AUTO_INCREMENT) | id SERIAL PRIMARY KEY |
BIGSERIAL | 大自增整数(支持更大范围) | id BIGSERIAL PRIMARY KEY |
JSONB | 二进制 JSON(支持索引,查询高效) | info JSONB |
INT[] | 整数数组(存储多个值) | tags INT[] |
INT4RANGE | 整数范围(如 1-10,避免存储多个值) | age_range INT4RANGE |
GEOMETRY | 地理信息(需 PostGIS 扩展) | location GEOMETRY(Point, 4326) |
示例:创建含数组与 JSONB 类型的表
sql
CREATE TABLE user_info (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
hobbies TEXT[], -- 爱好数组(如 {"篮球","音乐"})
profile JSONB, -- 个人资料(如 {"age":25,"city":"北京"})
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
3.3 数据库文件存储结构
PostgreSQL 数据文件默认位于 /usr/local/pgsql/data
,核心目录说明:
目录/文件 | 功能 | 对比 MySQL |
---|---|---|
base/ | 存储数据库表数据(每个数据库一个子目录) | data/ 下的数据库子目录 |
pg_wal/ | WAL 日志(事务日志,用于崩溃恢复与主从) | data/binlog/(二进制日志) |
postgresql.conf | 主配置文件 | my.cnf |
pg_hba.conf | 访问控制文件 | my.cnf 中的 user 授权配置 |
pg_stat/ | 统计信息(连接数、查询性能) | information_schema 视图 |
表文件 :每个表对应 base/数据库OID/表OID
文件(OID 是系统分配的唯一标识,可通过 SELECT oid FROM pg_database;
查看)。
3.4 SQL 语句分类与实操(重点差异)
3.4.1 DDL 操作(数据定义语言)
1. 创建数据库
sql
-- PostgreSQL(支持指定编码与表空间)
CREATE DATABASE mydb
WITH
OWNER = postgres
ENCODING = 'UTF8'
TABLESPACE = pg_default; -- 表空间(默认 pg_default)
-- MySQL 对比
CREATE DATABASE mydb CHARACTER SET utf8;
2. 创建表(含自增与特色类型)
sql
-- 切换到 mydb 库
\c mydb;
-- 创建订单表(含 SERIAL 自增、INT4RANGE 范围类型)
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
amount DECIMAL(10,2) NOT NULL, -- 金额(精确到分)
quantity INT4RANGE NOT NULL, -- 商品数量范围(如 [1,5] 表示 1-5 件)
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- 外键(关联用户表,类似 MySQL)
FOREIGN KEY (user_id) REFERENCES user_info(id)
);
-- 查看表结构
\d orders;
3. 修改表结构(ALTER TABLE)
sql
-- 1. 新增字段
ALTER TABLE orders ADD COLUMN status VARCHAR(20) DEFAULT 'pending';
-- 2. 修改字段类型(PostgreSQL 更灵活,需确保数据兼容)
ALTER TABLE orders ALTER COLUMN amount TYPE DECIMAL(12,2);
-- 3. 删除字段
ALTER TABLE orders DROP COLUMN status;
-- MySQL 对比:语法类似,但 PostgreSQL 不支持 MODIFY/CHANGE 混用,统一用 ALTER COLUMN
4. 删除表与数据库
sql
-- 删除表(需先删除外键依赖,或加 CASCADE 级联删除)
DROP TABLE orders CASCADE; -- CASCADE:删除依赖该表的对象
-- 删除数据库(需先断开所有连接)
DROP DATABASE mydb;
3.4.2 DML 操作(数据操纵语言)
1. 插入数据(支持数组与 JSONB)
sql
-- 插入普通数据
INSERT INTO user_info (name, hobbies, profile)
VALUES ('张三', '{"篮球","跑步"}', '{"age":28,"city":"上海"}');
-- 插入数组数据(两种写法)
INSERT INTO user_info (name, hobbies, profile)
VALUES ('李四', ARRAY['读书','旅行'], '{"age":30,"city":"广州"}');
-- 插入范围类型数据
INSERT INTO orders (user_id, amount, quantity)
VALUES (1, 299.99, '[2,5]'); -- quantity 为 2-5 件
2. 更新数据(支持 JSONB 字段更新)
sql
-- 普通更新
UPDATE user_info SET name = '张三丰' WHERE id = 1;
-- 更新 JSONB 字段(PostgreSQL 特有)
UPDATE user_info
SET profile = profile || '{"phone":"13800138000"}'::JSONB
WHERE id = 1;
-- MySQL 对比:MySQL 需用 JSON_SET 函数,PostgreSQL 用 || 拼接
3. 删除与清空表
sql
-- 删除指定数据
DELETE FROM user_info WHERE id = 2;
-- 清空表(两种方式,区别于 MySQL)
-- 方式1:DELETE(可回滚,自增 ID 不重置)
DELETE FROM user_info;
-- 方式2:TRUNCATE(不可回滚,自增 ID 重置,速度快)
TRUNCATE TABLE user_info RESTART IDENTITY; -- RESTART IDENTITY 重置自增
-- MySQL 对比:MySQL TRUNCATE 自动重置自增,PostgreSQL 需加 RESTART IDENTITY
3.4.3 DQL 操作(数据查询语言,突出高级特性)
1. 基础查询(LIMIT 语法一致,但支持 OFFSET 简写)
sql
-- 查询前 10 条数据(与 MySQL 一致)
SELECT * FROM user_info LIMIT 10;
-- 从第 5 条开始,查询 10 条(两种写法)
SELECT * FROM user_info LIMIT 10 OFFSET 5; -- PostgreSQL/MySQL 通用
SELECT * FROM user_info LIMIT 5, 10; -- 仅 MySQL 支持,PostgreSQL 不支持
2. 数组与 JSONB 字段查询(PostgreSQL 特有)
sql
-- 1. 查询爱好包含"篮球"的用户(数组查询)
SELECT name FROM user_info WHERE '篮球' = ANY (hobbies);
-- 2. 查询 profile 中 age=28 的用户(JSONB 查询)
SELECT name FROM user_info WHERE profile->>'age' = '28';
-- 说明:->> 表示提取 JSONB 字段的值并转为字符串
3. CTE 公共表表达式(复杂查询简化,MySQL 8.0+ 支持)
sql
-- 需求:查询订单金额大于 200 的用户姓名与订单金额
WITH high_value_orders AS (
SELECT user_id, amount FROM orders WHERE amount > 200
)
SELECT u.name, o.amount
FROM user_info u
JOIN high_value_orders o ON u.id = o.user_id;
3.4.4 DCL 操作(用户与权限管理)
PostgreSQL 权限管理更精细,支持角色(Role) 概念(用户本质是可登录的角色)。
1. 创建用户(角色)
sql
-- 创建可登录的用户(类似 MySQL 的 CREATE USER)
CREATE ROLE test_user WITH
LOGIN -- 允许登录(关键,否则无法连接)
PASSWORD 'test123' -- 密码
NOCREATEDB -- 禁止创建数据库
NOCREATEROLE; -- 禁止创建角色
-- MySQL 对比
CREATE USER 'test_user'@'%' IDENTIFIED BY 'test123';
2. 授权用户
sql
-- 授予 test_user 对 mydb 库所有表的查询、插入权限
GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA public TO test_user;
-- 授予 test_user 在 mydb 库创建表的权限
GRANT CREATE ON DATABASE mydb TO test_user;
-- MySQL 对比
GRANT SELECT, INSERT ON mydb.* TO 'test_user'@'%';
3. 查看与撤销权限
sql
-- 查看 test_user 的权限
\du test_user; -- psql 命令
-- 或用 SQL 语句
SELECT * FROM information_schema.role_table_grants WHERE grantee = 'test_user';
-- 撤销权限
REVOKE INSERT ON ALL TABLES IN SCHEMA public FROM test_user;
3.5 应急处理:忘记 postgres 密码
若忘记 postgres
用户密码,按以下步骤重置:
- 修改 pg_hba.conf 临时关闭认证:
bash
# 编辑访问控制文件
vi /usr/local/pgsql/data/pg_hba.conf
# 将所有认证方式改为 trust(无需密码)
# 原内容:host all all 0.0.0.0/0 scram-sha-256
# 修改为:host all all 0.0.0.0/0 trust
- 重启 PostgreSQL 服务:
bash
systemctl restart postgresql
- 无密码连接并修改密码:
bash
# 无密码连接
psql -U postgres -d postgres
# 修改密码
ALTER USER postgres WITH PASSWORD 'new_password'; # 替换为新密码
# 退出
\q
- 恢复 pg_hba.conf 并重启:
bash
# 将 trust 改回 scram-sha-256
vi /usr/local/pgsql/data/pg_hba.conf
# 重启服务
systemctl restart postgresql
四、PostgreSQL 与 MySQL 核心差异总结
维度 | PostgreSQL | MySQL |
---|---|---|
默认端口 | 5432 | 3306 |
自增字段 | SERIAL/BIGSERIAL | AUTO_INCREMENT |
事务隔离级别 | 支持 Serializable(默认 Read Committed) | 支持 Repeatable Read(默认 Repeatable Read) |
数据类型 | 支持 JSONB、数组、地理信息 | 仅支持基础类型,JSON 性能弱 |
查询能力 | 支持 CTE、并行查询、窗口函数 | 8.0+ 支持 CTE,无并行查询 |
认证方式 | scram-sha-256(更安全) | mysql_native_password(默认) |
存储引擎 | 无引擎选择(默认支持事务) | InnoDB(事务)、MyISAM(非事务) |
备份工具 | pg_dump/pg_basebackup | mysqldump/mysqlbinlog |
五、小结
PostgreSQL 作为企业级开源数据库,其强事务一致性、丰富的数据类型和扩展能力,使其在金融、大数据、地理信息等场景中成为首选。与 MySQL 相比,它更适合需要复杂查询、自定义数据类型或高安全性的业务,但学习成本略高。
实际应用建议:
- 中小项目/简单场景:MySQL(部署简单,生态成熟)
- 复杂业务/金融/地理数据:PostgreSQL(事务安全,扩展灵活)
- 混合架构:PostgreSQL(核心数据)+ Redis(缓存)+ Elasticsearch(全文检索)
通过本文的安装与操作实践,可掌握 PostgreSQL 的核心用法,后续可进一步学习主从复制、分区表、PostGIS 扩展等高级特性,满足企业级需求。