Одновременное использование нескольких серверов MySQL

Задача
Вы хотите выполнить запрос, который использует таблицы в базах данных, расположенных на разных серверах MySQL.

Решение
Эту задачу невозможно решить средствами только SQL. Можно обойти ее, открывая отдельные соединения с каждым сервером и самостоятельно свя-зывая информацию из двух таблиц. Есть и другой способ – копировать одну из таблиц с одного сервера на другой, чтобы работать с обеими таблицами на одном сервере.

Обсуждение
На всем протяжении главы я неявно предполагал, что все таблицы, вовлеченные в операции с несколькими таблицами, хранятся на одном сервере MySQL. Если это предположение неверно, то работать с таблицами становится сложнее. Соединение с сервером MySQL определяется конкретным сервером. Вы не можете написать предложение SQL, ссылающееся на таблицы, хранящиеся на другом сервере. (Я встречал заявления о том, что это можно сделать, но всегда оказывалось, что они на самом деле ничем не подкреплены.)

Рассмотрим задачу на примере таблиц artist и painting. Предположим, что вы хотите определить названия картин да Винчи. Необходимо определить идентификатор да Винчи в таблице artist и сопоставить его записям таблицы painting.


Если обе таблицы расположены в одной базе данных, то можно найти картины, используя запрос, выполняющий объединение таблиц:

mysql> SELECT painting.title
-> FROM artist, painting
-> WHERE artist.name = 'Da Vinci' AND artist.a_id = painting.a_id;

+-------------------+
| title |
+-------------------+
| The Last Supper |
| The Mona Lisa |
+-------------------+

Если таблицы относятся к разным базам данным, но управляются одним сервером MySQL, необходимо лишь слегка изменить запрос, включив спецификаторы базы данных (см. рецепт 12.2). Для наших таблиц запрос был бы таким:

mysql> SELECT db2.painting.title
-> FROM db1.artist, db2.painting
-> WHERE db1.artist.name = 'Da Vinci'
-> AND db1.artist.a_id = db2.painting.a_id;

+------------------+
| title |
+------------------+
| The Last Supper |
| The Mona Lisa |
+------------------+

Если же таблицы artist и painting находятся на разных серверах, невозможно выдать один запрос для выполнения соединения между ними.


Вы должны отправить запрос на один сервер, чтобы извлечь идентификатор художника:

mysql> SELECT a_id FROM artist WHERE name = 'Da Vinci';

+-----+
| a_id |
+-----+
| 1 |
+-----+

Затем использовать значение a_id (1) для формирования второго запроса, отправляемого другому серверу:

mysql> SELECT title FROM painting WHERE a_id = 1;

+-------------------+
| title |
+-------------------+
| The Last Supper |
| The Mona Lisa |
+-------------------+

Для простого примера предложено достаточно простое решение. Простота объясняется тем, что извлекается всего одно значение из первой таблицы, а информация выводится только из второй таблицы. Если же потребуется выводить фамилию художника вместе с названием картины, и выполнить такую операцию нужно будет для нескольких художников, то задача соответственно усложнится. Можно решить ее, написав программу, имитирующую соединение:

1. Открыть отдельное соединение с каждым сервером базы данных.

2. Запустить цикл, выбирающий идентификаторы и фамилии художников для сервера, хранящего таблицу artist.

3.


При каждом проходе цикла использовать текущий идентификатор художника для формирования запроса, который ищет в таблице painting строки, соответствующие значению идентификатора. Отправить запрос серверу, управляющему таблицей painting. По мере извлечения названий картин выводить их вместе с фамилией текущего художника.

При таком подходе имитируется соединение между таблицами, расположенными на разных серверах. Кстати, этот же способ можно использовать при работе с таблицами разных СУБД. (Например, именно так вы можете имитировать соединение таблицы MySQL с таблицей PostgreSQL.) В этом есть, однако, некоторое трюкачество, так что в подобной ситуации вы можете предпочесть копирование одной из таблиц с одного сервера на другой. Тогда с таблицами можно будет работать как с расположенными на одном сервере, выполняя необходимое соединение между ними.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Вставка записей в таблицу, включающую значения из другой
Вывод списков для записей «главная-подчиненная» и итогов
Вычисление разности между последовательными строками
Вычисление рейтинга команд
Выявление и удаление несвязанных записей