最近项目中涉及MySQL数据库视图的创建,需要整合两个位于不同服务器上数据库的内容,就遇到了远程访问数据库的问题。在cracle中可以通过dblink来实现跨本地数据库来访问另外一个数据库中的数据。通过在网上查找,发现可以通过MySQL中的federated插件来实现类似的功能。
操作环境:
宿主机为Windows 10系统,MySQL数据库IP:192.168.1.98;从机为VMware虚拟机中的Linux系统,版本为CentOS 6.5,MySQL数据库IP:192.168.1.106。
实现功能:
可以在Linux系统中MySQL数据库(target端)中建立宿主机MySQL数据库(source端)中某个表的link,当在Linux中读取link表时,就相当于直接读取宿主机中的原始表内容。
实现步骤:
1、查看target端(Linux虚拟机中)是否安装federated插件:
mysql> show engines;
显示没有安装federated插件
2、安装federated插件:
mysql> install plugin federated soname 'ha_federated.so';
[root@localhost etc]# service mysqld stop
[root@localhost etc]# mysqld_safe --federated &
mysql> show engines;
federated插件已经启用
3、配置/etc/my.conf,设置federated为默认启动
[root@localhost etc]# vim /etc/my.conf
federated
重启mysql服务
[root@localhost ~]# service mysqld restart
mysql> show engines;
已经设置为默认启动。
4、在source端建立测试表,通过Navicat建立表的,其SQL文件为:
DROP TABLE IF EXISTS e_eledata;
CREATE TABLE e_eledata (
ID bigint(20) unsigned NOT NULL auto_increment COMMENT 'ID',
E_ELEMETERHEAD_ID bigint(20) default NULL COMMENT '电表表头ID',
DAQDT timestamp NULL default NULL COMMENT '数据采集时间',
DLDT timestamp NULL default NULL COMMENT '数据入库时间',
APCURRENT decimal(10,3) default NULL COMMENT 'A相电流。单位:A。',
BPCURRENT decimal(10,3) default NULL COMMENT 'B相电流。单位:A。',
CPCURRENT decimal(10,3) default NULL COMMENT 'C相电流。单位:A。',
APVOLTAGE decimal(10,3) default NULL COMMENT 'A相电压。单位:V。',
BPVOLTAGE decimal(10,3) default NULL COMMENT 'B相电压。单位:V。',
CPVOLTAGE decimal(10,3) default NULL COMMENT 'C相电压。单位:V。',
PRIMARY KEY (ID)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='电路数据表';
5、在target端建立link表,可以直接改写source表的SQL脚本文件为:
DROP TABLE IF EXISTS e_eledata_link;
CREATE TABLE e_eledata_link (
ID bigint(20) unsigned NOT NULL auto_increment COMMENT 'ID',
E_ELEMETERHEAD_ID bigint(20) default NULL COMMENT '电表表头ID',
DAQDT timestamp NULL default NULL COMMENT '数据采集时间',
DLDT timestamp NULL default NULL COMMENT '数据入库时间',
APCURRENT decimal(10,3) default NULL COMMENT 'A相电流。单位:A。',
BPCURRENT decimal(10,3) default NULL COMMENT 'B相电流。单位:A。',
CPCURRENT decimal(10,3) default NULL COMMENT 'C相电流。单位:A。',
APVOLTAGE decimal(10,3) default NULL COMMENT 'A相电压。单位:V。',
BPVOLTAGE decimal(10,3) default NULL COMMENT 'B相电压。单位:V。',
CPVOLTAGE decimal(10,3) default NULL COMMENT 'C相电压。单位:V。',
PRIMARY KEY (ID)
) ENGINE=FEDERATEDAUTO_INCREMENT=1DEFAULT CHARSET=utf8 COMMENT='电路数据表'
CONNECTION='mysql://usrname:password@192.168.1.98:3306/databasename/table';
其中:
usrname为宿主机中MySQL的用户名
password为相应的密码
(要保证该用户具有远程登陆的权限,可以通过以下命令来设置:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'usrname'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
其中*.*是指对用户开放所有数据库和表的权限,如果只开放某一个数据库的一个表为databasename.table;’%‘指的是该用户可以从任意的一个ip地址来远程访问数据库,包括本地,如果要限制用户从特定的ip来访问,将其改为’ip地址’)
192.168.1.98是source数据库的IP,宿主机的IP:3306为数据库的端口,默认一般为3306
database和table分别为source端数据库的名称和表名称
将该SQL脚本在target端运行
6、实现跨本地数据库的访问
在target端通过访问e_eledata_link表来访问source端e_eledata表
mysql> select * from e_eledata_link;