2012-11-09 74 views
0

在這裏嘗試做我認爲很簡單的事情。我正在嘗試移動到shell腳本/ MySQL選項,以便將數據從一個數據庫中的一個表中獲取到另一個數據庫中的臨時表中。基本上截斷表db2.stage_customer_log,然後db1.customer_log - > db2.stage_customer_log。我嘗試了幾個選項,每個選項都取得了有限的成功,並且我已經準備好提供建議。將數據從一個MySQL數據庫表導出到另一個數據庫表的最佳選擇

我嘗試的第一個想到的就是:

mysqldump -p dbname -u uname customer_log > stage_customer_log.csv --no-create-info 

但事實證明,這不是一個很好的選擇,因爲生成的文件是一個插入到原始表名。所以我不得不做一些小小的操作才能使它起作用。

接下來,我創建了這個shell腳本:

#!/bin/sh 
mysql -h hostname -P 99999 -u uname -p --database dbname <<STOP 

SELECT * FROM customer_log INTO OUTFILE 'stage_dm_customer_log.csv' 
FIELDS TERMINATED BY ',' ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n'; 

\q 
STOP 
test $? = 0 && echo "Your batch job terminated gracefully" 

這給了我,我想(用逗號分隔的文件)的結果,但它把文件中的MySQL目錄(即使我進入了一個絕對的路徑或'./'或其他)。看到我在亞馬遜託管,第二部分(導入)不起作用,因爲我得到訪問錯誤。

然後我回到第一個選項,當我閱讀更多的選項。我的最後一個命令是這樣的:

mysqldump -p dbname -u uname customer_log --no-create-info --no-create-db --tab='/tmp/' --fields-optionally-enclosed-by='"' --fields-terminated-by=',' --fields-escaped-by='' --lines-terminated-by='\n' --verbose 

但是又以文件名稱結尾,必須被操縱。

我終於嘗試過把Pentaho引入表中,我不知道它是否是我們的實例,但是對於這樣的小記錄(85,000分鐘需要32分鐘)需要相當長的時間。所以,我不需要具體的東西,但是這樣的東西最好的路線是什麼?其他人實施了什麼?

謝謝。

回答

0

如果這兩個數據庫駐留在同一臺主機上,那麼你就可以運行這個命令:

INSERT INTO db2.stage_customer_log (column1, column2, ...) 
SELECT column1, column2, ... 
FROM db1.stage_customer_log 
WHERE [your filters here] 

但是,如果他們在不同的服務器上,那麼這可能會有所幫助:

mysqldump -u user1 -ppassword1 -h host1 [some options here] db1 stage_customer_log | mysql -u user2 -ppassword2 -h host2 [some options here] db2 

mysqldump總是將csv文件保存在服務器計算機上,並在客戶端保存sql轉儲。

更新1

還有一個竅門,可以或者使用MySQL工作臺(你可以節省您的本地硬盤驅動器上的轉儲文件)或使用FEDERATED storage engine

+0

其實我應該指出。我希望他們是,但不幸的是,他們不僅在不同的機器上,而且還有一個是亞馬遜EC2,他們還有其他RDS,所以我沒有shell進行導入。我只能使用「mysqlimport」作爲第二個選項。 – zapatify

+0

如果您只想使用腳本,那麼使用'FEDERATED'存儲引擎怎麼樣?你也可以使用MySQL Workbench。我的答案更新1中的更多信息。 – GregD

+0

就是這樣。我走了這條路,讓它按我想要的方式工作。 mysqldump -u user1 -ppassword1 -h host1 [這裏有些選項] db1 stage_customer_log | mysql -u user2 -ppassword2 -h host2 [這裏有些選項] db2 謝謝 – zapatify

相關問題