2012-07-17 40 views
4

我有一個巨大的mysqldump輸出,並希望排除特定表的插入。從mysqldump輸出中刪除特定表的插入數據(sed?)

文件看起來是這樣的:

-- 
-- Dumping data for table `big_table` 
-- 

INSERT INTO `big_table` ... 
INSERT INTO `big_table` ... 


-- 
-- Table structure for table `next_table` 
-- 

我怎樣才能切出那些來「對錶BIG_TABLE傾銷數據」和下一個「爲表表結構」之間插入的文件過大,以適應在文本編輯器中。

+0

有多大的文件?另外,你是在切割插件嗎?最後,命令是在一行中,還是可能分成多行? – Shahbaz 2012-07-17 12:20:56

+0

該文件是1.9 GB。我認爲插入也可以是多線。基本上我想削減這兩個標記之間的一切。我認爲它應該是可能的與sed。 – Alex 2012-07-17 12:22:30

+0

啊,所以用'--'s和''table'結構爲表'next_table'「的''big_table'表的轉儲數據'實際上在文件中?你想刪除兩個標記之間的任何內容(包括也許是「傾倒...」部分)?還是隻有插入? – Shahbaz 2012-07-17 12:26:26

回答

4

使用sed的一個解決方案。它搜索文字-- Dumping data for table 'big_table'-- Table structure for table之間的所有行。並評論那些不以--開頭的行。

假設infile內容:

1 
2 
3 
4 
-- 
-- Dumping data for table `big_table` 
-- 

INSERT INTO `big_table` ... 
INSERT INTO `big_table` ... 


-- 
-- Table structure for table `next_table` 
-- 
1 
2 
3 
4 
5 
6 

運行命令:

sed -e ' 
    /-- Dumping data for table `big_table`/,/-- Table structure for table/ { 
     /^--/! s/^/--/ 
    } 
' infile 

有了以下的輸出:

1 
2 
3 
4 
-- 
-- Dumping data for table `big_table` 
-- 
-- 
--INSERT INTO `big_table` ... 
--INSERT INTO `big_table` ... 
-- 
-- 
-- 
-- Table structure for table `next_table` 
-- 
1 
2 
3 
4 
5 
6 
+0

太棒了!但是,刪除這些行還必須有解決方案嗎? – Alex 2012-07-17 12:44:18

+2

@亞歷克斯:是的。用'd'替代's/^/- /'來刪除那些不以'--'開頭的行。 – Birei 2012-07-17 12:46:56

0

怎麼樣解決方法:

  1. 備份你不想更新(重新命名然後將它重新也許一個空的版本)
  2. 運行轉儲
  3. 恢復你的表和覆蓋表由轉儲供應

我希望這有助於。

+0

我沒有可能做出新的轉儲。如果我有我會使用https://github.com/amenk/SelfScripts/blob/master/mysql-stripped-dump – Alex 2012-07-17 12:30:50

8

我忽略了所有插入當然都以表名開頭的事實。所以我可以簡單地使用

 
grep -v "INSERT INTO \`big_table\`" dump.sql > dump_stripped.sql 
相關問題