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



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



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

479   13  

13 ответов:

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

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

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


альтернативным вариантом было бы "коснуться" определенного файла всякий раз, когда таблица MySQL обновляется:

при обновлении базы данных:

  • откройте файл timestamp в O_RDRW режим
  • close это опять

или

  • использовать touch(), PHP эквивалент

у меня нет базы данных 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.

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

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 байта на строку для метки времени).
Но это работает для таблиц InnoDB до версии 5.7.15 MySQL, которая INFORMATION_SCHEMA.TABLES.UPDATE_TIME - нет.

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

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

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

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

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

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

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

просто возьмите дату изменения файла из файловой системы. На моем языке это означает:

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

выход:

1/25/2013 06:04:10 AM

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

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

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

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

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

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

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

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

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

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

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

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

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

теперь вы переходите к таблицам, которые хотите наблюдать, и добавляете триггеры после вставки / обновления / удаления с помощью этой или подобной процедуры:

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

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

<?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'];
    }
?>

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

создайте веб-страницу для принудительной перезагрузки кэша при его обновлении.

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

Comments

    Ничего не найдено.