Запрос на поиск таблиц, измененных за последний час - PullRequest
32 голосов
/ 22 марта 2010

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

Ответы [ 5 ]

58 голосов
/ 22 марта 2010

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';
5 голосов
/ 22 марта 2010

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

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

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

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

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

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

4 голосов
/ 27 июня 2013

Я ответил на такой вопрос в 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

Дай попробовать !!!

4 голосов
/ 23 июня 2013

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 в большинстве установок по умолчанию.

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

0 голосов
/ 27 июня 2013
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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...