In MySQL sind keinerlei SMTP-Setup, -Mechanismen oder -Treiber integriert.
Es gibt jedoch zwei grundlegende Dinge, mit denen Sie die gewünschte Art der Überwachung durchführen können.
Option 1: Sie können die Binärprotokolle überwachen
Wenn binäre Protokolle aktiviert sind, können Sie ein Shell-Skript schreiben, um mysql aufzurufen und SHOW MASTER STATUS auszuführen. Wenn sich entweder der Dateiname oder die Dateigröße ändert, hat sich etwas geändert. Sobald Sie erkannt haben, können Sie eine E-Mail senden, in der Sie darauf hinweisen, dass sich etwas geändert hat !!!
Versuchen Sie so etwas:
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: Sie können information_schema.tables überwachen
Sie können jede Tabelle durchlaufen und ihre Spalte UPDATE_TIME in information_schema.tables überprüfen
Sammeln Sie zuerst alle Tabellennamen, denen die Datenbank vorangestellt ist. Durchlaufen Sie dann alle Tabellennamen und überprüfen Sie diesen Eintrag in information_schema.tables.
Versuchen Sie Folgendes (jede Tabelle, die sich in den letzten 10 Minuten geändert hat):
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
Dies sind nur Skelett-Skripte, um Änderungen zu erkennen. Für Option 1 können Sie mysqlbinlog für das aktuelle Binärprotokoll ausführen und die SQL anzeigen, die in dem von Ihnen benötigten Zeitraum ausgeführt wurde. Bei Option 2 können Sie die SQL ändern, um den Datums- / Uhrzeitstempel der letzten Aktualisierung für eine bestimmte Tabelle abzurufen.
UPDATE 29.06.2011 06:30 EDT
Option 3: Sie können das allgemeine Protokoll überwachen
Interessanterweise können Sie das allgemeine Protokoll aktivieren. Noch faszinierender ist, dass Sie eine MySQL-Tabelle aktivieren können. Die Vorlage für das allgemeine Protokoll als Tabelle ist bereits in / var / lib / mysql / mysql als general_log.CSV vorhanden. Hier sind die Schritte:
Schritt 01) Fügen Sie diese zu /etc/my.cnf hinzu
[mysqld]
log-output=TABLE
log
Schritt 02) Service MySQL Neustart (general_log ist eine CSV-Tabelle nach dem Neustart)
Schritt 03) Führen Sie diese Befehle aus, um das general_Log von CSV in MyISAM zu konvertieren
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
Schritt 04) Verschieben Sie die Datei general_log auf ein großes Datenträger-Volume, das eine schnell wachsende Protokolltabelle aufnehmen kann
Beispiel: Wenn Sie das folgende Festplattenlayout haben
[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
Führen Sie die folgenden Schritte aus, um die allgemeine Protokolltabelle zu verschieben:
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
Wann stellen Sie sicher, dass die Symlinks vorhanden sind
[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
Schritt 05) Führen Sie diesen SQL-Befehl aus
SET GLOBAL general_log = 'ON';
Das ist es. Sie sollten das general_log als MyISAM-Tabelle haben
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)
Sie müssen lediglich alle 15 Minuten die Tabelle general_log über crontab abfragen, um diese Abfrage auszuführen
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);
WARNUNG: Einträge häufen sich schnell. Löschen Sie alle Ereignisse unter Beibehaltung der letzten 3 Tage. Führen Sie dies jede Nacht um Mitternacht in einem Crontab aus
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;
Probieren Sie es aus !!!
mysql --defaults-file=...
mysql -u... -p...
Wenn Sie über vps oder einen dedizierten Server verfügen, können Sie Ihr eigenes Modul mithilfe der C-Programmierung codieren.
Abs
Haupt c
Um Ihr Projekt zu konfigurieren, gehen Sie dieses Video durch: https://www.youtube.com/watch?v=Zm2pKTW5z98 (E-Mail von MySQL 5.7 unter Linux senden)
quelle