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

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

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

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

Asterisk: Failed to insert CDR record into SQL table (Ошибки cdr_adaptive_odbc)

Обновлено: 24.08.2026 · Официальная документация ↗
  • В журнале фиксируется ERROR[2345]: cdr_adaptive_odbc.c: Failed to insert CDR record into SQL table (cdr) on connection 'asterisk_connector'.
  • В базе данных перестают появляться новые записи детализации вызовов (Call Detail Records).
  • Ошибки усечения строк: Data truncated for column 'dstchannel' или Column 'userfield' cannot be null.
  • Команда cdr show status показывает ошибки записи в бэкенд.

1. Проверка статуса подсистемы CDR

asterisk -rx "cdr show status"

2. Проверка структуры таблицы cdr в MySQL/PostgreSQL

Убедитесь, что длина полей достаточна для длинных PJSIP каналов (UUID) и CallerID:

ALTER TABLE cdr 
  MODIFY COLUMN clid VARCHAR(120) NOT NULL DEFAULT '',
  MODIFY COLUMN src VARCHAR(80) NOT NULL DEFAULT '',
  MODIFY COLUMN dst VARCHAR(80) NOT NULL DEFAULT '',
  MODIFY COLUMN dcontext VARCHAR(80) NOT NULL DEFAULT '',
  MODIFY COLUMN channel VARCHAR(120) NOT NULL DEFAULT '',
  MODIFY COLUMN dstchannel VARCHAR(120) NOT NULL DEFAULT '',
  MODIFY COLUMN lastapp VARCHAR(80) NOT NULL DEFAULT '',
  MODIFY COLUMN lastdata VARCHAR(255) NOT NULL DEFAULT '',
  MODIFY COLUMN uniqueid VARCHAR(150) NOT NULL DEFAULT '',
  MODIFY COLUMN linkedid VARCHAR(150) NOT NULL DEFAULT '',
  MODIFY COLUMN userfield VARCHAR(255) NOT NULL DEFAULT '';

3. Конфигурация /etc/asterisk/cdr_adaptive_odbc.conf

Используйте адаптивный модуль вместо устаревшего cdr_odbc:

[first]
connection=asterisk_connector
table=cdr
alias start => calldate
usegmtime=no
newcdrcolumns=yes

4. Включение аварийного резервирования в CSV

Чтобы не потерять биллинг при падении БД, включите CSV бэкенд в /etc/asterisk/cdr.conf:

[general]
enable=yes
unanswered = yes
congestion = yes
endbeforehexten = yes

5. Перезагрузка модуля CDR

asterisk -rx "module reload cdr_adaptive_odbc.so"
asterisk -rx "cdr show status"
💡 Практика специалистов: Если на MariaDB/MySQL включен строгий режим STRICT_TRANS_TABLES, любой NULL в колонке без дефолтного значения приведет к блокировке вставки CDR. Всегда задавайте DEFAULT '' для всех текстовых полей таблицы cdr.

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

В чем преимущество cdr_adaptive_odbc перед cdr_odbc?

Адаптивный модуль динамически считывает колонки таблицы в БД. Если в таблице появляются новые столбцы, совпадающие с переменными CDR(custom_field), модуль записывает их автоматически без перекомпиляции.

Почему длина столбцов channel должна быть больше 80 символов?

В драйвере PJSIP имена каналов формируются с добавлением уникальных UUID (например, PJSIP/trunk-provider-0000001a-deadbeef). При коротких полях СУБД отбрасывает весь INSERT запрос.

Куда деваются записи CDR при недоступности MySQL?

Если включен модуль cdr_csv.so, записи дублируются в локальный текстовый файл /var/log/asterisk/cdr-csv/Master.csv, откуда их можно импортировать после восстановления БД.

Как включить запись таймстемпов в локальном времени?

В файле cdr_adaptive_odbc.conf задайте директиву usegmtime = no, иначе время calldate будет писаться по UTC.

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