【问题标题】:PostgreSQL "initdb" (Database Initialization) on LinuxLinux 上的 PostgreSQL“initdb”(数据库初始化)
【发布时间】:2015-11-09 14:08:54
【问题描述】:

我正在使用 PostgreSQL 9.x 在 Linux 系统(CentOS - RedHat - Fedora)上创建一个数据库集群(单个数据库)。我已经安装了正确的 PostgreSQL 包(服务器和客户端),但是,我无法创建数据库并获得某种类型的初始化依赖项错误:总线错误/退出代码 135。我已经用“su postgres”将我的用户更改为“postgres”,然后尝试用“initdb”初始化数据库(这可能是问题所在)

Installed: postgresql-libs-9.2.13-1.el7_1.x86_64
Installed: postgresql-9.2.13-1.el7_1.x86_64
Installed: postgresql-server-9.2.13-1.el7_1.x86_64

$ initdb -D /usr/local/pgsql/data

http://www.postgresql.org/docs/9.2/interactive/creating-cluster.html

错误:

$ initdb -D /usr/local/pgsql/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

creating directory /usr/local/pgsql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in /usr/local/pgsql/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... sh: line 1: 12616 Bus error               (core dumped) "/usr/bin/postgres" --single -F -O -c search_path=pg_catalog -c exit_on_error=true template1 > /dev/null
child process exited with exit code 135

有什么想法吗?

【问题讨论】:

  • 这是硬盘坏了还是 postgresql 特有的问题?
  • 您究竟是如何安装这些软件包的?什么命令行?包裹从哪里来?你到底在什么操作系统上?请编辑问题以显示lsb_release -a 输出和rpm -qi postgresql-92-server(将92 替换为您的PostgreSQL 版本;如果不确定使用psql --version)。完成后在此处发表评论。
  • CentOS7 和 PostgreSQL 9.2 使用默认的 RedHat EL7 yum 安装。
  • 当时似乎与硬件/平台有关。设置ulimit -c unlimited 然后重新运行initdb 并调试它生成的核心文件可能会提供有用的信息。
  • postgres 以信号 7 终止,总线错误。 #0 dl_new_hash (s=0x43883b
    ) at dl-lookup.c:477 477 for (unsigned char c = *s; c != '\0'; c = *++s) 看起来我喜欢它试图索引一个越界的指针我应该从源代码安装 postgres 并获取最新版本吗?像这样的错误可能已经修复了。

标签: postgresql postgresql-9.2 centos7


【解决方案1】:

安装 PostgreSQL(服务器和客户端工具)后,需要以 ROOT(“su”)运行以下命令。关键步骤是启动“service postgresql initdb”并让它初始化你的PostgreSQL数据库。

如果您有任何错误,您需要删除空的安装“数据”目录并仔细阅读所有日志文件。

# service postgresql initdb
# systemctl enable postgresql
# systemctl start postgresql

完成上述操作后,验证 postgres 是否在 /var/lib/pgsql 中,并且正在运行带有“ps -ef | grep postgres”的进程(它在端口 5432 上)

如果您遇到任何其他问题,您可能需要创建或修改 postgres 用户/密码或清除 postgres 数据目录。

【讨论】:

  • 可以通过控制脚本检查和删除空或大小为零的“数据”目录来防止此类错误。
  • 刚刚收到一条信息消息,说“service postgresql initdb”已更改为“postgresql-setup initdb”。
【解决方案2】:

如果您从包安装,您应该使用包提供的方法来创建数据库。对于 README.rpm-dist 中记录的 PDGD RPM(来自 http://yum.postgresql.org/):

/usr/pgsql-9.4/bin/postgresql94-setup initdb

但是,您遇到的错误确实不应该发生。它表明硬件不兼容或低级问题,如不兼容的 C 库。也许您从不同的操作系统或版本强制安装了 RPM?

更新

似乎很可能是 C 库不兼容。也许是 RHEL 和 CentOS 之间的问题?还是版本相关?这是动态链接器的错误。 dl-lookup.c 将是 glibc/elf/dl-lookup.c 并且它似乎在符号查找期间崩溃。所以这里有一些非常不稳定的东西,比如二进制文件中的损坏的符号哈希表或二进制文件和使用的动态链接器之间的不兼容。或者内存故障、磁盘故障、CPU 缓存问题或其他硬件错误。

如果重新启动让它消失,我会非常怀疑硬件。如果不是这样,您可能在系统上有一些非常不稳定的东西,比如某些 3rd 方未打包的安装程序会覆盖原始 C 库/动态链接器,这种奇怪。

【讨论】:

  • 不幸的是,我无法像文档建议的那样运行“postgresql-setup initdb”。我所做的是清理所有内容,然后运行“service postgresql initdb”。最好先使用您推荐的命令。
  • 看来 PostgreSQL 二进制 RPM/YUM 安装库对于 CentOS / RedHat 是正确的,它们现在正在使用 9.2。这些说明看起来好像可以将数据库初始化为 postgres 用户,并且在这些条件下可能存在一些导致核心转储的错误。
猜你喜欢
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 2017-09-11
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
相关资源
最近更新 更多