Desidero scoprire quali tabelle sono state modificate nell'ultima ora in un database MySQL. Come posso fare questo?Query per trovare tabelle modificate nell'ultima ora
risposta
MySQL 5.x può farlo tramite il database INFORMATION_SCHEMA. Questo database contiene informazioni sulle tabelle, viste, colonne, ecc
SELECT *
FROM `INFORMATION_SCHEMA`.`TABLES`
WHERE
DATE_SUB(NOW(), INTERVAL 1 HOUR) < `UPDATE_TIME`
restituisce tutti i tavoli che sono stati aggiornati (UPDATE_TIME) nelle ultime ore. Puoi anche filtrare per nome del database (colonna TABLE_SCHEMA).
Una query di esempio:
SELECT
CONCAT(`TABLE_SCHEMA`, '.', `TABLE_NAME`) AS `Table`,
UPDATE_TIME AS `Updated`
FROM `INFORMATION_SCHEMA`.`TABLES`
WHERE
DATE_SUB(NOW(), INTERVAL 3 DAY) < `UPDATE_TIME`
AND `TABLE_SCHEMA` != 'INFORMATION_SCHEMA'
AND `TABLE_TYPE` = 'BASE TABLE';
Grazie! Questo fa esattamente quello di cui avevo bisogno –
+1, bel modo per farlo. –
Tieni presente che questo approccio funziona solo con le tabelle MyISAM, non con InnoDB. –
Per ogni tabella che si desidera rilevare il cambiamento, è necessario disporre di una colonna che contiene timestamp dell'ultima modifica.
Per ogni inserimento o aggiornamento nella tabella, è necessario aggiornare tale colonna con la data e l'ora correnti.
In alternativa, è possibile impostare uno trigger che aggiorna automaticamente la colonna su ciascun inserto o modifica. In questo modo non devi modificare tutta la tua query.
Una volta che questo funziona, per scoprire se le righe da una tabella sono state modificate nelle ultime ore, eseguire la query
select count(*) from mytable where datemod>subtime(now(),'1:0:0')
Ripetere l'operazione per ogni tavolo si desidera controllare.
InnoDB al momento manca ancora un meccanismo nativo per recuperare queste informazioni. Nel related feature request at MySQL, qualcuno consiglia di impostare i trigger AFTER [all events]
su ciascuna tabella da monitorare. Il trigger emetterà una dichiarazione come
INSERT INTO last_update VALUE ('current_table_name', NOW())
ON DUPLICATE KEY UPDATE update_time = NOW();
in una tabella come questa:
CREATE TABLE last_update (
table_name VARCHAR(64) PRIMARY KEY,
update_time DATETIME
) ENGINE = MyISAM; -- no need for transactions here
alternativa, se una leggera inesattezza a questi dati (nell'intervallo di un secondo) è accettabile, e se hai accesso in lettura ai file di dati MySQL, puoi passare a un'impostazione dove inndb_files_per_table = ON
(consigliata in ogni caso) e controllare l'ultima ora di modifica dei file di dati sottostanti.
Questi file si trovano in /var/lib/mysql/[database_name]/*.ibd
nella maggior parte delle installazioni predefinite.
Nota: se si decide di percorrere questa tratta, è necessario recreate existing tables per la nuova impostazione da applicare.
È possibile utilizzare il tipo di dati TIMESTAMP anziché DATETIME. Definirlo come "' update_time' TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP " ... e verrà impostato automaticamente quando si inseriscono i dati, se omessi. – DustWolf
SELECT *
FROM information_schema.tables
WHERE UPDATE_TIME >= SYSDATE() - INTERVAL 1 DAY && TABLE_TYPE != 'SYSTEM VIEW'
SELECT *
FROM information_schema.tables
WHERE UPDATE_TIME >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) && TABLE_TYPE != 'SYSTEM VIEW'
ho risposto a una domanda come questa nel DBA StackExchange circa 1,5 anni fa: Fastest way to check if InnoDB table has changed.
Sulla base di quel vecchio risposta, vi consiglio il seguente
Flushing Scrive su disco
Questa è una configurazione di una volta. È necessario impostare innodb_max_dirty_pages_pct su 0.
Innanzitutto, aggiungere a/etc/my.CNF
[mysqld]
innodb_max_dirty_pages_pct=0
Poi, eseguire questo per evitare di dover riavviare mysql:
mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;
Restituisce un timestamp della tabella InnoDB di .ibd file
ls
ha la possibilità di recuperare il timestamp di UNIX in pochi secondi. Per una tabella InnoDB mydb.mytable
$ cd /var/lib/mysql/mydb
$ ls -l --time-style="+%s" mytable.ibd | awk '{print $6}'
È quindi possibile calcolare UNIX_TIMESTAMP(NOW()) - (timestamp of the .ibd file
) e vedere se è 3600 o meno.
Provalo !!!
Grazie Rolando! Questo è stato molto utile e informativo. – dotancohen
- 1. Sql Query per trovare le tabelle temporali in DB
- 2. Query SQL per trovare valori distinti in due tabelle?
- 3. Query SQL Server per trovare indici cluster
- 4. Postgres: ottimizzazione delle query per data/ora
- 5. Tabelle join query HQL
- 6. query SQL per unire tre tabelle
- 7. Query SQL per conteggio() più tabelle
- 8. query MySQL per unire tre tabelle
- 9. Query SQL per trovare righe che non sono presenti in altre tabelle
- 10. Posso esaminare un oggetto query sqlalchemy per trovare le tabelle già unite?
- 11. NHibernate Query su più tabelle
- 12. Applicazione array_agg/array_to_json a una query con colonne modificate
- 13. Interrogazione di più tabelle in Big Query
- 14. eliminare da due tabelle in una query
- 15. Query per trovare un prezzo medio ponderato
- 16. Query SQL per trovare i duplicati
- 17. MongoDB 'impossibile trovare l'indice per $ geoNear query'
- 18. Variabili modificate dall'API TeamSpeak per PHP
- 19. Query SQL per trovare i dati più efficaci
- 20. Confronto di data/ora in CAML Query per Sharepoint
- 21. Rails & Postgresql: come raggruppare le query per ora?
- 22. trovare la prossima ora più vicino
- 23. 1.3M query/ora. Come costruiresti le domande?
- 24. Query MongoDB per trovare la proprietà del primo elemento dell'array
- 25. Query per ottenere tutte le istruzioni CREATE delle tabelle MySql
- 26. query sql per restituire le differenze tra due tabelle
- 27. Query MySQL per creare colonne basate su altre tabelle
- 28. SUM Query per due campi in due tabelle diverse
- 29. ORMLite o query su più tabelle
- 30. modifiche github non modificate per il commit
Le tabelle hanno una colonna timestamp quando i dati sono stati modificati? – TomTom
Penso che molti di loro, se non tutti, abbiano un campo "creato". Non sono sicuro che questo risponda alla tua domanda; il database proviene da un sito web che non ho sviluppato ma devo mantenere, quindi sono un po 'perso. –
puoi descrivere l'usecase? potrebbe esserci una soluzione migliore a ciò che si vuole ottenere –