在要還原 mysql 備份檔時, 有時整個 database 的 backup file 檔案很大, 要找出其中某一個區塊很花時間, 也需要用一個能打開大檔的文字編輯器才能找到, 有沒有更方便的方法, 找出其中某個 table 呢? 可以使用好用的文字檔分割工具 csplit (linux 指令)
舉例來說, 我們要找一個 table t_table1 的 dump 檔案內容, 而備份的 mysql database 檔案為 mysqlbackup.sql 我們使用指令如下:
csplit -f output_file mysqlbackup.sql "/Table structure for table `t_table1`/" "/Table structure for table/"
這樣一共會輸出三個檔案: output_file00, output_file01, output_file02, 其中的 output_file01 就會是我們要的 t_table1 這個資料表的 dump 資料了. 當然, 前後的檔案就分別是切出 01 後的 00, 02 了.
所以工作原理就是將 Table structure for table `t_table1` 與 Table structure for table 兩個分割點來進行檔案切割. 所以若是希望把所有的 table 檔分出來, 則可以使用以下指令:
csplit -f output_file mysqlbackup.sql "/Table structure for table/" "{10}"
其中的 10 就是要重覆做幾次(包含前面做第一次, 後面再做10次共11次), 重點是若有 11 個 table, 應該就可以分出 11 個檔案, 其中的 00 沒有用, 而 01~11 就會是那 11個 table 的 dump file, 所以若是不知 table 數量時, 後面的那個參數, 就不能寫超過總數的次數, 否則會一個檔案也不輸出.
另外可以使用 {*} 的方式如下:
csplit -f output_file mysqlbackup.sql "/Table structure for table/" "{*}"
會直接盡可能地使用重覆到無法使用, 也就是 table 有多少就會做多少次, 下面 PS 有說明我在 FreeBSD 8.2 執行時有錯誤, 不過在 CentOS 是可以正常執行的.
使用 csplit 可以快速的切割超級大檔案, 把要找的資料整理出來, 很方便又實用.
繼續閱讀:
http://www.computerhope.com/unix/ucsplit.htm
PS. 雖然上面這篇介紹有使用 {*} 來重覆作業, 不過我實際執行時, 會發生:
csplit: *}: bad repetition count 的錯誤訊息, 環境是 FreeBSD 8.2, 不過在另一台 CentOS 7.1 是可以正常執行的, 所以若是不能使用 {*} 請參考上面說明.