MySQL не имеет каких-либо встроенных настроек, механизмов или драйверов SMTP.
Тем не менее, есть две основные вещи, которые вы можете делать, когда хотите.
Вариант 1: вы можете контролировать двоичные журналы
Если двоичные журналы включены, вы можете написать сценарий оболочки для вызова mysql и выполнить SHOW MASTER STATUS; Если изменяется либо имя файла, либо размер файла, что-то изменилось. После обнаружения вы можете отправить по электронной почте сообщение о том, что что-то изменилось !!!
Попробуйте что-то вроде этого:
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
Вариант 2: вы можете отслеживать информацию
Вы можете перебрать каждую таблицу и проверить ее столбец UPDATE_TIME в information_schema.tables
Сначала соберите все имена таблиц с добавлением базы данных. Затем переберите все имена таблиц и проверьте эту запись в information_schema.tables.
Попробуйте следующее (любая таблица, которая изменилась за последние 10 минут):
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
Это просто скриптовые скрипты для обнаружения изменений. Для варианта 1 вы можете сделать mysqlbinlog для текущего двоичного журнала и посмотреть SQL, который был выполнен в любой нужный вам период. Для варианта 2 вы можете изменить SQL для получения метки даты и времени последнего обновления для данной таблицы.
ОБНОВЛЕНИЕ 2011-06-29 06:30 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Вариант 3: Вы можете контролировать общий журнал
Интересно, что вы можете активировать общий журнал. Еще более интригующим является то, что вы можете активировать его в MySQL Table. Шаблон для общего журнала в виде таблицы уже существует в / var / lib / mysql / mysql как general_log.CSV. Вот шаги:
Шаг 01) Добавьте их в /etc/my.cnf
[mysqld]
log-output=TABLE
log
Шаг 02) Перезапуск службы mysql (general_log - таблица CSV после перезапуска)
Шаг 03) Запустите эти команды, чтобы преобразовать general_Log из CSV в MyISAM
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
Шаг 04) Переместите файл general_log на огромный том диска, который может вместить быстро растущую таблицу журналов.
Пример: если у вас есть следующая схема диска
[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
Выполните эти шаги, чтобы переместить общую таблицу журнала:
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
Когда убедитесь, что символические ссылки существуют
[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
Шаг 05) Запустите эту команду SQL
SET GLOBAL general_log = 'ON';
Вот и все. Вы должны иметь general_log в качестве таблицы 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)
Все, что вам нужно сделать, это опрашивать таблицу general_log каждые 15 минут через crontab, выполняющий этот запрос
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);
ВНИМАНИЕ: Записи будут накапливаться быстро. Удалить все события за последние 3 дня. Запускай это в crontab каждую ночь в полночь
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;
Дайте это попробовать !!!
mysql --defaults-file=...
вместоmysql -u... -p...
:)Если у вас есть VPS или выделенный сервер, вы можете написать свой собственный модуль, используя C-программирование.
para.h
main.c
Чтобы настроить свой проект, просмотрите это видео: https://www.youtube.com/watch?v=Zm2pKTW5z98 (отправка электронной почты из MySQL 5.7 в Linux)
источник