miércoles, julio 02, 2014

MySQL Triggers


A partir de la version 5 de MySQL ya es posible realizar triggers que son funciones especificas que se pueden ejecutar antes (BEFORE) o despues (AFTER) de una transaccion que puede ser DELETE, INSERT, UPDATE.
Los triggers utilizan OLD y NEW que son los valores que tienen las columnas antes y después de la modificación.
Con triggers o disparadores se pueden realizar acciones como replicacion de datos de una Base de Datos a otra o para llevar un Log de Transacciones insertando en una tabla auxiliar de logs.

Ejemplo

Crear una tabla a la cual le pondremos un trigger
CREATE TABLE clientes
(
    iCliente INT NOT NULL AUTO_INCREMENT,
    Cliente VARCHAR(450) DEFAULT '',
    PRIMARY KEY(iCliente)
)ENGINE = InnoDB;
Crear una tabla de logs donde insertaremos los clientes modificados
CREATE TABLE clientes_log
(
    iCliente_Log INT NOT NULL AUTO_INCREMENT,
    Cliente VARCHAR(450) DEFAULT '',
    Fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY(iCliente_Log)
)ENGINE = InnoDB;
Creamos un Trigger que se dispare en cada UPDATE de la tabla clientes
CREATE TRIGGER trigger_clientes_log AFTER UPDATE ON clientes
FOR EACH ROW
INSERT INTO clientes_log(Cliente)VALUES(OLD.Cliente);
Con esto completamos un log automatico para cambios en la tabla de clientes.

viernes, junio 27, 2014

MySQL - Backups Incrementales


Realizar backups incrementales en MySQL se pueden realizar utilizando los "binary logs", son los archivos donde se encuentran almacenadas todas las transacciones de la base de datos.
Activar los binary logs en MySQL
Editar archivo my.cnf nano /etc/mysql/my.cnf
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
La primera linea indica la ruta donde se guardaran los logs, y la segunda linea dice que se borraran los archivos log despues de 10 dias.
El directorio de logs se ve como sigue:
ls -al /var/log/mysql/
total 16
drwxr-s--- 2 mysql adm  4096 Sep  5 10:41 .
drwxr-xr-x 7 root  root 4096 Sep  5 09:52 ..
-rw-rw---- 1 mysql adm   106 Sep  5 10:41 mysql-bin.000001
-rw-rw---- 1 mysql adm    32 Sep  5 10:41 mysql-bin.index
El archivo mysql-bin.000001 es el log activo donde actualmente se estaran guardando todas las transacciones, y el archivo mysql-bin.index es donde estan todos los archivos bin logs.
Creacion de Base de Datos para prueba
Vamos a crear una base de datos de prueba para realizar los backups incrementales.
CREATE DATABASE `backup`;
USE backup;
CREATE TABLE `clientes`(
    `iCliente` INT NOT NULL AUTO_INCREMENT,
    `Cliente` VARCHAR(45) NOT NULL DEFAULT '',
    PRIMARY KEY(`iCliente`)
) ENGINE InnoDB;
Ahora insertamos unos registros
USE backup;
INSERT INTO clientes(Cliente)VALUES('Luis Gomez');
Hacemos el primer backup completo con mysqldump
mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 backup > full_backup.sql
--single-transaction hara un dump de las tablas innoDB en un estado consistente,--flush-logs cerrara los logs actuales y abrira uno nuevo, --master-data=2 escribira comentarios en el archivo dump sobre las posiciones de los logs.
Si revisamos el directorio /var/log/mysql/ se abra creado un nuevo archivo mysql-bin.000002 y todos los cambios y transacciones se grabaran en ese archivo, y la siguiente vez que se ejecute un flush-logs o se reinicie el servidor de MySQL se creara el archivo mysql-bin.000003 y asi sucesivamente.
ls -al /var/log/mysql/
total 20
drwxr-s--- 2 mysql adm  4096 Sep  5 10:48 .
drwxr-xr-x 7 root  root 4096 Sep  5 09:52 ..
-rw-rw---- 1 mysql adm   149 Sep  5 10:48 mysql-bin.000001
-rw-rw---- 1 mysql adm   106 Sep  5 10:48 mysql-bin.000002
-rw-rw---- 1 mysql adm    64 Sep  5 10:48 mysql-bin.index
Ahora insertamos mas registros
USE backup;
INSERT INTO clientes(Cliente)VALUES('Jade Gomez');
INSERT INTO clientes(Cliente)VALUES('Victor Gomez');
Ya solo necesitamos hacer flush a los logs, con esto se creara un nuevo archivo mysql-bin.000003, es como un corte, a partir de este momento cualquier cambio se estara almacenando en mysql-bin.000003, pero los cambios anteriores al flush estaran en mysql-bin.000002.
Restarurar binary log
Primero vamos a borrar la base de datos y volverla a crear vacia.
DROP DATABASE backup;
CREATE DATABASE backup;
Ahora hacemos un restore con el primer dump que hicimos
mysql -uroot -p backup < full_backup.sql
La base de datos contiene solo los registros de cuando hicimos el respaldo, pero vamos a agregar lo que viene en el binary log.
mysqlbinlog mysql-bin.000002 | mysql -uroot -p backup
Con esto debemos tener actualizada la base de datos hasta el punto en que hicimos flush log y se comenzo a grabar en el nuevo mysql-bin.000003.

martes, abril 22, 2014

Vicidial Cluster

Vicidial Cluster

Conexiones remotas - MySQL

