这几天有个任务,需要在存储过程中读取远程数据库一个表的数据存到本地表,然后进行计算。

在网上查找了资料,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是本地数据库用户密码

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

更多相关文章

  1. 数据库优化_定位慢查询
  2. R的数据库访问-MySQL
  3. 网易MySQL数据库工程师微专业学习笔记(十二)
  4. 如何在VB.net中进行备份和恢复mysql数据库
  5. mysql数据库之单表查询
  6. 我需要PHP页面显示mysql数据库中的BLOB图像
  7. mysql数据库utf-8编码
  8. JAVA使用JDBC连接MySQL数据库
  9. mysql 数据库整体运行状态确认思路

随机推荐

  1. Android 模拟器 HAXM硬件加速安装
  2. 关于服务端设置了IPV6时,Android请求网络
  3. android 自定义权限问题
  4. Android中Activity四种启动模式详解
  5. Android(安卓)G711A 音频编解码,去除“吱
  6. [置顶] Android官方文档系列(翻译)
  7. 获得Android设备的唯一序列号
  8. Android Xml文件生成,Xml数据格式写入
  9. Android官方DataBinding(三):RecyclerView
  10. Android常见错误处理