2008-11-21 9 views
138

En bas de ma page, j'aimerais ajouter quelque chose comme "last updated the xx/xx/200x" avec cette date étant la dernière fois qu'une certaine table mySQL a été mise à jour.Comment puis-je savoir quand une table MySQL a été mise à jour pour la dernière fois?

Quelle est la meilleure façon de faire cela? Y at-il une fonction pour récupérer la dernière date mise à jour? Dois-je accéder à la base de données chaque fois que j'ai besoin de cette valeur?

+0

Connexes: http://stackoverflow.com/questions/12563706/-there-a-mysql-option-feature-pour-track-history-of-changes-to-records –

Répondre

217

Dans les versions ultérieures de MySQL, vous pouvez utiliser la base de données information_schema pour vous dire quand une autre table a été mise à jour:

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

Cela veut évidemment dire l'ouverture d'une connexion à la base de données.


Une autre option serait de "toucher" un fichier particulier à chaque fois que la table MySQL est mis à jour:

des mises à jour de base de données:

  • Ouvrez votre fichier d'horodatage en O_RDRW le mode
  • close encore une fois

ou bien

  • utilisation touch(), l'équivalent de la fonction PHP utimes(), pour changer l'horodatage de fichier.

Sur l'affichage de la page:

  • utilisation stat() relire le temps de modification du fichier.
+0

sont je peux le manipuler. signifie que si je veux changer la valeur que MySQL me donne quand j'exécute cette requête –

+71

Cela ne fonctionne que pour le moteur MyISAM. – svandragt

+6

Pour plus de détails, y compris les limitations InnoDB, voir http://dev.mysql.com/doc/refman/5.5/fr/show-table-status.html ('show table status' utilise' information_schema.tables') – KCD

-8

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.

+2

vous ne pouvez pas "mettre en cache" variables entre invocations indépendantes d'une page PHP sans aide extérieure. – Alnitak

49

Je n'ai pas la base de données de information_schema, en utilisant la version de MySQL 4.1.16, donc dans ce cas, vous pouvez interroger ceci:

SHOW TABLE STATUS FROM your_database LIKE 'your_table'; 

Il retournera ces colonnes:

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

Comme vous pouvez le voir il ya une colonne appelée: "Update_time" qui vous montre la dernière heure de mise à jour pour your_table.

+29

ne fonctionne pas avec innodb – ajacian81

+2

Il exécute également une instruction SELECT (0x) – jmav

+0

Cette commande doit être sélectionnée comme bonne réponse – Code

-1

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

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

Merci, '' a fait l'affaire pour moi;) –

+2

Pourquoi voudriez-vous utiliser comme ici? –

+3

@WesleyMurch: la balise est très obsolète. – siride

5

Je voudrais créer un déclencheur qui attire toutes les mises à jour/insertions/suppressions et horodatage écrire dans le tableau personnalisé, quelque chose comme tablename | horodatage

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

+1

Cela semble être une bonne solution pour MS SQL, car il n'y a pas de colonne 'UPDATE_TIME' comme dans MySQL. – Darcy

4

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

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

Pourquoi toutes mes 'UPDATE_TIME' sont nulles? Une idée? – Metafaniel

+3

Votre UPDATE_TIME est nul, car vous utilisez InnoDB au lieu de MyISAM. InnoDB est généralement le meilleur choix, mais il ne prend pas en charge UPDATE_TIME. – Xaraxia

0

suffit de saisir la date de fichier modifié à partir du système de fichiers. Dans ma langue qui est la suivante:

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

Sortie:

1/25/2013 06:04:10 AM 
+4

ressemble à un hack hautement non portable, un moyen standard qui fonctionnerait partout serait mieux –

+0

Cela ne fonctionnera pas avec d'autres types de table. – Brad

0

Si vous utilisez Linux, vous pouvez utiliser inotify pour regarder la table ou le répertoire de base de données. inotify est disponible depuis PHP, node.js, perl et je suspecte la plupart des autres langages. Bien sûr, vous devez avoir installé inotify ou demandé à votre FAI de l'installer. Beaucoup de FAI ne le feront pas.

+1

Les vérifications du système de fichiers ne sont pas utiles si votre base de données fonctionne sur un serveur séparé. –

41

Je suis surpris que personne n'a suggéré le suivi de la dernière fois la 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; 

Cette met à jour l'horodatage même si nous n'avons pas mentionné dans le 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 | 
+----+------+---------------------+ 

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 qui n'est pas le cas pour INFORMATION_SCHEMA.TABLES.UPDATE_TIME.

+8

+1 En ce qui me concerne, c'est la seule bonne réponse à cette question. La question veut vraiment savoir quand les données pertinentes sont mises à jour, et non quand une table (qui n'est pas pertinente pour l'utilisateur) peut ou non avoir été changée pour une raison quelconque. – siride

+16

Mais si vous supprimez un enregistrement avec un temps de mise à jour inférieur, MAX (updated_at) ne fonctionnera pas. – Ammamon

+2

@Ammamon, vrai, si vous devez également tenir compte des suppressions, cette solution ne reflète pas cela. Un déclencheur pour mettre à jour un tableau récapitulatif peut être la seule solution complète, mais cela créerait un goulot d'étranglement. –

0

Vous ne savez pas si cela vous intéresse? Utiliser mysqlproxy entre mysql et clients, et utiliser un script lua pour mettre à jour une valeur de clé dans memcached en fonction des changements de table intéressants UPDATE, DELETE, INSERT était la solution que j'ai faite tout récemment. Si le wrapper supportait les hooks ou les triggers en php, cela aurait pu être utile. Aucun des wrappers à partir de maintenant fait cela.

3

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

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

Cela devrait vous donner la liste de toutes les tables avec la table lors de dernière modification le temps le plus ancien, d'abord.

0

analyse de niveau OS:

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

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

Vérifier la plupart des modifications récentes

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

devrait fonctionner sur tous les types de bases de données.

Questions connexes