postgresql 安装:initdb 数据目录不为空?

postgresql 安装:initdb 数据目录不为空?

我正在尝试创建 postgresql 数据库。

当我安装 PostgreSQL 时,我给出了以下命令:

sudo yum install postgresql postgresql-server

后来我修改了配置文件:

sudo vim /var/lib/pgsql/data/pg_hba.conf

并修改为

local   all         all                               trust
host    all         all         127.0.0.1/32          trust
host    all         all         ::1/128               trust
host    all         all         0.0.0.0/0             md5

当我尝试启动 postgresql 服务时:

sudo service postgresql initdb

> Data directory is not empty!                               [FAILED]

sudo chkconfig postgresql on

sudo service postgresql start

Starting postgresql service:                               [  OK  ]

是什么导致了这些错误以及如何修复它们?

答案1

Initdb 应该只运行一次。它将创建一个目录,您将在其中保存配置文件和(通常)实际数据库。您显然已经这样做了;否则就不会有任何 pg_hba.conf 供您编辑。

因此,不要postgresql initdb再次运行,除非您要完全重新安装。

答案2

这里

如果你要完全擦除并重新安装 Postgres DB,则运行时执行initdb以下操作:

service postgresql-9.2 initdb -E 'UTF8' --pgdata="/foo/bar/"

您可能会遇到此服务错误:

数据目录不为空![失败]

要修复它(这是核选项——所有数据库数据都被清除!)

在 Amazon Linux (2014-x) 上:

rm -rf /var/lib/pgsql9/data

在 CentOS(6.x)上

rm -rf /var/lib/pgsql/9.2/data

现在再次尝试该initdb命令,这次它应该可以工作:

service postgresql-9.2 initdb

答案3

在基于 systemd 的系统(如 RHEL/CentOS 7 和 Fedora)上,运行 initdb 的过程略有不同。这不再由 init 脚本(不再存在)完成,新过程更接近于上游指令

您必须先向su用户提供postgres,然后运行initdbpg_ctl initdb。如果您使用的是 Red Hat 版本,则无需提供数据目录,因为其默认会自动选择默认数据目录/var/lib/pgsql

例如:

# su - postgres
$ pg_ctl initdb
$ exit
#

当然,您只需在首次安装时执行一次此操作,以设置初始数据目录。除非您正在创建全新安装或从灾难中恢复,否则您不会再次执行此操作。

答案4

我在 CentOS 6 上使用 PostgreSQL 9.3 时遇到了同样的问题。

我删除了 /var/lib/pgsql/9.3/data 文件夹,然后重新运行该命令

sudo service postgresql-9.3 initdb

...再次成功初始化数据库服务。

相关内容