Ошибка type mvarchar does not exist при создании базы 1С в PostgreSQL

Столкнулся с неприятной ошибкой во время работы с сервером администрирования 1С в связке с PostgreSQL. Сразу скажу, что данная связка сулит много нюансов и подводных камней, так что без крайней необходимости не рекомендую с ней связываться, если нет хорошего опыта работы с postgresql. Либо придется учиться по ходу дела.

Теоретический курс по основам сетевых технологий. Позволит системным администраторам упорядочить и восполнить пробелы в знаниях. Цена очень доступная, есть бесплатный доступ. Все подробности по . Можно пройти тест на знание сетей, бесплатно и без регистрации.

Суть проблемы вот в чем. Я установил postgresql 10 от postgresqlpro примерно по той же схеме, что описана у меня в статье про установку и настройку postgresql для работы с 1с. После установки выполнил инициализацию кластера простой командой:

# pg-setup initdb

Затем из дампа залил базу и какое-то время все это без проблем работало. Потом стало нужно создать новую базу. Я создал через консоль postgresql базу:

$ create database panda with owner = usr1cv8 ENCODING = 'UTF8' LC_COLLATE = 'ru_RU.UTF-8' LC_CTYPE = 'ru_RU.UTF-8';

И пошел создавать базу через панель администрирования 1с. У меня этого не получилось, вылезла ошибка.

Ошибка при создании информационной базы:
Ошибка операции администрирования
Ошибка СУБД: 
ERROR: type "mvarchar" does not exist 
LINE 1: create table Config (FileName mvarchar(128) not null, Creati...^

Ошибка type mvarchar does not exist при создании базы 1С в PostgreSQL

Начал искать информацию на эту тему. Понял, что создавать базу из консоли нельзя, необходимо это делать через панель администрирования 1С. ОК, удалил базу через консоль:

$ drop database panda;

Пошел в панель администрирования, но создать базу не получилось. К сожалению, не заскринил ошибку. Но суть в том, что база создавалась не в той кодировке. Сейчас поясню. Смотрим список баз на сервере:

root@sql:/opt/pgpro/1c-10/bin# ./psql -U postgres -l
                                   Список баз данных
    Имя     | Владелец | Кодировка | LC_COLLATE  |  LC_CTYPE   |     Права доступа     
------------+----------+-----------+-------------+-------------+-----------------------
 enterprise | usr1cv8  | UTF8      | ru_RU.utf8  | ru_RU.utf8  | =Tc/usr1cv8          +
            |          |           |             |             | usr1cv8=CTc/usr1cv8
 panda      | usr1cv8  | UTF8      | en_US.UTF-8 | en_US.UTF-8 | 
 postgres   | postgres | UTF8      | en_US.UTF-8 | en_US.UTF-8 | 
 template0  | postgres | UTF8      | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
            |          |           |             |             | postgres=CTc/postgres
 template1  | postgres | UTF8      | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
            |          |           |             |             | postgres=CTc/postgres

База enterprise была залита из дампа и имеет правильную кодировку. Базу panda создает 1С через консоль администрирования, и у нее кодировка LC_COLLATE и LC_CTYPE en_US.UTF-8, а должна быть ru_RU.UTF-8. Это при том, что консоль сервера в момент настройки postgresql была правильная.

# locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=

Я думал, что пропатченой сборки postgresql и нужной консоли достаточно, чтобы все было в порядке с кодировкой. Но ошибся. Раньше не припоминаю, чтобы сталкивался с подобной ошибкой. Получается, я попал в тупик. Я могу руками создать базу данных с нужными кодировками, но она не будет работать, так как 1С должна базу создать сама. Если же я создаю базу через 1С, выбираются дефолтные шаблоны с неподходящей кодировкой и ничего не работает.

Я нашел один вариант решения — проинициализировать заново кластер, явно указав кодировки:

# initdb --locale=ru_RU.UTF-8 --lc-collate=ru_RU.UTF-8 --lc-ctype=ru_RU.UTF-8 --encoding=UTF8

Как я понял, все текущие базы дропнутся. Возможно понял не правильно, но проверять не захотелось, так как текущая база там на 80 гигов и заливать дамп очень долго. Нашел другой способ — замена шаблона. Вот последовательность действий в консоли postgresql для удаления текущего шаблона и создания нового с нужными кодировками.

$ update pg_database set datistemplate = false where datname='template1';
$ drop database template1;
$ create database template1 ENCODING = 'UTF8' LC_COLLATE = 'ru_RU.UTF-8' LC_CTYPE = 'ru_RU.UTF-8' template=template0;
$ update pg_database set datistemplate = true where datname='template1';

После этого получилось через консоль 1С создать базу и начать с ней работать. Список баз стал выглядеть вот так:

root@sql:/opt/pgpro/1c-10/bin# ./psql -U postgres -l
                                   Список баз данных
    Имя     | Владелец | Кодировка | LC_COLLATE  |  LC_CTYPE   |     Права доступа     
------------+----------+-----------+-------------+-------------+-----------------------
 enterprise | usr1cv8  | UTF8      | ru_RU.utf8  | ru_RU.utf8  | =Tc/usr1cv8          +
            |          |           |             |             | usr1cv8=CTc/usr1cv8
 panda      | usr1cv8  | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | 
 postgres   | postgres | UTF8      | en_US.UTF-8 | en_US.UTF-8 | 
 template0  | postgres | UTF8      | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
            |          |           |             |             | postgres=CTc/postgres
 template1  | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | 

Ошибок больше не было.

Онлайн курс «DevOps практики и инструменты»

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.

Проверьте себя на вступительном тесте и смотрите программу детальнее по .


Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.
Источник

Просмотров:

Добавить комментарий