Как я могу узнать, когда таблица MySQL последний раз обновлялась? - PullRequest
163 голосов
/ 21 ноября 2008

В нижнем колонтитуле моей страницы я хотел бы добавить что-то вроде «последнее обновление xx / xx / 200x», причем эта дата является последним обновлением определенной таблицы mySQL.

Каков наилучший способ сделать это? Есть ли функция для получения последней обновленной даты? Должен ли я обращаться к базе данных каждый раз, когда мне нужно это значение?

Ответы [ 13 ]

254 голосов
/ 21 ноября 2008

В более поздних версиях MySQL вы можете использовать базу данных information_schema, чтобы сообщать вам, когда была обновлена ​​другая таблица:

SELECT UPDATE_TIME
FROM   information_schema.tables
WHERE  TABLE_SCHEMA = 'dbname'
   AND TABLE_NAME = 'tabname'

Это, конечно, означает открытие соединения с базой данных.


Альтернативным вариантом будет «прикасаться» к конкретному файлу при каждом обновлении таблицы MySQL:

В обновлениях базы данных:

  • Откройте файл метки времени в режиме O_RDRW
  • close это снова

или альтернативно

  • используйте touch(), PHP-эквивалент функции utimes(), чтобы изменить временную метку файла.

На странице отображения:

  • используйте stat() для считывания времени модификации файла.
53 голосов
/ 12 июля 2010

У меня нет базы данных information_schema, использующей mysql версии 4.1.16, поэтому в этом случае вы можете запросить это:

SHOW TABLE STATUS FROM your_database LIKE 'your_table';

Он вернет эти столбцы:

| Name      | Engine | Version | Row_format | Rows | Avg_row_length <br>| Data_length | Max_data_length | Index_length | Data_free | Auto_increment <br>| Create_time         | <b>Update_time</b>         | Check_time | Collation         <br>| Checksum | Create_options | Comment |

Как видите, есть столбец с именем: " Update_time ", который показывает время последнего обновления для your_table .

47 голосов
/ 22 августа 2013

Я удивлен, что никто не предложил отслеживать время последнего обновления в строке:

mysql> CREATE TABLE foo (
  id INT PRIMARY KEY
  x INT,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
                     ON UPDATE CURRENT_TIMESTAMP,
  KEY (updated_at)
);

mysql> INSERT INTO foo VALUES (1, NOW() - INTERVAL 3 DAY), (2, NOW());

mysql> SELECT * FROM foo;
+----+------+---------------------+
| id | x    | updated_at          |
+----+------+---------------------+
|  1 | NULL | 2013-08-18 03:26:28 |
|  2 | NULL | 2013-08-21 03:26:28 |
+----+------+---------------------+

mysql> UPDATE foo SET x = 1234 WHERE id = 1;

Это обновляет временную метку, хотя мы не упоминали об этом в ОБНОВЛЕНИИ.

mysql> SELECT * FROM foo;
+----+------+---------------------+
| id | x    | updated_at          |
+----+------+---------------------+
|  1 | 1235 | 2013-08-21 03:30:20 | <-- this row has been updated
|  2 | NULL | 2013-08-21 03:26:28 |
+----+------+---------------------+

Теперь вы можете запросить MAX ():

mysql> SELECT MAX(updated_at) FROM foo;
+---------------------+
| MAX(updated_at)     |
+---------------------+
| 2013-08-21 03:30:20 |
+---------------------+

По общему признанию, это требует больше памяти (4 байта на строку для TIMESTAMP).
Но это работает для таблиц InnoDB до версии MySQL 5.7.15, а INFORMATION_SCHEMA.TABLES.UPDATE_TIME - нет.

7 голосов
/ 08 января 2013

Для получения списка последних изменений в таблице используйте это:

SELECT UPDATE_TIME, TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
ORDER BY UPDATE_TIME DESC, TABLE_SCHEMA, TABLE_NAME
5 голосов
/ 15 апреля 2016

Самое простое - проверить временную метку файлов таблицы на диске. Например, Вы можете проверить в своей директории данных

cd /var/lib/mysql/<mydatabase>
ls -lhtr *.ibd

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

5 голосов
/ 16 февраля 2012

Я бы создал триггер, который ловит все обновления / вставки / удаления и записывает метку времени в пользовательскую таблицу, что-то вроде имя таблицы | отметка времени

Просто потому, что мне не нравится идея читать внутренние системные таблицы сервера БД напрямую

1 голос
/ 17 мая 2018

Хотя есть принятый ответ, я не чувствую, что он правильный. Это самый простой способ достичь того, что нужно, но даже если он уже включен в InnoDB (на самом деле документы говорят вам, что вы все равно должны получить NULL ...), если вы читаете MySQL docs , даже в текущей версии (8.0) использование UPDATE_TIME не является правильным вариантом, потому что:

Метки времени не сохраняются при перезапуске сервера или когда таблица извлекается из кэша словаря данных InnoDB.

Если я правильно понимаю (не могу проверить это на сервере прямо сейчас), отметка времени сбрасывается после перезапуска сервера.

Что касается реальных (и, конечно, дорогостоящих) решений, у вас есть решение Билла Карвина с CURRENT_TIMESTAMP, и я хотел бы предложить другое, основанное на триггерах (я использую это один).

Вы начинаете с создания отдельной таблицы (или, может быть, у вас есть какая-то другая таблица, которая может использоваться для этой цели), которая будет работать как хранилище для глобальных переменных (здесь отметки времени). Вам нужно сохранить два поля - имя таблицы (или любое другое значение, которое вы хотите сохранить здесь в качестве идентификатора таблицы) и метку времени. После того, как он у вас есть, вы должны инициализировать его с этим идентификатором таблицы + дата начала (NOW () - хороший выбор :)).

Теперь вы переходите к таблицам, которые хотите наблюдать, и добавляете триггеры ПОСЛЕ ВСТАВКИ / ОБНОВЛЕНИЯ / УДАЛЕНИЯ с помощью этой или аналогичной процедуры:

CREATE PROCEDURE `timestamp_update` ()
BEGIN
    UPDATE `SCHEMA_NAME`.`TIMESTAMPS_TABLE_NAME`
    SET `timestamp_column`=DATE_FORMAT(NOW(), '%Y-%m-%d %T')
    WHERE `table_name_column`='TABLE_NAME';
END
0 голосов
/ 20 сентября 2017

Анализ уровня ОС:

Найти, где БД хранится на диске:

grep datadir /etc/my.cnf
datadir=/var/lib/mysql

Проверить наличие последних изменений

cd /var/lib/mysql/{db_name}
ls -lrt

Должен работать на всех типах баз данных.

0 голосов
/ 30 сентября 2015

Не уверен, что это будет интересно. Использование mysqlproxy между mysql и клиентами и использование сценария lua для обновления значения ключа в memcached в соответствии с интересными изменениями таблицы UPDATE, DELETE, INSERT было решением, которое я сделал совсем недавно. Если оболочка поддерживает хуки или триггеры в php, это может быть eaiser. Ни одна из обёрток на данный момент не делает этого.

0 голосов
/ 22 августа 2013

Если вы работаете в Linux, вы можете использовать inotify для просмотра таблицы или каталога базы данных. inotify доступен из PHP, node.js, perl, и я подозреваю, что большинство других языков. Конечно, вы должны были установить inotify или ваш провайдер установил его. Много провайдеров не будет.

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