我的服务器上安装了 CentOs 6.7:
bash-4.1# uname -r
2.6.32-573.18.1.el6.x86_64
服务器重启后,我的 PostgreSQL 9.6 服务器由于区域设置问题而无法启动。
这是日志错误消息:pgstartup.log
< 2017-01-26 16:33:08.115 IST > LOG: invalid value for parameter "lc_messages": "en_US.UTF-8"
< 2017-01-26 16:33:08.123 IST > LOG: invalid value for parameter "lc_monetary": "en_US.UTF-8"
< 2017-01-26 16:33:08.123 IST > LOG: invalid value for parameter "lc_numeric": "en_US.UTF-8"
< 2017-01-26 16:33:08.123 IST > LOG: invalid value for parameter "lc_time": "en_US.UTF-8"
< 2017-01-26 16:33:08.123 IST > FATAL: configuration file "/var/lib/pgsql/9.6/data/postgresql.conf" contains errors
系统要求语言环境“en_US.UTF-8”可用。我已检查,确实可用。
bash-4.1# locale -a | grep en_US
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
en_US
en_US.UTF-8
en_US.iso88591
en_US.iso885915
en_US.utf8
因此,我从 postgresql.conf 文件中注释了以下几行:
#lc_messages = 'en_US.UTF-8' # locale for system error message
# strings
#lc_monetary = 'en_US.UTF-8' # locale for monetary formatting
#lc_numeric = 'en_US.UTF-8' # locale for number formatting
#lc_time = 'en_US.UTF-8' # locale for time formatting
按照上述方法注释掉几行之后,服务器开始启动,但是无法登录到服务器,并且出现以下错误:
bash-4.1$ psql
psql: FATAL: database locale is incompatible with operating system
DETAIL: The database was initialized with LC_COLLATE "en_US.UTF-8", which is not recognized by setlocale().
HINT: Recreate the database with another locale or install the missing locale.
现在我在系统中有了 postgres 所需的区域设置,但问题也出现了。不知道问题到底出在哪里。
注意:此问题在服务器重启后产生。
答案1
我已经找到解决这个问题的方法。
实际上,locale 是由 Glibc 库提供的。在服务器中,Glibc 版本是 2.12。
由于某种原因,我们需要 2.14 版本,但无法通过 yum 将 2.12 升级到 2.14,因为 yum 说的是最新版本。
因此我们手动编译了 2.14 源代码并创建了二进制文件。
并将 2.12 的链接更改为 2.14,从而造成了混乱。
解决方案:将符号链接恢复为原始 2.12 版本。
寓意:永远不要弄乱 glibc,不要通过将符号链接指向不同的版本来这样做。