Validar que desde todos los servidores dentro del cluster se puedan comunicar de manera remota.
mysql -h172.16.0.4 -uroot -prootPasswd
El comando anterior debe cambiar acorde al servidor y las credenciales apropiadas.

Servicio NTP

Validar servicio de ntp este ejecutandose en el servidor correcto, generalmente en el de la Base de Datos.
ntpq -p

Edicion de archivo /etc/astguiclient.conf

Editar el archivo /etc/astguiclient.conf y validar la siguiente configuracion.
# Database connection information
VARDB_server => 172.16.0.3
VARDB_database => asterisk
VARDB_user => cron
VARDB_pass => 1234
VARDB_custom_user => custom
VARDB_custom_pass => custom1234
VARDB_port => 3306

# Alpha-Numeric list of the astGUIclient processes to be kept running
# (value should be listing of characters with no spaces: 123456)
#  X - NO KEEPALIVE PROCESSES (use only if you want none to be keepalive)
#  1 - AST_update
#  2 - AST_send_listen
#  3 - AST_VDauto_dial
#  4 - AST_VDremote_agents
#  5 - AST_VDadapt (If multi-server system, this must only be on one server)
#  6 - FastAGI_log
#  7 - AST_VDauto_dial_FILL (only for multi-server, this must only be on one server)
#  8 - ip_relay (used for blind agent monitoring)
#  9 - Timeclock auto logout
VARactive_keepalives => 123468
En la primera parte
# Database connection information
Va informacion de la conexion a la base de datos, la IP del servidor y las credenciales que usara.
En la segunda parte
# Alpha-Numeric list of the astGUIclient processes to be kept running
Son las opciones que tienen que estar ejecutandose, y en comentarios muestra cuales opciones son exclusivas solamente para un solo servidor, generalmente el de la base de datos, estas opciones son la 5 y la 7 por lo que en el servidor de Base de Datos quedaria de la siguiente forma.
VARactive_keepalives => 12345678
Y para los demas servidores quedaria de la siguiente forma.
VARactive_keepalives => 123468

MySQL conexiones remotas

MySQL conexiones remotas

Para habilitar conexiones remotas a nuestro servidor MySQL se tienen que realizar varios cambios, uno de ellos es editar el archivo de configuracion de MySQL /etc/my.cnf

Edicion de archivo /etc/my.cnf

Se deben buscar las siguientes lineas:
#This will disable networking
#skip-networking
bind-address=172.16.0.4
Asegurarse que la linea skip-networking este comentada con el caracter de # y de tener la linea bind-address=172.16.0.4asignada a la IP del servidor.
Despues se debe reiniciar el servicio de MySQL
service mysql restart
Entrar a la consola de MySQL y ejecutar el siguiente comando para dar permiso a todas las conexiones remotas.
mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'%' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;
Por ejemplo para darle permiso a root seria el siguiente ejemplo:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'rootPasswd' WITH GRANT OPTION;
Y finalmente se limpian los privilegios para actualizar los cambios.
mysql> FLUSH PRIVILEGES;
Con esto el servidor esta listo para aceptar conexiones remotas
mysql -h172.16.0.4 -uroot -prootPasswd

lunes, abril 21, 2014

Rutas estaticas

Rutas estaticas

Desplegar la tabla de ruteo

route -n
Este comando nos mostrara la tabla de ruteo del sistema, el parametro -n es para evitar que trate de resolver el nombre de dominio de la tabla de ruteo.
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.0.254    0.0.0.0         UG    0      0        0 eth0
10.0.125.0      172.16.0.254    255.255.255.0   UG    0      0        0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
172.16.0.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
172.16.6.0      172.16.0.254    255.255.255.0   UG    0      0        0 eth0
192.168.100.0   172.16.0.254    255.255.255.0   UG    0      0        0 eth0

Agregar ruta estatica

route add -net 172.16.5.0/24 gw 172.16.0.254 dev eth0
utilizamos el comando add -net para agregar una nueva red, en este caso 172.16.5.0 con /24 le estamos indicando que la mascara de red es 255.255.255.0 y el comando gw para darle la ruta del gateway que usara 172.16.0.254 la ultima parte dev eth0 es para indicar en que puerto estara configurada la ruta estatica.

Eliminar ruta estatica

route del -net 172.16.5.0/24 gw 172.16.0.254 dev eth0
Igual que el comando de agregar una ruta, el de eliminar es mediante el comando del -net seguido de los datos de la ruta a eliminar.

Agregar default gateway

route add default gw 172.16.0.254
Con este comando se agrega una ruta de salida por default para todas las rutas

Eliminar default gateway

route del default gw 172.16.0.254
Con este comando se elimina una ruta de salida por default para todas las rutas

Rutas persistentes

El comando route modifica la tabla de ruteo de linux, pero esto solo se hace en memoria, los cambios son inmediatos, pero una vez que el servidor se reinicia, todas estas rutas son eliminadas de memoria y de la tabla de ruteo. Las rutas persistentes son archivos de configuracion que permanecen en el sistema, y son cargados al reinicio del sistema operativo, dependiendo de la version de linux estos se encontraran en diferentes directorios.
Pero en general esta en el directorio de configuracion de las tarjetas de red, donde se encuentran los archivos ifcfg-eth0ahi debe de estar un archivo de nombre routes y dentro de el estara una linea indicando el default gateway default 172.16.0.254 - - solo se debe agregar la nueva ruta 172.16.5.0/24 via 172.16.0.254 dev eth0.