最近項目中涉及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;