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 без проблем.
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
Да, отличия есть. # 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 в контейнере. А то для всех тестируемых вариантов ни физических машин, ни виртуальных не напасёшься.
Что выводится по команде: su -l postgres -s /bin/sh -c '/usr/bin/locale' и какое содержимое /etc/sysconfig/i18n? Есть ли в системе glibc-locales ?
(В ответ на комментарий №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.
Как-то странно. При установке 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 и повторить процедуру инициализации БД.
(В ответ на комментарий №5) > Имеет смысл прописать в /etc/sysconfig/i18n: > LANG=ru_RU.UTF-8 > SUPPORTED=ru_RU.UTF-8 > > и повторить процедуру инициализации БД. Да, это (заполнение i18n) помогло. Теперь (и после перезапуска контейнера) БД инициализируется C UTF-8. Цель достигнута. Ладно, перебдеть - не недобдеть. Зато мы таким образом сумели запустить кластер 1С:Предприятия 8 вместе с базой данных в одном контейнере под управлением pve-manager. Может пригодиться.