2010-07-14 152 views
21

我想使用代碼而不是使用像「MySQL Migration Toolkit」這樣的工具。我知道的最簡單的方法是打開連接(使用MySQL連接器)到DB1並讀取其數據。打開與DB2的連接並將數據寫入其中。有更好/最簡單的方法嗎?如何在2個MySQL數據庫之間傳輸數據?

+1

兩個數據庫或不同服務器上的兩個數據庫? – 2010-07-14 00:33:12

+0

@Itay:我不確定天氣他們是否在同一臺服務器上?我知道這有所作爲,但我並沒有想到要問他們。我明天會做。 – Morano88 2010-07-14 00:38:17

回答

20

首先我要假設你是不是在把剛纔複製的位置數據/目錄,因爲如果你正在使用你現有的快照/備份/恢復可能就足夠了(並且測試你的備份/恢復程序進行討價還價)。

在這種情況下,如果兩個表的結構通常最快,而諷刺的是,最簡單的方法是在一端使用SELECT ... INTO OUTFILE ...,並且LOAD DATA INFILE ... on另一個。

有關詳細信息,請參閱http://dev.mysql.com/doc/refman/5.1/en/load-data.html和.../select.html。

對於瑣碎表下面的工作:

SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

LOAD DATA INFILE '/tmp/mytable.csv' INTO TABLE mytable 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

我們也使用FIFO的有很大的影響,以避免實際寫入磁盤的開銷,或者如果我們確實需要寫入到磁盤由於某種原因,通過gzip管道。

即。

mkfifo /tmp/myfifo 
gzip -c /tmp/myfifo > /tmp/mytable.csv.gz & 
... SEL 

ECT... INTO OUTFILE '/tmp/myfifo' ..... 
wait 

gunzip -c /tmp/mytable.csv.gz > /tmp/myfifo & 
... LOAD DATA INFILE /tmp/myfifo ..... 
wait 

基本上,一個你直接表數據的FIFO可以壓縮它,它Munge時間或隧道它通過網絡你的心內容。

+0

謝謝,儘管它在dev.mysql手冊中,但它不能正常工作。它給我這個錯誤: 你的SQL語法有錯誤;請檢查與您的MySQL服務器版本相對應的手冊,以在第1行'\ n''附近使用正確的語法) 它不接受'\ n'..爲什麼? – Morano88 2010-07-16 22:06:06

+0

堆棧溢出損壞了示例查詢。在源代碼中,ESCAPED BY子句中的斜槓被轉義,但轉換爲html時轉義丟失。對不起,我沒有注意到腐敗 - 我已經解決了上述問題。 – Recurse 2010-07-19 23:57:24

+0

這正是我需要用來加快備份相當大的數據庫,但我無法讓你的例子工作。我可以創建FIFO,如果我使用mysqldump轉儲到管道,它的工作原理很好。但是,如果我嘗試使用SELECT ... INTO OUTFILE轉儲到管道,則會出現「myfifo已存在」錯誤。 – 2011-10-06 09:09:36

11

FEDERATED存儲引擎?不是這一羣人中速度最快的人,而是一次,偶然或少量的數據。假設你在談論2個服務器。隨着2個數據庫在同一個服務器,它會僅僅是:

INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename; 
+0

非常感謝,我還不確定如果2個數據庫在同一臺服務器上或不在。 – Morano88 2010-07-14 00:34:41

+0

這對我的情況來說太棒了。乾杯:) – Nick 2013-05-10 07:24:40

+0

在Amazon RDS中工作良好,您無法訪問運行MySQL實例的底層機器,排除涉及INFILE/OUTFILE的解決方案。 – Andz 2015-09-27 07:35:37

1

您可以使用mysqldumpmysql(命令行客戶端)。這些是命令行工具,在你寫的問題中,你不想使用它們,但仍然使用它們(即使通過在代碼中運行它們)是最簡單的方法; mysqldump解決了很多問題。

您可以使select從一個數據庫和insert到另一個,這很容易。但是,如果您還需要傳輸數據庫模式(create table s等),它會稍微複雜一些,這是我推薦mysqldump的原因。但很多PHP-MySQL-admin工具也可以做到這一點,所以你可以使用它們或查看他們的代碼。

也許你可以使用MySQL複製。

+0

如果兩個數據庫位於兩臺不同的服務器上,這會(選擇,插入)工作嗎? 不,我只是想遷移數據,而不是表創建..等 – Morano88 2010-07-14 00:34:15

+0

是的,你將有tvo連接 - 對於每個服務器一個 - 在一個連接中運行SELECT,然後在另一個INSERT中從該SELECT返回的數據。 – Messa 2010-07-14 09:11:23

0

如果啓用了當前服務器上的二進制日誌(並擁有所有的bin日誌),你可以在第二個服務器設置複製