我的项目有自己的数据库。另外,我使用用户表,该表位于其他数据库上。两个办公室在同一台服务器上有其数据,而第三个办公室在另一台服务器上有其自己的用户表。
因此,在很多查询中,我需要加入表some_db.users或other_server.some_db.users
您会针对这种情况建议什么解决方案?
我使用MySQL。
最佳答案
MySQL中有Federated tables:
首先,必须在远程服务器上有一个要使用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:[email protected]: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
成为远程服务器中test_table
的虚拟表。现在,您可以在localhost服务器的数据库中的表之间使用JOIN。如果您的本地主机服务器中有一个名为
test
的表,并且您想与远程服务器中的前sakila.test_table进行联接,请编写如下所示的查询:SELECT * FROM `federated_table` JOIN `test`;
查询中的
federated_table
实际上将引用远程服务器中的test_table。启用FEDERATED Storage Engine
默认情况下,正在运行的服务器中未启用FEDERATED存储引擎。要启用FEDERATED,必须使用
--federated
选项启动MySQL服务器二进制文件。笔记:
可选的存储引擎需要特权,并且在指定
--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
。资料来源:The FEDERATED Storage Engine
关于mysql - 我需要从其他数据库(有时是其他服务器)中加入表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11684956/