Postgresql 阿里云部署排雷

启动服务bug:

根据你的输出,可以看到 PostgreSQL 服务启动失败,并且显示以下错误消息:

```

pg_ctl: cannot be run as root

Please log in (using, e.g., "su") as the (unprivileged) user that will own the server process.

```

这个错误是因为 PostgreSQL 不允许以 root 用户身份启动。为了解决这个问题,你需要以 PostgreSQL 数据库的拥有者身份启动服务。

你可以使用以下步骤来解决这个问题:

  1. 使用 `su` 命令以 `postgres` 用户身份登录:

```bash

su - postgres

```

输入 `postgres` 用户的密码(如果有密码的话)。

  1. 在 `postgres` 用户会话中,启动 PostgreSQL 服务:

```bash

/data/pgsql/bin/pg_ctl start -D /data/pgsql -s -w -t 270

```

这将以 `postgres` 用户的身份启动 PostgreSQL 服务。

  1. 检查 PostgreSQL 服务的状态:

```bash

systemctl status postgresql.service

```

确保服务现在处于 "active" 状态,并且没有错误。

如果你希望 PostgreSQL 服务在系统启动时自动启动,你可以使用以下命令启用服务:

```bash

systemctl enable postgresql.service

```

解除PID文件占用

是的,你的理解是正确的。如果之前运行的 PostgreSQL 实例状态为 "active (exited)",那么它已经处于停止状态,但是由于存在锁文件(`postmaster.pid`),因此无法重新启动新的 PostgreSQL 服务。在这种情况下,你需要执行以下操作:

  1. 停止已经运行的 PostgreSQL 实例("active (exited)"状态的实例)以释放锁文件。你可以使用以下命令来尝试停止它:

```bash

/data/pgsql/bin/pg_ctl stop -D /data/pgsql/dbdata -s -m fast

```

这将尝试快速停止 PostgreSQL 服务。如果服务已成功停止,你可以继续下一步。

  1. 如果上述步骤无法正常停止 PostgreSQL 服务,你可以手动杀死正在运行的 `postmaster` 进程。首先,查找并记下 `postmaster` 进程的 PID(在这种情况下是 PID 29613),然后使用 `kill` 命令停止它:

```bash

kill -TERM 29613

```

这将发送一个终止信号给进程,使其正常退出。如果没有正常退出,你可以尝试使用 `kill -KILL 29613` 强制终止它。

  1. 一旦确保没有正在运行的 PostgreSQL 服务,你可以再次尝试启动服务:

```bash

/data/pgsql/bin/pg_ctl start -D /data/pgsql/dbdata -s -w -t 270

```

如果一切正确,PostgreSQL 服务应该能够成功启动。

这些步骤应该解决了由于锁文件导致 PostgreSQL 无法启动的问题。如果你仍然遇到问题,请提供错误消息,以便我能够更进一步帮助你。

BUG Active: active (exited)

在SysV初始化脚本下,Active: active (exited) 表示服务已经成功启动,但它不会一直在后台运行,而是在完成启动操作后立即退出。这在SysV方式下是正常的行为,因为SysV脚本通常不会自动后台运行。

PgSQL集群部署

Service文件配成两个

  1. 第一个文件 `postgresql.service` 似乎是一个元单元(meta unit)用于管理系统上的所有 PostgreSQL 集群。这个单元本身不执行实际的操作,而是用于管理多个 PostgreSQL 集群的单元 `postgresql@.service` 的元单元。这个文件的内容包括了 `Description`、`ExecStart`、`ExecReload` 等字段,但它的 `ExecStart` 和 `ExecReload` 都设置为 `/bin/true`,这意味着它们不执行实际的操作。

  2. 第二个文件是一个模板文件,用于启动和管理 PostgreSQL 集群的单元。它以 `postgresql@%i` 的形式命名,其中 `%i` 是一个变量,表示 PostgreSQL 集群的名称(例如,`9.3-main`)。这个文件包括了 `Description`、`AssertPathExists`、`RequiresMountsFor` 等字段,它定义了如何启动、停止和重新加载 PostgreSQL 集群。

第二个文件是用于管理 PostgreSQL 集群的 systemd 服务单元文件,而第一个文件是元单元,用于管理所有 PostgreSQL 集群的统一状态。

要启动或停止特定的 PostgreSQL 集群,使用 `systemctl` 命令,并指定要操作的单元名称,例如:

  • 启动 PostgreSQL 集群:`sudo systemctl start postgresql@9.3-main`

  • 停止 PostgreSQL 集群:`sudo systemctl stop postgresql@9.3-main`

  • 重新加载 PostgreSQL 集群配置:`sudo systemctl reload postgresql@9.3-main`

  • 查看 PostgreSQL 集群状态:`sudo systemctl status postgresql@9.3-main`

请注意,将上述命令中的 `9.3-main` 替换为你实际使用的 PostgreSQL 集群名称。

相关推荐
小吴编程之路4 小时前
MySQL 索引核心特性深度解析:从底层原理到实操应用
数据库·mysql
~莫子4 小时前
MySQL集群技术
数据库·mysql
凤山老林4 小时前
SpringBoot 使用 H2 文本数据库构建轻量级应用
java·数据库·spring boot·后端
就不掉头发4 小时前
Linux与数据库进阶
数据库
与衫4 小时前
Gudu SQL Omni 技术深度解析
数据库·sql
咖啡の猫5 小时前
Redis桌面客户端
数据库·redis·缓存
oradh5 小时前
Oracle 11g数据库软件和数据库静默安装
数据库·oracle
what丶k5 小时前
如何保证 Redis 与 MySQL 数据一致性?后端必备实践指南
数据库·redis·mysql
_半夏曲5 小时前
PostgreSQL 13、14、15 区别
数据库·postgresql
把你毕设抢过来5 小时前
基于Spring Boot的社区智慧养老监护管理平台(源码+文档)
数据库·spring boot·后端