【问题标题】:I need to join table from other database and sometimes other server我需要从其他数据库连接表,有时也需要从其他服务器连接表
【发布时间】:2012-07-27 09:22:01
【问题描述】:

我的项目有自己的数据库。另外,我使用其他数据库上的用户表。两个办公室的数据在同一台服务器上,但第三个办公室在另一台服务器上拥有自己的用户表。

所以,在很多查询中,我需要加入表 some_db.users 或 other_server.some_db.users

对于这种情况,您会建议什么解决方案?

我使用 MySQL。

【问题讨论】:

    标签: mysql database


    【解决方案1】:

    MySQL中有Federated tables

    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 存储引擎。

    localhost 中的表federated_table 成为远程服务器中test_table 的虚拟表。

    现在您可以在 localhost 服务器中的数据库中的表之间使用 JOIN。如果您的本地服务器中有一个名为 test 的表,并且您想与远程服务器中的前 sakila.test_table 进行 JOIN,请编写如下所示的查询:

    SELECT * FROM `federated_table` JOIN `test`;
    

    查询中的federated_table实际上将引用远程服务器中的test_table。


    关于启用联合存储引擎

    在运行的服务器中默认不启用 FEDERATED 存储引擎;要启用 FEDERATED,您必须使用 --federated 选项启动 MySQL 服务器二进制文件。

    注意:
    可选的存储引擎需要权限并且在指定--skip-grant-tables 时将无法加载。

    整个db加载失败的结果,日志中会出现如下错误:

    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

    【讨论】:

    • 谢谢,尤其是快速教程。不幸的是,我无法让它发挥作用。显示像 '%federated%' 这样的变量;返回空集。我在 my.ini 中找到了 #Disable Federated by default skip-federated,我已经注释掉了跳过行并重新启动了服务,我还在此文件的 [mysqld] 部分添加了 federated 并重新启动了服务。
    • 您使用的是哪个 MySQL 版本?
    • 不,好吧.. 看起来它现在正在工作,即使空集返回。谢谢:)
    【解决方案2】:

    请同时提及数据库。 在 SQLServer 中,您可以使用链接服务器。 http://msdn.microsoft.com/en-us/library/ms188279.aspx

    【讨论】:

      【解决方案3】:

      在 MySQL 中,您可以使用完全限定名称连接来自不同数据库的表,例如

      `database_name1`. `table_name1` JOIN `database_name2`.`table_name2`
      

      但我担心,您不能连接来自不同服务器的表,因为您需要有两个不同的连接,而且据我所知,查询中没有完全限定的连接名称。

      或者,您可以在其中一台服务器上创建本地临时表并在那里运行查询。但在这种情况下,您需要将数据从一台服务器传输到另一台服务器。您可以使用SQLyog 或 MySQL admin 等 MySQL GUI 工具,将数据从一台服务器传输到另一台服务器,并同步两台服务器上的数据库。

      希望对你有帮助....

      【讨论】:

        【解决方案4】:

        联合表是其他服务器上表的解决方案。但是,如果您对它们执行连接,它们会非常慢。 如果您只想从同一服务器上的另一个数据库读取数据,您可以使用视图。这样您就可以在一个数据库中虚拟地拥有所有表,并且您只需在应用程序中打开一个连接。

        CREATE
            VIEW `my_db`.`table_name` 
            AS
        (SELECT * FROM `other_db`.`table_name`);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-17
          • 2018-03-31
          • 1970-01-01
          • 1970-01-01
          • 2019-03-10
          • 2021-11-27
          • 2018-11-21
          • 2013-02-19
          相关资源
          最近更新 更多