두 개의 다른 서버에서 테이블 조인
두 개의 다른 서버가 있습니다.server1
그리고.server2
지금은db1
에server1
그리고.db2
에server2
저는 이렇게 MySQL에서 이 두 테이블을 함께 하려고 합니다.
Select a.field1,b.field2
FROM [server1, 3306].[db1].table1 a
Inner Join [server2, 3312].[db2].table2 b
ON a.field1=b.field2
하지만 오류가 발생하고 있습니다.MYSQL에서 가능합니다.
네, MySQL에서 가능합니다.
아까도 비슷한 질문들이 있습니다.이 작업을 수행하려면 Federated Engine(연방 엔진)을 사용해야 합니다.아이디어는 다음과 같습니다.
원하는 방식으로 사용하려면 다른 원격 위치에 테이블 기반의 연합 테이블이 있어야 합니다.테이블의 구조는 정확히 같아야 합니다.
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://fed_user@remote_host:9306/federated/test_table';
복제는 대체 솔루션이자 적합한 솔루션입니다.
server1 - db1 -> server2에 복제합니다.(이제 db1과 db2가 동일한 서버 서버2에 있게 됩니다. 쉽게 가입할 수 있습니다.)
참고: 서버2가 저장소/프로세스 등의 측면에서 db1의 부하를 감당할 수 있는 수준이면 복제를 수행할 수 있습니다.@brilliand가 언급했듯이 Federated는 많은 수동 작업을 수행하고 처리 속도를 늦출 것입니다.
일종의 해킹이며 조인은 아니지만 bash 기능을 사용하여 크로스 서버 쿼리를 수행하는 것처럼 느껴집니다.
명시적 버전:
tb2lst(){
echo -n "("
tail -n +2 - | paste -sd, | tr -d "\n"
echo ")"
}
id_list=$(mysql -h'db_a.hostname' -ume -p'ass' -e "SELECT id FROM foo;" | tb2lst)
mysql -h'db_b.hostname' -ume -p'ass' -e "SELECT * FROM bar WHERE foo_id IN $id_list"
+--------|-----+
| foo_id | val |
+--------|-----+
| 1 | 3 |
| 2 | 4 |
+--------|-----+
bashrc에 보관하는 래퍼 함수를 몇 개 작성했기 때문에, 제 관점은 하나의 명령일 뿐입니다.
db_b "SELECT * FROM bar WHERE foo_id IN $(db_a "SELECT id FROM foo;" | tb2lst);"
+--------|-----+
| foo_id | val |
+--------|-----+
| 1 | 3 |
| 2 | 4 |
+--------|-----+
적어도 제 사용 사례의 경우, 이렇게 하면 두 쿼리를 빠르게 연결하여 출력이 조인과 동일할 정도로 연결할 수 있으며, 그러면 필요한 모든 도구에 출력을 연결할 수 있습니다.
한 쿼리의 ID 목록은 다른 쿼리의 쿼리 텍스트로 끝납니다.이러한 방식으로 너무 많은 데이터를 "다운로드"하면 OS가 쿼리 길이를 제한할 수 있습니다(https://serverfault.com/a/163390) .따라서 이 솔루션은 대규모 데이터셋에 적합하지 않습니다.저는 pymysql과 같은 mysql 라이브러리에서 동일한 작업을 수행하는 것이 이러한 한계를 극복할 수 있다는 것을 발견했습니다.
언급URL : https://stackoverflow.com/questions/11114197/join-tables-from-two-different-server
'programing' 카테고리의 다른 글
서로 다른 활동에서 동일한 탐색 드로어 (0) | 2023.08.25 |
---|---|
Spring Data JDBC: 리포지토리에서 세 번째 수준부터 중첩된 엔티티를 저장하지 않습니다. (0) | 2023.08.25 |
자바스크립트에서 긴 정규식을 여러 줄로 분할하는 방법은 무엇입니까? (0) | 2023.08.20 |
장고의 컬렉션 스태틱은 무슨 의미가 있습니까? (0) | 2023.08.20 |
[NSDate date]에서 현재 날짜를 가져오지만 시간을 오전 10시로 설정합니다. (0) | 2023.08.20 |