O PostgreSQL 9.5 não será iniciado após a atualização do Windows 10

13

Instalei a atualização de outono do Windows 10 (1709) e agora meu servidor PostgreSQL 9.5 não será iniciado. Funcionou ontem antes da atualização e não fiz alterações na configuração.

Verifiquei o visualizador de eventos e encontrei as seguintes mensagens de erro:

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

Parece que a Microsoft mudou o nome da localidade com a atualização de outono, não consegui encontrar nenhuma lista de nomes de localidades disponíveis, então decidi instalar o Postgres 10 e confirmou minha suspeita, o postgresql.conf no Postgres 10 agora diz:

# 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

Alterei os valores de configuração do servidor PostgreSQL 9.5 para 'Czech_Czechia.1250' e tudo começou bem, mas o problema é que agora não consigo me conectar a nenhum banco de dados, o pgAdmin III me dá o seguinte erro:

Erro pgAdmin

Existe uma maneira de recuperar os dados? Não consigo criar dump ou executar pg_upgrade, já que os bancos de dados agora possuem localidade inválida e não consigo conectar-me a eles. Talvez haja uma maneira de alterar o local do banco de dados manualmente? Em teoria, isso não deve causar problemas, pois seu único nome diferente para a mesma codificação.

jvb
fonte
2
Talvez você possa recriar o código de idioma ausente como um código de idioma personalizado com a ferramenta Locale Builder .
Daniel Vérité

Respostas:

12

Graças à sugestão de Daniel Vérité, eu pude corrigi-lo sem descarregar o servidor db inteiro. Meu conhecimento das localidades no Windows é muito limitado, mas, pelo que aprendi, parece que a Microsoft mudou o nome da região do local checo de "República Tcheca" para "República Tcheca" durante a atualização do Fall Creators (presumivelmente em conformidade com a ISO 3166-1) .

O Postgres de alguma forma carrega o código do idioma pela combinação do nome do idioma e do nome da região, portanto, os bancos de dados criados antes dessa alteração não podem ser conectados, pois a combinação de idioma e região não é mais válida.

Então, para corrigi-lo, baixei o Locale Builder 2.0 da Microsoft e depois:

  1. Novo código de idioma criado com base no código de idioma tcheco (cs-CZ), mantido o mesmo nome de código de idioma (cs-CZ)
  2. Nome da região alterado para "República Tcheca" (de "República Tcheca")
  3. Instalador criado, selecionando "Build" -> "Build Locale Installer"
  4. Instalou o código de idioma recém-criado executando o arquivo .msi criado na etapa anterior
  5. Reiniciou o servidor PostgreSQL, desta vez iniciado sem problemas

Agora eu posso executar o PostgreSQL 9.5 com 'Czech_Czech Republic.1250' e o PostgreSQL 10 com 'Czech_Czechia.1250' e os dois funcionam.

Não tenho certeza se está certo criar o código de idioma com o mesmo nome de código de idioma (cs-CZ), mas isso não parece causar problemas, talvez alguém possa elaborar mais.

jvb
fonte