29.11.2019

AMI FREEPBX NAMI SYSLOG NODEJS

В этом проекте нам нужно сохранять различные события в очередях Астериска через nodejs библиотеку NAMI. Сложности тут на первый взгляд только одна, это создания таблиц для сохранения событий. На самом деле нет, есть еще задача сохранения неудачного запроса, есть задача выполнения асинхронного запроса, чтобы не скрипт не тормозил.

В проект включены файлы:
tables.sql – который создает базу данных asterisk_logs и несколько табличек в ней,
table-ami-events.ods – excel файл с описанием событий по столбцам.

  1. создаем БД и таблички tables.sql,
  2. устанавливаем “npm install nami mysql modern-syslog”
  3. добавляем пользователя monit в manager_custom.conf
  4. прописываем учетные данные для mysql и asterisk manager в массивы db_config и namiConfig.
  5. Запускаем скрипт nami.js и если модули nodejs установлены верно, то скрипт запустится даже если у вас нет астериска и базы данных.

особенностью этого скрипта является то, что даже при пропадании подключения к mysql он будет пытаться реконнектится, при пропадании к астериску тоже. И если если подключение к астериску есть, а к mysql нет, то он будет сохранять готовые для импорта запросы в syslog.

фалы проекта можно скачать тут

26.11.2019

mysql optimization

Задача отображать данные из таблицы которая превышает 100 млн записей. Опции которые нужно проверить. Для отображения последних данных используется скрипт:

  1. Создание индекса НЕ на всю длину,
  2. Создание индексов для двух колонок,
  3. Для уменьшения места можно использовать компрессию для таблицы, сжимает – будь здоров, но потеря в производительности.
  4. Ограничение времени для выполнения конкретного запроса через /*+ MAX_EXECUTION_TIME($TIMEOUT) */  где $TIMEOUT в микросекундах.
  5. Изменение параметров кешей и прочего значимых изменений не дали.
  6. Создание и управление вторым сервером на компьютере для проведения тестирования при помощи mysqld_multi.
  7. create table new like current > rename current to old_tmp, new to current > select into tmp.csv where time > (2 days) > load data from tmp.csv into current > rm csv.

3.08.2019

MySQL ORDER BY / LIMIT performance: late row lookups

Оптимизация запросов, для большой выборки и исключения повторений крайне полезная статья.

вкраце можно использовать вот такую конструкцию:

SELECT  distinctl.id
FROM    (
SELECT  id
FROM    t_limit
WHERE columnA='53'
) o
JOIN    t_limit l
ON      l.id = o.id

11.09.2018

load data local infile не работает

При попытке добавить данные из файла в Mysql 5.5 выдаёт следующее: ERROR 1148 (42000): The used command is not allowed with this MySQL version

Чтобы не вносить изменения в конфигурацию mysql достаточно выполнить команду:

set global local_infile = ‘ON’;

Детали можно почитать в статье.

7.07.2018

mysqldump. без блокировки таблиц.

mysqldump –single-transaction=TRUE

6.07.2018

Mysql. Оптимизация. SHM. Error permission denied

Столкнулся с тем что Mysql пишет очень много на диск, работает в связке с Django.
Решил подключить /run/shm в качестве временного каталога, а он не подключается – “permission denied error 13”.

Оказалось всё просто, оказалось я использую apparmor(вероятно шел с дистрибутивом) вот тут инструкция.

15.06.2017

Восстановление базы MySQL из бинарных логов

Восстановление базы MySQL из бинарных логов
Простая статься на хабре, помогает быстренько восстановить утерянные insert в таблицы.

 

Восстановление базы данных из ib_logfile0

6.11.2014

Mysql. With recursive. Суммировать результаты запроса. Having.

Привет,  давеча обнаружил что в таблице со звонками есть двойные звонки. Соответственно возникают две задачи:

1. Удалить дублирующися записи (легко),

2. Делать выборку без дублирующихся записей (легко),

3. Посчитать сумму звонков в продублированных записях. (интересно).

 

1 и 2 я опущу, это не интересно. А вот третий пункт делается так:

with recursive mytable as (select max(duration) from acc where time > ‘2014-08-01 00:00:00’ and srcip like ‘ip address’ and duration > 0 group by callid having count(callid) > 1) select sum(max) from mytable;

но это не включает секунды третьего звонка которые тоже есть.

создадим темповою табличку для экспериментов:

create temporary table acc2 as (select * from acc order by time desc limit 1000);

yooxy# delete from acc3 where id in (select max(id) from acc3 where time > ‘2014-08-01 00:00:00’ and srcip like ‘address’ and duration > 0 group by callid having count(callid) > 1);
DELETE 224
yooxy_1711=# delete from acc3 where id in (select max(id) from acc3 where time > ‘2014-08-01 00:00:00’ and srcip like ‘address’ and duration > 0 group by callid having count(callid) > 1);
DELETE 27
yooxy_1711=# delete from acc3 where id in (select max(id) from acc3 where time > ‘2014-08-01 00:00:00’ and srcip like ‘address’ and duration > 0 group by callid having count(callid) > 1);

DELETE 0.

правда это вручную, зато все под контролем. ну и удалим таблицу.

drop table acc2.