We have been witnessing a phenomenal increase in the use of proxies in
computer networks in recent times. Just to refresh, a proxy (a computer system
or an application) is used to service the requests of clients by forwarding them
to the server. It not only provides users an access to the server but also
monitors and analyses the client-server communication. For MySQL database users,
there's a tool named MySQL Proxy which also functions in the same manner and
provides additional functionality.
MySQL Proxy is a tool that sits between the MySQL clients and server, and
monitors the client's queries to the server for modification and filtering. It
also provides server failover support, load balancing and much more. It is a
part of the MySQL Enterprise Tools project and is available as a binary package
for Linux, Mac OS and Solaris platforms right now. The binary for Windows is
expected anytime soon.
About MySQL Proxy
MySQL Proxy is a lightweight binary application that stands between MySQL
clients and MySQL server. Using their credentials, the clients connect to the
Proxy instead of server, while the Proxy acts as the redirector for client's
requests to the server. MySQL Proxy doesn't just perform the pass-through of
client's requests to the MySQL server, but is also capable of monitoring,
analyzing and even altering the communication between the client and the server.
The Proxy is shipped with embedded Lua interpreters.
Direct Hit! |
Applies To: MySQL users on Linux USP: Tool to monitor and modify client queries to MySQL server Primary Link: http://dev.mysql.com/ downloads/mysql-proxy Google Keywords:MySQL Proxy |
The Lua scripting language is used to intercept the user queries and add
profiling to the query. By intercepting user queries, the proxy can insert
additional queries such as the query to know the execution time to the list of
client's queries and can remove the additional results that were returned by the
database server. With Proxy monitoring, filtering or manipulation on queries can
be performed without the user being even aware of them.
Getting started
MySQL Proxy is available in pre-compiled binaries that can be used for
installation on a supporting platform. For this article we shall be using Linux
derivative Fedora 9 OS as the platform. But Proxy also needs the Lua scripting
engine, and the current binary package version for MySQL Proxy contains the Lua
interpreter.
From one console, start MySQL Proxy and from the second console, connect to Proxy. When we pass queries having wrong keywords, they get replaced at the Proxy and the query with correct keywords is passed to the main server. |
It supports MySQL 5.0.1 version and above, so it becomes a pre-requisite to
have MySQL 5.0.x version of database server installed on your Fedora 9 machine.
Instead of installing Proxy using a binary package, we used 'Yum' to download
and install MySQL Proxy. The command for installing Proxy is as follows:
#yum install MySQL-proxy
As, Proxy also needs Lua interpreter; yum will install all dependencies that
are needed for MySQL Proxy. Once the download and installation is complete, we
can start using the Proxy for MySQL database server.
The syntax for MySQL Proxy is as follows:
#mysql-proxy —-proxy-lua-script=
Where
modify query transactions between the server and clients. To test the
connection, start the MySQL database server and from the same console start the
proxy server by passing the command 'mysql-proxy,' and again from another
console connect to the proxy server using port 4040 instead of 3306 (default) as
follows:
#mysql --host=127.0.0.1 --port=4040 --user=USERNAME
--password
When we pass any query from this console, it connects to the proxy at port
4040 and then is redirected to the MySQL server listening at port 3306.
Scripting for query modification
MySQL Proxy uses Lua scripts to intercept the communication between clients and
the server. Many a times it happens that a user misspells a keyword and because
of that the system throws an error. So, the user has to rewrite the whole query
again. A proxy server can be passed with a Lua script that looks for such
commonly misspelt words and corrects them. It then directs the query to the
database server. The user would not even be aware of the typo error in his query
and will still get the desired result. The following Lua script when passed to
the proxy server will catch the client's queries for common typos and replace
them with correct ones. For instance, keywords like 'CREATE' being typed as
'CRAETE' or 'SELECT' being typed as 'SLECT'. The following Lua script checks for
such typing errors in the queries. Open a text editor and save the script as 'demoScript.lua'.
function read_query( packet )
if string.byte(packet) == proxy.COM_QUERY then
local query = string.sub(packet, 2)
print ("Query Received " .. query)
local replacing = false
-- matches "CRAETE" as first word of the query
if string.match(string.upper(query), '^%s*CRAETE') then
query = string.gsub(query,'^%s*%w+', 'CREATE')
replacing = true
-- matches "SLECT" as first word of the query
elseif string.match(string.upper(query), '^%s*SLECT') then
query = string.gsub(query,'^%s*%w+', 'SELECT')
replacing = true
end
if (replacing) then
print("Error Replaced with " .. query )
proxy.queries:append(1, string.char(proxy.COM_QUERY) .. query )
return proxy.PROXY_SEND_QUERY
end
end
end
Now start the proxy server and also pass the demoScript along with it as
follows:
Mysql-proxy —proxy-lua-script=demoScript.lua
From a separate MySQL client console window, connect to the MySQL Proxy and
then create a table with a wrongly spelt word. For instance, 'CREATE' as 'CRAETE.'
The code would be as follows:
#mysql —u USERNAME —p PASSWORD —h 127.0.0.1 —P 4040
MySQL> CRAETE table demo (uid int);
Even when we pass an error in the query, the query is caught for errors at
the Proxy and after corrections to the query it's directed to the main MySQL
server.
In conclusion
Thus, by use of such scripts we can create filters or auto-correction for typed
errors so that the user gets his query answered even if he had passed an
erroneous query.
This was just a simple demo on how queries get modified; the possible uses of
the MySQL Proxy are many more, including load balancing and query injections.
More can be learnt about them from the MySQL Proxy documentation online.