jvb*_*jvb 13 postgresql windows-10 postgresql-9.5
我已经安装了 Windows 10 秋季更新 (1709),现在我的 PostgreSQL 9.5 服务器无法启动。它昨天在更新前工作,我没有对配置进行任何更改。
我检查了事件查看器并发现以下错误消息:
2017-10-19 11:32:32 CEST LOG: invalid value for parameter "lc_monetary": "Czech_Czech Republic.1250"
2017-10-19 11:32:32 CEST LOG: invalid value for parameter "lc_numeric": "Czech_Czech Republic.1250"
2017-10-19 11:32:32 CEST LOG: invalid value for parameter "lc_time": "Czech_Czech Republic.1250"
2017-10-19 11:32:32 CEST FATAL: configuration file "C:/Program Files/PostgreSQL/9.5/data/postgresql.conf" contains errors
Run Code Online (Sandbox Code Playgroud)
似乎微软在秋季更新时更改了语言环境名称,我找不到任何可用语言环境名称的列表,所以我决定安装 Postgres 10 并证实了我的怀疑,Postgres 10 中的 postgresql.conf 现在显示为:
# These settings are initialized by initdb, but they can be changed.
lc_messages = 'Czech_Czechia.1250' # locale for system error message
# strings
lc_monetary = 'Czech_Czechia.1250' # locale for monetary formatting
lc_numeric = 'Czech_Czechia.1250' # locale for number formatting
lc_time = 'Czech_Czechia.1250' # locale for time formatting
Run Code Online (Sandbox Code Playgroud)
我将 PostgreSQL 9.5 服务器的配置值更改为 'Czech_Czechia.1250' 并且它开始正常,但问题是现在我无法连接到任何数据库,pgAdmin III 给了我以下错误:
有没有办法取回数据?我无法创建转储或运行 pg_upgrade,因为数据库现在具有无效的语言环境并且我无法连接到它们。也许有一种方法可以手动更改数据库的语言环境?从理论上讲,它不应该引起任何问题,因为它对于相同的编码只有不同的名称。
jvb*_*jvb 12
感谢 Daniel Vérité 的建议,我能够在不转储整个数据库服务器的情况下修复它。我对 Windows 上的语言环境的理解非常有限,但据我所知,在 Fall Creators 更新期间,微软似乎将捷克语言环境的区域名称从“捷克共和国”更改为“捷克语”(大概因此它符合 ISO 3166-1) .
Postgres 以某种方式通过语言名称和区域名称的组合加载区域设置,因此无法连接在此更改之前创建的数据库,因为语言和区域的组合不再有效。
为了解决这个问题,我从微软下载了Locale Builder 2.0,然后:
现在我可以运行带有“Czech_Czech Republic.1250”的 PostgreSQL 9.5 和带有“Czech_Czechia.1250”的 PostgreSQL 10,它们都可以工作。
我不确定创建具有相同语言环境名称 (cs-CZ) 的语言环境是否可以,但它似乎不会引起任何问题,也许有人可以详细说明。