PostgreSQL 部署全记录:Ubuntu从安装到故障排查的完整实践

一、环境准备与安装过程

1.1 系统环境

  • ​操作系统​:Ubuntu 22.04 LTS
  • ​PostgreSQL版本​:15.8
  • ​安装包来源​:官方APT仓库

1.2 安装步骤详解

csharp 复制代码
# 步骤1:更新系统仓库
sudo apt update && sudo apt upgrade -y

# 步骤2:添加PostgreSQL官方仓库
sudo apt install -y software-properties-common
sudo add-apt-repository 'deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main'

# 步骤3:导入仓库密钥
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

# 步骤4:安装数据库服务
sudo apt install -y postgresql postgresql-contrib

​关键验证点​​:

bash 复制代码
# 检查服务状态
systemctl status postgresql
# 预期输出:Active: active (exited)

# 查看安装版本
psql --version
# 输出示例:psql (PostgreSQL) 15.8

1.3 初始配置

ini 复制代码
# 步骤1:切换到postgres用户
sudo -i -u postgres

# 步骤2:进入psql控制台
psql

# 步骤3:创建初始用户和数据库
CREATE USER admin WITH PASSWORD 'SecurePass123!' CREATEDB CREATEROLE;
CREATE DATABASE mydb OWNER admin;
\q

​权限验证​​:

sql 复制代码
SELECT usename, usesuper, valuntil FROM pg_user;

二、核心操作指令集

2.1 数据库管理

操作 命令示例 说明
连接数据库 psql -U admin -d mydb 使用指定用户连接
列出数据库 \l 显示所有数据库
创建数据库 CREATE DATABASE test WITH ENCODING 'UTF8'; 指定编码格式
删除数据库 DROP DATABASE IF EXISTS old_db; 安全删除操作

systemctl status postgresql

执行 systemctl status postgresql 实时监控服务运行状态,包含进程信息、日志摘要和资源占用。查看服务启动时长和进程信息。

shell 复制代码
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: active (exited) since Tue 2025-08-26 14:30:00 CST; 2h 15min ago
  Process: 1234 ExecStart=/usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main -c config_file=/etc/postgresql/14/main/postgresql.conf (code=exited, status=0/SUCCESS)
 Main PID: 1234 (code=exited, status=0/SUCCESS)

基础配置验证

shell 复制代码
# 验证服务是否监听正确地址 
netstat -plnt | grep postgres 
# 预期输出:tcp6 0 0 :::5432 :::* LISTEN postgres

权限配置验证

shell 复制代码
-- 查看用户权限
\du

-- 验证远程连接配置
SELECT * FROM pg_hba_file_rules WHERE database = 'all' AND user = 'all';

2.2 表操作

sql 复制代码
-- 创建带约束的表
CREATE TABLE employees (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name VARCHAR(50) NOT NULL CHECK (name ~ '^[A-Za-z]+$'),
    salary NUMERIC(10,2) CHECK (salary > 0),
    hire_date DATE DEFAULT CURRENT_DATE
);

-- 修改表结构
ALTER TABLE employees ADD COLUMN department VARCHAR(20);
ALTER TABLE employees ALTER COLUMN salary TYPE DECIMAL(12,2);

2.3 数据操作

sql 复制代码
-- 批量插入数据
INSERT INTO employees (name, salary)
VALUES 
('Alice', 75000.50),
('Bob', 82000.00)
RETURNING id, name;

-- 事务操作
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

2.4 权限管理

sql 复制代码
-- 创建只读用户
CREATE ROLE read_only WITH LOGIN PASSWORD 'ReadOnlyPass!';
GRANT CONNECT ON DATABASE mydb TO read_only;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only;

-- 撤销权限
REVOKE DELETE ON employees FROM read_only;

三、故障排查实战记录

3.1 典型问题案例

​问题现象​​:新创建用户无法连接数据库

