2009-05-01 2 views
23

MySQL 클라이언트를 사용하여 교차 서버 선택 쿼리를 작성할 수 있습니까? 기본적으로 설정은 다음과 같습니다.MySQL 교차 서버 선택 쿼리

서버 IP           데이터베이스
---------           --------
1.2.3.4           테스트
ABCD           시험

1.2.3.4의 테스트 데이터베이스에서 테이블의 행을 선택하고 abcd의 테스트 데이터베이스에 테이블의 결과를 삽입하는 쿼리를 작성하려고합니다.
내 서버가 몇 킬로미터 떨어져있어 둘을 연결하는 SSH 터널.

모든 포인터? mysql 클라이언트는 한 번, 짧은 대답은 아니오이다 그러나 방법은 항상 존재에 하나 개의 서버에 연결할 수 있기 때문에

답변

7

mysqldump은 이미 언급 한 해결책 일 수도 있고 SELECT ... INTO OUTFILE 다음에 LOAD DATA INFILE ... 명령을 사용해 볼 수도 있습니다.

MySQL에는 유용 ​​할 수있는 페더레이션 스토리지 엔진이 있습니다. 여기에 더 많은 문서가 있습니다. http://dev.mysql.com/doc/refman/5.0/en/federated-storage-engine.html 나는 그것으로 큰 성공을 거두지 못했다고 고백해야하지만 그것은 당신을 위해 일할 수도 있습니다.

세 번째 해결책은 응용 프로그램에서 작업하는 것입니다. SELECT 쿼리 결과를 한 줄씩 다른 서버에 한 줄씩 읽고 INSERT 줄을 한 줄씩 읽습니다. 당신은 데이터 타입과 null 처리와 같은 몇 가지 문제를 겪을 수도 있습니다.

2

... mysqldump 지원에 사용할 수있는 --where 매개 변수의

최신 버전 덤프 된 데이터를 제한하십시오. 즉, 간단한 SELECT (즉 모든 표가 한 표에 있음)을 실행하고 유효한 SQL을 INSERT으로 생성하는 방법이 있음을 의미합니다. 그런 다음 대상 서버에 대한 mysql 명령에 원본 서버에 대한 mysqldump 명령의 출력을 파이프 할 수 있습니다.

mysqldump 명령에 --no-create-info--no-add-locks과 같은 몇 가지 옵션을 포함 할 수 있습니다. 결과가 원하는만큼 정확하게 출력 될 때까지 테스트하십시오.

+0

당신이 이제까지의 경우 mysql 클라이언트가 조인을 수행하는 상황에서 문제가 발생한다. 올바른 해결책은 서버가 서로 통신하고 클라이언트에 보낼 단일 결과 집합을 생성하는 것이다. MSSQL은 서버를 "링크"하고 연결에 사용할 자격 증명을 구성 할 수있게하여이 작업을 수행합니다. 그런 다음이 서버는 별칭을 통해 액세스됩니다. – Basic

+0

당신이 무슨 말을하고 있었는지 알아내는 데 약간의 독서가 필요했습니다. 또 다른 대답은 내가 게시 한 것보다 더 일반적인 해결책 일 가능성이있는 MySQL에서이를 수행하는 방법을 설명합니다. – staticsan

31

서버 중 하나에서 페더 레이 티드 테이블을 사용하는 방법은 어떻습니까? 쿼리에 사용할 원격 테이블을 기반으로 페더레이션 테이블을 만들고 데이터베이스가 모두 로컬 인 것처럼 쿼리를 실행하면됩니다. 아래 예 : MySQL site

FEDERATED 테이블을 사용하는 절차는 매우 간단합니다. 일반적으로 동일한 호스트 또는 다른 호스트에 두 개의 서버가 실행 중입니다. (FEDERATED 테이블은 동일한 서버가 관리하는 다른 테이블을 사용할 수 있지만, 그렇게하는 것이 중요하지 않습니다.)

먼저 원격 서버에 액세스하려는 테이블이 있어야합니다 FEDERATED 테이블을 사용하여.

CREATE TABLE test_table (
    id  INT(20) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32) NOT NULL DEFAULT '', 
    other INT(20) NOT NULL DEFAULT '0', 
    PRIMARY KEY (id), 
    INDEX name (name), 
    INDEX other_key (other) 
) 
ENGINE=MyISAM 
CHARSET=latin1; 

예는 MyISAM 테이블을 사용하지만, 표 스토리지 엔진을 사용할 수 리모트 테이블 연합 데이터베이스에 있고, 이와 같이 정의됨을 가정하자.

다음, 원격 테이블에 액세스하기위한 로컬 서버에 FEDERATED 테이블을 생성 :

CREATE TABLE federated_table (
    id  INT(20) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32) NOT NULL DEFAULT '', 
    other INT(20) NOT NULL DEFAULT '0', 
    PRIMARY KEY (id), 
    INDEX name (name), 
    INDEX other_key (other) 
) 
ENGINE=FEDERATED 
DEFAULT CHARSET=latin1 
CONNECTION='mysql://[email protected]_host:9306/federated/test_table'; 

(MySQL은 5.0.13 전에, 오히려 연결보다 사용 COMMENT.)

+0

이 방법은 "적절한"솔루션이지만 FEDERATED 테이블은 매우 느립니다 (거의 모든 것이 순전히 전체 테이블 스캔으로 변환됩니다). 따라서 데이터가 모두 큰 경우 옵션이되지 않을 수도 있습니다. – Brilliand

+0

federate가 원베이스 테이블에서 인덱스를 처리하므로 로컬에서도 해당 인덱스를 존중해야하지만 슬프게도 쿼리 캐시를 사용하지 않고 대규모 삽입시 성능이 떨어집니다 –