So che esiste general_log che registra tutte le query, ma voglio scoprire quale query ha un errore e ottenere il messaggio di errore. Ho provato a eseguire una query di errore di proposito, ma registra come una normale query e non segnala con errore. Qualche idea?Come registrare le query di errore in mysql?
risposta
So che questo è antico ora, ma per chiunque abbia lo stesso problema che atterra qui da Google, ecco i miei due centesimi.
Se si utilizza il cli client, è possibile semplicemente reindirizzare lo sterr in un file e quindi analizzarlo.
mysql -u user -p 2> errors.log
ho provato a fare funzionare una query di errore sul scopo, ma si registra come una query normale e non segnalarlo con l'errore. Qualche idea ?
quindi, hai fatto male. Nessuna altra idea senza il codice.
in PHP che sto facendo in questo modo (supporre che si sta utilizzando il driver mysql):
$res=mysql_query($sql) or trigger_error(mysql_error().$sql);
che registrerà tutte le domande errate se avete log_errors
impostazione (e si deve)
MODIFICA: Vedo ora, si desidera la registrazione a livello globale, m non il livello di applicazione. Ma il livello di applicazione potrebbe essere adatto anche a te?
Inserisco sql tramite phpmyadmin 3.3.2 che stanno facendo male? –
@user phpmyadmin è un'applicazione per utente singolo, quindi non necessita di alcuna registrazione. –
Vedo ora, modificato la mia risposta –
There is no functionality in MySQL to do this.
È necessario attenersi alla registrazione del livello dell'applicazione.
perché? una domanda - perché? è troppo difficile ... fare? basta registrare la query e l'errore quando lo si restituisce al client. –
@Serge: non lo so. Sembra che non dovrebbe essere troppo difficile da implementare. Forse una questione di separazione delle preoccupazioni (vale a dire che è responsabilità del cliente ottenere correttamente la dichiarazione SQL ed è libero di registrare gli errori come desidera). –
Anche se questa domanda è piuttosto vecchia, spero che possa essere utile a qualcuno che ha cercato query sugli errori di mysql log o termini simili.
Non molto tempo fa ho anche richiesto a mysqld di registrare solo le query errate. Ho scoperto che mysql-proxy consente di farlo e ho scritto un piccolo script LUA:
local err_flag = false
function read_query(packet)
if packet:byte() == proxy.COM_QUERY then
local user = proxy.connection.client.username
local host = proxy.connection.client.src.name
if user:lower() == 'someuser' then -- change this to any condition where errors should be logged
proxy.queries:append(1, packet, {resultset_is_needed = true})
proxy.queries:append(2, string.char(proxy.COM_QUERY) .. "SET @last_query = '" .. string.sub(packet, 2) .. "'", {resultset_is_needed = true})
proxy.queries:append(3, string.char(proxy.COM_QUERY) .. "SHOW WARNINGS", {resultset_is_needed = true})
end
return proxy.PROXY_SEND_QUERY
end
end
function insert_query(err_t, err_n, err_m)
local query = "INSERT INTO `somedb`.`mysql_error` " .. -- change log destination
"(`date`, `err_num`,`err_type`, `err_message`, `problem_query`, `conn_id`)" ..
" VALUES (NOW(), " ..
err_n .. "," .. "\"" ..
err_t .."\"" .. "," .. "\"" ..
err_m .. "\"" .. "," ..
"@last_query" .. "," ..
proxy.connection.server.thread_id .. ")"
proxy.queries:append(4, string.char(proxy.COM_QUERY) .. query, {resultset_is_needed = true})
return proxy.PROXY_SEND_QUERY
end
function read_query_result(inj)
local res = assert(inj.resultset)
if inj.id == 1 then
err_flag = false
if res.query_status == proxy.MYSQLD_PACKET_ERR then
err_flag = true
return proxy.PROXY_IGNORE_RESULT
end
elseif inj.id == 2 then
return proxy.PROXY_IGNORE_RESULT
elseif inj.id == 3 then
if err_flag == true then
for row in res.rows do
proxy.response.type = proxy.MYSQLD_PACKET_ERR
proxy.response.errmsg = row[3]
insert_query(row[1], row[2], row[3])
end
return proxy.PROXY_SEND_RESULT
end
return proxy.PROXY_IGNORE_RESULT
elseif inj.id == 4 then
return proxy.PROXY_IGNORE_RESULT
end
end
DDL necessario per tabella di registrazione, regolare somedb
. mysql_error
a piacere, ma non dimenticare di farlo anche nello script LUA sopra indicato.
CREATE TABLE `somedb`.`mysql_error` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` datetime NOT NULL,
`err_num` smallint(6) NOT NULL,
`err_type` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
`err_message` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`problem_query` varchar(8000) COLLATE utf8_unicode_ci NOT NULL,
`conn_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Per utilizzare lo script, eseguire
/path/to/mysql-proxy --proxy-lua-script=/path/to/mysql-proxy-log-error-queries.lua
o se non funziona (> = v0.9)
/path/to/mysql-proxy --proxy-lua-script=/path/to/mysql-proxy-log-error-queries.lua --plugins=proxy
Il proxy viene eseguito sulla porta di default 4040
, per verificare:
mysql -u username -p --host=127.0.0.1 --port=4040
ed eseguire alcuni sql difettosi.
Quando tutto sembra essere in ordine, impostare la porta nella propria applicazione su 4040 invece della vera porta mysqld e si ha l'errore mysql che si registra sul livello del database.
Nota finale: mysql-proxy è beta. Uso con cautela Immagino. Sono corso qui da quasi sei mesi senza problemi, comunque YMMV.
Bello, ho provato e ci è voluto un po 'per farlo funzionare finalmente, ma funziona come un fascino. A proposito, non è nemmeno beta, è ancora alfa. http://dev.mysql.com/downloads/mysql-proxy/ –
Non è un killer delle prestazioni? Penso che la gestione degli errori sul lato client andrebbe bene – Zaffy
Funziona. Grande! – hellojinjie
È possibile registrare le richieste di errore con MariaDB Audit Plugin.
Il plugin MariaDB Audit funziona con MariaDB, MySQL e Percona Server.
Ad esempio, per queste query
select now();
select now()+();
select 9+();
select 'hello';
registro sembra che questo:
20150807 23:00:36,mnv-Satellite-L300D,root,localhost,82,377,QUERY,`test`,'select now()
LIMIT 0, 1000',0
20150807 23:00:37,mnv-Satellite-L300D,root,localhost,82,379,QUERY,`test`,'select now()+()',1064
20150807 23:00:37,mnv-Satellite-L300D,root,localhost,82,382,QUERY,`test`,'select 9+()',1064
20150807 23:00:38,mnv-Satellite-L300D,root,localhost,82,383,QUERY,`test`,'select \'hello\'
LIMIT 0, 1000',0
ultima colonna è codice di ritorno. 0 è Ok. Altro - errore.
- 1. Come registrare le query PostgreSQL?
- 2. Come registrare le query SQL CoreData?
- 3. Come registrare tutte le query di Doctrine in un file?
- 4. Monitorare le query di un utente MySQL
- 5. Come registrare le query di Rails prima che si verifichino?
- 6. Come rintracciare le query MySql usando MySql-Proxy?
- 7. Come posso generare/registrare la query sql generata dalle query di Orm di Fuel PHP?
- 8. Query lente di debug di MySQL?
- 9. Come elencare le query memorizzate nella cache in MySQL? (Qcache_queries_in_cache)
- 10. Come ottimizzare le query MySQL in base al piano EXPLAIN
- 11. Come registrare query sql generate da Simple.Data ORM per .NET
- 12. Come vedere le query mysql nella console di rails
- 13. Come posso gestire le query di sovrapposizione poligono MySQL?
- 14. Come creare query MySQL personalizzate in CakePHP?
- 15. MySql Errore 150 - Le chiavi esterne
- 16. Come registrare le eccezioni "catched"?
- 17. Come eseguire due query mysql come una in PHP/MYSQL?
- 18. Query Mysql async più query
- 19. Uso di variabili in una query MySQL
- 20. Come registrare le eccezioni uncatched di QApplication?
- 21. MySQL Query non aggiorna le righe
- 22. MySQL - come scrivere questa query
- 23. Come pianificare una query MySQL?
- 24. sconosciuta colonna 'dei campi' errore su MySQL query di aggiornamento
- 25. ordine Mantenere in MySQL "IN" di query
- 26. Come interrompere una query mysql in esecuzione
- 27. Errore o errore di blocco mysql?
- 28. Query Mysql per convertire dinamicamente le righe in colonne
- 29. Come registrare le aree per il routing
- 30. Trasposizione righe di query mysql in colonne
Grazie, non sapevo potrebbe farlo, piuttosto che accedere a un file. L'ho fatto registrare su un database, invece. Saluti. –