2008-11-12 85 views
5

獲取單個表的數據,刪除單個表或將整個轉儲文件分解爲各個包含單獨表的文件的最簡單方法是什麼?我通常最終做了大量的vi regex搜索,但我敢打賭有更簡單的方法來用awk/perl等來做這些事情。谷歌搜索結果的第一頁帶回了一堆非工作的perl腳本。操縱巨大的MySQL轉儲文件

回答

9

如果可以的話,可以省下很多麻煩並使用mysqldump -T

documentation

--tab =路徑,-T路徑

農產品製表符分隔的數據文件。對於每個轉儲表,mysqldump 創建一個tbl_name.sql文件,其中包含創建表的CREATE TABLE語句 和包含其 數據的tbl_name.txt文件。選項值是寫入文件的目錄。

默認情況下,.txt數據文件使用列值和每行末尾的換行符之間的製表符 進行格式化。可以使用--fields-xxx和 - lines-terminated-by選項明確指定 格式。

注意
只有在mysqldump在與mysqld服務器相同的機器上運行時才應使用此選項。您必須擁有FILE權限 ,並且服務器必須有權寫入您指定的目錄 中的文件。

11

當我需要從SQL轉儲中取出單個表時,我使用了grep,head和tail的組合。

如:

grep -n "CREATE TABLE" dump.sql 

這就給你每一個行號,所以如果你的表是行200和一個後上線269,我這樣做:

head -n 268 dump.sql > tophalf.sql 
tail -n 69 tophalf.sql > yourtable.sql 

我想你可以延伸這些原則來打破一個腳本,將整個事件分解成每個表格一個文件。

任何人都想要去這裏做嗎?

,可以幫助啓動一個bash循環去另一個位:

grep -n "CREATE TABLE " dump.sql | tr ':`(' ' ' | awk '{print $1, $4}' 

這讓你的行號,並如表名的一個很好的列表:

200 FooTable 
269 BarTable 
+0

頭的輸出可以簡單地通過管道輸送到尾巴 - 這是不是一個壞主意 – deadprogrammer 2008-11-12 23:01:41

+0

非常有趣的解決方案,但maatkit可以做同樣的甚至更多:d – 2010-05-22 23:17:49

4

This shell script將抓取你想要的表並將它們傳遞給splitted.sql

它能夠理解正則表達式,因爲我添加了sed -r選項。

另外MyDumpSplitter可以將轉儲分割成單獨的錶轉儲。

0

我有點晚,但如果它可以幫助任何人,我不得不分裂一個巨大的SQL轉儲文件,以便將數據導入到另一個Mysql服務器。 我最終做的是使用系統命令拆分轉儲文件。

分裂-l 1000 import.sql splited_file

上面將分裂SQL文件每1000行。

希望這可以幫助別人