MySQL中实现跨数据库服务器查询数据
在MySQL中,同一个数据库服务器中,不同数据库中的表,可以通过库名调用表名的方式进行调用,实现查询与修改。对查询不同数据库服务器下的表,MySQL提供了FEDERATED引擎,实现表的映射。
(1)查看MySQL的FEDERATED引擎是否开启;默认情况下,未开启。
show engines;
(2)启用MySQL的FEDERATED引擎
对于windows系统,找到my.ini文件,添加:federated,重启mysql。
(3)利用create server 创建federated引擎连接
CREATE SERVER fedlinkname
FOREIGN DATA WRAPPER mysql
OPTIONS (USER 'username', PASSWORD 'password' ,HOST 'remote_host', PORT port_num, DATABASE 'dbname');
其中USER、PASSWORD、HOST、PORT、DATABASE均为数据源的数据库连接参数,即有数据的数据库的相关参数。
注意:CREATE SERVER语句在mysql数据库的serverstable 中创建新行。此语句需要SUPER特权。
(4)利用新建的federated引擎连接,在目标数据库中创建与源数据库中一样表结构的数据表。
CREATE TABLE test_table (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL DEFAULT ''
)
ENGINE=FEDERATED
CONNECTION='fedlinkname/test';
到此,就可以实现在目标数据库中查询test_table表,从而得到的是源数据库dbname中test表中的数据。
注意:之所以创建了federated引擎连接,是为了避免目标数据库的连接参数中有特殊字符,而不能识别的问题。
即可以直接使用如下语法创建federated引擎表,但是在connection中,如果password中也有@,那么造成语法混乱,出现报错信息,[Err] 1432 - Can't create federated table. The data source connection string。因为多了一个@,mysql会认为第一个@后就是hostname。所以建议先创建federated引擎连接,然后在创建federated引擎表
CREATE TABLE test_table (
ID varchar(64) NOT NULL COMMENT 'ID',
NAME varchar(64) DEFAULT NULL COMMENT 'NAME'
) ENGINE=federated CONNECTION='mysql://username:password@remote_host:port/dbname/test';
(5)查询在mysql数据库服务器中有多少个federated引擎连接
SELECT * FROM mysql.servers
(6)查询在mysql数据库服务器中有多少个federated引擎表
SELECT * from information_schema.TABLES where TABLE_SCHEMA = 'dbname'
ORDER BY ENGINE