1. 服務配置說明:
服務器名稱 |
服務器地址 |
數據庫名稱 |
用戶名 |
密碼 |
端口 |
數據庫服務器A |
121.xx.xx.xx |
youjihui_zs |
root |
youjihui |
3306 |
數據庫服務器B |
120.yy.yy.yy |
youjihui_cx |
root |
root |
3309 |
2. 目標:
服務器A中數據庫youjihui_zs中的數據表t_index和服務器B中數據庫youjihui_cx中數據表t_index_cx數據同步。
3.約束
如果直接採用federated的方式,即t_index建立federated引擎,映射到t_index_cx表。由於映射後,這兩個表的數據和操作是完全同步的,也就是說,在其中任何一個表上執行插入、更新和刪除操作,引擎會在另外一個表中執行同樣的操作。
由於t_index是正式數據庫的表,t_index_cx是查詢數據庫的表。如果在查詢數據庫中操作數據,引發正式庫的數據變化,是相當有風險的。
4.方案
方案結構圖如下:
過程說明:
4.1. 查詢庫授權正式庫的操作權限
授權可以從ip爲121.xx.xx.xx的服務器A上,用root用戶密碼是root,訪問當前服務器B的mysql服務:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'121.xx.xx.xx' IDENTIFIED BY 'root' WITH GRANT OPTION;
4.2. FEDERATED引擎
create table t_index_zs
(
id VARCHAR(50) not null,
mc VARCHAR(200),
PRIMARY KEY(id)
)ENGINE=FEDERATED CONNECTION='mysql://root:[email protected]:3309/youjihui_cx/t_index_zs_map'
4.3. 觸發器2
-- INSERT 觸發器
DROP TRIGGER IF EXISTS tindex_insert_after_trigger;
CREATE TRIGGER tindex_insert_after_trigger
AFTER INSERT ON t_index_zs_map
FOR EACH ROW
BEGIN
INSERT INTO t_index_cx(id,mc) VALUES(new.id,new.mc);
END;
-- UPDATE 觸發器
DROP TRIGGER IF EXISTS tindex_update_after_trigger;
CREATE TRIGGER tindex_update_after_trigger
AFTER UPDATE ON t_index_zs_map
FOR EACH ROW
BEGIN
UPDATE t_index_cx SET mc=new.mc WHERE id=new.id;
END;
-- DELETE 觸發器
DROP TRIGGER IF EXISTS tindex_delete_after_trigger;
CREATE TRIGGER tindex_delete_after_trigger
AFTER DELETE ON t_index_zs_map
FOR EACH ROW
BEGIN
DELETE FROM t_index_cx where id=old.id;
END;
5.總結
添加2張中間表和2個觸發器,避開正式表的直接操作,進而避免破壞正式表的數據。