2010-04-17 14 views
6

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

4

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

Grazie, non sapevo potrebbe farlo, piuttosto che accedere a un file. L'ho fatto registrare su un database, invece. Saluti. –

1

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?

+0

Inserisco sql tramite phpmyadmin 3.3.2 che stanno facendo male? –

+0

@user phpmyadmin è un'applicazione per utente singolo, quindi non necessita di alcuna registrazione. –

+0

Vedo ora, modificato la mia risposta –

6

There is no functionality in MySQL to do this.

È necessario attenersi alla registrazione del livello dell'applicazione.

+0

perché? una domanda - perché? è troppo difficile ... fare? basta registrare la query e l'errore quando lo si restituisce al client. –

+0

@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). –

2

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.

+0

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/ –

+0

Non è un killer delle prestazioni? Penso che la gestione degli errori sul lato client andrebbe bene – Zaffy

+0

Funziona. Grande! – hellojinjie

1

È 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.

Problemi correlati