我正在尝试创建 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
,然后运行initdb
或pg_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
...再次成功初始化数据库服务。