2

私はMySQLのプロキシ0.8.xMySQLのプロキシR/W複製および一時テーブル

それは一時テーブルを除いて正常に動作してMySQL5.1と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' 

これはスレーブのためのクエリログです:

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 

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メッセージです

私が直接マスターに問い合わせる場合(代わりにphp db connectionをmysql-proxyに変更する)、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文を挿入を送信し、次のステップで選択がスレーブに送信されます。 Unfortunatelly MySQLでは、tmpテーブルはそれを発行した接続に対してのみ有効です。したがって、レプリケーションによって作成されたtmpテーブルは、スレーブ上のmysql proxyによって発行された2番目の接続に対して有効ではありません。

私は現在、自分のアプリケーションを変更してこれを解決しようとしており、tmpテーブルを使って直接マスターに接続しています。

もっと良い解決策があると思ったら教えてください。

答えて

0

はい、それはまさに問題です。これは、アプリケーション層がそれ自体のためにその決定をするのではなく、MySQL Proxyで読み込みクエリを分割する落とし穴の1つです。

あなたがやっていることは、その決定をアプリケーション層に戻しているように聞こえますが、これらの表だけです。それは素晴らしい回避策です。 dbhをデータベースで直接指すことを必要とする例外が増えた場合は、そのコードを抽象化し、アプリケーションに特定の機能のdbhを要求する方法を与えることを検討してください。この場合、コードにライブラリに「TEMPORARY TABLEクエリを実行できるdbhを与えてください」と尋ねるようにします。

もう1つの方法は、すべてのTEMPORARY TABLEに認識可能な名前を付けることです(多分「tmp_」で始めるようにしてください)。これにより、プロキシに選択肢を適切な場所に送るチャンスが与えられます。

関連する問題