PostgreSQL 15 完整安装、排错与运维指南
恭喜你!PostgreSQL 15 已经成功安装并运行。下面我给你整理一份完整的 PostgreSQL 运维手册,包含你可能会用到的所有命令。
一、安装后的基础配置
1.1 设置 postgres 用户密码
bash
# 切换到 postgres 系统用户
sudo su - postgres
# 进入 psql 命令行
psql
# 设置密码(将 'your_password' 替换为你的密码)
ALTER USER postgres WITH PASSWORD 'your_password';
# 退出 psql
\q
# 退出 postgres 用户
exit
1.2 创建业务数据库和用户(以 Halo 为例)
bash
# 以 postgres 用户连接
sudo su - postgres
psql
# 创建 Halo 专用用户和数据库
CREATE USER halo_user WITH PASSWORD 'halo_password';
CREATE DATABASE halo_db OWNER halo_user;
# 授予所有权限
GRANT ALL PRIVILEGES ON DATABASE halo_db TO halo_user;
# 退出
\q
exit
1.3 测试本地连接
bash
# 使用密码连接测试
psql -h localhost -U postgres -d postgres
# 查看数据库列表
psql -h localhost -U postgres -d postgres -c "\l"
# 查看 Halo 数据库是否创建成功
psql -h localhost -U halo_user -d halo_db -c "\conninfo"
二、常用运维命令大全
2.1 服务管理
bash
# 启动服务
sudo systemctl start postgresql-15
# 停止服务
sudo systemctl stop postgresql-15
# 重启服务
sudo systemctl restart postgresql-15
# 查看状态
sudo systemctl status postgresql-15
# 设置开机自启
sudo systemctl enable postgresql-15
# 禁用开机自启
sudo systemctl disable postgresql-15
# 重新加载配置(不重启)
sudo systemctl reload postgresql-15
2.2 连接与访问
bash
# 本地连接(使用 postgres 用户)
psql -U postgres -d postgres
# 指定主机连接
psql -h localhost -U postgres -d postgres
# 指定端口连接(默认 5432)
psql -h localhost -p 5432 -U postgres -d postgres
# 以其他用户连接
psql -h localhost -U halo_user -d halo_db
2.3 数据库信息查看
bash
# 查看数据库列表
psql -U postgres -c "\l"
# 查看当前连接数
psql -U postgres -c "SELECT count(*) FROM pg_stat_activity;"
# 查看当前正在执行的查询
psql -U postgres -c "SELECT pid, usename, query, state FROM pg_stat_activity WHERE state = 'active';"
# 查看数据库大小
psql -U postgres -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database;"
# 查看表大小(需先连接到对应数据库)
psql -U postgres -d halo_db -c "SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC;"
2.4 用户与权限管理
bash
# 创建用户
psql -U postgres -c "CREATE USER new_user WITH PASSWORD 'password';"
# 修改用户密码
psql -U postgres -c "ALTER USER username WITH PASSWORD 'new_password';"
# 授予数据库权限
psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE dbname TO username;"
# 授予表权限(需先连接到对应数据库)
psql -U postgres -d dbname -c "GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO username;"
# 查看用户列表
psql -U postgres -c "\du"
# 删除用户
psql -U postgres -c "DROP USER username;"
2.5 备份与恢复
bash
# 备份单个数据库
pg_dump -U postgres -h localhost halo_db > halo_db_backup_$(date +%Y%m%d).sql
# 备份所有数据库
pg_dumpall -U postgres -h localhost > all_dbs_backup_$(date +%Y%m%d).sql
# 压缩备份
pg_dump -U postgres -h localhost halo_db | gzip > halo_db_backup_$(date +%Y%m%d).sql.gz
# 恢复数据库(需先创建空数据库)
createdb -U postgres -h localhost new_halo_db
psql -U postgres -h localhost -d new_halo_db < halo_db_backup.sql
# 从压缩文件恢复
gunzip -c halo_db_backup.sql.gz | psql -U postgres -h localhost -d new_halo_db
# 使用自定义格式备份(更灵活)
pg_dump -U postgres -h localhost -F c halo_db > halo_db_backup_$(date +%Y%m%d).dump
pg_restore -U postgres -h localhost -d new_halo_db halo_db_backup.dump
三、配置文件管理
3.1 主要配置文件位置
bash
# 主配置文件
/var/lib/pgsql/15/data/postgresql.conf
# 客户端认证配置文件
/var/lib/pgsql/15/data/pg_hba.conf
# 日志目录
/var/lib/pgsql/15/data/log/
3.2 常用配置修改
bash
# 编辑配置文件
sudo vi /var/lib/pgsql/15/data/postgresql.conf
常用配置项:
ini
# 监听所有地址(允许远程连接)
listen_addresses = '*'
# 修改端口(默认 5432)
port = 5432
# 内存设置(根据服务器内存调整)
shared_buffers = 256MB
work_mem = 4MB
maintenance_work_mem = 64MB
# 连接数设置
max_connections = 100
# 日志设置
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0
3.3 配置远程访问
bash
# 编辑 pg_hba.conf
sudo vi /var/lib/pgsql/15/data/pg_hba.conf
添加以下行(根据需要选择):
ini
# 允许特定 IP 访问所有数据库
host all all 192.168.1.100/32 md5
# 允许整个网段访问
host all all 192.168.1.0/24 md5
# 允许所有 IP(仅测试环境!)
host all all 0.0.0.0/0 md5
修改后重启服务:
bash
sudo systemctl restart postgresql-15
四、排错指南
4.1 查看错误日志
bash
# 查看 PostgreSQL 日志
sudo tail -f /var/lib/pgsql/15/data/log/postgresql-*.log
# 查看系统日志
sudo journalctl -u postgresql-15 -f
# 查看最近 50 行错误
sudo journalctl -u postgresql-15 --since "5 minutes ago" | grep -i error
4.2 常见错误及解决
错误1:服务启动失败
bash
# 查看详细错误
sudo systemctl status postgresql-15 -l
# 检查数据目录权限
sudo ls -la /var/lib/pgsql/15/data/
# 应为 postgres:postgres
# 修复权限
sudo chown -R postgres:postgres /var/lib/pgsql/15/data/
错误2:连接被拒绝
bash
# 检查端口监听
sudo netstat -tlnp | grep 5432
# 检查防火墙
sudo firewall-cmd --list-ports
# 开放端口
sudo firewall-cmd --permanent --add-port=5432/tcp
sudo firewall-cmd --reload
# 检查 pg_hba.conf 配置是否正确
cat /var/lib/pgsql/15/data/pg_hba.conf | grep -v "^#"
错误3:密码认证失败
bash
# 重置 postgres 密码
sudo su - postgres
psql -c "ALTER USER postgres WITH PASSWORD 'new_password';"
exit
# 检查 pg_hba.conf 认证方式(应为 md5 或 scram-sha-256)
grep host /var/lib/pgsql/15/data/pg_hba.conf
错误4:数据库已存在
bash
# 删除数据库(谨慎!)
psql -U postgres -c "DROP DATABASE IF EXISTS halo_db;"
# 重新创建
psql -U postgres -c "CREATE DATABASE halo_db OWNER halo_user;"
错误5:磁盘空间不足
bash
# 查看磁盘使用
df -h
# 查看数据库大小
psql -U postgres -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) FROM pg_database;"
# 清理旧日志
sudo find /var/lib/pgsql/15/data/log -name "*.log" -mtime +30 -delete
五、性能监控脚本
创建一个简单的监控脚本 /usr/local/bin/pg_monitor.sh:
bash
#!/bin/bash
# PostgreSQL 监控脚本
echo "=== PostgreSQL 状态监控 ==="
echo "时间: $(date)"
echo ""
echo "服务状态:"
systemctl is-active postgresql-15 --quiet && echo "✅ 运行中" || echo "❌ 已停止"
echo ""
echo "连接数统计:"
sudo -u postgres psql -t -c "SELECT count(*) FROM pg_stat_activity;" | xargs echo "当前连接数:"
echo ""
echo "数据库大小:"
sudo -u postgres psql -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) FROM pg_database;"
echo ""
echo "最长运行事务:"
sudo -u postgres psql -c "SELECT pid, usename, query, now() - xact_start as duration FROM pg_stat_activity WHERE state = 'active' AND xact_start IS NOT NULL ORDER BY duration DESC LIMIT 5;"
echo ""
echo "磁盘使用:"
df -h /var/lib/pgsql | awk 'NR==2 {print "使用率: " $5 " (" $3 "/" $2 ")"}'
添加执行权限并测试:
bash
chmod +x /usr/local/bin/pg_monitor.sh
sudo /usr/local/bin/pg_monitor.sh
六、定时维护任务
6.1 设置自动备份
创建备份脚本 /usr/local/bin/pg_backup.sh:
bash
#!/bin/bash
# PostgreSQL 自动备份脚本
BACKUP_DIR="/backup/postgresql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份所有数据库
sudo -u postgres pg_dumpall > $BACKUP_DIR/all_dbs_$DATE.sql
# 压缩备份
gzip $BACKUP_DIR/all_dbs_$DATE.sql
# 删除7天前的备份
find $BACKUP_DIR -name "all_dbs_*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "Backup completed: $BACKUP_DIR/all_dbs_$DATE.sql.gz"
添加到 crontab(每天凌晨2点备份):
bash
sudo crontab -e
# 添加以下行
0 2 * * * /usr/local/bin/pg_backup.sh >> /var/log/pg_backup.log 2>&1
6.2 设置自动清理旧日志
bash
sudo crontab -e
# 每周日凌晨3点清理30天前的日志
0 3 * * 0 find /var/lib/pgsql/15/data/log -name "*.log" -mtime +30 -delete
七、快速参考命令表
| 操作 | 命令 |
|---|---|
| 启动服务 | sudo systemctl start postgresql-15 |
| 停止服务 | sudo systemctl stop postgresql-15 |
| 重启服务 | sudo systemctl restart postgresql-15 |
| 查看状态 | sudo systemctl status postgresql-15 |
| 连接数据库 | psql -U postgres -d postgres |
| 查看数据库列表 | \l |
| 切换数据库 | \c dbname |
| 查看表列表 | \dt |
| 查看用户列表 | \du |
| 退出 psql | \q |
| 备份数据库 | pg_dump -U postgres dbname > backup.sql |
| 恢复数据库 | psql -U postgres dbname < backup.sql |
| 查看日志 | sudo journalctl -u postgresql-15 -f |
| 测试配置 | sudo -u postgres /usr/pgsql-15/bin/pg_ctl -D /var/lib/pgsql/15/data/ test |
八、卸载 PostgreSQL(如需重装)
bash
# 停止服务
sudo systemctl stop postgresql-15
# 卸载软件包
sudo yum remove -y postgresql15*
# 删除数据目录(谨慎!备份好数据)
sudo rm -rf /var/lib/pgsql
sudo rm -rf /usr/pgsql-15
# 删除用户(可选)
sudo userdel -r postgres
# 清理 yum 缓存
sudo yum clean all
postgreSQL认证方式
postgreSQL 本地连接 ,默认用了 peer 或 ident 认证,不需要密码。
PostgreSQL 的认证方式由 pg_hba.conf 控制。你当前的配置允许本地操作系统用户 postgres 直接连接数据库,无需密码。
查看当前认证配置
bash
# 查看 pg_hba.conf 中关于本地连接的配置
sudo -u postgres cat /var/lib/pgsql/15/data/pg_hba.conf | grep -E "^local|^host.*127"
大概率你会看到类似这样的行:
local all all peer
# 或者
local all all ident
host all all 127.0.0.1/32 ident
peer 认证的含义
- 当你是 Linux 系统用户
postgres时(sudo -u postgres),PostgreSQL 直接信任你,不需要密码 - 你的命令
psql -U postgres虽然指定了数据库用户,但因为你是用系统用户postgres执行的,所以免密登录
如何验证密码是否设置成功
虽然本地免密,但密码确实设置成功了。用以下方式验证:
方法1:指定 host 连接(强制使用 TCP)
bash
# 使用 TCP 连接(会要求密码)
psql -h localhost -U postgres -d postgres
这时会提示输入密码,输入 Liu@66228028 应该能成功登录。
方法2:用其他系统用户连接
bash
# 退出当前 postgres 用户
exit
# 用 root 或其他用户连接(会要求密码)
psql -h localhost -U postgres -d postgres
方法3:查看用户密码信息
bash
sudo -u postgres psql -c "SELECT usename, passwd FROM pg_shadow WHERE usename='postgres';"
会看到加密后的密码字符串,说明密码已设置。
如果需要强制密码验证(安全考虑)
如果想让本地连接也要求密码,可以修改认证方式:
bash
# 编辑 pg_hba.conf
sudo vi /var/lib/pgsql/15/data/pg_hba.conf
将:
local all all peer
改为:
local all all md5
然后重启服务:
bash
sudo systemctl restart postgresql-15
之后再执行 psql -U postgres 就会要求输入密码了。
总结
- ✅ 密码设置成功,不必担心
- ✅ 本地免密是 PostgreSQL 的默认安全设计(通过操作系统用户认证)
- ✅ 远程连接或指定
-h localhost时会要求密码