MySQL репликация R / W и временные таблицы - PullRequest
2 голосов
/ 17 марта 2011

Я делаю репликацию master / slave на MySQL5.1 и разделение ч / б с помощью MySQL прокси 0.8.x

Работает нормально, за исключением временных таблиц. 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 на 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 Proxy отправляет операторы создания tmp и вставки select ведущему, который правильно реплицирует команды на ведомое устройство, затем на следующем шаге select отправляется на ведомое устройство. К сожалению, в MySQL таблица tmp действительна только для соединения, которое ее установило, поэтому таблица tmp, созданная репликацией, недопустима для второго соединения, созданного прокси-сервером mysql на ведомом устройстве.

Я сейчас пытаюсь решить эту проблему, изменив мое приложение и выполнив соединения с таблицами tmp непосредственно к мастеру.

Пожалуйста, дайте мне знать, если вы считаете, что есть лучшее решение.

1 Ответ

0 голосов
/ 08 августа 2011

Да, именно в этом проблема.Это одна из ловушек разделения запросов на чтение с MySQL Proxy вместо того, чтобы прикладной уровень сам решал это.

Звучит так, как будто вы возвращаете это определение обратно на прикладной уровень, нотолько для этих таблиц.Это хороший обходной путь.Если вы обнаружите, что делаете больше исключений, требующих наведения dbh непосредственно на базу данных, рассмотрите возможность абстрагирования этого кода и предоставления вашему приложению способа запрашивать dbh для определенной функциональности.В этом случае вы захотите, чтобы ваш код попросил библиотеку «дать мне dbh, на котором я могу выполнять запросы TEMPORARY TABLE».

Другим способом было бы дать всем распознаваемым именам всех TEMPORARY TABLEs (возможно, сделать ихвсе начинаются с "tmp_"), что даст Прокси реальную возможность отправить SELECT на них в нужное место.

...