mysql代理r / w复制和临时表

时间:2011-03-17 15:22:36

标签: mysql replication master-slave mysql-error-1146 mysql-proxy

我在MySQL5.1上进行主/从复制,并使用mysql proxy 0.8.x进行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错误消息:

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

如果我直接查询master(将php db连接更改为master而不是mysql-proxy),它可以正常工作。

我正在使用这个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代理发送create tmp并将select语句插入到master中,后者将命令正确地复制到slave,然后在下一步中将select发送给slave。不幸的是,在MySQL中,tmp表仅对发出它的连接有效,因此复制创建的tmp表对于slave上的mysql代理发出的第二个连接无效。

我现在正试图通过更改我的应用程序并直接向主服务器发出与tmp表的连接来解决这个问题。

如果您认为有更好的解决方案,请告诉我。

1 个答案:

答案 0 :(得分:0)

是的,这正是问题所在。这是使用MySQL代理分割读取查询的缺陷之一,而不是让应用程序层为自己做出决定。

听起来你正在做的就是把这个决定放回到应用层,但仅限于这些表。这是一个很好的解决方法。如果您发现自己制作了更多需要将dbh直接指向数据库的异常,请考虑抽象该代码并为应用程序提供一种方法来请求dbh以获取特定功能。在这种情况下,您希望您的代码询问库"给我一个dbh,我可以执行TEMPORARY TABLE查询。"

另一种方法是为所有TEMPORARY TABLE提供可识别的名称(可能使它们全部以" tmp _"开头),这将使Proxy有机会将SELECT发送到正确的位置。