Comment savoir quand une table MySQL a été mise à jour pour la dernière fois?

Dans le pied de page, je voudrais append quelque chose comme “dernière mise à jour le xx / xx / 200x”, cette date étant la dernière fois qu’une certaine table mySQL a été mise à jour.

Quelle est la meilleure façon de le faire? Existe-t-il une fonction permettant de récupérer la date de la dernière mise à jour? Dois-je accéder à la firebase database chaque fois que j’ai besoin de cette valeur?

Dans les versions ultérieures de MySQL, vous pouvez utiliser la firebase database information_schema pour vous indiquer quand une autre table a été mise à jour:

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

Cela signifie bien sûr ouvrir une connexion à la firebase database.


Une autre option serait de “toucher” un fichier particulier chaque fois que la table MySQL est mise à jour:

Sur les mises à jour de la firebase database:

  • Ouvrez votre fichier d’horodatage en mode O_RDRW
  • close

Ou bien

  • utilisez touch() , l’équivalent PHP de la fonction utimes() , pour modifier l’horodatage du fichier.

Affichage sur la page:

  • utilisez stat() pour lire l’heure de modification du fichier.

Je n’ai pas de firebase database information_schema, en utilisant mysql version 4.1.16, donc dans ce cas, vous pouvez interroger ceci:

 SHOW TABLE STATUS FROM your_database LIKE 'your_table'; 

Il retournera ces colonnes:

 |  Nom |  Moteur |  Version |  Row_format |  Lignes |  Avg_row_length 
| Data_length | Max_data_length | Index_length | Data_free | Incrémentation automatique
| Create_time | Update_time | Check_time | Collation
| Somme de contrôle | Create_options | Commentaire |

Comme vous pouvez le voir, il existe une colonne appelée ” Update_time ” qui vous indique la dernière heure de mise à jour de your_table .

Je suis surpris que personne n’ait suggéré de suivre le dernier temps de mise à jour par ligne:

 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; 

Cela met à jour l’horodatage même si nous ne l’avons pas mentionné dans la mise à jour.

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

Maintenant, vous pouvez interroger le MAX ():

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

Certes, cela nécessite plus de stockage (4 octets par ligne pour TIMESTAMP).
Mais cela fonctionne pour les tables InnoDB avant la version 5.7.15 de MySQL, ce que ne permet pas INFORMATION_SCHEMA.TABLES.UPDATE_TIME .

Pour une liste des modifications de table récentes, utilisez ceci:

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

Je créerais un déclencheur qui intercepte toutes les mises à jour / insertions / suppressions et écrit l’horodatage dans un tableau personnalisé, quelque chose comme tablename | horodatage

Juste parce que je n’aime pas l’idée de lire directement les tables système internes du serveur db

La chose la plus simple serait de vérifier l’horodatage des fichiers de table sur le disque. Par exemple, vous pouvez vérifier sous votre répertoire de données

 cd /var/lib/mysql/ ls -lhtr *.ibd 

Cela devrait vous donner la liste de toutes les tables avec la table lors de la dernière modification de la plus ancienne heure, en premier.

Il suffit de saisir la date du fichier modifiée du système de fichiers. Dans ma langue c’est:

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

Sortie:

 1/25/2013 06:04:10 AM 

Si vous utilisez Linux, vous pouvez utiliser inotify pour regarder la table ou le répertoire de la firebase database. inotify est disponible à partir de PHP, node.js, perl et je soupçonne la plupart des autres langages. Bien entendu, vous devez avoir installé inotify ou demandé à votre FAI de l’installer. Beaucoup de FAI ne le feront pas.

Je ne sais pas si cela serait intéressant. En utilisant mysqlproxy entre mysql et les clients, et en utilisant un script lua pour mettre à jour une valeur de clé dans memcached en fonction de modifications de table intéressantes, UPDATE, DELETE, INSERT était la solution que j’ai faite récemment. Si l’encapsuleur supportait des hooks ou des sortingggers dans php, cela aurait pu être plus simple. Aucune des enveloppes ne le fait maintenant.

Analyse du niveau du système d’exploitation:

Trouvez où le DB est stocké sur le disque:

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

Vérifier les modifications les plus récentes

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

Devrait fonctionner sur tous les types de firebase database.

Bien qu’il y ait une réponse acceptée, je ne pense pas que ce soit la bonne. C’est la manière la plus simple de réaliser ce qui est nécessaire, mais même si elle est déjà activée dans InnoDB (en fait, les docs vous disent que vous devriez toujours obtenir NULL …), si vous lisez MySQL, même dans la version actuelle (8.0) pas la bonne option, car:

Les horodatages ne sont pas conservés au redémarrage du serveur ou lorsque la table est supprimée du cache du dictionnaire de données InnoDB.

Si je comprends bien (ne peut pas le vérifier sur un serveur maintenant), l’horodatage est réinitialisé après le redémarrage du serveur.

En ce qui concerne les solutions réelles (et bien coûteuses), vous avez la solution de Bill Karwin avec CURRENT_TIMESTAMP et j’aimerais en proposer une autre, basée sur des déclencheurs (j’utilise celui-là).

Vous commencez par créer une table distincte (ou peut-être avez-vous une autre table utilisable à cette fin) qui fonctionnera comme un stockage pour les variables globales (ici les horodatages). Vous devez stocker deux champs – le nom de la table (ou la valeur que vous souhaitez conserver ici en tant qu’identifiant de la table) et l’horodatage. Après l’avoir, vous devez l’initialiser avec cet identifiant de table + date de début (NOW () est un bon choix :)).

Maintenant, vous passez aux tables que vous souhaitez observer et ajoutez des déclencheurs APRÈS INSERT / UPDATE / DELETE avec cette procédure ou une procédure similaire:

 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 

C’est ce que j’ai fait, j’espère que ça aide.

 1r tr.: ".$row['UPDATE_TIME']; } ?> 

Cache la requête dans une variable globale lorsqu’elle n’est pas disponible.

Créez une page Web pour forcer le rechargement du cache lorsque vous le mettez à jour.

Ajoutez un appel à la page de rechargement dans vos scripts de déploiement.