MySQL n'a pas de configuration, de mécanisme ou de pilote SMTP particulier intégré.
Cependant, il y a deux choses de base que vous pouvez faire le type de surveillance que vous souhaitez.
Option 1: vous pouvez surveiller les journaux binaires
Si les journaux binaires sont activés, vous pouvez écrire un script shell pour appeler mysql et faire SHOW MASTER STATUS; Si le nom de fichier ou la taille du fichier change, quelque chose a changé. Une fois détecté, vous pouvez envoyer un e-mail indiquant que quelque chose a changé !!!
Essayez quelque chose comme ceci:
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
Option 2: vous pouvez surveiller information_schema.tables
Vous pouvez parcourir chaque table et vérifier sa colonne UPDATE_TIME dans information_schema.tables
Collectez d'abord tous les noms de table précédés de la base de données. Ensuite, parcourez tous les noms de table et vérifiez cette entrée dans information_schema.tables.
Essayez ce qui suit (tout tableau qui a changé au cours des 10 dernières minutes):
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
Ce ne sont que des scripts squelettes pour détecter les changements. Pour l'option 1, vous pouvez faire mysqlbinlog par rapport au journal binaire actuel et voir le SQL qui a été exécuté dans le délai dont vous avez besoin. Pour l'option 2, vous pouvez modifier le SQL pour récupérer l'horodatage datetime de la dernière mise à jour pour une table donnée.
MISE À JOUR 2011-06-29 06:30 EDT
Option 3: vous pouvez surveiller le journal général
Fait intéressant, vous pouvez activer le journal général. Ce qui est encore plus fascinant, c'est que vous pouvez l'activer une table MySQL. Le modèle du journal général en tant que table existe déjà dans / var / lib / mysql / mysql en tant que general_log.CSV. Voici les étapes:
Étape 01) Ajoutez-les à /etc/my.cnf
[mysqld]
log-output=TABLE
log
Étape 02) Service mysql restart (general_log est une table CSV après redémarrage)
Étape 03) Exécutez ces commandes pour convertir le general_Log de CSV en MyISAM
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
Étape 04) Déplacez le fichier general_log vers un énorme volume de disque pouvant accueillir une table de journal à croissance rapide
Exemple: si vous disposez de la disposition de disque suivante
[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
Procédez comme suit pour déplacer la table de journal générale:
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
Quand assurez-vous que les liens symboliques existent
[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
Étape 05) Exécutez cette commande SQL
SET GLOBAL general_log = 'ON';
C'est ça. Vous devriez avoir le general_log comme une table 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)
Tout ce que vous devez faire est d'interroger la table general_log toutes les 15 minutes via crontab exécutant cette requête
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);
AVERTISSEMENT: les entrées s'empileront rapidement. Supprimez tous les événements en conservant les 3 derniers jours. Exécutez cela dans une crontab tous les soirs à minuit
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;
Essayez ceci !!!
mysql --defaults-file=...
mysql -u... -p...
Si vous avez des vps ou un serveur dédié, vous pouvez coder votre propre module en utilisant la programmation C.
para.h
principal c
Pour configurer votre projet, passez par cette vidéo: https://www.youtube.com/watch?v=Zm2pKTW5z98 (Envoyer un e-mail depuis MySQL 5.7 sous Linux)
la source