Подтвердить что ты не робот

Запрос на поиск таблиц, измененных за последний час

Я хочу узнать, какие таблицы были изменены за последний час в базе данных MySQL. Как я могу это сделать?

4b9b3361

Ответ 1

MySQL 5.x может сделать это через базу данных INFORMATION_SCHEMA. Эта база данных содержит информацию о таблицах, представлениях, столбцах и т.д.

SELECT * 
FROM `INFORMATION_SCHEMA`.`TABLES`
WHERE 
    DATE_SUB(NOW(), INTERVAL 1 HOUR) < `UPDATE_TIME`

Возвращает все обновленные таблицы (UPDATE_TIME) за последний час. Вы также можете фильтровать по имени базы данных (столбец TABLE_SCHEMA).

Пример запроса:

SELECT 
    CONCAT(`TABLE_SCHEMA`, '.', `TABLE_NAME`) AS `Table`, 
    UPDATE_TIME AS `Updated`
FROM `INFORMATION_SCHEMA`.`TABLES`
WHERE
    DATE_SUB(NOW(), INTERVAL 3 DAY) < `UPDATE_TIME`
    AND `TABLE_SCHEMA` != 'INFORMATION_SCHEMA'
    AND `TABLE_TYPE` = 'BASE TABLE';

Ответ 2

Для каждой таблицы, которую вы хотите обнаружить, вам нужно иметь столбец с последней меткой времени изменения.

Для каждой вставки или обновления в таблице вам необходимо обновить этот столбец с текущей датой и временем.

В качестве альтернативы вы можете настроить trigger, который автоматически обновляет столбец при каждой вставке или изменении. Таким образом, вам не нужно изменять весь ваш запрос.

Как только это работает, чтобы выяснить, были ли изменены строки из таблицы за последний час, выполните запрос

select count(*) from mytable where datemod>subtime(now(),'1:0:0')

Повторите для каждой таблицы, которую вы хотите проверить.

Ответ 3

В InnoDB по-прежнему в настоящее время отсутствует собственный механизм для получения этой информации. В связанном запросе функции в MySQL, кто-то советует устанавливать триггеры AFTER [all events] для каждой таблицы, подлежащей мониторингу. Триггер выдаст утверждение типа

INSERT INTO last_update VALUE ('current_table_name', NOW())
ON DUPLICATE KEY UPDATE update_time = NOW();

в таблице:

CREATE TABLE last_update (
    table_name VARCHAR(64) PRIMARY KEY,
    update_time DATETIME
) ENGINE = MyISAM; -- no need for transactions here

В качестве альтернативы, если допустима небольшая неточность в этих данных (в пределах одной секунды), и если вы получили доступ к файлам данных MySQL, вы можете переключиться на параметр, где inndb_files_per_table = ON (рекомендуется в любом случае) и проверять время последней модификации основных файлов данных.

Эти файлы находятся в разделе /var/lib/mysql/[database_name]/*.ibd в большинстве установок по умолчанию.

Обратите внимание, что если вы решите пройти этот маршрут, вам нужно воссоздать существующие таблицы для применения нового параметра.

Ответ 4

Я ответил на такой вопрос в DBA StackExchange около 1,5 лет назад: Самый быстрый способ проверить, изменилась ли таблица InnoDB.

Основываясь на этом старом ответе, я рекомендую следующее

Промывка записи на диск

Это одноразовая настройка. Вам нужно установить innodb_max_dirty_pages_pct на 0.

Сначала добавьте это в /etc/my.cnf

[mysqld]
innodb_max_dirty_pages_pct=0

Затем запустите это, чтобы не перезапускать mysql:

mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;

Получить отметку времени таблицы InnoDB .ibd file

ls имеет возможность извлекать временную метку UNIX в секундах. Для таблицы InnoDB mydb.mytable

$ cd /var/lib/mysql/mydb
$ ls -l --time-style="+%s" mytable.ibd | awk '{print $6}'

Затем вы можете вычислить UNIX_TIMESTAMP (NOW()) - (timestamp of the .ibd file) и посмотреть, составляет 3600 или менее.

Попробуйте!!!

Ответ 5

SELECT *
FROM  information_schema.tables
WHERE UPDATE_TIME >= SYSDATE() - INTERVAL 1 DAY  && TABLE_TYPE != 'SYSTEM VIEW'

SELECT * 
FROM information_schema.tables
WHERE UPDATE_TIME >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) && TABLE_TYPE != 'SYSTEM VIEW'