¿Cómo puedo saber cuándo se actualizó por última vez una tabla MySQL?


En el pie de página de mi página, me gustaría añadir algo como "last updated the xx/xx/200x" con esta fecha siendo la última vez que se ha actualizado una determinada tabla MySQL.

¿Cuál es la mejor manera de hacerlo? ¿Hay una función para recuperar la última fecha de actualización? ¿Debo acceder a la base de datos cada vez que necesito este valor?

 147
Author: Eric Leschinski, 2008-11-21

13 answers

En versiones posteriores de MySQL puede usar la base de datos information_schema para decirle cuándo se actualizó otra tabla:

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

Esto significa, por supuesto, abrir una conexión a la base de datos.


Una opción alternativa sería "tocar" un archivo en particular cada vez que se actualice la tabla MySQL:

Sobre las actualizaciones de la base de datos:

  • Abra su archivo de marca de tiempo en modo O_RDRW
  • close otra vez

O alternativamente

  • uso touch(), el equivalente PHP de la función utimes(), para cambiar la marca de tiempo del archivo.

En la visualización de la página:

  • use stat() para leer la hora de modificación del archivo.
 236
Author: Alnitak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-24 20:58:39

No tengo la base de datos information_schema, usando mysql versión 4.1.16, por lo que en este caso puede consultar esto:

SHOW TABLE STATUS FROM your_database LIKE 'your_table';

Devolverá estas columnas:

| 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 |

Como puede ver, hay una columna llamada: "Update_time" que le muestra la última hora de actualización para your_table.

 51
Author: Radu Maris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-23 07:49:30

Me sorprende que nadie haya sugerido rastrear el tiempo de la última actualización por fila:

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;

Esto actualiza la marca de tiempo a pesar de que no lo mencionamos en la ACTUALIZACIÓN.

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 |
+----+------+---------------------+

Ahora puedes consultar MAX():

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

Es cierto que esto requiere más almacenamiento (4 bytes por fila para la MARCA de TIEMPO).
Pero esto funciona para tablas InnoDB antes de la versión 5.7.15 de MySQL, que INFORMATION_SCHEMA.TABLES.UPDATE_TIME no lo hace.

 43
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-13 14:34:27

Para una lista de los cambios recientes en la tabla use esto:

SELECT UPDATE_TIME, TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
ORDER BY UPDATE_TIME DESC, TABLE_SCHEMA, TABLE_NAME
 6
Author: Francois Bourgeois,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-08 11:53:36

Crearía un disparador que atrapa todas las actualizaciones / inserciones / eliminaciones y escribiría la marca de tiempo en una tabla personalizada, algo como tablename / timestamp

Solo porque no me gusta la idea de leer las tablas internas del sistema de db server directamente

 5
Author: Mikhail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-16 08:25:29

Lo más sencillo sería comprobar la marca de tiempo de los archivos de tabla en el disco. Por ejemplo, puede comprobar en su directorio de datos

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

Esto debería darle la lista de todas las tablas con la tabla cuando se modificó por última vez la vez más antigua, primero.

 3
Author: user2654744,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-09 16:01:18

Simplemente tome la fecha de archivo modificada del sistema de archivos. En mi idioma que es:

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

Salida:

1/25/2013 06:04:10 AM
 0
Author: Steve Wood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-13 07:38:58

Si está ejecutando Linux, puede usar inotify para ver la tabla o el directorio de la base de datos. inotify está disponible desde PHP, nodo.js, perl y yo sospechamos de la mayoría de los otros idiomas. Por supuesto, debe haber instalado inotify o haber hecho que su ISP lo instale. Muchos ISP no lo harán.

 0
Author: bartonlp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-22 00:02:23

No estoy seguro de si esto sería de algún interés. Usar mysqlproxy entre mysql y clientes, y hacer uso de un script lua para actualizar un valor clave en memcached de acuerdo con los cambios de tabla interesantes ACTUALIZAR,ELIMINAR,INSERTAR fue la solución que hice hace poco. Si el wrapper soportaba hooks o disparadores en php, esto podría haber sido eaiser. Ninguno de los envoltorios hace esto.

 0
Author: Jiju Thomas Mathew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-30 13:35:05

Análisis del nivel de SG:

Encuentre dónde se almacena la base de datos en el disco:

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

Compruebe las modificaciones más recientes

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

Debería funcionar en todos los tipos de bases de datos.

 0
Author: John McLean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-20 13:37:13

Aunque hay una respuesta aceptada, no siento que sea la correcta. Es la forma más sencilla de lograr lo que se necesita, pero incluso si ya está habilitado en InnoDB (en realidad los documentos le dicen que todavía debe obtener NULL ...), si lee MySQL docs , incluso en la versión actual (8.0) usar UPDATE_TIME no es la opción correcta, porque:

Las marcas de tiempo no se conservan cuando se reinicia el servidor o cuando la tabla es desalojada del diccionario de datos InnoDB cache.

Si entiendo correctamente (no puedo verificarlo en un servidor en este momento), la marca de tiempo se restablece después del reinicio del servidor.

En cuanto a las soluciones reales (y, bueno, costosas), tienes la solución de Bill Karwin con CURRENT_TIMESTAMP y me gustaría proponer una diferente, que se basa en disparadores (estoy usando esa).

Comienza creando una tabla separada (o tal vez tenga alguna otra tabla que se pueda usar para este propósito) que funcionará como un almacenamiento para variables globales (aquí marcas de tiempo). Necesita almacenar dos campos: nombre de tabla (o cualquier valor que desee mantener aquí como id de tabla) y marca de tiempo. Después de tenerlo, debe inicializarlo con este id de tabla + fecha de inicio (NOW () es una buena opción :)).

Ahora, se mueve a las tablas que desea observar y agrega disparadores DESPUÉS DE INSERTAR/ACTUALIZAR/ELIMINAR con este procedimiento o similar:

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
Author: Soul Reaver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-17 10:05:38

Esto es lo que hice, espero que ayude.

<?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'];
    }
?>
 -1
Author: Andrés Chandía,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-19 15:39:11

Almacena en caché la consulta en una variable global cuando no está disponible.

Cree una página web para forzar la recarga de la caché cuando la actualice.

Agregue una llamada a la página de recarga en sus scripts de implementación.

 -8
Author: Kieveli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-21 00:56:48