Как узнать, когда последняя таблица MySQL была обновлена?

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

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

Ответ 1

В более поздних версиях 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(), чтобы прочитать время изменения файла.

Ответ 2

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

SHOW TABLE STATUS FROM your_database LIKE 'your_table';

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

| Name      | Engine | Version | Row_format | Rows | Avg_row_length 
| Data_length | Max_data_length | Index_length | Data_free | Auto_increment
| Create_time | Update_time | Check_time | Collation
| Checksum | Create_options | Comment |

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

Ответ 3

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

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;

Это обновляет метку времени, хотя мы не упоминаем ее в UPDATE.

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 до версии 5.7.15 MySQL, которая INFORMATION_SCHEMA.TABLES.UPDATE_TIME не делает.

Ответ 4

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

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

Ответ 5

В списке последних изменений таблицы используйте это:

SELECT UPDATE_TIME, TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
ORDER BY UPDATE_TIME DESC, TABLE_SCHEMA, TABLE_NAME

Ответ 6

Простейшей задачей было бы проверить временную метку табличных файлов на диске. Например, вы можете проверить свой каталог данных

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

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

Ответ 7

Просто возьмите дату файла, измененную из файловой системы. На моем языке, который есть:

 tbl_updated = file.update_time(
        "C:\ProgramData\MySQL\MySQL Server 5.5\data\mydb\person.frm")

Вывод:

1/25/2013 06:04:10 AM

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

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

Проверить последние изменения

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

Необходимо работать со всеми типами баз данных.

Ответ 11

Это то, что я сделал, надеюсь, это поможет.

<?php
    mysql_connect("localhost", "USER", "PASSWORD") or die(mysql_error());
    mysql_select_db("information_schema") or die(mysql_error());
    $query1 = "SELECT `UPDATE_TIME` FROM `TABLES` WHERE
        `TABLE_SCHEMA` LIKE 'DataBaseName' AND `TABLE_NAME` LIKE 'TableName'";
    $result1 = mysql_query($query1) or die(mysql_error());
    while($row = mysql_fetch_array($result1)) {
        echo "<strong>1r tr.: </strong>".$row['UPDATE_TIME'];
    }
?>

Ответ 12

Кэшировать запрос в глобальной переменной, когда он недоступен.

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

Добавьте вызов на страницу перезагрузки в свои сценарии развертывания.