Мы часто стали наблюдать проблему, когда необходимо проверить таблицу CEL, т.е. просмотреть более подробные параметры вызовов(подключение и разрывы голосовых каналов) в Asterisk CDR Reports, но тут может возникнуть FATAL ERROR. В этой статье мы расскажем, как вылечить таблицу cel и расскажем, как восстанавливаются таблицы и базы данных в MySQL.
Ошибка выглядит примерно так:
А лечится это довольно просто, при условии, что вы используете БД MySQL (на PostgreSQL думаю так же не сложно, но мы не тестировали)
Немного теории.
В MySQL есть две команды: myisamchk и mysqlcheck. Утилитки myisamchk и mysqlcheck можно использовать для получения информации о таблицах рабочей базы данных, для их проверки и исправления или же оптимизации. Отличие mysqlcheck от myisamchk состоит в том, что утилита mysqlcheck должна использоваться при работающем сервере mysqld, в то время как myisamchk - при остановленном. Т.е. используя mysqlcheck теперь не надо прерывать работу базы данных.
Для восстановления таблицы cel, принадлежащей базе данных asteriskcdrdb, необходимо использовать команду:
# mysqlcheck --repair asteriskcdrdb cel -uroot -p
В общем виде команда выглядит так:
# mysqlcheck --repair db_name table_name -u username -p
Где db_name - имя восстанавливаемой базы данных, table_name - имя восстанавливаемой таблицы.
Если хотите проверить и восстановить (в случае необходимости) все базы данных и таблицы, то следует применить следующую команду:
# mysqlcheck --repair --all-databases --auto-repair -u username -p
Что означают указанные ключи:
- --repair, -r - может исправить почти все, за исключением уникальных ключей, имеющих дубликаты
- --all-databases, -A - проверить все базы данных
- --auto-repair - если проверенная таблица повреждена, автоматически восстановить ее. Исправления будут произведены после проверки всех таблиц, если были обнаружены повреждения
Расскажем и про утилитку myisamchk. Для начала, базы данных необходимо проверить на ошибки. Быстрая проверка осуществляется командой:
# myisamchk --fast --silent /path/to/yourdatabase/*/*.MYI
Далее необходимо вылечить найденные ошибки. Делается это командой:
# myisamchk --recover /path/to/yourdatabase/*/*.MYI
А если все плохо, то необходимо использовать команду:
# myisamchk --safe-recover /path/to/yourdatabase/*/*.MYIЧ
то означают указанные ключи:
- --force, -f - выполнять перезапуск myisamchk, если myisamchk найдет в ней хоть одну ошибку
- --silent, -s - молчаливый режим. Выдавать сообщения только при возникновении ошибок
- --recover, -r - при указании этой опции можно исправить практически все, кроме уникальных ключей, в которых есть повторения (ошибка, вероятность которой мизерна для таблиц ISAM/MyISAM)
- --safe-recover, -o - используется старый метод восстановления (читаются подряд все строки и обновляются все деревья индексов на основе найденных строк); такой алгоритм работает на порядок медленнее -r, но метод справляется с несколькими редкими случаями, непосильными для -r
После использования данных команд, FreePBX будет корректно выводить данные из таблицы cel.