問題導入
在實際開發中,我們可能會遇到跨庫查詢數據的需要,可能是同一連接下的不同數據庫的表,或是遠程數據庫的表。為了開發方便,我們通常會把異庫的表映射到本地來讀取數據。本文來說說MySQL下的處理辦法,其他數據庫思路相同,可能具體過程略有差異。
一、同一連接下的不同數據庫通過視圖映射到本地
假設在同一連接下有數據庫db1和db2,現需要將db2.user表映射到db1中,可以使用如下語句在db1中創建視圖
CREATE OR REPLACE VIEW db1.vuser AS SELECT * FROM db2.user
db2.user成功映射到db1中
在這樣 我們對db1.vuser中的數據增刪改查,就可以直接影響到db2.user,當然前提是擁有操作db2.user相關操作權限,把我們db2中需要的表通過視圖全部映射到db1中,我們就可以像操作本地庫一樣操作異庫。
二、不同服務下通過FEDERATED存儲引擎訪問在遠程數據庫的表中的數據
Federate存儲引擎也是mysql比較常用的存儲引擎,使用它可以訪問遠程的mysql數據庫上的表,這種引擎的作用類似於oracle數據庫的dblink
1.查看federated引擎是否開啟
點擊進入Navicat並點擊鍵盤上F6,出現命令行界面 ,輸入指令:show engines;
以上說明federated已經安裝但是並沒有開啟
2.開啟federated引擎
Windows系統 : 在my.ini的[mysqld]中加入federated(注意:我這里是mysql解壓版,直接在解壓目錄就可以找到ini文件,安裝版該文件路徑可能有出入)
重啟mysql服務,管理員打開CMD
cmd>net stop mysql
cmd>net start mysql
Linux操作系統:vi /etc/my.cnf(以實際路徑為准),加入一行federated,保存並退出
重啟mysql服務
mysql>service mysqld restart
再次查看,輸入指令:show engines;
3.創建fedearted表
CREATE TABLE (......) ENGINE =FEDERATED CONNECTION='mysql://[name]:[pass]@[location]:[port]/[db-name]/[table-name]'
name--mysql用戶名
pass--mysql密碼
location--ip
port:端口號
db-name:數據庫名
table-name:表名
例子:
CREATE TABLE `user` (
`Id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`UserName` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
`Name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
`Password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密碼',
`Status` int(0) NOT NULL COMMENT '狀態1有效0無效',
`LastLoginTime` datetime(0) NULL DEFAULT NULL,
`CreateTime` datetime(0) NULL DEFAULT NULL,
`Email` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
PRIMARY KEY (`Id`) USING BTREE
) ENGINE = FEDERATED CONNECTION='mysql://root:root@遠程數據庫IP:3306/admboot/user';
至此遠程數據庫的user表就同步到我們本地數據庫上了。我們就可以像操作本地庫一樣操作遠程數據庫了。
注意事項:
- 對本地虛擬表的結構修改,並不會修改遠程表的結構
- truncate 命令,會清除遠程表數據
- drop命令只會刪除虛擬表,並不會刪除遠程表
- 不支持 alter table 命令
- 使用索引時,虛擬表與實體表應同步建立索引
三、跨庫操作的其他方案
跨庫操作的方案有很多種,比如我們還可以在程序上支持多庫連接,那么在數據庫上我們什么都不需要做,在程序中設置好對應數據庫數據即可。
優點:
- 不受數據庫類型限制,主庫和從庫可以是不同的數據庫。
- 不建立數據庫鏈,查詢速度快。
缺點:
- 表間關聯查詢只能在內存中進行
- 多庫事務一致性不好處理
比如還可以通過接口的方式調用從庫數據,等等。大家還有什么比較好的方案可以留言探討。