![]() ![]() ![]() ![]() |
|||||
|
|||||
樓主 Peter ![]()
![]() |
最近有一需求是要把甲地的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樓 |
請教各位大大
我的問題跟樓主很像,我使用的是MSSQL 我目前已經會使用SQL Server的DB Link,可以查詢資料, 我想要做的是: 甲地的A資料庫中的tb_a資料表的內容只要有資料或異動就要同步複製到乙地的B資料庫中tb_b資料表中, 當乙地的B資料庫中tb_b資料表中有欄位被更新後,也必須同步更新甲地的A資料庫中的tb_a資料表的內容 請問MSSQL可以用什麼樣的方式達成呢? 是用觸發程序或預存程序來做嗎? 感謝幫忙
本篇文章回覆於2020-09-10 23:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
回覆 |
如要回應,請先登入. |