1 準備環境
MySQL中針對不同的功能需求提供了不同的存儲引擎。所謂的存儲引擎也就是MySQL下特定接口的具體實作。
FEDERATED是其中一個專門針對遠端資料庫的實作。一般情況下在本地資料庫中建表會在資料庫目錄中生成相應的表定義檔案,并同時生成相應的資料檔案。
但通過FEDERATED引擎建立的表隻是在本地有表定義檔案,資料檔案則存在于遠端資料庫中(這一點很重要)。
使用FEDERATED建表語句如下:
CREATE TABLE (…) ENGINE =FEDERATED CONNECTION=‘mysql://[name]:[pass]@[location]:[port]/[db-name]/[table-name]’
建立成功後就可直接在本地查詢相應的遠端表了。
需要注意的幾點:
本地的表結構必須與遠端的完全一樣。
2.遠端資料庫目前僅限MySQL
3.不支援事務
4.不支援表結構修改
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SOmJzM2gTZwUjM0MzN5MmY5MmZwQGM4YjNjdjZwE2Nm9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
2 需求
将伺服器A資料庫db_a表中資料,同步更新到伺服器B資料庫db_b表中(即:實作mysql跨庫同步操作)
3 檢視federated引擎是否開啟
通過Navicat連結伺服器A上面的資料庫db_a,在查詢頁面中輸入一下指令:
show engines;
FEDERATED引擎沒有啟動
4 開啟federated引擎
Windows系統 : 在my.ini中加入federated
打開my.ini檔案
在[mysqld]下方添加federated
修改完之後再任務管理器中重新啟動mysql服務
再次資料指令檢視,FEDERATED 已開啟
show engines;
5 建立映射關系
在伺服器A上有MySQL資料庫db_a,在伺服器B上有MySQL資料庫db_b。現在需要将db_a庫中的jg_student表資料映射到資料庫db_b中。此時需要在資料庫db_b中建立表t_student資料庫表,注意ENGINE和CONNECTION。
db_a中jg_student表(伺服器A)
CREATE TABLE `jg_student` (
`sfzh` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`xm` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`xb` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`mz` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`ksly` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`xy` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`rz` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`sfzh`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
db_b中t_student表(伺服器B)
CREATE TABLE `t_student` (
`student_id` int(20) NOT NULL,
`college_name` varchar(255) DEFAULT NULL,
`province_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在db_a中建立fed_student表,表結構同db_b中t_student一緻
-- 建立學生基本資訊表fed_student
CREATE TABLE `fed_student` (
`student_id` varchar(30) NOT NULL,
`college_name` varchar(255) NOT NULL,
`province_name` varchar(255) NOT NULL,
PRIMARY KEY (`student_id`)
) ENGINE=FEDERATED
CONNECTION='mysql://root:[email protected]:3306/db_a/t_student';
其中root為通路伺服器B上mysql的使用者名,後面898是密碼。先要保證這個帳戶可以通路到伺服器B(192.168.0.189)這台伺服器的mysql。
當然要注意3306這個端口。若不能通路看下是不是沒有這個帳戶在目前伺服器ip下的通路權限。
建立觸發器
觸發器具體方法不明白的可以百度
-- 建立觸發器
DELIMITER $$
CREATE
TRIGGER `student_insert_trigger` AFTER INSERT ON `jg_student`
FOR EACH ROW BEGIN
-- 插入資料
INSERT INTO `fed_student`(
`student_id`,
`college_name`,
`province_name`
) VALUES (
new.`sfzh`,
new.`xy`,
new.`ksly`
);
END;
$$
DELIMITER;
6 測試
伺服器A(192.168.8.172)連結db_a中的jg_student表,手動添加一條資料,送出commit後,觀察伺服器B(192.168.0.189)db_b庫中t_student表是否已擁有新添加的資料,若存在,那恭喜你成功完成mysql跨庫的同步操作,若不存在,很遺憾,檢查那個地方語句是否存在問題。謝謝
大家加油!