2

我做的主/從複製在MySQL5.1和R/W分裂與MySQL代理0.8.4MySQL代理R/W複製和臨時表

它工作正常,除非使用臨時表。 MySQL拋出一個錯誤,臨時表不存在。

這是查詢日誌主服務器:

 CREATE TEMPORARY TABLE IF NOT EXISTS sh (ad_id MEDIUMINT(8) UNSIGNED NOT NULL, score float , INDEX (`ad_id`), INDEX (`score`)) ENGINE = MEMORY 

INSERT INTO sh 
          SELECT cl.ID, 1 
          FROM classifieds cl 
          WHERE cl.advertiser_id = '40179' 

這是查詢日誌中從站:

CREATE TEMPORARY TABLE IF NOT EXISTS sh (ad_id MEDIUMINT(8) UNSIGNED NOT NULL, score float , INDEX (`ad_id`), INDEX (`score`)) ENGINE = MEMORY 

這是MySQL errror消息:

Occured during executing INSERT INTO sh SELECT cl.ID, 1 FROM classifieds cl WHERE cl.advertiser_id = '40179' statement 
Error: 1146 Table 'dbname.sh' doesn't exist 

如果我直接查詢主(PHP變化DB連接掌握,而不是到mysql代理),它的工作原理沒有PROBL EMS。

我用這MySQL代理配置:

[mysql-proxy] 
daemon = true 
pid-file = /home/mysqladm/mysql-proxy.pid 
log-file = /home/mysqladm/mysql-proxy.log 
log-level = debug 
proxy-address = 192.168.0.109:3307 
proxy-backend-addresses = 192.168.0.108:3306 
proxy-read-only-backend-addresses = 192.168.0.109 
proxy-lua-script = /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua 

有沒有人對如何解決這種想法?感謝您的任何幫助!

//編輯第二天

我相信我知道爲什麼這不工作:

MySQL代理髮送創建tmp和插入SELECT語句它複製命令正確地從主,那麼在下一步中選擇被髮送到從機。可惜的是在MySQL中TMP表僅適用於發放它的連接,從而通過複製創建的TMP表無效由MySQL代理奴隸發出的第二個連接。

我現在想通過改變我的應用程序和發行解決這個與TMP表直接連接到主機。

請讓我知道,如果你認爲有更好的解決方案。

回答

0

是的,這也正是問題。這是使用MySQL Proxy拆分讀取查詢的缺陷之一,而不是讓應用程序層爲自己做出決定。

這聽起來像你正在做的是把該決定迴應用層的東西,但這些表只。這是一個很好的解決方法。如果你發現自己製造了更多需要直接在數據庫中指定dbh的異常,請考慮抽象該代碼併爲應用程序提供一種請求dbh以實現特定功能的方法。在這種情況下,你想讓你的代碼問一個庫「給我一個dbh,我可以執行TEMPORARY TABLE查詢。」

另一種方法是給予所有臨時表可識別的名稱(也許使它們都以「tmp_」開頭),這將使Proxy有機會將SELECTs發送給正確的地方。