Replikacja baz MySQL działa jako tako. Jeśli to typ MASTER – SLAVE, to na ogół ten drugi serwer się nudzi. Skoro się nudzi, można wykorzystać go do zapytań, które nie zmieniają niczego (SELECT). Jeśli oddamy go w takim stanie programiście, to pewne jest, że prędzej czy później będzie to jego serwer testowy i dziać się będą na nim różne rzeczy.
Pewnie sposobów na ograniczenie tego jest parę, ja zrobiłem to wykorzystując mysql-proxy i odpowiedni skrypt Lua. A wygląda to tak:
function read_query( packet )
-- local log_file = '/var/log/mysql-proxy.log'
-- local fh = io.open(log_file, 'a+')
if string.byte(packet) == proxy.COM_QUERY then
local query = string.sub(packet, 2)
if not (string.match(string.upper(query), '^%s*SELECT') or string.match(string.upper(query), '^%s*SHOW')) then
-- fh:write(string.format("%s %s\t%s\t%s\t%s\n", os.date('%Y-%m-%d %H:%M:%S'), proxy.connection.client.address, proxy.connection.client.username, proxy.connection.client.default_db, query))
proxy.response.type = proxy.MYSQLD_PACKET_ERR
proxy.response.errmsg = "Only SELECT and SHOW queries are available"
return proxy.PROXY_SEND_RESULT
end
end
-- fh:flush()
end
W powyższym kodzie zakomentowałem linijki odpowiadające za logowanie wszystkiego, co nie zaczyna się od SELECT lub SHOW.
Przy okazji poznałem głębiej jak działają takie skrypty (kiedyś coś tam już grzebałem). Do tego doszedłem:
proxy.queriesto kolejka zapytań, które sami (w skrypcie) stworzymy.reset()nie usunie nam zapytania, które przesyła klient (tym samymlen()zawsze pokaże 0),- jeżeli nie będziemy manipulować kolejką, to do serwera zawsze dojdzie to co wysłał klient,
- manipulować kolejką możemy poprzez np.
append(), a następnie wysyłać zapytania przezproxy.PROXY_SEND_QUERY, - możemy zupełnie pominąć to co wysyła klient i przygotować dla niego własną odpowiedź lub błąd (jak w skrypcie wyżej).
Warto zajrzeć na:
Tagi: LUA, MySQL, mysql-proxy