2012-02-27 20 views
0

我正在嘗試編寫一個腳本來從遠程機器上導入數據庫模式,該機器只接受本地ssh連接。從pg_dump中刪除表空間

我設法做任何事情,除了保持相同的編碼有遠程數據庫。

我發現這個解決方案使用的是帶有-C(create)的pg_dump,這樣我就可以用相同的編碼創建數據庫,但是我遇到了一個問題......遠程中有一個表空間數據庫,我不想導入它。

我知道最近版本的psql已經有了no-tablespace參數......但倒黴的是,我不允許升級postgres版本。

有人能告訴我一種方法來刪除SQL轉儲上的所有表空間的出現嗎?像sed什麼的。

非常感謝!

回答

2

我用來通過管道pg_dump到sed來切換安裝之間的表空間,我修改了TABLESPACE子句。

您也可以刪除它,並使用任何編輯器從轉儲文件中除去CREATE TABLESPACE ..並將其加載到另一個數據庫集羣。

我很久以來轉移到新版本,我可以使用--no-tablespaces選項。 根據您的設置,一個shell命令可能看起來像這樣在Linux中 - 從我的頭頂,只測試走馬:

pgdump -h 123.456.7.89 -p 5432 mydb \ 
| sed \ 
-e' /^CREATE TABLESPACE/d' \ 
-e 's/ *TABLESPACE .*;/;/' \ 
-e 's/SET default_tablespace = .*;/SET default_tablespace = '';/' 
| psql -p5432 mylocaldb 
  • -e' /^CREATE TABLESPACE/d' ......刪除與「CREATE TABLESPACE」開頭的行。

  • -e 's/ *TABLESPACE .*;/;/' ...修剪表空間條款(總是在pg_dump的輸出線的末端)從CREATE TABLECREATE INDEX語句。

  • -e "s/SET default_tablespace = .*;/SET default_tablespace = '';" ..廢除任何其他默認表空間,而不是空字符串 - 它表示當前數據庫的默認表空間。請注意使用雙引號",所以我可以輕鬆地輸入單引號'

如果你知道你參與可以縮小下來的表空間的名稱。有一種理論上的可能性,即數據行可以像其中一個搜索條件一樣開始。不過,我從來沒有遇到過問題。

檢查出a page like this欲瞭解更多有關sed的信息。

+0

是的問題是,我需要在腳本中有這樣的sed命令來刪除表空間將是最好的解決方案...儘管我不完全理解sed我不知道sed命令應該如何刪除它 – Killercode 2012-02-27 17:30:28

+0

@Killercode:增加了一點。 – 2012-02-28 02:35:13

+0

我已經自己想通了hehehe sed s/TABLESPACE /; - TABLESPACE或類似的東西 – Killercode 2012-03-01 13:25:13