Как исправить ошибку mchar не найден в PostgreSQL 8.4.20 на CentOS 6

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При развертывании сервера 1С:Предприятие 8.3 на операционной системе CentOS 6 с использованием стандартной (ванильной) сборки PostgreSQL 8.4.20 администраторы часто сталкиваются с критической ошибкой: «библиотека mchar не найдена». Это происходит потому, что стандартный PostgreSQL не содержит специфических расширений, необходимых для корректной работы механизмов 1С. В данной статье мы разберем, зачем нужны эти библиотеки, почему нельзя просто скопировать их из других версий ОС и как правильно настроить среду для стабильной работы.

Зачем нужны библиотеки mchar, fasttrun и fulleq?

Рассмотрим функциональное назначение этих модулей, которые исторически разрабатывались для адаптации открытой СУБД под требования платформы 1С:

Анализ ошибки Magic Block и проблем совместимости

Проанализируем ситуацию, когда администратор пытается подсунуть файлы .so, взятые из сборок для других дистрибутивов (например, CentOS 5). В этом случае PostgreSQL выдает ошибку invalid magic block. Разберемся, почему это происходит:

В PostgreSQL реализована жесткая проверка совместимости расширений через макрос PG_MODULE_MAGIC. При загрузке библиотеки сервер проверяет заголовки файла. Если библиотека была скомпилирована с другими флагами (например, поддержка SSL, ICU) или для другой версии системных библиотек glibc, сервер откажется ее загружать. В CentOS 5 используется glibc 2.5, а в CentOS 6 — 2.12. Разница в бинарном интерфейсе приложений (ABI) делает невозможным прямой перенос файлов между этими ОС.

Решение 1: Использование специализированных сборок (Рекомендуемое)

Самый надежный способ — не пытаться «починить» ванильный PostgreSQL, а использовать готовую сборку, в которую эти патчи уже включены. Выясним, где их можно найти:

  1. Портал ИТС: В архивах дистрибутивов 1С за период 2013–2015 годов присутствуют пакеты postgresql-8.4.x-1.1C.x86_64.rpm. Индекс 1C в названии версии означает, что все необходимые библиотеки уже интегрированы.
  2. Специализированные ресурсы: Посмотрим на проект 1c.postgres.ru. Несмотря на то, что сейчас актуальны версии 11–16, в их архивах можно найти подготовленные скрипты и пакеты для более старых систем.

Если вы обязаны использовать версию 8.4.20 из-за сторонних приложений, лучшим решением будет Side-by-side установка. Установите второй экземпляр PostgreSQL (с патчами 1С) на альтернативный порт (например, 5433). Это позволит изолировать среду 1С от других программ и избежать конфликтов версий.

Решение 2: Сборка библиотек из исходников через PGXS

Если готовый RPM-пакет найти не удается, мы можем собрать расширения самостоятельно именно под вашу текущую версию PostgreSQL. Для этого нам понадобится пакет postgresql-devel.

Рассмотрим пошагово процесс сборки на примере расширения mchar:

  1. Установим необходимые инструменты разработки: yum install postgresql-devel gcc make.
  2. Получим исходные коды расширений (файлы mchar.c, mchar.h и Makefile).
  3. Выполним сборку с использованием утилиты pgxs, которая автоматически подтянет нужные пути заголовков сервера.

Пример типичного Makefile для такой сборки будет выглядеть следующим образом:


MODULES = mchar
DATA = mchar.sql
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)

После создания файла в директории с исходниками достаточно выполнить команды:


make
make install

Это скомпилирует файл mchar.so и скопирует его в /usr/lib64/pgsql/, гарантируя полное соответствие magic block вашей текущей версии сервера.

Регистрация расширений в базе данных

Просто положить файлы в папку библиотек недостаточно. Выясним, как заставить PostgreSQL «увидеть» новые функции внутри конкретной базы данных 1С. После копирования файлов .so необходимо выполнить SQL-скрипты, которые обычно идут в комплекте с исходниками.

Запустите выполнение скриптов через psql для вашей базы данных:


psql -d your_database_name -f /usr/share/pgsql/contrib/mchar.sql
psql -d your_database_name -f /usr/share/pgsql/contrib/fulleq.sql
psql -d your_database_name -f /usr/share/pgsql/contrib/fasttrun.sql

Важный нюанс: Если скриптов .sql нет, функции можно объявить вручную. Например, для fasttrun регистрация функции в SQL-консоли выглядит примерно так:


CREATE OR REPLACE FUNCTION fast_truncate(text)
RETURNS void
AS '$libdir/fasttrun', 'fast_truncate'
LANGUAGE c STRICT;

Альтернативные подходы: Docker и виртуализация

Если сборка из исходников кажется слишком трудоемкой, проанализируем варианты с контейнеризацией. Как отмечалось в обсуждении, использование Docker позволяет запустить подготовленный контейнер с нужной версией PostgreSQL и всеми патчами, не засоряя основную систему CentOS 6 старыми библиотеками. Это обеспечивает:

В заключение отметим, что связка PostgreSQL 8.4 и 1С 8.3 является морально устаревшей. Платформа 8.3 оптимизирована для работы с версиями PostgreSQL 9.6, 10 и выше. Если ваша инфраструктура позволяет, рассмотрите вопрос обновления СУБД до актуальных версий от Postgres Professional, где поддержка 1С включена «из коробки» и не требует ручных манипуляций с библиотеками.

← На главную