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

相关推荐
君不见,青丝成雪17 分钟前
SpringBoot项目占用内存优化
java·spring boot·后端
追逐时光者1 小时前
一个 .NET 开源、功能强大的在线文档编辑器,类似于 Microsoft Word,支持信创!
后端·.net
想买CT5的小曹1 小时前
SpringBoot如何获取系统Controller名称和方法名称
java·spring boot·后端
修一呀3 小时前
[后端快速搭建]基于 Django+DeepSeek API 快速搭建智能问答后端
后端·python·django
哈基米喜欢哈哈哈3 小时前
Spring Boot 3.5 新特性
java·spring boot·后端
当无3 小时前
Mac 使用Docker部署Mysql镜像,并使用DBever客户端连接
后端
David爱编程4 小时前
可见性问题的真实案例:为什么线程看不到最新的值?
java·后端
00后程序员4 小时前
移动端网页调试实战,iOS WebKit Debug Proxy 的应用与替代方案
后端