vbnet 复制代码
psql: error: connection to server at "localhost" (::1), port 5432 failed: FATAL: password authentication failed for user "user_hrjd4h"

​排查过程​​:

  1. 检查pg_hba.conf配置
bash 复制代码
grep -A 5 'host' /etc/postgresql/15/main/pg_hba.conf

发现配置项:

css 复制代码
host    all    all    0.0.0.0/0    scram-sha-256
  1. 验证密码策略
sql 复制代码
ALTER USER user_hrjd4h WITH PASSWORD 'NewPass123!';
  1. 重启服务使配置生效

    sudo systemctl restart postgresql

3.2 性能问题分析

​场景​​:复杂查询执行缓慢

sql 复制代码
EXPLAIN ANALYZE
SELECT * FROM orders 
WHERE created_at BETWEEN '2025-01-01' AND '2025-08-31'
ORDER BY total_amount DESC;

​优化方案​​:

sql 复制代码
-- 创建复合索引
CREATE INDEX idx_orders_date_amount ON orders (created_at, total_amount DESC);

3.3 备份恢复方案

​全量备份​​:

r 复制代码
pg_dump -U admin -F c -b -v -f /backup/mydb.dump mydb

​增量备份​​:

bash 复制代码
pg_basebackup -D /backup/inc1 -Fp -Xs -P -v -h localhost -U admin

四、最佳实践总结

4.1 安全加固

  1. 启用SSL连接
vbnet 复制代码
sudo openssl req -new -x509 -days 365 -nodes -text -out server.crt -keyout server.key -subj "/CN=localhost"
  1. 定期密码轮换
sql 复制代码
ALTER USER admin WITH PASSWORD 'NewSecurePass456!';

4.2 性能监控

sql 复制代码
-- 启用统计扩展
CREATE EXTENSION pg_stat_statements;

-- 查看最耗时查询
SELECT query, calls, total_time FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;

4.3 自动化维护

bash 复制代码
# 创建每日备份脚本
cat << EOF > /opt/postgres/backup_daily.sh
#!/bin/bash
DATE=$(date +%Y%m%d)
pg_dump -U admin -F c -b -v -f /backup/$DATE.dump mydb
EOF

# 设置定时任务
chmod +x /opt/postgres/backup_daily.sh
(crontab -l 2>/dev/null; echo "0 2 * * * /opt/postgres/backup_daily.sh") | crontab -

五、附录:常用命令速查表

分类 命令示例 说明
​服务管理​ systemctl restart postgresql 重启服务
​用户管理​ ALTER USER user WITH LOGIN 设置登录权限
​查询优化​ EXPLAIN (ANALYZE, BUFFERS) SELECT ... 执行计划分析
​日志查看​ tail -f /var/log/postgresql/postgresql-15-main.log 实时日志监控

通过本次部署实践,我们系统性地覆盖了PostgreSQL的安装配置、核心操作和故障处理。建议定期执行VACUUM ANALYZE维护数据库健康,并通过pg_stat_activity监控实时连接状态。生产环境中务必配置防火墙规则(仅开放必要端口)并启用审计日志功能。

六、其他记录

软件初始占用内存:0.05g

相关推荐
zopple7 小时前
常见的 Spring 项目目录结构
java·后端·spring
cjy0001119 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
小江的记录本10 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji341610 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
程序员cxuan10 小时前
人麻了,谁把我 ssh 干没了
人工智能·后端·程序员
wuyikeer11 小时前
Spring Framework 中文官方文档
java·后端·spring
Victor35611 小时前
MongoDB(61)如何避免大文档带来的性能问题?
后端
Victor35611 小时前
MongoDB(62)如何避免锁定问题?
后端
wuyikeer12 小时前
Spring BOOT 启动参数
java·spring boot·后端
子木HAPPY阳VIP13 小时前
Ubuntu 22.04 VMware 设置固定IP配置
人工智能·后端·目标检测·机器学习·目标跟踪