Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

REALTIME_ODBC_CONNECT_FAIL IP-Телефония и СКУД

Развертывание Realtime-архитектуры Asterisk (динамическая СУБД)

Обновлено: 24.08.2026 · Официальная документация ↗
  • Необходимость постоянного выполнения команды pjsip reload при добавлении новых абонентов в текстовые файлы.
  • Ошибки res_odbc: Unable to connect to database [asterisk-connector].
  • Задержки при обработке вызовов из-за медленных синхронных запросов к СУБД.
  • Рассинхронизация статусов регистраций и AOR при высокой нагрузке.

1. Архитектура Asterisk Realtime (Dynamic Configuration)

Механизм Realtime позволяет Asterisk запрашивать данные об учетных записях (Endpoints, AORs, Auths), маршрутах и очередях из реляционной СУБД (MySQL, PostgreSQL) непосредственно в момент инициации звонка, без перезагрузки конфигурационных файлов.

2. Настройка UnixODBC и коннектора MariaDB

Установите пакеты ODBC:

apt-get install -y unixodbc unixodbc-dev odbc-mariadb || dnf install -y unixODBC unixODBC-devel mariadb-connector-odbc

Отредактируйте системный файл драйверов /etc/odbcinst.ini:

[MariaDB]
Description = MariaDB ODBC Connector
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmaodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
FileUsage = 1

Настройте системный DSN в /etc/odbc.ini:

[asterisk-realtime]
Description = Asterisk Realtime MariaDB Connection
Driver = MariaDB
Server = 127.0.0.1
Port = 3306
Database = asterisk_db
User = asterisk_user
Password = StrongSqlDbPass2025!
Socket = /var/run/mysqld/mysqld.sock
Option = 3

Проверьте связность утилитой isql:

isql -v asterisk-realtime

3. Конфигурация модулей Asterisk: res_odbc.conf и res_config_odbc.conf

В файле /etc/asterisk/res_odbc.conf:

[asterisk-connector]
enabled => yes
dsn => asterisk-realtime
max_connections => 20
pre-connect => yes
username => asterisk_user
password => StrongSqlDbPass2025!

Свяжите объекты PJSIP с таблицами БД в /etc/asterisk/extconfig.conf:

[settings]
ps_endpoints => odbc,asterisk-connector,ps_endpoints
ps_auths => odbc,asterisk-connector,ps_auths
ps_aors => odbc,asterisk-connector,ps_aors
ps_domain_aliases => odbc,asterisk-connector,ps_domain_aliases
ps_endpoint_id_ips => odbc,asterisk-connector,ps_endpoint_id_ips
extensions => odbc,asterisk-connector,extensions_table

4. Структура SQL таблиц для динамического абонента

CREATE TABLE ps_endpoints (
    id VARCHAR(40) PRIMARY KEY,
    transport VARCHAR(40),
    aors VARCHAR(200),
    auth VARCHAR(40),
    context VARCHAR(40),
    disallow VARCHAR(200) DEFAULT 'all',
    allow VARCHAR(200) DEFAULT 'alaw,ulaw',
    direct_media ENUM('yes', 'no') DEFAULT 'no'
);

CREATE TABLE ps_auths (
    id VARCHAR(40) PRIMARY KEY,
    auth_type ENUM('userpass', 'md5') DEFAULT 'userpass',
    password VARCHAR(80),
    username VARCHAR(40)
);

CREATE TABLE ps_aors (
    id VARCHAR(40) PRIMARY KEY,
    max_contacts INT DEFAULT 1,
    remove_existing ENUM('yes', 'no') DEFAULT 'yes'
);

5. Проверка статуса Realtime в консоли Asterisk

# Проверка статуса подключения ODBC
asterisk -rx "odbc show asterisk-connector"

# Поиск динамического эндпоинта в БД
asterisk -rx "realtime load ps_endpoints id 101"
💡 Практика специалистов: Обязательно используйте пул постоянных соединений (pre-connect => yes) в res_odbc.conf. Создание нового TCP/ODBC-подключения к базе данных на каждый звонок вызывает критические задержки сигнального протокола (SIP timeouts).

Частые вопросы (FAQ)

В чем разница между Static Realtime и Dynamic Realtime?

Static Realtime загружает конфигурационные файлы из БД только в момент старта или по команде reload. Dynamic Realtime делает запрос в базу на каждый входящий/исходящий запрос SIP-сессии в реальном времени.

Что произойдет с телефонной связью, если упадет сервер СУБД MySQL?

Текущие активные разговоры продолжат работать, но совершение новых вызовов и регистрация телефонов станут невозможными. Рекомендуется использовать репликацию баз данных (Galera Cluster / Master-Slave).

Как очищать устаревшие динамические контакты в таблице ps_contacts?

Asterisk самостоятельно удаляет просроченные контакты по истечении срока аренды (expiration). Также рекомендуется настроить кэширование sorcery в sorcery.conf.

Как ускорить работу Realtime при тысячах SIP-абонентов?

Включите пул постоянных соединений (max_connections в res_odbc.conf), создайте индексы по столбцам 'id' во всех таблицах ps_* и активируйте кэширование sorcery с коротким TTL.

Полезные материалы
Рекомендуем