Asterisk: Failed to insert CDR record into SQL table (Ошибки cdr_adaptive_odbc)
- В журнале фиксируется
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=yes4. Включение аварийного резервирования в CSV
Чтобы не потерять биллинг при падении БД, включите CSV бэкенд в /etc/asterisk/cdr.conf:
[general]
enable=yes
unanswered = yes
congestion = yes
endbeforehexten = yes5. Перезагрузка модуля CDR
asterisk -rx "module reload cdr_adaptive_odbc.so"
asterisk -rx "cdr show status" Частые вопросы (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.