MySQL 存储过程查询远程数据库的方法

    xiaoxiao2021-03-25  116

    这几天有个任务,需要在存储过程中读取远程数据库一个表的数据存到本地表,然后进行计算。 在网上查找了资料,Oracle和SQL Server查询远程数据库是比较方便的,MySQL麻烦一些,需要在本地建立一个需要查询的远程的表结构完全一样的表,并且是Federate引擎。

    1、首先,用show ENGINES语句查看是否安装Federate引擎。 如果有Federate记录但是Support字段是no就需要配置,修改my.ini(如果是linux就是my.cnf),在[mysqld]下面添加一行federated,保存退出后重启mysql服务。 如果没有记录,就需要编译安装federated 引擎,就不说了

    2、在本地数据库中建表,结构和需要读取的远程数据库中的表完全一样,但是需要在最后指定Federate引擎:

    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), INDEX name (name), INDEX other_key (other) ) ENGINE=FEDERATED DEFAULT CHARSET=latin1 CONNECTION='mysql://username:password@remote_host:port/federated/test_table';

    对CONNECTION后面的字符串解释一下 mysql:支持的连接协议,在这里只支持mysql username:本地数据库连接远程数据库的用户名 password:密码 remote_host:远程数据库地址 port:端口号,例如3306,3936 federated:远程数据库实例 test_table:需要查询的数据库表名

    3、在远程数据库上赋予本地数据库查询权限 在本地建立Federate表后是无法直接读取的,会出现如下错误:

    1429 - Unable to connect to foreign data source: Can't connect to MySQL server on 'hostname'

    这是因为本地数据库没有权限查询远程数据库的表,需要在远程数据库中添加本地username的查询权限 在远程数据库的mysql实例中赋予本地数据库查询权限:

    GRANT SELECT ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

    其中: SELECT是赋予的权限,也可以是UPDATE,DELETE等,用逗号分隔开 username是需要赋予的本地数据库用户名 localhost是本地数据库地址 password是本地数据库用户密码

    这样就可以像查询本地表一样查询远程数据库表了

    转载请注明原文地址: https://ju.6miu.com/read-11590.html

    最新回复(0)