2010-04-06 8 views
8

È possibile registrare le istruzioni CREATE/ALTER emesse su un server MySQL tramite phpMyAdmin? Ho sentito che potrebbe essere fatto con un trigger, ma non riesco a trovare il codice adatto da nessuna parte. Vorrei registrare queste istruzioni su una tabella, preferibilmente con il timestamp di quando sono state rilasciate. Qualcuno può fornirmi un trigger di esempio che mi consenta di realizzare questo?MySQL 5.1/phpMyAdmin - registrazione delle istruzioni CREATE/ALTER

Vorrei registrare queste istruzioni in modo da poter sincronizzare facilmente le modifiche con un altro server MySQL.

+1

Stai provando a sincronizzare tutte le modifiche? La replica potrebbe essere la risposta? –

+0

No. I database contengono dati diversi, voglio solo mantenere sincronizzate le strutture delle tabelle. – pako

+0

Puoi confermare che sei interessato a registrare * solo * query phpMyAdmin? Se sì (e potrebbe essere il modo di procedere perché in questo modo puoi evitare di registrare le query normali), dai un'occhiata alla risposta di Jarod e mia. – Unreason

risposta

4

C'è un patch per phpMyAdmin che fornisce la registrazione configurabile con solo alcune semplici modifiche al codice.

Abbiamo fatto questo al mio lavoro e poi ho perfezionato ulteriormente per accedere alle cartelle di giorno, registrare gli indirizzi IP e un paio di altre cose e funziona benissimo.

Grazie a @Unreason per il collegamento, non ho potuto ricordare dove l'ho trovato.

+4

era http://sourceforge.net/tracker/index.php?func=detail&aid=1252596&group_id=23067&atid=377410? – Unreason

+0

@Unreason - sì quello era quello. –

+0

Il codice sembra un po 'complicato, ma darò un'occhiata a questo. – pako

1

La risposta alla tua domanda cadrà in uno dei elencati MySQL Server logs

Se si desidera solo per ottenere i CREATE/ALTER, vorrei andare con the general query log. Ma dovrai analizzare il file manualmente. Siate consapevoli dei problemi di sicurezza che questo approccio solleva.

Nel proprio scenario, la replica sembra essere eccessiva.

I trigger non sono un'opzione valida poiché sono supportati solo ai livelli SELECT, UPDATE e INSERT e non ALTER/CREATE.

Edit 1:

Il log delle query sarebbe la scelta migliore, ma come lei ha ricordato su server occupato i registri causerebbe un notevole rigore efficienza. L'unica alternativa aggiuntiva che conosco è MySQL Proxy.

+1

Il server SQL è piuttosto impegnato (oltre 70 query al secondo), quindi non voglio registrare ogni singola query. E non sembra possibile filtrare quali query dovrebbero essere salvate nel registro generale delle query. – pako

+0

Si potrebbe fare in modo che il file di registro sia un fifo che viene ascoltato da un altro daemon che filtra le voci del registro non appena vengono ricevute. Ciò ridurrebbe la penalità in quanto non si avrebbe il costo di scrivere tutto su disco. –

0

Penso che la soluzione migliore sarebbe quella di esaminare l'uso delle stored procedure e delle funzioni qui per apportare modifiche al DB. In questo modo è possibile esaminare i dati di registrazione manualmente.

+1

Uso phpMyAdmin per modificare la struttura del database e chiama direttamente le istruzioni ALTER/CREATE. – pako

2

Ecco uno script che farebbe ciò che si desidera per mysql-proxy (controllare il collegamento sui documenti ufficiali su come installare il proxy).

Per collegarvi in ​​realtà le query è possibile utilizzare qualcosa di semplice come

function string.starts(String,Start) 
    return string.sub(String,1,string.len(Start))==Start 
end 

function read_query(packet) 
    if string.byte(packet) == proxy.COM_QUERY then 
     local query = string.lower(string.sub(packet, 2)) 
     if string.starts(query, "alter") or string.starts(query, "create") then 
      -- give your logfile a name, absolute path worked for me 
      local log_file = '/var/log/mysql-proxy-ddl.log' 
      local fh = io.open(log_file, "a+") 
      fh:write(string.format("%s %6d -- %s \n", 
       os.date('%Y-%m-%d %H:%M:%S'), 
       proxy.connection.server["thread_id"], 
       query)) 
      fh:flush() 
     end 
    end 
end 

La sceneggiatura è stata adottata da here, ricerca per 'semplice la registrazione'.

Questo non interessa i risultati - anche se la query ha restituito un errore, verrebbe registrato (vi è un esempio di "registrazione più personalizzata", che è un candidato migliore per la registrazione di produzione).

Inoltre, è possibile adottare un altro approccio se è applicabile per l'utente: definire utenti diversi nel database e assegnare i diritti DDL solo a un determinato utente, quindi è possibile registrare tutto per quell'utente e non si deve preoccupare sui dettagli (ad esempio - delega riconosce il seguente server commands, di cui si ispeziona solo Query)

Installazione del Proxy è dritto in avanti, quando si prova è possibile eseguire con

mysql-proxy --proxy-lua-script=/path/to/script.lua 

funziona su porta 4040 di default quindi testalo con

mysql -u user -p -h 127.0.0.1 -P 4040 

(assicurarsi di non bypassare il proxy; per esempio sulla mia distro mysql -u user -p -h localhost -P 4040 ho completamente ignorato la porta e collegato tramite socket, che mi ha lasciato perplesso per alcuni minuti)