mysql

Asterisk, CDR en mysql

Call Detail Records
Las centrales telefónicas generan los llamados Call Detail Records (CDR) que son archivos o logs que contienen información detallada acerca de las llamadas tanto de donde fueron originadas, terminadas o que pasa por el intercambio de las mismas. Y claro no es sorprendente que los CDR se utilizan para la facturación. Fuente: http://www.voip-info.org/wiki/view/CDR

Ahora bien Asterisk es una central telefonica en la que podemos variar  tipo de informacion y almacenamiento que este sistema va a recolectar para sus  CDRs

Asterisk puede trabajar sus CDR de las siguientes formas:

  • Csv – archivos de texto con valores separados coma
  • Cdr SQLite – logs de CDR en la base de datos de SQLite
  • Pgsql – logs de CDR en las bases de datos de PostgreSQL
  • Odbc – logs de CDR a cualquier base de datos con soporte unixODBC
  • Mysql – logs  de CDR en las bases de datos de MySQL
  • Cdr FreeTDS – logs CDR en MS SQL o a la base de datos de Sybase a través de los conductores de FreeTDS
  • Yada – logs de CDR registrados en cualquier base de datos con soporte  yada.

Pero lo que veremos por el momento es como conectar nuestro mysql para guardar los CDRs

Primero vamos a crear la tabla que guardara nuestros datos en el Mysql

<br />
CREATE DATABASE asterisk;</p>
<p>GRANT INSERT<br />
  ON asterisk.*<br />
  TO asterisk@localhost<br />
  IDENTIFIED BY &#8216;tu_clave&#8217;;</p>
<p>USE asterisk;<br />
CREATE TABLE cdr (<br />
  calldate datetime NOT NULL default &#8217;0000-00-00 00:00:00&#8242;,<br />
  clid varchar(80) NOT NULL default &#8221;,<br />
  src varchar(80) NOT NULL default &#8221;,<br />
  dst varchar(80) NOT NULL default &#8221;,<br />
  dcontext varchar(80) NOT NULL default &#8221;,<br />
  channel varchar(80) NOT NULL default &#8221;,<br />
  dstchannel varchar(80) NOT NULL default &#8221;,<br />
  lastapp varchar(80) NOT NULL default &#8221;,<br />
  lastdata varchar(80) NOT NULL default &#8221;,<br />
  duration int(11) NOT NULL default &#8217;0&#8242;,<br />
  billsec int(11) NOT NULL default &#8217;0&#8242;,<br />
  disposition varchar(45) NOT NULL default &#8221;,<br />
  amaflags int(11) NOT NULL default &#8217;0&#8242;,<br />
  accountcode varchar(20) NOT NULL default &#8221;,<br />
  uniqueid varchar(32) NOT NULL default &#8221;,<br />
  userfield varchar(255) NOT NULL default &#8221;<br />
);<br />

Segundo tenemos que contar con soporte cdr_mysql en nuestro sistema asterisk, como verificamos esto:

dentro del CLI de asterisk corremos

 show modules

…. y la salida tendria que ser algo asi
<br />
app_addon_sql_mysql.so         Simple Mysql Interface                   0<br />
cdr_addon_mysql.so             MySQL CDR Backend                        0<br />
134 modules loaded<br />

si por alguna razon no los tenemos cargados, podemos compilar los add-ons de asterisk y luego cargarlos

<br />
load app_addon_sql_mysql.so<br />
load cdr_addon_mysql.so<br />

por ultimo crearemos la conexion entre estos 2 sistemas modificaremos el archivo cdr_mysql.conf

<br />
[root@SRV-ASTERISK asterisk]# nano /etc/asterisk/cdr_mysql.conf<br />
[global]</p>
<p>hostname=127.0.0.1<br />
dbname=asterisk<br />
table=cdr<br />
password=usuario<br />
user=password<br />
port=3306<br />
;sock=/tmp/mysql.sock<br />
;userfield=1<br />

bueno luego de estos 3 pasos quedara listo nuestros CDRs en Mysql para la central telefonica Asterisk.

Mysql Too many connections

El mensaje que nunca queremos ver al intentar conectarnos en nuestro Mysql, y que significa esto, pues que todas las conexiones disponibles (100 por default) dentro de nuestro mysql han sido ya tomadas.

Lo primero que debemos de verificar es que clase de conexiones esta manejando el mysql server, debido a que algunas de ellas pueden estar “colgadas”.

<br />
mysqladmin -uUSUARIO -pPASSWORD processlist<br />

para aumentar el numero de conexiones concurrentes que nuestro servidor mysql puede manejar vamos a editar el archivo /etc/mysql/my.cnf:

<br />
port = 3306<br />
datadir=/var/lib/mysql<br />
socket=/var/lib/mysql/mysql.sock<br />
skip-locking<br />
set-variable = max_connections=100<br />

aquí cambiaremos el valor predeterminado de 100 a 250 o un poco mas, recuerden que esta cantidad depende linealmente de la cantidad de memoria ram de que la dispongamos y así también del poder de CPU.

NOTA: algunas veces este problema tambien puede estar realacionado con la resolucion DNS, asi que tambien podemos verificar el archivo /etc/hosts de cliente para ver si esta bien definido el nombre e IP del servidor, asi tambien estos mismos datos dentro del /etc/hosts del server.

Migrar Mysql a otro Mysql via bash remotamente

Este es un pequeño script que hice para poder sincronizar 2 servidores mysql en el interim de una migracion, para poder usar este script el mysql de nuestro server destino tiene que estar limpia (recien instalada) porque el script va a generar todas las bases de datos segun el listado que encuentre en el servidor origen, y luego de eso a llenar con la data existente. Se recomienda que se pausen toda transaccion en el servidor origen para que pueda copiar exactamente igual la informacion.

El unico detalle de este script es que

<br />
#!/bin/sh<br />
# System + MySQL backup script remoto<br />
# Copyright (c) 2009 Paulo Alvarado<br />
# This script is licensed under GNU GPL version 2.0 or above<br />
# &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>#########################<br />
######CONFIGURACION#####</p>
<p>### MySQL Setup ###<br />
MUSER=&quot;USER&quot;<br />
MPASS=&quot;PASSWORD&quot;<br />
MHOST=&quot;IPLOCAL&quot;</p>
<p>NUSER=&quot;USER&quot;<br />
NPASS=&quot;PASSWORD&quot;<br />
NHOST=&quot;IPREMOTA&quot;</p>
<p>######DECLARACION DE BINARIOS NO MODIFICAR#####<br />
###############################################</p>
<p>### Binaries ###<br />
MYSQL=&quot;$(which mysql)&quot;<br />
MYSQLDUMP=&quot;$(which mysqldump)&quot;</p>
<p>### Get all databases name ###<br />
DBS=&quot;$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse &#8216;show databases&#8217;)&quot;<br />
for db in $DBS<br />
do<br />
	### CREA LAS BASES DE DATOS EN EL SERVER REMOTO NOMBRES IDENTICOS ###<br />
	echo &#8216;create database&#8217; $db &#8216;;&#8217;|$MYSQL -u $MUSER -h $NHOST -p$MPASS</p>
<p>	### SINCRONIZA TODA LA DATA DE LAS DBs AL SERVER REMOTO ###<br />
	echo $db; $MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db | mysql -h $NHOST -u $NUSER  -p$NPASS $db </p>
<p>done<br />

1 2 Scroll to top