Мне нужно присоединиться к таблице из другой базы данных, а иногда и с другого сервера
У моего проекта есть своя база данных. Также я использую таблицу пользователей, которая находится в другой базе данных. В двух офисах данные находятся на одном сервере, а в третьем - собственная таблица пользователей на другом сервере.
Таким образом, во многих запросах мне нужно присоединиться к таблице some_db.users или other_server.some_db.users.
Какое решение вы бы посоветовали для этого сценария?
Я использую MySQL.
3 ответа
Есть федеративные таблицы в MySQL:
Механизм хранения FEDERATED позволяет получать доступ к данным из удаленной базы данных MySQL без использования технологии репликации или кластеров. Запрос локальной таблицы FEDERATED автоматически извлекает данные из удаленных (объединенных) таблиц. Данные не хранятся в локальных таблицах.
Во-первых, у вас должна быть таблица на удаленном сервере, к которой вы хотите получить доступ с помощью таблицы FEDERATED. Предположим, что удаленная таблица находится в базе данных sakila и определена так:
CREATE TABLE test_table (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL
PRIMARY KEY (id)
)
ENGINE=MyISAM
DEFAULT CHARSET=latin1;
Затем создайте таблицу FEDERATED на локальном сервере для доступа к удаленной таблице:
CREATE TABLE federated_table (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL
PRIMARY KEY (id)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://fed_user:fed_user@197.186.1.199:3306/sakila/test_table';
Пример строки подключения:
CONNECTION='mysql://username:password@hostname:port/database/tablename'
CONNECTION='mysql://username@hostname/database/tablename'
CONNECTION='mysql://username:password@hostname/database/tablename'
Базовая структура этой таблицы должна соответствовать структуре удаленной таблицы, за исключением того, что опция таблицы ENGINE должна быть FEDERATED.
Выполнение:
show variables like '%federated%';
проверить, доступен ли FEDERATED механизм хранения на вашем локальном сервере.
Стол federated_table
в localhost становится виртуальной таблицей test_table
в удаленном сервере.
Теперь вы можете использовать JOIN между таблицами в БД на сервере localhost. Если есть таблица с именем test
на вашем локальном сервере, и вы хотите присоединиться к бывшему sakila.test_table, который находится на удаленном сервере, напишите запрос, подобный показанному ниже:
SELECT * FROM `federated_table` JOIN `test`;
federated_table
в запросе будет фактически указывать на test_table на удаленном сервере.
О включении FEDERATED Storage Engine
Механизм хранения FEDERATED не включен по умолчанию на работающем сервере; чтобы включить FEDERATED, вы должны запустить двоичный файл сервера MySQL, используя --federated
вариант.
НОТА:
Дополнительные механизмы хранения требуют привилегий и не смогут загружаться, когда --skip-grant-tables
указан.
В результате весь БД не будет загружен, и в журналах появится следующая ошибка:
110318 21:37:23 [ERROR] /usr/local/libexec/mysqld: unknown option '--federated'
Это, в свою очередь, означает, что обновление с 5.x необходимо выполнить в два этапа, если у вас есть объединенные таблицы. Однажды с --skip-grant-tables
и без --federated
один раз без --skip-grant-tables
и с --federated
,
Источник: FEDERATED Storage Engine
Пожалуйста, укажите также и базу данных. В SQLServer вы можете использовать Linked Sever. http://msdn.microsoft.com/en-us/library/ms188279.aspx
Объединенные таблицы - ваше решение для таблиц на других серверах. Однако они очень медленные, если вы выполняете на них соединения. Если вы просто хотите читать данные из другой базы данных на том же сервере, вы можете использовать представление. Таким образом, все таблицы фактически находятся в одной базе данных, и вам нужно открыть только одно соединение в своем приложении.
CREATE
VIEW `my_db`.`table_name`
AS
(SELECT * FROM `other_db`.`table_name`);
В MySQL вы можете объединять таблицы из разных баз данных, используя полные имена, такие как
`database_name1`. `table_name1` JOIN `database_name2`.`table_name2`
Но я боюсь, что вы не можете объединять таблицы с разных серверов, потому что для этого вам нужно иметь два разных соединения, и, насколько мне известно, в запросе нет полностью определенных имен соединений.
Кроме того, вы можете создать локальную временную таблицу (таблицы) на одном из серверов и запустить запрос там. Но в этом случае вам нужно будет перенести данные с одного сервера на другой. Вы можете использовать инструмент MySQL GUI, такой как SQLyog или MySQL admin, для передачи данных с одного сервера на другой и для синхронизации баз данных на двух серверах.
Надеюсь, поможет....