O MySQL não possui nenhuma configuração, mecanismo ou driver SMTP específico.
No entanto, existem duas coisas básicas que você pode fazer o tipo de monitoramento que deseja.
Opção 1: você pode monitorar os logs binários
Se os logs binários estiverem ativados, você poderá escrever um script de shell para chamar mysql e fazer SHOW MASTER STATUS; Se o nome do arquivo ou o tamanho do arquivo mudar, algo mudou. Uma vez detectado, você pode enviar um e-mail expressando que algo mudou !!!
Tente algo como isto:
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
Opção 2: você pode monitorar information_schema.tables
Você pode percorrer todas as tabelas e verificar sua coluna UPDATE_TIME em information_schema.tables
Primeiro colete todos os nomes de tabela anexados ao banco de dados. Em seguida, percorra todos os nomes de tabela e verifique essa entrada em information_schema.tables.
Tente o seguinte (qualquer tabela que tenha sido alterada nos ú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
Estes são apenas scripts básicos para detectar alterações. Para a opção 1, você pode executar o mysqlbinlog no log binário atual e ver o SQL que foi executado em qualquer período de tempo necessário. Para a opção 2, você pode alterar o SQL para recuperar o carimbo de data e hora da última atualização para uma determinada tabela.
ATUALIZAÇÃO 29-06-2011 06:30 EDT
Opção 3: você pode monitorar o log geral
Curiosamente, você pode ativar o log geral. O que é ainda mais intrigante é que você pode ativá-lo em uma tabela MySQL. O modelo para o log geral como uma tabela já existe em / var / lib / mysql / mysql como general_log.CSV. Aqui estão os passos:
Etapa 01) Adicione-os ao /etc/my.cnf
[mysqld]
log-output=TABLE
log
Etapa 02) service mysql restart (general_log é uma tabela CSV após a reinicialização)
Etapa 03) Execute estes comandos para converter o general_Log de CSV para MyISAM
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
Etapa 04) Mova o arquivo general_log para um volume enorme de disco que possa acomodar uma tabela de log de crescimento rápido
Exemplo: se você tiver o seguinte layout 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
Execute estas etapas para mover a tabela de log geral:
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
Quando verifique se os links simbólicos existem
[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
Etapa 05) Execute este comando SQL
SET GLOBAL general_log = 'ON';
É isso aí. Você deve ter o general_log como uma tabela 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)
Tudo o que você precisa fazer é pesquisar a tabela general_log a cada 15 minutos via crontab executando 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);
AVISO: As entradas se acumularão rapidamente. Exclua todos os eventos mantendo os últimos 3 dias. Execute isso em um crontab todas as noites à meia-noite
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;
Experimente!
mysql --defaults-file=...
em vez de ummysql -u... -p...
:)Se você possui vps ou servidor dedicado, é possível codificar seu próprio módulo usando a programação C.
para.h
main.c
Para configurar seu projeto, siga este vídeo: https://www.youtube.com/watch?v=Zm2pKTW5z98 (Enviar email do MySQL 5.7 no Linux)
fonte