首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL Proxy 事件探查器實戰:Lua 腳本攔截、分析、修改 SQL 通訊流量

     編輯:MySQL 資料庫相關知識

MySQL Proxy 是官方提供的中間件,位於客戶端與 Server 之間,基於 MySQL 網絡協議透明轉發,並支援 Lua 腳本攔截、監控、過濾、修改 SQL 流量。本文記錄安裝部署、核心參數、內建教學腳本驗證、自定義腳本開發方向,適用於 SQL 審計、慢查詢分析、讀寫分離、防火牆、协议適配等場景。

核心特性

  • 透明代理:客戶端無感知,僅修改連接地址/端口
  • Lua 腳本引擎:read_query, read_query_result 等鉤子函數
  • 支援 MySQL 5.0+,類似 SQL Server Profiler 功能
  • 可實現:SQL 審計、參數化改寫、分片路由、熔斷限流、慢查詢標記

安裝部署


# 下載二進制包(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

Lua 腳本核心鉤子函數


-- 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 0.8.x 為 Alpha 版本,**不建議生產核心鏈路使用**
  • 官方已停止維護,社區分支極少
  • 現代替代:
    • ProxySQL:高性能、生產就緒、支援查詢快取、讀寫分離、分片、熔斷、SQL 改寫、監控統計
    • MaxScale:MariaDB 官方、企業級、支援 Binlog 過濾、遷移、備份
    • Vitess:YouTube 開源、大規模分片、Kubernetes 原生
    • MyCat / ShardingSphere:Java 生態、分片中間件

MySQL Proxy 是理解 MySQL 協議中間件原理的優秀教學工具,但生產環境請選擇 ProxySQL 等成熟方案。Lua 腳本開發思維(攔截→分析→修改→轉發)在現代中間件中依然通用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved