MySQL Proxy 是官方提供的中間件,位於客戶端與 Server 之間,基於 MySQL 網絡協議透明轉發,並支援 Lua 腳本攔截、監控、過濾、修改 SQL 流量。本文記錄安裝部署、核心參數、內建教學腳本驗證、自定義腳本開發方向,適用於 SQL 審計、慢查詢分析、讀寫分離、防火牆、协议適配等場景。
read_query, read_query_result 等鉤子函數
# 下載二進制包(Linux/Windows)
wget https://downloads.mysql.com/archives/proxy/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
tar -zxvf mysql-proxy-*.tar.gz
cd mysql-proxy-0.8.5
# 無需編譯,直接使用 bin/mysql-proxy
| 參數 | 說明 |
|---|---|
--proxy-backend-addresses=host:port |
後端 MySQL 地址,可多個(輪詢負載均衡) |
--proxy-lua-script=file |
載入的 Lua 腳本文件 |
--proxy-address=:4040 |
Proxy 監聽地址(默認 0.0.0.0:4040) |
--admin-address=:4041 |
管理界面地址 |
--admin-lua-script=file |
管理界面腳本 |
--log-level=message |
日誌級別 |
--daemon |
後台運行 |
# 啟動 Proxy,載入教學腳本(顯示 SQL 與執行時間)
./bin/mysql-proxy \
--proxy-backend-addresses=192.168.128.131:3306 \
--proxy-lua-script=./share/doc/mysql-proxy/tutorial-query-time.lua \
--proxy-address=:4040 \
--daemon
mysql -u root -p -h 127.0.0.1 -P 4040
# 連接成功後執行任意 SQL
SELECT * FROM test.books;
-- Proxy 控制台輸出:
-- query: SELECT * FROM test.books
-- query time: 0.001234 sec
-- tutorial-query-time.lua 核心邏輯
function read_query(packet)
if packet:byte() == proxy.COM_QUERY then
local query = packet:sub(2)
proxy.queries:append(1, string.format("SELECT 1"), {resultset_is_needed = true})
proxy.queries:append(2, query, {resultset_is_needed = true})
return proxy.PROXY_SEND_QUERY
end
end
function read_query_result(inj)
if inj.id == 1 then
return proxy.PROXY_IGNORE_RESULT
end
if inj.id == 2 then
print("query: " .. proxy.queries[2].query)
print("query time: " .. inj.query_time .. " sec")
return proxy.PROXY_SEND_RESULT
end
end
| 場景 | 鉤子函數 | 關鍵邏輯 |
|---|---|---|
| SQL 審計日誌 | read_query_result | 記錄 query、user、host、time、rows_affected 到文件/數據庫 |
| 慢查詢標記 | read_query_result | if inj.query_time > threshold then log_warn(query) end |
| 敏感操作攔截 | read_query | 解析 SQL,匹配 DROP/TRUNCATE/DELETE 無 WHERE → 返回錯誤包 |
| 參數化改寫 | read_query | 將字面值替換為 ?,配合 prepared statement 復用計劃 |
| 讀寫分離路由 | read_query | SELECT → 從庫池;非 SELECT → 主庫 |
| 分片路由 | read_query | 按 sharding key 解析 SQL,重寫表名/路由到對應後端 |
| 熔斷限流 | read_query | 統計 QPS/活躍連接,超限返回錯誤或排隊 |
MySQL Proxy 是理解 MySQL 協議中間件原理的優秀教學工具,但生產環境請選擇 ProxySQL 等成熟方案。Lua 腳本開發思維(攔截→分析→修改→轉發)在現代中間件中依然通用。