Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

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