台灣最大程式設計社群網站
線上人數
1843
 
會員總數:246092
討論主題:189665
歡迎您免費加入會員
討論區列表 >> MySQL >> 呼叫遠端預存程序
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
呼叫遠端預存程序
價值 : 50 QP  點閱數:4202 回應數:3
樓主

Peter
初學者
142 177
1871 259
發送站內信

請教諸位大大:
最近有一需求是要把甲地的A資料庫中的tb_a資料表的內容
複製到乙地的B資料庫中tb_b資料表中
請問可以用什麼樣的方式達成呢?
可以用預存程序來做嗎??
感謝幫忙

本篇文章發表於2011-02-17 14:18
1樓
最有價值解答

bunko
檢舉此回應
一般來說要將資料從一台MySQL移到另一台MySQL最常用的方法是backup/restore,但是這也就是資料轉換.若是資料量大,或是原本的資料還會再變動,而第二台是要做資料分析,需要參考第一台裡的Table來做Join,可以採用MySQL Federated storage engine.這個Stroage Engine的方式類似其他種DB的DBLink.
底下是我寫的範例:
MySQL Federated storage engine 簡單範例
----------------------------------------
1.環境介紹
Mysql #1 Name: Akira
Mysql #2 Name: Bunko

2.首先先在 Akira 裡面建一個叫test1219a的database

create database test1219a;
use test1219a;
grant all on test1219a.* to 'akira'@'%' identified by 'akiraxyz';
flush privileges;
-------------------
然後再用akira登入

建立一個叫Author的Table
akira@[test1219a] Akira
==>CREATE TABLE Author
-> (AuthorID smallint PRIMARY KEY,
-> AuthorName varchar(255)
-> );



3.然後在Bunko 建立一個叫 test1219b的database

create database test1219b;
use test1219b;
grant all on test1219b.* to 'bunko'@'%' identified by 'bunkonao';
flush privileges;
---------------------
接著用bunko登入,建立一個叫 rAuthor的table


bunko@[test1219b] Bunko
==>CREATE TABLE rAuthor
-> (AuthorID smallint PRIMARY KEY,
-> AuthorName varchar(255))
-> engine=FEDERATED
-> connection='mysql://akira:akiraxyz@192.168.0.100:3307/test1219a/Author';
Query OK, 0 rows affected (0.07 sec)

可以看到上面要指定engine=FEDERATED ,還有連結的資料.包含登入user,password,host ip,port,
database,table組成.

現在select看看...
bunko@[test1219b] Bunko
==>select * from rAuthor;
Empty set (0.01 sec)

空的....正確!因為我們原始的Table也沒有資料.

4.回到Akira

akira@[test1219a] Akira
==>insert into Author values(1, 'Agatha Christie');

akira@[test1219a] Akira
==>select * from Author;
+----------+-----------------+
| AuthorID | AuthorName |
+----------+-----------------+
| 1 | Agatha Christie |
+----------+-----------------+

已插入一筆資料
--------------------------------------
到Bunko看看

bunko@[test1219b] Bunko
==>select * from rAuthor;
+----------+-----------------+
| AuthorID | AuthorName |
+----------+-----------------+
| 1 | Agatha Christie |
+----------+-----------------+

可以順利的看到Akira裡面剛加入的資料.
現在我們在Bunko rAuthor新增資料.

bunko@[test1219b] Bunko
==>insert into rAuthor values(2, 'Stephen King');

到Akira

akira@[test1219a] Akira
==>select * from Author;
+----------+-----------------+
| AuthorID | AuthorName |
+----------+-----------------+
| 1 | Agatha Christie |
| 2 | Stephen King |
+----------+-----------------+

到此可以看到Akira/Bunko兩個MySQL透過Federated storage engine
讓兩邊都能輕易的存取到實際上存在Akira上的Table.

5. Join

在Bunko裡面,再建立一個新Table : Books

