Mysql: Checklist diario

 

A continuación dejo un pequeño post de como montar un sistema automático de notificación via mail que nos indique cual es el estado de nuestra base de datos. Por ejemplo lo podemos programar un poquito antes de empezar nuestra jornada laboral y antes de irnos o mientras estamos de vacaciones (jaja...). Este ejemplo es sobre un Mysql 5.X corriendo sobre Debian. Pasos que sigue:

  • Chequeo de tiempo de actividad del servidor, memoria y espacio en disco.

  • Chequeo de las últimas copias de seguridad o los logs de las mismas

  • Obtención del estado de la base de datos

  • Logs de error de la base de datos.

  • Notificación via mail.

El sistema consiste en construir un script que construya nuestro informe en un fichero para luego enviarlo por correo. Además, en este ejemplo el estado de la base de datos lo obtengo con mysqlreport*. Este nos dá suficiente información para saber que ha pasado últimamente en la base de datos y podemos detectar cualquier problema si sabemos cual es la linea base.

*Cuidado porque está disponible a partir de la versión 5.x

 

Paso 1) Edición báscia del script base checklist.sh. Como se puede observar no tiene ningun secreto ya que se trata solo de redirigir siempre la salida de un comando concreto a un fichero temporal que luego adjuntamos como cuerpo del mail o adjunto. El formato y el estilo ya son cosas de cada uno...

#!/bin/bash

#

# Checklist diario mysql

#

# Parámetros

LOG=/scripts/checklist/check.txt

 

# A continuacion empiezan las accciones

TXT=''

SL=''

# Estado de la máquina

TXT='>>> 0.UPTIME'

echo $TXT > $LOG

w >> $LOG

# Memoria del servidor

TXT='>>> 1.MEMORIA'

echo $SL >> $LOG

echo $TXT >> $LOG

free -m >> $LOG

#Espacio en disco

TXT='>>> 2.ESPACIO EN DISCO'

echo $SL >> $LOG

echo $TXT >> $LOG

df -h >> $LOG

# Úlitmos backups

TXT='>>>3.BACKUPS'

echo $SL >> $LOG

echo $TXT >> $LOG

ls -lh -t /var/backups_mysql/ >> $LOG

#Estado mysql

TXT='>>>4.ESTADO MYSQL'

echo $SL >> $LOG

echo $TXT >> $LOG

mysqlreport –user root –password pwd –all >> $LOG

 

# Notificación via mail

echo “Checklist”|mail .s “MYSQL > Checklist diario” ilmasacratore@dataprix.com < $LOG

# Borramos fichero temp

rm $LOG

 

 

Paso 2) Permisos de ejecución y programación

En el caso de sistemas unix podemos utilizar crontab para programar la ejecución, previa asignación de permisos de ejecución al fichero para el usuario que vaya a meterlo en su cron

 

Ejemplo de correo:

 

0.UPTIME
 09:00:01 up 13:20,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

>>> 1.MEMORIA
             total       used       free     shared    buffers     cached
Mem:           884        877          6          0         44        745
-/+ buffers/cache:         88        795
Swap:          737          0        737

>>> 2.ESPACIO EN DISCO
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              17G  8.4G  7.9G  52% /
tmpfs                 443M     0  443M   0% /lib/init/rw
tmpfs                 443M     0  443M   0% /dev/shm

>>> 3.BACKUPS
>>> 4.ESTADO MYSQL
MySQL 5.0.32-Debian_7et  uptime 0 13:9:20       Wed Jul 14 09:00:01 2010

__ Key _________________________________________________________________
Buffer used   387.00k of  16.00M  %Used:   2.36
  Current       1.84M            %Usage:  11.52
Write ratio      0.03
Read ratio       0.10

__ Questions ___________________________________________________________
Total           7.61k    0.16/s
  Com_          5.47k    0.12/s  %Total:  71.93
  COM_QUIT        807    0.02/s           10.61
  DMS             665    0.01/s            8.74
  +Unknown        602    0.01/s            7.92
  QC Hits          61    0.00/s            0.80
Slow                6    0.00/s            0.08  %DMS:   0.90
DMS               665    0.01/s            8.74
  SELECT          648    0.01/s            8.52         97.44
  UPDATE           12    0.00/s            0.16          1.80
  DELETE            4    0.00/s            0.05          0.60
  INSERT            1    0.00/s            0.01          0.15
  REPLACE           0    0.00/s            0.00          0.00
Com_            5.47k    0.12/s           71.93
  show_create   1.15k    0.02/s           15.10
  show_status     797    0.02/s           10.48
  show_variab     797    0.02/s           10.48

__ SELECT and Sort _____________________________________________________
Scan            3.92k    0.08/s %SELECT: 605.09
Range               0    0.00/s            0.00
Full join           1    0.00/s            0.15
Range check         0    0.00/s            0.00
Full rng join       0    0.00/s            0.00
Sort scan           7    0.00/s
Sort range          1    0.00/s
Sort mrg pass       0    0.00/s

__ Query Cache _________________________________________________________
Memory usage  106.50k of  16.00M  %Used:   0.65
Block Fragmnt   0.68%
Hits               61    0.00/s
Inserts            65    0.00/s
Prunes              1    0.00/s
Insrt:Prune      65:1    0.00/s
Hit:Insert     0.94:1

__ Table Locks _________________________________________________________
Waited              0    0.00/s  %Total:   0.00
Immediate       1.32k    0.03/s

__ Tables ______________________________________________________________
Open               64 of   64    %Cache: 100.00
Opened          2.01k    0.04/s

__ Connections _________________________________________________________
Max used            3 of  100      %Max:   3.00
Total             810    0.02/s

__ Created Temp ________________________________________________________
Disk table      1.19k    0.03/s
Table           3.52k    0.07/s
File                5    0.00/s

 

 

Ahora, a quien le guste o sepa un poco del tema se le ocurren mil cosas que añadir o cosas que faltan. Para algunas consultas concretas como número de processos etc podemos usar desde linea de comandos mysqladmin -u <usuario> -p <clave> <opción> para obtener más datos interesantes... Cada uno que se lo haga a su manera!!