還是老問題
最近在開發一個項目,需要訪問另一個項目的數據,由於兩個數據庫是部署在同一個服務器上,且本項目只是對另一數據讀取,因此決定在項目中使用雙數據源配置進行訪問。
如果是想在代碼中做雙數據源配置,可以查看我的另一篇文章: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 ;