MySQL5.1 でマスター/スレーブ レプリケーションを実行しており、mysql プロキシ 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
マスターに直接クエリを実行すると (php db 接続を 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 Proxy は create tmp および insert select ステートメントをマスターに送信し、マスターはコマンドを正しくスレーブにレプリケートし、次のステップで select がスレーブに送信されます。残念ながら、MySQL では、tmp テーブルはそれを発行した接続に対してのみ有効です。したがって、レプリケーションによって作成された tmp テーブルは、スレーブ上の mysql プロキシによって発行された 2 番目の接続に対しては有効ではありません。
私は現在、アプリケーションを変更し、マスターに直接 tmp テーブルを使用して接続を発行することで、これを解決しようとしています。
より良い解決策があると思われる場合はお知らせください。