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发送给正确的地方。