Hoe weet ik wanneer een MySQL-tabel voor het laatst is bijgewerkt?

In de voettekst van mijn pagina zou ik iets willen toevoegen als “laatst bijgewerkt op xx/xx/200x”, waarbij deze datum de laatste keer is dat een bepaalde mySQL-tabel is bijgewerkt.

Wat is de beste manier om dat te doen? Is er een functie om de laatst bijgewerkte datum op te halen? Moet ik elke keer dat ik deze waarde nodig heb toegang krijgen tot de database?


Antwoord 1, autoriteit 100%

In latere versies van MySQL kunt u de database information_schemagebruiken om u te vertellen wanneer een andere tabel is bijgewerkt:

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

Dit betekent natuurlijk wel dat er een verbinding met de database moet worden geopend.


Een alternatieve optie zou zijn om een ​​bepaald bestand te “aanraken” wanneer de MySQL-tabel wordt bijgewerkt:

Over database-updates:

  • Open uw tijdstempelbestand in de modus O_RDRW
  • closehet weer

of anders

  • gebruik touch(), het PHP-equivalent van de functie utimes()om de tijdstempel van het bestand te wijzigen.

Op paginaweergave:

  • gebruik stat()om de wijzigingstijd van het bestand terug te lezen.

Antwoord 2, autoriteit 21%

Het verbaast me dat niemand heeft voorgesteld om de tijd van de laatste update per rij bij te houden:

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;

Hiermee wordt de tijdstempel bijgewerkt, ook al hebben we dit niet vermeld in de 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 |
+----+------+---------------------+

Nu kunt u de MAX() opvragen:

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

Toegegeven, dit vereist meer opslagruimte (4 bytes per rij voor TIMESTAMP).
Maar dit werkt voor InnoDB-tabellenvóór versie 5.7.15 van MySQL, wat INFORMATION_SCHEMA.TABLES.UPDATE_TIMEniet doet.


Antwoord 3, autoriteit 20%

Ik heb geen information_schema database, gebruik mysql versie 4.1.16, dus in dit geval kun je dit opvragen:

SHOW TABLE STATUS FROM your_database LIKE 'your_table';

Het geeft deze kolommen terug:

| Naam | Motor | Versie | Rij_formaat | Rijen | Gem_row_length 
| Data_length | Max_data_length | Index_length | Data_vrij | Auto_increment
| Create_time | Update_time| Check_time | Sorteren
| Controlesom | Create_options | Reageer |

Zoals je kunt zien is er een kolom met de naam: “Update_time” die je de laatste updatetijd voor your_tablelaat zien.


Antwoord 4, autoriteit 6%

Het eenvoudigste zou zijn om de tijdstempel van de tabelbestanden op de schijf te controleren. U kunt bijvoorbeeld controleren onder uw gegevensmap

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

Dit zou u de lijst moeten geven van alle tabellen met eerst de tabel waarin deze voor het laatst is gewijzigd, de oudste keer.


Antwoord 5, autoriteit 4%

Gebruik dit voor een lijst met recente tabelwijzigingen:

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

Antwoord 6, autoriteit 2%

Ik zou een trigger maken die alle updates/invoegingen/verwijderingen opvangt en een tijdstempel in een aangepaste tabel schrijft, zoiets als
tafelnaam | tijdstempel

Alleen omdat ik het idee niet leuk vind om de interne systeemtabellen van de db-server rechtstreeks te lezen


Antwoord 7

Hoewel er een geaccepteerd antwoord is, heb ik niet het gevoel dat het het juiste is. Het is de eenvoudigste manier om te bereiken wat nodig is, maar zelfs als het al is ingeschakeld in InnoDB (eigenlijk zeggen de documenten dat je nog steeds NULL zou moeten krijgen …), als je MySQL docs, zelfs in de huidige versie (8.0) is het gebruik van UPDATE_TIME niet de juiste optie, omdat:

Tijdstempels worden niet bewaard wanneer de server opnieuw wordt opgestart of wanneer de
tabel wordt verwijderd uit de cache van het InnoDB-datawoordenboek.

Als ik het goed begrijp (kan het nu niet verifiëren op een server), wordt de tijdstempel gereset nadat de server opnieuw is opgestart.

Wat betreft echte (en, nou ja, dure) oplossingen, je hebt de oplossingvan Bill Karwin met CURRENT_TIMESTAMP en ik zou graag een andere voorstellen, die is gebaseerd op triggers (die gebruik ik).

Je begint met het maken van een aparte tabel (of misschien heb je een andere tabel die voor dit doel kan worden gebruikt) die zal werken als een opslag voor globale variabelen (hier tijdstempels). U moet twee velden opslaan: tabelnaam (of welke waarde u hier ook wilt behouden als tabel-ID) en tijdstempel. Nadat je het hebt, moet je het initialiseren met deze tabel-ID + startdatum (NOW() is een goede keuze 🙂 ).

Nu ga je naar de tabellen die je wilt observeren en voeg je triggers toe NA INSERT/UPDATE/DELETE met deze of soortgelijke procedure:

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

Antwoord 8

Analyse op besturingssysteemniveau:

Zoek waar de DB op schijf is opgeslagen:

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

Controleer op de meest recente wijzigingen

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

Zou moeten werken op alle databasetypes.


Antwoord 9

a) Het toont u alle tabellen en hun laatste updatedatums

SHOW TABLE STATUS FROM db_name;

dan kunt u verder vragen om een ​​specifieke tabel:

SHOW TABLE STATUS FROM db_name like 'table_name';

b) Zoals in bovenstaande voorbeelden kunt u niet sorteren op ‘Update_time’, maar met SELECT kunt u:

SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA='db_name' ORDER BY UPDATE_TIME DESC;

om verder te vragen over een bepaalde tafel:

SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA='db_name' AND table_name='table_name' ORDER BY UPDATE_TIME DESC';

Antwoord 10

Ik heb dit lokaal laten werken, maar niet op mijn gedeelde host voor mijn openbare website (probleem met rechten denk ik).

SELECT last_update FROM mysql.innodb_table_stats WHERE table_name = 'yourTblName';
'2020-10-09 08:25:10'

MySQL 5.7.20-log op Win 8.1


11

Niet zeker of dit van enig belang zou zijn. Met behulp van mysqlproxy tussen mysql en klanten, en gebruik maken van een lua script een belangrijke waarde in memcached volgens interessante tafel verandert UPDATE updaten, verwijderen, invoegen was de oplossing die ik vrij recent deed. Als de wrapper ondersteund haken of triggers in php, kan dit eaiser zijn geweest. Geen van de wrappers vanaf nu doet dit.


12

ik maakte een column op naam:-update-at in phpMyAdmin en kreeg de huidige tijd van het Date () methode in mijn code (NodeJS). bij iedere verandering in de tabel deze kolom houdt u de tijd van de veranderingen.


13

Cache de query in een globale variabele als het niet beschikbaar is.

Een webpagina om de cache te dwingen om te herladen wanneer je te werken.

een oproep aan de herladen pagina toevoegen in uw implementatie scripts.

Other episodes