在不同的服务器上两个库中的两个表需要查询。在mysql可以做吗? 怎么看权限? 即使写java代码又该怎么写啊?木有思路啊,跪求大神!!!100分了

解决方案 »

  1.   

    15.7. FEDERATED存储引擎
    15.7.1. 安装FEDERATED存储引擎15.7.2. FEDERATED存储引擎的介绍15.7.3. 如何使用FEDERATED表15.7.4. FEDERATED存储引擎的局限性FEDERATED存储引擎访问在远程数据库的表中的数据,而不是本地的表。 FEDERATED存储引擎仅在-MAX版的MySQL上可用。 要为FEDERATED引擎检查源码,请查看MySQL源码分发版的sql目录。 对于FEDERATED存储引擎,在http://forums.mysql.com/list.php?105上有一个专门的论坛。 15.7.1. 安装FEDERATED存储引擎
    要允许这个存储引擎,当你构建MySQL时请使用--with-federated-storage-engine来configure。 15.7.2. FEDERATED存储引擎的描述
    当你创建一个FEDERATED表的时候,服务器在数据库目录创建一个表定义文件。文件由表的名字开始,并有一个.frm扩展名。无其它表被创建,因为实际的数据在一个远程数据库上。这不同于为本地表工作的存储引擎的方式。 对于本地的数据录表,数据文件是本地的。例如,如果你创建一个名为user的MyISAM表,MyISAM处理器创建一个名为users.MYD的数据文件。对本地表读,插入,删除和更新在本地数据文件里的数据的处理器和记录被以对处理器的特定格式存储。为了读记录,处理器必须把数据分解进列。为了写记录,列值必须被转换到被处理器使用的行格式并且被写进本地的数据文件。 使用MySQL FEDERATED存储引擎,没有对表的本地数据文件(比如,没有.MYD文件)。取而代之地,一个远程数据库存储那些正常地应该在表中的数据。这使得MySQL客户端API来读,删除,更新和插入数据的使用成为必要。数据取回被通过SELECT * FROM tbl_name SQL语句来初始化。要读这个结果,通过使用mysql_fetch_row() C API函数,行被一次取一个,然后从SELECT结果包中的列转换成FEDERATED处理器期望的格式。 基本流程如下: 1.    SQL调用被本地发布 2.    MySQL处理器API (数据以处理器格式) 3.    MySQL客户端API (数据被转换成SQL调用) 4.    远程数据库-> MySQL客户端API 5.    转换结果包(如果有的话)到处理器格式 6.    处理器 API -> 结果行或受行影响的对本地的计数 15.7.3. 如何使用FEDERATED表
    使用FEDERATED表的步骤是非常简单的。通常,你运行两个服务器,要么在同一个主机上,要么在不同主机上。(一个FEDERATED表使用其它被同一服务器管理的表也是可能的。虽然只有极少的点要这么做)。 首先,你必须在你想要用FEDERATED表访问的远程服务器上有一个表。假设,远程的表在FEDERATED数据库中并且被如下定义: CREATE TABLE test_table (
        id     int(20) NOT NULL auto_increment,
        name   varchar(32) NOT NULL default '',
        other  int(20) NOT NULL default '0',
        PRIMARY KEY  (id),
        KEY name (name),
        KEY other_key (other)
    )
    ENGINE=MyISAM
    DEFAULT CHARSET=latin1;
    ENGINE表选项可能命名任何存储引擎,该表需要不是一个MyISAM表。 接着,在本地服务器上为访问远程表创建一个FEDERATED表: CREATE TABLE federated_table (
        id     int(20) NOT NULL auto_increment,
        name   varchar(32) NOT NULL default '',
        other  int(20) NOT NULL default '0',
        PRIMARY KEY  (id),
        KEY name (name),
        KEY other_key (other)
    )
    ENGINE=FEDERATED
    DEFAULT CHARSET=latin1
    CONNECTION='mysql://root@remote_host:9306/federated/test_table';
    (注意: CONNECTION 替代 用在先前版本的MySQL里的COMMENT)。 除了ENGINE表选项应该是FEDERATED,并且CONNECTION表选项是给FEDERATED指明如何连接到远程服务器上的连接字符串之外,这个表的结构必须完全与远程表的结构相同。 FEDERATED引擎仅创建在已联盟数据库中的test_table.frm文件。 远程主机信息指明本地服务器要连接到的远程服务器,数据库和表信息指明哪一个远程表要被作为数据文件来用。在这个例子中。远程服务器被指定来作为远程主机在9306端口上运行,所以你要启动服务器,让它监听9306端口。 在CONNECTION选项中的连接字符串的一般形式如下: scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name
    只有mysql在这一点被支持为scheme,密码和端口号时可选的。 这里有一些连接字符串的例子: CONNECTION='mysql://username:password@hostname:port/database/tablename'
    CONNECTION='mysql://username@hostname/database/tablename'
    CONNECTION='mysql://username:password@hostname/database/tablename'
    为指定连接字符串使用CONNECTION是非可选,并且在将来可能会改变。当你使用FEDERATED表的时候,要记得这个,因为这意味着当将来发生那种改变之时,可能被要求。 因为任何被用的密码作为纯文本被存在连接字符串中,它可以被任何使对FEDERATED表使用SHOW CREATE TABLE或SHOW TABLE STATUS的用户,或者在INFORMATION_SCHEMA数据库中查询TABLES表的用户看见。 对于FEDERATED存储引擎,在http://forums.mysql.com/list.php?105上有一个专门的论坛。 15.7.4. FEDERATED存储引擎的局限性
    FEDERATED支持及不支持的如下: ·         在第一个版本中,远程服务器必须是一个MySQL服务器。FEDERATED对其它数据库引擎的支持可能会在将来被添加。 ·         FEDERATED表指向的远程表在你通过FEDERATED表访问它之前必须存在。 ·         一个FEDERATED表指向另一个FEDERATED表是可能的,但是你必须小心不要创建一个循环。 ·         没有对事务的支持。 ·         如果远程表已经改变,对FEDERATED引擎而言是没有办法知道的。这个的原因是因为这个表必须象数据文件一样工作,除了数据库其它任何都不会被写入。如果有任何对远程数据库的改变,本地表中数据的完整性可能会被破坏。 ·         FEDERATED存储引擎支持SELECT, INSERT, UPDATE, DELETE和索引。它不支持ALTER TABLE, DROP TABLE或任何其它的数据定义语言语句。当前的实现不使用预先准备好的语句。 ·         执行使用SELECT, INSERT, UPDATE和DELETE,但不用HANDLER。 ·         FEDERATED表不能对查询缓存不起作用。 这些限制中的一些在FEDERATED处理机的将来版本可能被消除。 
      

  2.   


    大哥用java程序怎么解决呢???需要配置两个不同的数据源,然后把结果拼接起来么?这是我的思路
      

  3.   

    在MYSQL中建立federated表,示例:CREATE TABLE `a` (
       `tid` INT(6) NOT NULL AUTO_INCREMENT,
       `subject` VARCHAR(20) DEFAULT NULL,
       UNIQUE KEY `tid` (`tid`),
       KEY `tt` (`tid`,`subject`)
    ) ENGINE=FEDERATED   
    CONNECTION='mysql://aa:[email protected]:3306/ee/a'
    ee:数据库名
    a:表名mysql配置文件中,添加一行federated,重新启动mysql就可以了![mysqld]
    federated在JAVA中连接建立federated表的MYSQL服务器,既可访问、连接
      

  4.   

    or
    用JAVA连接任意MYSQL服务器,导出表,再导入另外1个服务器中,连接、查询
      

  5.   

    我是这一个思路 :程序层的解决方法 
    比较笨,但是操作起来却很简单。你想想,MYSQL不能帮你联表查,但是可以分开查询,把两个结果先记录下来,让JAVA语句来执行联表关系的操作,若还需要更新,再把最后的结果分别更新到两个服务器上。这种方法虽然效率低,但是容易理解,易于实现。
     
      

  6.   

    把两个结果先记录下来:怎么实现
    如果只是临时性的执行,可以这样做
    如果是经常性的工作,建议用federated表
      

  7.   

    在1个MYSQL服务器中建立与另1个MYSQL服务器需要连接的表(OLDTT)相同结构的表(NEWTT)
    用2个记录集连接OLDTT、NEWTT,循环,将OLDTT中的内容赋值给NEWTT,
    还不如用federated表
      

  8.   

    ipts/csdn/Plugin/003/monkey/24.gif][/img]