还是老问题
最近在开发一个项目,需要访问另一个项目的数据,由于两个数据库是部署在同一个服务器上,且本项目只是对另一数据读取,因此决定在项目中使用双数据源配置进行访问。
如果是想在代码中做双数据源配置,可以查看我的另一篇文章:SpringMVC双数据源配置
今天我这边要讲的是另一种方式,mysql基于federated存储引擎访问远程数据库表。
基于这种方式,从程序角度来看,只需要访问一个数据库即可。
但是这个是有一个前置条件:两个数据库都必须是mysql数据库,且被访问的表必须是可以通过网络访问到的(同一台机器也好,同一个局域网也好,走外网映射也好,总之要能被访问就是了)
好了,话不多说,马上开始。
假设有A和B两个数据库。
B库想访问A库的表a
1、先开启B库的federated存储引擎
查看数据库的federated存储引擎是否开启;
方法一、打开mysql的命令行客户端,输入show engines;
方法二、打开navicate,在information_schema中找到ENGINES表
查看表的记录
显示NO就表示没打开,需要打开;
打开MYSQL的my.ini文件,进行编辑,在[mysqld]标签下添加federated,具体如下
设置完后重启mysql服务,即可。
2、在B库中添加数据表
CREATE TABLE `a` (
`id` varchar(64) NOT NULL ,
`no` varchar(32) DEFAULT NULL ,
`name` varchar(64) DEFAULT NULL ,
`start_time` varchar(128) DEFAULT NULL ,
`end_time` varchar(128) DEFAULT NULL
) ENGINE=FEDERATED
CONNECTION='mysql://root:123456@localhost:3306/A/a'
DEFAULT CHARSET=utf8 ;
注意:
ENGINE=FEDERATED指定引擎类型
CONNECTION='mysql://root:123456@localhost:3306/A/a'指定连接的数据库和表信息
root:数据库用户名
123456:数据库密码
localhost:A库的访问地址
3306:A库的端口
A:数据库名称
a:表名
创建完后就看到B库有a表,可以进行查询和修改,具体的访问权限是根据CONNECTION里面的数据库用户权限来决定的。
到此,程序就可以直接通过B库访问和修改A库中的a表。
比起SpringMVC双数据源配置,这种方式相对是比较简单的,而且这个是可以关联多个数据库的。
问题:
1.数据库密码可能带有特殊字符,如@字符
遇见这种用上面的创建方法无法创建,会报错
可以使用如下解决方法
先创建一个链接服务
CREATE SERVER fedlink FOREIGN DATA WRAPPER mysql OPTIONS (
USER 'root', #数据库用户名
PASSWORD '123456', #数据库密码
HOST '192.168.0.11', #数据库地址
PORT 3306, #数据库端口
DATABASE 'XXXXX' #数据库名
);
然后再创建表
CREATE TABLE `a` (
`id` varchar(64) NOT NULL ,
`no` varchar(32) DEFAULT NULL ,
`name` varchar(64) DEFAULT NULL ,
`start_time` varchar(128) DEFAULT NULL ,
`end_time` varchar(128) DEFAULT NULL
) ENGINE=FEDERATED
CONNECTION='fedlink/a'
DEFAULT CHARSET=utf8 ;
如果要删除FEDERATED连接,则只要使用drop table XXX即可,该操作会删除链接,但是原库的表不会有任何修改。