從 MySQL dump 抽取單一資料表

你有一個含 127 個資料表的 7 GB dump,但在本機只需要其中三個——usersordersproducts。本文說明常見的 sedgrep 技巧為何會出錯,以及如何只用幾下點擊,把你要的資料表(連同它們的外鍵)精準抽出來。

不是每件工作都需要整個資料庫。當你在本機開發某個功能時,你很少會想要一份把磁碟塞滿、又要花一小時才匯入完的完整正式環境 dump。你要的只是這個功能實際會用到的那幾個資料表。

當你在除錯單一資料表時也是如此——要重現 orders 裡的某個資料問題,並不需要另外那 126 個資料表——或者在做部分遷移、只把少數幾個資料表搬到新服務時也一樣。在所有這些情況下,問題都相同:我該怎麼從一個龐大的 dump 裡,乾淨又快速地取出就這幾個資料表

sed/grep 的做法,以及它為何會出錯

經典的解法是用 sed,在 mysqldump 為每個資料表寫入的區段標頭之間切出檔案:

# 從 mysqldump 檔案中取出 users 資料表
sed -n '/-- Table structure for table `users`/,/-- Table structure for table/p' dump.sql > users.sql

看起來很聰明,在一個小巧整齊的 dump 上甚至可能成功一次。但在真實的 7 GB 檔案上,它會以許多不易察覺的方式崩解:

你最後把 awk 疊到 grep 上、再疊到 sed 上,在小樣本上反覆測試,卻仍然不敢相信結果。其實有更好的方法。

用 DumpCleaner 抽取資料表

DumpCleaner 會正確地解析 dump——它理解陳述式邊界、多行 INSERT、反引號與註解——所以它總是切在正確的位置。抽出你需要的資料表只需四個步驟:

  1. 把你的 .sql dump 拖進來。DumpCleaner 串流讀取檔案,所以一個 7 GB 的 dump 是以恆定記憶體開啟,而不是把整個檔案載入。
  2. 看自動偵測出來的資料表清單。每個資料表都會被解析出來,並列出其資料列數與大小——不必在數百萬行裡捲來捲去找東西。
  3. 挑選你要的資料表。勾選 usersordersproducts,或輸入正規表示式/排除樣式(例如 *_logs)來一次去掉整組資料表。
  4. 納入外鍵父表並匯出。可選擇自動帶入被參照的父表,然後匯出一份乾淨、可匯入的檔案。

有幾點讓這件事比 shell 工具省事許多:

只要你需要的資料表——其他一概不要

DumpCleaner 能從任何大小的 dump 中抽取特定資料表——採串流處理、記憶體恆定,並替你解析好外鍵。原生 macOS & iPadOS App,一次性買斷。

在 App Store 下載

常見問題

我可以一次抽取多個資料表嗎?

可以。想勾幾個就勾幾個——usersordersproducts 一起——DumpCleaner 會在一趟處理中把它們全部寫進同一個檔案。

它會保留外鍵相依關係嗎?

可選擇保留。開啟納入外鍵相依關係,凡是你選取的資料表所參照的父表都會被自動帶入,所以抽取結果匯入時不會出現約束錯誤。

我可以依樣式排除資料表嗎?

可以。使用像 *_logs*_sessions 這類排除樣式,或用正規表示式,就能一次去掉整組資料表,不必一個個取消勾選。

它能搭配 PostgreSQL 使用嗎?

可以。DumpCleaner 能讀取 MySQL、MariaDB 與 PostgreSQL(pg_dump)dump,並在抽取資料表時處理像 public.users 這樣帶結構描述前綴的名稱。

別再跟 sed 和 grep 搏鬥

拖進來、挑資料表、匯出。DumpCleaner 從任何 dump 中精準取出你需要的資料表——連同它們的外鍵。

在 App Store 下載