2010-07-22 137 views
16

我有以下問題,我需要知道是否有辦法解決它。從原始物理文件恢復postgreSQL數據庫

我有一個客戶很便宜,拒絕在運行他的公司的主系統上爲他的postgreSQL數據庫購買備份計劃,而且我認爲有一天會發生一些操作系統文件在停電期間崩潰,操作系統需要重新安裝。

該客戶端沒有任何數據庫備份,但我設法保存了PostgreSQL主目錄。我讀到數據庫以某種方式存儲在postgres主文件夾的數據目錄中。

我的問題是:有什麼辦法只從數據文件夾中恢復數據庫?我在使用PostgreSQL 8.2的Windows環境(XP Service Pack 2)中工作,我需要在新的服務器中重新安裝PostgreSQL。我需要在新環境中重新創建數據庫,並以某種方式將舊文件附加到新的數據庫實例。我知道在SQL Server中這是可能的,因爲引擎存儲數據庫的方式,但我不知道postgres。

任何想法?他們將非常感激。

回答

14

如果您擁有整個數據文件夾,則您擁有所需的所有內容(只要架構相同)。只需在將其擦除之前嘗試將其恢復到另一臺機器上,以防您沒有複製任何內容。

只需將數據目錄保存到磁盤即可。啓動Postgres時,設置參數告訴它數據目錄在哪裏(請參閱:wiki.postgresql.org)。或刪除全新安裝的原始數據目錄,並將副本放置在原位。

+0

哇,這看起來很容易,明天讓我試試看,我會讓你知道結果。感謝您的快速答案;) – Alvos 2010-07-22 05:47:28

+0

我試過了,它應該工作,但我認爲數據文件夾已損壞,因爲它沒有工作。它應該當數據文件夾是好的,但。我將交易文件作爲備份,恢復歷史數據需要更長的時間,但我認爲我能夠恢復所有內容。它只會花費比我希望的更多的時間。感謝您的幫助。我在測試環境中嘗試了您的解決方案,它確實有效。 – Alvos 2010-07-24 15:36:54

+0

謝謝:)。它運行良好。您只需記住帳戶的密碼是舊安裝的密碼,而不是新密碼。 – Nordes 2011-10-18 08:53:24

5

這是可能的,你只需要將舊的計算機中的「data」文件夾(在Postgres安裝文件夾內)複製到新的計算機上,但需要記住一些事項。

首先,在複製文件之前,您必須停止Postgres服務器服務。因此,控制面板 - >管理工具 - >服務,找到Postgres服務並停止它。完成複製文件並設置權限後,重新啓動它。

其次,您需要設置數據文件的權限。由於postgres服務器實際上是在另一個用戶帳戶上運行的,因此如果您將它們複製到數據文件夾中,它將無法訪問這些文件,因爲它沒有權限這樣做。所以您需要將文件的所有權更改爲「postgres」用戶。我不得不使用subinacl這一點,首先安裝它,然後用它從命令提示符像這樣(先定位到文件夾中安裝了它):

subinacl /subdirectories "C:\Program Files\PostgreSQL\8.2\data\*" /setowner=postgres 

(更改所有權也應該可以從做資源管理器:首先你必須禁用文件夾選項中的「使用簡單文件共享」,然後在文件夾屬性對話框中出現一個「安全」選項卡,並且有選項可以設置權限並更改所有權,但我無法做到)

現在,如果服務器服務在您再次手動啓動後無法啓動,您通常可以在「事件」查看器(管理工具 - >事件查看器)中查看原因。 Postgres會拋出一個錯誤事件,檢查它會給你一個關於問題的線索(有時它會抱怨postmaster.pid文件,只是刪除它等)。

+0

它確實有效,我只對pg_hba.conf文件有問題,但評論IPv6線路的確有竅門,謝謝你,併爲我的壞英語感到抱歉。 – pabloferraz 2016-07-01 15:10:22

0

我這樣做,但最棘手的部分是改變人的許可:

  1. 去服務來自的執政工具
  2. 找到
  3. 在日誌選項卡上的變化Postgres的服務,並雙擊它到本地系統
  4. 然後重新啓動
0

的問題是很老了,但是我想分享的有效方法T我找到了帽子。

如果您沒有使用「pg_dump」進行備份,並且您的舊數據是文件夾,請嘗試以下步驟。 在Postgres數據庫中,將記錄添加到「pg_database」表中。使用經理程序或「插入」。 進行必要的檢查並更改以下插入查詢並運行它。

該查詢在工作後會返回一個OID。用此號碼的名稱創建一個文件夾。將舊數據複製到此文件夾後,即可使用。



    /* 
    ------------------------------------------ 
    *** Recover From Folder *** 
    ------------------------------------------ 
    Check this table on your own system. 
    Change the differences below. 
    */ 
    INSERT INTO 
     pg_catalog.pg_catalog(
     datname, datdba, encoding, datcollate, datctype, datistemplate, datallowconn, 
     datconnlimit, datlastsysoid, datfrozenxid, datminmxid, dattablespace, datacl) 
    VALUES(
          -- Write Your collation 
     'NewDBname', 10, 6, 'Turkish_Turkey.1254', 'Turkish_Turkey.1254', 
     False, True, -1, 12400, '536', '1', 1663, Null); 

    /* 
    Create a folder in the Data directory under the name below New OID. 
    All old backup files in the directory "data\base\Old OID" are the directory with the new OID number 
    Copy. The database is now ready for use. 
    */ 
    select oid from pg_database a where a.datname = 'NewDBname'; 

+0

沒問題,除非是正確的表名:pg_catalog.pg_database – alijunior 2018-01-26 15:33:57