#python #mysql
#python #mysql
Вопрос:
В MySQL
у меня есть две разные базы данных — давайте назовем их A
и B
.
База данных A
находится на сервере server1
, в то время как база данных B
находится на сервере server2
.
Оба сервера { A
, B
} Физически близки друг к другу, но находятся на разных машинах и имеют разные параметры подключения (разное имя пользователя, разный пароль и т.д.).
В таком случае, возможно ли выполнить соединение между таблицей, которая находится в базе данных A
, с таблицей, которая находится в базе данных B
?
Если да, то как мне это сделать, программно, в python
? (Я использую python
‘s MySQLDB
для отдельного взаимодействия с каждой из баз данных).
Комментарии:
1. Было бы лучше, если бы вы запросили средство для выполнения распределенной транзакции по нескольким базам данных, размещенным в разных СУБД?
2. Обратитесь к этому, было бы полезно: winashwin.wordpress.com/2012/08/22/mysql-federated-table
Ответ №1:
Попробуйте использовать механизм ФЕДЕРАТИВНОГО хранения.
Обходной путь: можно использовать другую СУБД для извлечения данных между двумя базами данных, например, вы могли бы сделать это с помощью связанных серверов в MS SQL Server (см. хранимую процедуру sp_addlinkedserver). Из документации:
Связанный сервер обеспечивает доступ к распределенным, разнородным запросам к источникам данных OLE DB.
Комментарии:
1. Ах ха. Это что-то новенькое для меня. 1
2. интересно. Когда я создаю
FEDERATED Storage Engine
, мне нужно «связать» с базой данных, где на самом деле находятся данные, верно? в таком случае надежно ли сохраняются сведения о соединении в базе данных, которая создает соединение?3. @user540009 Я многого не нашел в руководстве. Но есть что- dev.mysql.com/doc/refman/5.1/en/federated-create-server.html . Это позволяет сохранять свойства соединения в другой системной таблице
mysql
.servers
.
Ответ №2:
Это очень просто — выберите данные с одного сервера, выберите данные с другого сервера и агрегируйте с помощью Python. Если вы хотели бы иметь SQL-запрос с JOIN
— поместите результат с обоих серверов в отдельные таблицы в локальной SQLite
базе данных и запишите SELECT
с JOIN
помощью.
Комментарии:
1. но вам, возможно, придется каждый раз выбирать миллионы строк с двух серверов, что лишает преимущества объединения, не так ли?
2. это верно, но если вам нужно объединить некоторые данные для какого-то отчета — это быстрое и грязное решение.
3. @Flo федеративные механизмы хранения также содержат данные для того, чтобы сделать объединения возможными, проблема производительности также сохраняется в случае больших таблиц. Я бы предпочел использовать этот метод вместо механизмов федеративного хранения.
Ответ №3:
Нет. Невозможно выполнить объединение так, как вам хотелось бы. Но вы можете быть в состоянии что-то исправить, реплицируя один из серверов на другой для отдельной базы данных.
Один набор данных находится под управлением одной копии MySQL, а другой набор данных находится под управлением другой копии MySQL. Запрос может быть обработан только одним из серверов (MySQL).
Если вы создаете копию второй базы данных на первом сервере или наоборот (та, которая получает наименьшее количество обновлений, является лучшей), вы можете настроить репликацию, чтобы поддерживать копию в актуальном состоянии. Затем вы сможете выполнить запрос так, как хотите.