2

내가 MySQL의 프록시 0.8.xMySQL의 프록시 R/W 복제 및 임시 테이블

그것은 임시 테이블을 제외하고 잘 작동으로 MySQL5.1 및 R/W 분할에 마스터/슬레이브 복제를하고있는 중이 야. 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 
:

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 메시지입니다 :

 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' 

이 슬레이브에 대한 쿼리 로그는 다음과 같습니다

는 마스터 서버에 대한 쿼리 로그입니다

내가 직접 마스터를 쿼리하면 (대신 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 프록시가 발행 한 두 번째 연결에 유효하지 않습니다.

이제 응용 프로그램을 변경하고 tmp 테이블을 마스터에 직접 연결하여 문제를 해결하려고합니다.

더 나은 해결책이 있다고 생각되면 알려 주시기 바랍니다.

답변

0

네, 그게 정확히 문제입니다. 이것은 응용 프로그램 계층이 스스로 결정을 내리는 대신 MySQL 프록시로 읽기 쿼리를 분할하는 함정 중 하나입니다.

당신이하는 일은 응용 프로그램 계층에 그 결심을 되돌려 놓고있는 것처럼 들리지만,이 테이블들만을위한 것입니다. 그건 좋은 해결 방법입니다. 데이터베이스에서 dbh를 직접 가리켜 야하는 예외가 많이 발생하는 경우 해당 코드를 추상화하고 응용 프로그램에 특정 기능에 대한 dbh를 요청하는 방법을 제공하십시오. 이 경우 라이브러리에서 "TEMPORARY TABLE 쿼리를 수행 할 수있는 dbh를 제공하십시오"라는 코드를 코드에서 요구할 수 있습니다.

또 다른 방법은 모든 TEMPORARY TABLE에 인식 할 수있는 이름을 지정하는 것입니다 (프록시를 "tmp_"로 시작하는 것이 좋습니다). 프록시에게 적절한 장소로 SELECT를 보낼 수있는 기회를줍니다.