MySQL no tiene configuraciones, mecanismos o controladores SMTP particulares incorporados.
Sin embargo, hay dos cosas básicas que puede hacer el tipo de monitoreo que desea.
Opción 1: puede supervisar los registros binarios
Si los registros binarios están habilitados, puede escribir un script de shell para llamar a mysql y hacer SHOW MASTER STATUS; Si cambia el nombre del archivo o el tamaño del archivo, algo cambió. ¡Una vez detectado, puede enviar un correo electrónico expresando que algo cambió!
Intenta algo como esto:
FIRST_READ=1
while [ 1 -eq 1 ]
do
mysql -h... -u... -p... --skip-column-names -A -e"SHOW MASTER STATUS" > /tmp/ms.txt
currfile=`cat /tmp/ms.txt | awk '{print $1}'`
currsize=`cat /tmp/ms.txt | awk '{print $2}'`
if [ ${FIRST_READ} -eq 0 ]
then
SOMETHING_CHANGED=2
if [ "${prevfile}" == "${currfile}" ] ; then (( SOMETHING_CHANGED-- )) ; fi
if [ "${prevsize}" == "${currsize}" ] ; then (( SOMETHING_CHANGED-- )) ; fi
if [ ${SOMETHING_CHANGED} -gt 0 ]
then
echo "Something Changed" | mail -s "Something Changed Subject" abc@xyz.com
fi
fi
FIRST_READ=0
prevfile=${currfile}
prevsize=${currsize}
sleep 10
done
Opción 2: puede supervisar information_schema.tables
Puede recorrer cada tabla y verificar su columna UPDATE_TIME en information_schema.tables
Primero recopile todos los nombres de tabla antepuestos con la base de datos. Luego, recorra todos los nombres de tabla y verifique esa entrada en information_schema.tables.
Pruebe lo siguiente (cualquier tabla que haya cambiado en los últimos 10 minutos):
mysql -h... -u... -p... --skip-column-names -A -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql') AND engine IS NOT NULL" > /tmp/TableNamesToPoll.txt
while [ 1 -eq 1 ]
do
for DBTB in `cat /tmp/TableNamesToPoll.txt`
do
DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
NEWUPDATE=`mysql -h... -u... -p... --skip-column-names -A -e"SELECT IFNULL(update_time,NOW() - INTERVAL 100 YEAR) > (NOW() - INTERVAL 10 MINUTE) UpdatedRecently FROM information_schema.tables WHERE table_schema='${DB}' AND table_name='${TB}'"`
if [ ${NEWUPDATE} -eq 1 ]
then
echo "Something Changed in ${DBTB}" | mail -s "Something Changed Subject" abc@xyz.com
fi
done
sleep 5
done
Estos son solo scripts de esqueleto para detectar cambios. Para la opción 1, puede hacer mysqlbinlog contra el registro binario actual y ver el SQL que se ejecutó en cualquier período de tiempo que necesite. Para la opción 2, puede cambiar el SQL para recuperar el sello de fecha y hora de la última actualización para una tabla determinada.
ACTUALIZACIÓN 2011-06-29 06:30 EDT
Opción 3: puede supervisar el registro general
Curiosamente, puede activar el registro general. Lo que es aún más intrigante es que puede activarlo en una tabla MySQL. La plantilla para el registro general como tabla ya existe en / var / lib / mysql / mysql como general_log.CSV. Aquí están los pasos:
Paso 01) Agregue estos a /etc/my.cnf
[mysqld]
log-output=TABLE
log
Paso 02) servicio mysql restart (general_log es una tabla CSV después del reinicio)
Paso 03) Ejecute estos comandos para convertir el general_Log de CSV a MyISAM
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
Paso 04) Mueva el archivo general_log a un gran volumen de disco que pueda acomodar una tabla de registro de rápido crecimiento
Ejemplo: si tiene el siguiente diseño de disco
[root@iml-db10 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg1-root 117G 3.2G 108G 3% /
/dev/mapper/vg2-data01
1.7T 688G 877G 44% /data
/dev/sdc1 3.6T 36G 3.4T 2% /backup
/dev/sda1 99M 18M 77M 19% /boot
tmpfs 95G 0 95G 0% /dev/shm
none 16G 51M 16G 1% /var/tmpfs
Realice estos pasos para mover la tabla de registro general:
mkdir /backup/general_log
mv /var/lib/mysql/mysql/general_log.MY* /backup/general_log/.
chown -R mysql:mysql /backup/general_log
ln -s /backup/general_log/general_log.MYD /var/lib/mysql/mysql/general_log.MYD
ln -s /backup/general_log/general_log.MYI /var/lib/mysql/mysql/general_log.MYI
Cuándo asegurarse de que existen los enlaces simbólicos
[root@db1]# ls -l /var/lib/mysql/mysql/general*
-rw-rw---- 1 mysql mysql 8776 Jun 25 15:53 /var/lib/mysql/mysql/general_log.frm
lrwxrwxrwx 1 root root 35 Jun 25 18:33 /var/lib/mysql/mysql/general_log.MYD -> /backup/general_log/general_log.MYD
lrwxrwxrwx 1 root root 35 Jun 25 18:32 /var/lib/mysql/mysql/general_log.MYI -> /backup/general_log/general_log.MYI
Paso 05) Ejecute este comando SQL
SET GLOBAL general_log = 'ON';
Eso es. Debería tener el general_log como una tabla MyISAM
mysql> show create table mysql.general_log\G
*************************** 1. row ***************************
Table: general_log
Create Table: CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL,
KEY `event_time` (`event_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='General log' DATA DIRECTORY='/backup/general_log/' INDEX DIRECTORY='/backup/general_log/'
1 row in set (0.00 sec)
Todo lo que necesita hacer es sondear la tabla general_log cada 15 minutos a través de crontab que ejecuta esta consulta
SELECT COUNT(1) UpdateCount FROM mysql.general_log
WHERE LOCATE('UPDATE',argument) > 0
AND event_time >= (NOW() - INTERVAL 15 MINUTE);
SELECT COUNT(1) DeleteCount FROM mysql.general_log
WHERE LOCATE('DELETE',argument) > 0
AND event_time >= (NOW() - INTERVAL 15 MINUTE);
ADVERTENCIA: Las entradas se acumularán rápidamente. Eliminar todos los eventos manteniendo los últimos 3 días. Ejecuta esto en un crontab todas las noches a medianoche
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
DELETE FROM mysql.general_log WHERE event_time < NOW() - INTERVAL 3 DAY;
SET GLOBAL slow_query_log = @old_log_state;
Prueba esto !!!
mysql --defaults-file=...
lugar de unmysql -u... -p...
:)Si tiene vps o un servidor dedicado, puede codificar su propio módulo utilizando la programación en C.
para.h
C Principal
Para configurar su proyecto, lea este video: https://www.youtube.com/watch?v=Zm2pKTW5z98 (Enviar correo electrónico desde MySQL 5.7 en Linux)
fuente