bunko@[test1219b] Bunko
==>CREATE TABLE Books
-> (BookID smallint NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> BookName varchar(255),
-> AuthorID smallint NOT NULL,
-> INDEX (AuthorID)
-> );

插入4筆資料:

bunko@[test1219b] Bunko
==>INSERT INTO Books Values(NULL, 'Murder on the Orient Express', 1);

bunko@[test1219b] Bunko
==>INSERT INTO Books Values(NULL, 'Death on the Nile', 1);

bunko@[test1219b] Bunko
==>INSERT INTO Books Values(NULL, 'Different Seasons', 2);

bunko@[test1219b] Bunko
==>INSERT INTO Books Values(NULL, 'The Green Mile', 2);

然後Join

bunko@[test1219b] Bunko
==>SELECT b.BookID,b.BookName,a.AuthorName
-> FROM Books b, rAuthor a
-> where b.AuthorID = a.AuthorID;
+--------+------------------------------+-----------------+
| BookID | BookName | AuthorName |
+--------+------------------------------+-----------------+
| 1 | Murder on the Orient Express | Agatha Christie |
| 2 | Death on the Nile | Agatha Christie |
| 3 | Different Seasons | Stephen King |
| 4 | The Green Mile | Stephen King |
+--------+------------------------------+-----------------+

基本上到此已經運用Federated storage engine 在一道SQL Command裡面進行
兩個不同MySQL的Join查詢.

6. 補充

回到Akira 用root登入,建立另一個user.只有對 test1219a.Author 有select權限.

root@[test1219a] Akira
==>grant select on test1219a.Author to 'selauthor'@'%' identified by 'authorsel';

root@[test1219a] Akira
==>flush privileges;

---------------------------------------------
一樣在Bunko建立第二個 Table rAuthor2.

bunko@[test1219b] Bunko
==>CREATE TABLE rAuthor2
-> (AuthorID smallint PRIMARY KEY,
-> AuthorName varchar(255))
-> engine=FEDERATED
-> connection='mysql://selauthor:authorsel@192.168.0.100:3307/test1219a/Author';

bunko@[test1219b] Bunko
==>select * from rAuthor2;
+----------+-----------------+
| AuthorID | AuthorName |
+----------+-----------------+
| 1 | Agatha Christie |
| 2 | Stephen King |
+----------+-----------------+


一樣可以查詢.....但是試試看INSERT INTO

bunko@[test1219b] Bunko
==>insert into rAuthor2 values(3, 'Louis Cha');
ERROR 1296 (HY000): Got error 10000 'Error on remote system: 1142: INSERT command denied to user 'selauthor'@'192.168.0.100' for table 'A' from FEDERATED


無法INSERT INTO.這樣就不會改到原始資料了.
兩種方式可以視實際的需求,選擇適當的方式來連線作業.
---------------------------------------
若是要在第二台建立一個Table,只是要做一次性的轉換作業,可以將 Federated storage engine的Table用INSERT INTO <newtbl> SELECT的方式到MyISAM或InnoDB的Table,這樣就抓過來了.
本篇文章回覆於2011-02-18 09:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Peter
檢舉此回應
非常感謝^^
本篇文章回覆於2011-02-18 14:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

nicklin
檢舉此回應
請教各位大大
我的問題跟樓主很像,我使用的是MSSQL
我目前已經會使用SQL Server的DB Link,可以查詢資料,
我想要做的是:
甲地的A資料庫中的tb_a資料表的內容只要有資料或異動就要同步複製到乙地的B資料庫中tb_b資料表中,
當乙地的B資料庫中tb_b資料表中有欄位被更新後,也必須同步更新甲地的A資料庫中的tb_a資料表的內容

請問MSSQL可以用什麼樣的方式達成呢?
是用觸發程序或預存程序來做嗎?
感謝幫忙
本篇文章回覆於2020-09-10 23:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.