PostgreSQL 安装与操作指南

文章目录

  • [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 流程)
  1. 接收客户端请求(通过 psql、pgAdmin 或应用程序)
  2. 解析 SQL 语句,检查语法与权限
  3. 执行查询优化(生成最优执行计划,比 MySQL 更智能)
  4. 操作数据文件或索引,写入 WAL 日志(确保事务安全)
  5. 格式化结果并返回给用户

1.3 数据库发展史(PostgreSQL 演进)

PostgreSQL 是最悠久的开源关系型数据库之一,其发展历程体现了企业级特性的持续迭代:

  1. 1986 年:加州大学伯克利分校发布 Postgres(PostgreSQL 前身),首次支持复杂数据类型与事务
  2. 1996 年:加入 SQL 支持,更名为 PostgreSQL,成为开源项目
  3. 2005 年(8.0 版本):支持自增字段(SERIAL)、外键约束强化
  4. 2014 年(9.4 版本):引入 JSONB 类型(二进制 JSON,支持索引,远超 MySQL 的 JSON 性能)
  5. 2016 年(9.6 版本):支持并行查询(大表查询速度提升数倍)
  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 源码下载与解压

  1. 官网下载源码包(推荐 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/
  2. 解压到 /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(初始化后生成):

  1. postgresql.conf:主配置文件(服务端口、监听地址等)
  2. 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 支持的 INTVARCHARTIMESTAMP 等,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 用户密码,按以下步骤重置:

  1. 修改 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
  1. 重启 PostgreSQL 服务
bash 复制代码
systemctl restart postgresql
  1. 无密码连接并修改密码
bash 复制代码
# 无密码连接
psql -U postgres -d postgres
# 修改密码
ALTER USER postgres WITH PASSWORD 'new_password';  # 替换为新密码
# 退出
\q
  1. 恢复 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 扩展等高级特性,满足企业级需求。

相关推荐
sweethhheart2 小时前
【typora激活使用】mac操作方式
前端·数据库·macos
启明真纳4 小时前
PostgreSQL 单库备份
数据库·postgresql
Amd7945 小时前
PostgreSQL备份不是复制文件?物理vs逻辑咋选?误删还能精准恢复到1分钟前?
数据库·postgresql
wzg20165 小时前
pyqt5 简易入门教程
开发语言·数据库·qt
你是狒狒吗7 小时前
为什么mysql要有主从复制,主库,从库这种东西
数据库·mysql
倔强的石头10610 小时前
【金仓数据库】ksql 指南(一) 连接本地 KingbaseES 数据库与基础交互
数据库·oracle·kingbasees·金仓数据库·ksql
卷Java15 小时前
违规通知功能修改说明
java·数据库·微信小程序·uni-app
养生技术人16 小时前
Oracle OCP认证考试题目详解082系列第54题
数据库·sql·oracle·运维开发·database·开闭原则·ocp
数据知道16 小时前
Go基础:用Go语言操作MongoDB详解
服务器·开发语言·数据库·后端·mongodb·golang·go语言