W stopce mojej strony chciałbym dodać coś w stylu „ostatnia aktualizacja xx / xx / 200x”, z datą ostatniej aktualizacji danej tabeli MySQL.
Jaki jest najlepszy sposób, aby to zrobić? Czy istnieje funkcja pobierania ostatniej zaktualizowanej daty? Czy powinienem mieć dostęp do bazy danych za każdym razem, gdy potrzebuję tej wartości?
Odpowiedzi:
W późniejszych wersjach MySQL możesz użyć
information_schema
bazy danych, aby poinformować Cię, kiedy została zaktualizowana inna tabela:Oznacza to oczywiście otwarcie połączenia z bazą danych.
Alternatywną opcją byłoby „dotknięcie” określonego pliku przy każdej aktualizacji tabeli MySQL:
W przypadku aktualizacji bazy danych:
O_RDRW
trybieclose
to znowulub alternatywnie
touch()
, odpowiednikautimes()
funkcji PHP , do zmiany znacznika czasu pliku.Wyświetlanie na stronie:
stat()
aby odczytać czas modyfikacji pliku.źródło
show table status
zastosowaniainformation_schema.tables
)UPDATE_TIME
metoda, ashow table status
poniżej metody są dostępne tylko przy silniku MyISAM, InnoDB nie. Chociaż jest to wymienione jako błąd , jest to wspomniane w dokumencie MySQL 5.5 Reference , który mówi również, żefile_per_table
tryb jest niewiarygodnym wskaźnikiem czasu modyfikacji.Nie mam bazy danych information_schema, używam mysql w wersji 4.1.16, więc w tym przypadku możesz zapytać o to:
Zwróci te kolumny:
Jak widać, istnieje kolumna o nazwie: „ Czas_aktualizacji ”, która pokazuje czas ostatniej aktualizacji dla Twojej_tabeli .
źródło
Jestem zaskoczony, że nikt nie zasugerował śledzenia czasu ostatniej aktualizacji w każdym wierszu:
To aktualizuje sygnaturę czasową, mimo że nie wspomnieliśmy o tym w AKTUALIZACJI.
Teraz możesz zapytać o MAX ():
Trzeba przyznać, że wymaga to więcej miejsca (4 bajty na wiersz dla TIMESTAMP).
Ale to działa dla tabel InnoDB przed wersją MySQL 5.7.15, co
INFORMATION_SCHEMA.TABLES.UPDATE_TIME
nie działa.źródło
Najprościej byłoby sprawdzić sygnaturę czasową plików tabel na dysku. Na przykład możesz sprawdzić w swoim katalogu danych
Powinno to dać ci listę wszystkich tabel z tabelą, kiedy była ostatnio modyfikowana, jako pierwsza.
źródło
Aby zobaczyć listę ostatnich zmian tabeli, użyj tego:
źródło
UPDATE_TIME
są zerowe? Dowolny pomysł?Utworzyłbym wyzwalacz, który przechwytuje wszystkie aktualizacje / wstawienia / usunięcia i zapisuje znacznik czasu w niestandardowej tabeli, coś w rodzaju nazwy tabeli | znak czasu
Tylko dlatego, że nie podoba mi się pomysł bezpośredniego odczytywania wewnętrznych tabel systemowych serwera db
źródło
UPDATE_TIME
kolumny jak w MySQL.Chociaż istnieje akceptowana odpowiedź, nie uważam, że jest ona właściwa. Jest to najprostszy sposób na osiągnięcie tego, co jest potrzebne, ale nawet jeśli jest już włączony w InnoDB (w rzeczywistości dokumenty mówią, że nadal powinieneś uzyskać NULL ...), jeśli czytasz dokumenty MySQL , nawet w aktualnej wersji (8.0) używając UPDATE_TIME jest niewłaściwa opcja, ponieważ:
Jeśli dobrze rozumiem (nie mogę tego teraz zweryfikować na serwerze), znacznik czasu zostanie zresetowany po ponownym uruchomieniu serwera.
Jak dla prawdziwych (i dobrze, kosztownych) rozwiązań, masz Bill Karwin za rozwiązanie z CURRENT_TIMESTAMP i chciałbym zaproponować inny, który jest oparty na wyzwalaczy (używam tego jednego).
Zaczynasz od stworzenia oddzielnej tabeli (a może masz jakąś inną tabelę, która może być użyta do tego celu), która będzie działać jak magazyn dla zmiennych globalnych (tutaj znaczniki czasu). Musisz przechowywać dwa pola - nazwę tabeli (lub jakąkolwiek wartość, którą chcesz tutaj zachować jako identyfikator tabeli) i znacznik czasu. Gdy już to zrobisz, powinieneś zainicjować go z tym id tabeli + data początkowa (NOW () to dobry wybór :)).
Teraz przechodzisz do tabel, które chcesz obserwować, i dodajesz wyzwalacze PO WSTAWIENIU / AKTUALIZACJI / USUNIĘCIU za pomocą tej lub podobnej procedury:
źródło
Analiza poziomu systemu operacyjnego:
Znajdź miejsce przechowywania bazy danych na dysku:
Sprawdź najnowsze modyfikacje
Powinien działać na wszystkich typach baz danych.
źródło
Po prostu pobierz datę pliku zmodyfikowaną z systemu plików. W moim języku to znaczy:
Wynik:
źródło
Jeśli używasz Linuksa, możesz użyć inotify do przejrzenia tabeli lub katalogu bazy danych. inotify jest dostępny z PHP, node.js, perl i podejrzewam, że większość innych języków. Oczywiście musisz mieć zainstalowany inotify lub mieć go zainstalowanego przez dostawcę usług internetowych. Wielu dostawców usług internetowych tego nie zrobi.
źródło
Nie jestem pewien, czy to mogłoby być interesujące. Użycie mysqlproxy pomiędzy mysql a klientami oraz użycie skryptu lua do aktualizacji wartości klucza w memcached zgodnie z interesującymi zmianami tabeli UPDATE, DELETE, INSERT było rozwiązaniem, które zrobiłem całkiem niedawno. Gdyby opakowanie wspierało przechwyty lub wyzwalacze w php, mogłoby to być łatwiejsze. Żaden z opakowań na razie tego nie robi.
źródło
Zrobiłem kolumnę według nazwy: update-at w phpMyAdmin i uzyskałem aktualny czas z metody Date () w moim kodzie (nodejs). z każdą zmianą w tabeli ta kolumna zawiera czas zmian.
źródło
a) Pokaże wszystkie tabele i tam ostatnie daty aktualizacji
następnie możesz zapytać o konkretną tabelę:
b) Jak w powyższych przykładach, nie możesz użyć sortowania według 'Update_time', ale używając SELECT możesz:
aby zapytać o konkretny stół:
źródło
To właśnie zrobiłem, mam nadzieję, że to pomoże.
źródło
Buforuj zapytanie w zmiennej globalnej, gdy nie jest dostępna.
Utwórz stronę internetową, aby wymusić ponowne załadowanie pamięci podręcznej podczas jej aktualizacji.
Dodaj wywołanie do strony ponownego ładowania w skryptach wdrażania.
źródło