外观
PostgreSQL 18 单机版安装指南
1. 环境准备
1.1 系统要求
- 操作系统:Ubuntu 22.04 LTS 或 Ubuntu 24.04 LTS
- 内存:至少 2GB(建议 4GB 或更高)
- CPU:1 核心(建议 2 核心或更高)
1.2 服务器规划示例
| 主机名 | IP 地址 | 角色 | 配置 |
|---|---|---|---|
| pg-standalone | 192.168.199.111 | PostgreSQL 单机服务器 | 2C4G |
1.3 磁盘配置要求
合理的磁盘配置对 PostgreSQL 性能至关重要。本文档基于双磁盘架构设计:
1.3.1 磁盘配置详情
text
磁盘配置:
- 系统盘:40GB (virtio-scsi, /dev/sda)
- 挂载点:/ (根分区)
- 文件系统:ext4
- 用途:操作系统、基础软件、系统日志、PostgreSQL程序文件
- 数据盘:100GB+ (virtio-scsi, /dev/sdb)
- 挂载点:/data
- 文件系统:ext4
- 用途:PostgreSQL 数据文件、WAL日志、备份文件
- 建议:使用SSD存储以提高性能1.3.2 /data 目录结构规划
text
/data/
├── postgresql/ # PostgreSQL 数据目录
│ ├── 18/ # 版本目录
│ │ └── main/ # 主数据目录
│ │ ├── base/ # 数据库文件
│ │ ├── global/ # 全局数据
│ │ ├── pg_wal/ # WAL 日志
│ │ └── log/ # 数据库日志
│ └── backup/ # 备份目录
└── tmp/ # 临时文件目录(可选)1.3.3 存储性能建议
- 系统盘 (/):可使用普通存储,对性能要求不高
- 数据盘:强烈建议使用SSD存储,承载所有数据库相关文件
- 备份策略:建议定期将备份导出到外部存储或远程服务器
注意:目录的所有者和权限将在 PostgreSQL 安装并创建 postgres 用户后进行调整。
2. 系统初始化
2.1 更新系统包
bash
sudo apt update && sudo apt upgrade -y2.2 安装必要的工具
bash
sudo apt install -y wget curl vim net-tools telnet tree htop2.3 配置主机名解析
bash
sudo tee -a /etc/hosts <<EOF
192.168.199.111 pg-standalone
EOF2.4 配置防火墙(如启用)
bash
sudo ufw allow 22/tcp
sudo ufw allow 5432/tcp
sudo ufw --force enable3. 安装 PostgreSQL 18
3.1 方法一:使用官方自动化脚本(推荐)
bash
# 安装 postgresql-common 包
sudo apt install -y postgresql-common
# 运行官方自动化配置脚本
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
# 安装 PostgreSQL 18
sudo apt install -y postgresql-183.2 方法二:手动配置官方仓库
bash
# 安装依赖
sudo apt install -y curl ca-certificates
# 创建密钥目录
sudo install -d /usr/share/postgresql-common/pgdg
# 导入 PostgreSQL 官方 GPG 密钥
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc
# 添加 PostgreSQL 官方仓库
. /etc/os-release
sudo sh -c "echo 'deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $VERSION_CODENAME-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
# 更新包索引
sudo apt update
# 安装 PostgreSQL 18
sudo apt install -y postgresql-183.3 方法三:使用国内镜像加速
bash
# 安装依赖
sudo apt install -y curl ca-certificates gnupg2 lsb-release
# 导入 GPG 密钥
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
# 添加清华大学镜像源
echo "deb [signed-by=/etc/apt/trusted.gpg.d/postgresql.gpg] https://mirrors.tuna.tsinghua.edu.cn/postgresql/repos/apt/ $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
# 更新包索引并安装
sudo apt update
sudo apt install -y postgresql-184. 配置数据目录到 /data
安装完成后,需要将 PostgreSQL 数据目录迁移到 /data 磁盘:
4.1 停止服务并创建目录
bash
# 停止 PostgreSQL 服务
sudo systemctl stop postgresql
# 创建数据目录结构
sudo mkdir -p /data/postgresql/18/main
sudo mkdir -p /data/postgresql/backup
# 确保权限正确
sudo chown -R postgres:postgres /data/postgresql
sudo chmod 700 /data/postgresql/18/main4.2 迁移数据
bash
# 迁移现有数据
sudo rsync -av /var/lib/postgresql/18/main/ /data/postgresql/18/main/
# 备份原始配置文件
sudo cp /etc/postgresql/18/main/postgresql.conf /etc/postgresql/18/main/postgresql.conf.backup
# 修改配置文件指向新位置
sudo sed -i "s|data_directory = .*|data_directory = '/data/postgresql/18/main'|g" /etc/postgresql/18/main/postgresql.conf
# 更新服务配置
sudo sed -i "s|/var/lib/postgresql/18/main|/data/postgresql/18/main|g" /etc/postgresql/18/main/environment4.3 验证目录配置
bash
# 检查目录结构
ls -la /data/postgresql/18/main/
# 检查权限是否正确
sudo -u postgres ls -la /data/postgresql/18/main/4.4 启动 PostgreSQL 服务
bash
# 启动服务并设置开机自启
sudo systemctl start postgresql
sudo systemctl enable postgresql
# 检查服务状态
sudo systemctl status postgresql
# 验证数据目录位置
sudo -u postgres psql -c "SHOW data_directory;"5. PostgreSQL 基础配置
5.1 切换到 postgres 用户
bash
sudo -i -u postgres5.2 设置 postgres 用户密码
bash
psql -c "ALTER USER postgres PASSWORD 'your_secure_password';"5.3 退出 postgres 用户
bash
exit6. 配置远程访问(可选)
如果您需要从其他机器访问 PostgreSQL,需要进行以下配置:
6.1 修改 postgresql.conf
bash
# 查找配置文件位置
sudo -u postgres psql -c "SHOW config_file;"
# 编辑配置文件
sudo vim /etc/postgresql/18/main/postgresql.conf在配置文件中找到并修改以下行:
conf
# 监听所有地址
listen_addresses = '*'
# 启用日志收集
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'6.2 配置客户端认证
编辑 pg_hba.conf 文件:
bash
# 查找 pg_hba.conf 文件位置
sudo -u postgres psql -c "SHOW hba_file;"
# 编辑认证配置文件
sudo vim /etc/postgresql/18/main/pg_hba.conf在文件末尾添加允许远程连接的规则:
conf
# 允许特定网络访问
host all all 192.168.1.0/24 scram-sha-256
# 或者允许所有网络访问(不推荐用于生产环境)
host all all 0.0.0.0/0 scram-sha-2566.3 重启 PostgreSQL 服务
bash
sudo systemctl restart postgresql7. 创建业务数据库和用户
7.1 连接数据库
bash
sudo -u postgres psql7.2 创建数据库和用户
sql
-- 创建业务数据库
CREATE DATABASE myapp_db;
-- 创建业务用户
CREATE USER myapp_user WITH PASSWORD 'secure_password';
-- 授权
GRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp_user;
-- 退出
\q8. 基本性能优化配置
8.1 内存相关配置
编辑 postgresql.conf 文件:
bash
sudo vim /etc/postgresql/18/main/postgresql.conf根据您的服务器内存调整以下参数(以 4GB 内存为例):
conf
# 共享缓冲区(建议设为物理内存的 25%)
shared_buffers = 1GB
# 有效缓存大小(建议设为物理内存的 50-75%)
effective_cache_size = 3GB
# 工作内存(每个查询的内存)
work_mem = 4MB
# 维护工作内存
maintenance_work_mem = 256MB8.2 连接相关配置
conf
# 最大连接数(根据应用需求调整)
max_connections = 1008.3 检查点相关配置
conf
# 检查点间隔
checkpoint_completion_target = 0.9
# WAL 缓冲区
wal_buffers = 16MB8.4 PostgreSQL 18 新特性配置
conf
# 并行查询优化
max_parallel_workers_per_gather = 4
max_parallel_workers = 8
max_parallel_maintenance_workers = 4
# 逻辑复制优化(PostgreSQL 18 增强)
max_replication_slots = 10
max_wal_senders = 10
# 新增:改进的统计信息收集
default_statistics_target = 1008.5 重启服务使配置生效
bash
sudo systemctl restart postgresql9. 常用管理命令
9.1 服务管理
bash
# 启动 PostgreSQL
sudo systemctl start postgresql
# 停止 PostgreSQL
sudo systemctl stop postgresql
# 重启 PostgreSQL
sudo systemctl restart postgresql
# 查看 PostgreSQL 状态
sudo systemctl status postgresql
# 设置开机自启
sudo systemctl enable postgresql9.2 连接数据库
bash
# 使用 postgres 用户连接
sudo -u postgres psql
# 使用指定用户连接指定数据库
psql -U myapp_user -d myapp_db -h localhost
# 远程连接示例
psql -U finadmin -d mydb -h 10.10.0.13 -p 54329.3 常用 SQL 命令
sql
-- 列出所有数据库
\l
-- 切换数据库
\c database_name
-- 列出所有表
\dt
-- 查看表结构
\d table_name
-- 查看当前连接信息
\conninfo
-- 退出
\q10. 备份与恢复
10.1 逻辑备份(SQL 格式)
bash
# 备份整个数据库集群
sudo -u postgres pg_dumpall > /data/postgresql/backup/backup_full_$(date +%Y%m%d).sql
# 备份单个数据库
sudo -u postgres pg_dump myapp_db > /data/postgresql/backup/myapp_db_$(date +%Y%m%d).sql
# 备份单个表
sudo -u postgres pg_dump -t table_name myapp_db > /data/postgresql/backup/table_$(date +%Y%m%d).sql10.2 物理备份(文件系统级别)
bash
# 停止 PostgreSQL 服务
sudo systemctl stop postgresql
# 备份数据目录
sudo tar -czf /data/postgresql/backup/postgresql_backup_$(date +%Y%m%d).tar.gz /data/postgresql/18/main/
# 启动 PostgreSQL 服务
sudo systemctl start postgresql10.3 恢复数据
bash
# 恢复 SQL 备份
sudo -u postgres psql < /data/postgresql/backup/backup_full_20240101.sql
# 恢复单个数据库
sudo -u postgres psql myapp_db < /data/postgresql/backup/myapp_db_20240101.sql11. 监控和日志
11.1 查看日志文件
bash
# 查看日志目录
sudo -u postgres psql -c "SHOW log_directory;"
# 查看最新日志文件
sudo tail -f /data/postgresql/18/main/log/postgresql-*.log
# 或者系统日志目录
sudo tail -f /var/log/postgresql/postgresql-18-main.log11.2 基本监控查询
sql
-- 查看当前活动连接
SELECT * FROM pg_stat_activity;
-- 查看数据库大小
SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database;
-- 查看表大小
SELECT tablename, pg_size_pretty(pg_total_relation_size(tablename)) FROM pg_tables WHERE schemaname='public';11.3 磁盘空间监控
bash
# 查看磁盘使用情况
df -h
# 查看 PostgreSQL 数据目录大小
sudo du -sh /data/postgresql/18/main/
# 查看各子目录大小
sudo du -sh /data/postgresql/18/main/*/12. 安全加固建议
12.1 修改默认端口(可选)
编辑 postgresql.conf 文件:
conf
port = 5433 # 修改默认端口12.2 限制超级用户访问
编辑 pg_hba.conf 文件,限制 postgres 用户只能本地登录:
conf
local all postgres peer
host all postgres 127.0.0.1/32 reject12.3 定期更新
bash
sudo apt update && sudo apt upgrade postgresql-1813. 故障排除
13.1 常见问题
1. 无法连接到数据库
bash
# 检查服务状态
sudo systemctl status postgresql
# 检查端口监听
sudo netstat -tlnp | grep 5432
# 查看日志
sudo tail -f /data/postgresql/18/main/log/postgresql-*.log2. 权限拒绝错误
bash
# 检查认证配置
sudo cat /etc/postgresql/18/main/pg_hba.conf
# 重启服务使配置生效
sudo systemctl restart postgresql3. 磁盘空间不足
bash
# 检查磁盘使用情况
df -h
# 检查数据目录大小
sudo du -sh /data/postgresql/18/main/*/
# 清理旧的备份文件
sudo find /data/postgresql/backup/ -name "*.sql" -mtime +30 -delete13.2 日志分析
bash
# 查看错误日志
sudo grep -i "error" /data/postgresql/18/main/log/postgresql-*.log
# 查看警告日志
sudo grep -i "warning" /data/postgresql/18/main/log/postgresql-*.log14. PostgreSQL 18 新特性
14.1 主要新特性
PostgreSQL 18 带来了许多新特性和改进:
1. 性能改进
- 改进的并行查询性能
- 更快的索引创建
- 优化的 VACUUM 操作
2. SQL 增强
- 新增 JSON 函数和操作符
- 改进的窗口函数
- 增强的正则表达式支持
3. 复制和恢复
- 改进的逻辑复制性能
- 增强的流复制功能
- 更快的 PITR(时间点恢复)
4. 安全性
- 增强的加密支持
- 改进的权限管理
14.2 版本升级注意事项
如果从旧版本升级到 PostgreSQL 18:
bash
# 1. 备份数据
sudo -u postgres pg_dumpall > /data/postgresql/backup/backup_before_upgrade.sql
# 2. 停止旧版本服务
sudo systemctl stop postgresql
# 3. 使用 pg_upgrade 升级
sudo -u postgres /usr/lib/postgresql/18/bin/pg_upgrade \
-b /usr/lib/postgresql/16/bin \
-B /usr/lib/postgresql/18/bin \
-d /data/postgresql/16/main \
-D /data/postgresql/18/main
# 4. 启动新版本服务
sudo systemctl start postgresql15. 磁盘空间管理
15.1 目录结构概览
在双磁盘架构下,PostgreSQL 的目录结构如下:
text
/ # 系统盘
├── /etc/postgresql/18/main/ # 配置文件
├── /var/log/postgresql/ # 系统日志(可选)
└── /usr/lib/postgresql/18/ # 程序文件
/data # 数据盘
└── /data/postgresql/
├── 18/main/ # 数据目录
│ ├── base/ # 数据库文件
│ ├── global/ # 全局数据
│ ├── pg_wal/ # WAL 日志
│ └── log/ # 数据库日志
└── backup/ # 备份目录15.2 空间规划建议
| 目录 | 推荐大小 | 说明 |
|---|---|---|
| / (系统盘) | 40GB | 操作系统、程序文件 |
| /data/postgresql/18/main/ | 根据数据量 | 数据库核心数据 |
| /data/postgresql/backup/ | 数据量的1-2倍 | 备份存储 |
15.3 数据目录迁移
如果需要将数据目录从默认位置迁移到 /data:
bash
# 1. 停止 PostgreSQL 服务
sudo systemctl stop postgresql
# 2. 创建目标目录
sudo mkdir -p /data/postgresql/18/main
sudo chown postgres:postgres /data/postgresql/18/main
sudo chmod 700 /data/postgresql/18/main
# 3. 复制数据
sudo rsync -av /var/lib/postgresql/18/main/ /data/postgresql/18/main/
# 4. 修改配置文件
sudo vim /etc/postgresql/18/main/postgresql.conf
# 修改:data_directory = '/data/postgresql/18/main'
# 5. 更新环境配置
sudo vim /etc/postgresql/18/main/environment
# 修改数据目录路径
# 6. 启动服务
sudo systemctl start postgresql
# 7. 验证
sudo -u postgres psql -c "SHOW data_directory;"15.4 性能优化建议
磁盘 I/O 优化
bash
# 1. 调整文件系统参数(在 /etc/fstab 中)
# 对于 /data 磁盘,添加 noatime 参数:
# /dev/sdb1 /data ext4 defaults,noatime 0 0
# 2. 调整内核参数
sudo vim /etc/sysctl.conf
# 添加以下参数:
# vm.swappiness = 1
# vm.dirty_ratio = 15
# vm.dirty_background_ratio = 5
# 应用配置
sudo sysctl -pPostgreSQL 参数调优
bash
# 编辑 postgresql.conf
sudo vim /etc/postgresql/18/main/postgresql.conf
# 根据磁盘配置调整以下参数:
# shared_buffers = 25% of RAM
# effective_cache_size = 75% of RAM
# wal_buffers = 16MB
# checkpoint_completion_target = 0.9
# random_page_cost = 1.1 # SSD 环境下15.5 备份策略建议
在双磁盘架构下,建议采用以下备份策略:
bash
# 1. 本地备份(存储在 /data/postgresql/backup/)
sudo -u postgres pg_dump myapp_db > /data/postgresql/backup/myapp_db_$(date +%Y%m%d).sql
# 2. 定期清理旧备份(保留30天)
sudo find /data/postgresql/backup/ -name "*.sql" -mtime +30 -delete
# 3. 建议将关键备份同步到远程存储
# rsync -av /data/postgresql/backup/ user@remote:/backup/postgresql/