it-swarm.com.de

Wie kann ich feststellen, wann eine MySQL-Tabelle zuletzt aktualisiert wurde?

In der Fußzeile meiner Seite möchte ich etwas hinzufügen wie "xx/xx/200x zuletzt aktualisiert", wobei an diesem Datum zum letzten Mal eine bestimmte mySQL-Tabelle aktualisiert wurde.

Was ist der beste Weg dies zu tun? Gibt es eine Funktion zum Abrufen des letzten aktualisierten Datums? Soll ich jedes Mal auf die Datenbank zugreifen, wenn ich diesen Wert benötige?

153
RaGE

In späteren Versionen von MySQL können Sie anhand der Datenbank information_schema feststellen, wann eine andere Tabelle aktualisiert wurde:

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

Dies bedeutet natürlich, dass Sie eine Verbindung zur Datenbank herstellen.


Eine alternative Option wäre, eine bestimmte Datei zu "berühren", wenn die MySQL-Tabelle aktualisiert wird:

Bei Datenbank-Updates:

  • Öffnen Sie Ihre Zeitstempeldatei im O_RDRW-Modus
  • close es wieder

oder alternativ

  • verwenden Sie touch() , das Äquivalent von PHP der utimes()-Funktion, um den Dateizeitstempel zu ändern.

On-Page-Anzeige:

  • verwenden Sie stat(), um die Änderungszeit der Datei zurückzulesen.
243
Alnitak

Ich habe keine information_schema-Datenbank mit der mysql-Version 4.1.16. In diesem Fall können Sie dies abfragen:

SHOW TABLE STATUS FROM your_database LIKE 'your_table';

Es werden diese Spalten zurückgegeben:

 | Name | Motor | Version | Row_format | Zeilen | Avg_row_length 
| Datenlänge | Max_data_length | Indexlänge | Datenfrei | Auto_inkrement 
| Create_time | Updatezeit          | Check_time | Kollation 
| Prüfsumme | Create_options | Kommentar |

Wie Sie sehen, gibt es eine Spalte mit dem Namen " Update_time ", die Ihnen die letzte Aktualisierungszeit für your_table anzeigt.

53
Radu Maris

Ich bin überrascht, dass niemand vorgeschlagen hat, die letzte Aktualisierungszeit pro Zeile zu verfolgen:

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;

Dies aktualisiert den Zeitstempel, obwohl wir ihn im UPDATE nicht erwähnt haben.

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

Jetzt können Sie nach MAX () abfragen:

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

Dies erfordert zwar mehr Speicher (4 Bytes pro Zeile für TIMESTAMP).
Aber das funktioniert für InnoDB-Tabellen vor der MySQL-Version 5.7.15, was INFORMATION_SCHEMA.TABLES.UPDATE_TIME nicht tut.

46
Bill Karwin

Für eine Liste der letzten Tabellenänderungen verwenden Sie Folgendes:

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

Am einfachsten wäre es, den Zeitstempel der Tabellendateien auf der Festplatte zu überprüfen. Sie können beispielsweise in Ihrem Datenverzeichnis nachsehen 

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

Daraufhin sollten Sie zuerst die Liste aller Tabellen mit der Tabelle anzeigen, als sie zuletzt zum ältesten Zeitpunkt geändert wurde.

5
user2654744

Ich würde einen Auslöser erstellen, der alle Aktualisierungen/Einfügungen/Löschvorgänge abfängt und Zeitstempel in eine benutzerdefinierte Tabelle schreibt Zeitstempel 

Nur weil ich die Idee nicht mag, interne Systemtabellen des Datenbankservers direkt zu lesen

5
Mikhail

Obwohl es eine akzeptierte Antwort gibt, habe ich nicht das Gefühl, dass es die richtige ist. Es ist der einfachste Weg, um das zu erreichen, was benötigt wird, aber selbst wenn es bereits in InnoDB aktiviert ist (tatsächlich sagen Docs, dass Sie immer noch NULL erhalten sollten ...), wenn Sie MySQL docs lesen, auch in der aktuellen Version (8.0 ) UPDATE_TIME zu verwenden ist nicht die richtige Option, weil:

Zeitstempel werden nicht beibehalten, wenn der Server neu gestartet wird oder wenn Die Tabelle wird aus dem InnoDB-Datenwörterbuchcache entfernt.

Wenn ich es richtig verstanden habe (kann es jetzt nicht auf einem Server überprüfen), wird der Zeitstempel nach dem Neustart des Servers zurückgesetzt.

Was echte (und teure) Lösungen angeht, so haben Sie Bill Karwins Lösung mit CURRENT_TIMESTAMP und ich möchte eine andere vorschlagen, die auf Triggern basiert (ich verwende diese).

Sie beginnen mit dem Erstellen einer separaten Tabelle (oder möglicherweise haben Sie eine andere Tabelle, die für diesen Zweck verwendet werden kann), die als Speicher für globale Variablen (hier Zeitstempel) fungiert. Sie müssen zwei Felder speichern - den Tabellennamen (oder den Wert, den Sie hier als Tabellen-ID behalten möchten) und den Zeitstempel. Nachdem Sie es haben, sollten Sie es mit dieser Tabellen-ID + Startdatum initialisieren (JETZT () ist eine gute Wahl :)).

Jetzt bewegen Sie sich zu den Tabellen, die Sie beobachten möchten, und fügen nach dem Einfügen/Aktualisieren/Löschen die Trigger mit dieser oder einer ähnlichen Prozedur hinzu:

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
1
Soul Reaver

Wenn Sie Linux verwenden, können Sie mit inotify die Tabelle oder das Datenbankverzeichnis anzeigen. Inotify gibt es in PHP, node.js, Perl und ich vermute die meisten anderen Sprachen. Natürlich müssen Sie inotify installiert haben oder von Ihrem ISP installieren lassen. Viele ISP werden nicht.

0
bartonlp

Holen Sie sich einfach das Dateidatum aus dem Dateisystem. In meiner Sprache heißt das:

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

Ausgabe:

1/25/2013 06:04:10 AM
0
Steve Wood

Analyse auf Betriebssystemebene:

Finden Sie heraus, wo die Datenbank auf der Festplatte gespeichert ist:

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

Überprüfen Sie die neuesten Änderungen

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

Sollte auf allen Datenbanktypen funktionieren.

0
John McLean

Nicht sicher, ob dies von Interesse wäre. Die Verwendung von mysqlproxy zwischen mysql und clients und die Verwendung eines Lua-Skripts zum Aktualisieren eines Schlüsselwerts in memcached gemäß interessanten Tabellenänderungen. UPDATE, DELETE, INSERT war die Lösung, die ich kürzlich getan habe. Wenn der Wrapper Hooks oder Trigger in PHP unterstützt, könnte dies unkomplizierter gewesen sein. Das macht bisher keiner der Wrapper. 

0