Bug 33681 - Несовпадение кодировки при создании информационной базы
Summary: Несовпадение кодировки при создании информационной базы
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: postgresql9.6-1C-server (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: Alexei Takaseev
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-07-25 17:58 MSK by Pavel Isopenko
Modified: 2017-07-26 15:46 MSK (History)
0 users

See Also:


Attachments
Ошибка кодировки при создании базы (22.82 KB, image/png)
2017-07-25 17:58 MSK, Pavel Isopenko
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Pavel Isopenko 2017-07-25 17:58:24 MSK
Created attachment 7158 [details]
Ошибка кодировки при создании базы 

Ошибка СУБД: new encoding (UTF8) is incompatible with the encoding if the template database (SQL_ASCII)
при попытке создания новой пустой ИБД на сервере приложения. В версии 9.4-1C такого не было. Платформа 1С:Предприятие 8.3.10-2375, до сих пор работает с 9.4-1C без проблем.
Comment 1 Alexei Takaseev 2017-07-25 18:44:09 MSK
1. Что выводится по команде grep ^lc_ /var/lib/pgsql/data/postgresql.conf ?
2. Какой результат выполнения  psql -l -U postgres ?

Это все относится к свежепоставленным пакетам postgresql9.6-1C-server и postgresql9.6-1C-contrib и после выполнения /etc/rc.d/init.d/postgresql initdb

Должно быть:

lc_messages = 'ru_RU.UTF-8'                     # locale for system error message
lc_monetary = 'ru_RU.UTF-8'                     # locale for monetary formatting
lc_numeric = 'ru_RU.UTF-8'                      # locale for number formatting
lc_time = 'ru_RU.UTF-8'                         # locale for time formatting

и

psql -l -U postgres
                                  Список баз данных
    Имя    | Владелец | Кодировка | LC_COLLATE  |  LC_CTYPE   |     Права доступа     
-----------+----------+-----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | 
 template0 | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
           |          |           |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
           |          |           |             |             | postgres=CTc/postgres
Comment 2 Pavel Isopenko 2017-07-26 11:51:55 MSK
Да, отличия есть.

# apt-get install postgresql9.6-1C-server postgresql9.6-1C-contrib
# /etc/rc.d/init.d/postgresql initdb
# grep ^lc_ /var/lib/pgsql/data/postgresql.conf
lc_messages = 'C'			# locale for system error message
lc_monetary = 'C'			# locale for monetary formatting
lc_numeric = 'C'			# locale for number formatting
lc_time = 'C'				# locale for time formatting
# service postgresql start
# psql -l -U postgres
                                Список баз данных
    Имя    | Владелец | Кодировка | LC_COLLATE | LC_CTYPE |     Права доступа   
  
-----------+----------+-----------+------------+----------+---------------------
--
 postgres  | postgres | SQL_ASCII | C          | C        | 
 template0 | postgres | SQL_ASCII | C          | C        | =c/postgres         
 +
           |          |           |            |          | postgres=CTc/postgre
s
 template1 | postgres | SQL_ASCII | C          | C        | =c/postgres         
 +
           |          |           |            |          | postgres=CTc/postgre
s
(3 строки)

От дистрибутива, на котором разворачивается стенд, может зависеть? Если это важно, для стенда был использован шаблон mkimage-profiles - ve/systemd-bare.tar.gz в контейнере. А то для всех тестируемых вариантов ни физических машин, ни виртуальных не напасёшься.
Comment 3 Alexei Takaseev 2017-07-26 13:30:11 MSK
Что выводится по команде:

su -l postgres -s /bin/sh -c '/usr/bin/locale' и какое содержимое /etc/sysconfig/i18n?

Есть ли в системе glibc-locales ?
Comment 4 Pavel Isopenko 2017-07-26 14:37:15 MSK
(В ответ на комментарий №3)
> Что выводится по команде:
> 
> su -l postgres -s /bin/sh -c '/usr/bin/locale' и какое содержимое
> /etc/sysconfig/i18n?
> 
> Есть ли в системе glibc-locales ?

# su -l postgres -s /bin/sh -c '/usr/bin/locale'
LANG=ru_RU.utf8
LC_CTYPE="ru_RU.utf8"
LC_NUMERIC="ru_RU.utf8"
LC_TIME="ru_RU.utf8"
LC_COLLATE="ru_RU.utf8"
LC_MONETARY="ru_RU.utf8"
LC_MESSAGES="ru_RU.utf8"
LC_PAPER="ru_RU.utf8"
LC_NAME="ru_RU.utf8"
LC_ADDRESS="ru_RU.utf8"
LC_TELEPHONE="ru_RU.utf8"
LC_MEASUREMENT="ru_RU.utf8"
LC_IDENTIFICATION="ru_RU.utf8"
LC_ALL=

/etc/sysconfig/i18n пустой
# rpm -qa | grep glibc-locales
glibc-locales-2.23-alt3

Тут другое. Добавил отладочной выдачи в скрипт postgresql и обнаружил, что $LANG теряется после подключения /etc/init.d/functions, а там у нас есть такой  фрагмент
if [ "$UID" = 0 ]; then
	LANG=POSIX
	LANGUAGE=POSIX
	LC_ALL=POSIX
и известно зачем так сделано. Короче, ошибка - запускать postgresql initdb от root у нас нельзя. Запускать postgresql initdb нужно с правами пользователя с ненулевым $UID, которого в контейнере пока нет. Всё, извиняюсь, это не проблема postgresql. И вообще не баг. Буду думать о соответствующей настройке контейнера, чтобы он стал пригоден для запуска postgresql.
Comment 5 Alexei Takaseev 2017-07-26 14:45:50 MSK
Как-то странно. При установке PG ставится пакет postgresql-common и при этом создается пользователь postgres. При выполнении /etc/rc.d/init.d/postgresql initdb  выполняется код

        locale_list="$(su -l postgres -s /bin/sh -c '/usr/bin/locale')"
        locale="$(echo $locale_list | tr ' ' '\n' | grep LANG | cut -d '=' -f2 )"

который, собственно, вытягивает локаль для нужного пользователя.

Имеет смысл прописать в /etc/sysconfig/i18n:
LANG=ru_RU.UTF-8
SUPPORTED=ru_RU.UTF-8

и повторить процедуру инициализации БД.
Comment 6 Pavel Isopenko 2017-07-26 15:46:34 MSK
(В ответ на комментарий №5)
> Имеет смысл прописать в /etc/sysconfig/i18n:
> LANG=ru_RU.UTF-8
> SUPPORTED=ru_RU.UTF-8
> 
> и повторить процедуру инициализации БД.
Да, это (заполнение i18n) помогло. Теперь (и после перезапуска контейнера) БД инициализируется C UTF-8. Цель достигнута. Ладно, перебдеть - не недобдеть.
Зато мы таким образом сумели запустить кластер 1С:Предприятия 8 вместе с базой данных в одном контейнере под управлением pve-manager. Может пригодиться.