Подтвердить что ты не робот

Восстановление баз данных postgreSQL из сырых физических файлов

У меня есть следующая проблема, и мне нужно знать, есть ли способ ее исправить.

У меня есть клиент, который был достаточно дешев, чтобы отказаться от покупки плана резервного копирования для своих баз данных postgreSQL в основной системе, в которой работает его компания, и, как я думал, это произойдет когда-нибудь, некоторые файлы ОС разбились во время отключения электроэнергии и потребности в ОС для переустановки.

У этого клиента не было резервных копий баз данных, но мне удалось сохранить основной каталог PostgreSQL. Я прочитал, что базы данных хранятся как-то внутри каталога данных главной папки postgres.

Мой вопрос: есть ли способ восстановить базы данных только из папки данных? Я работаю в среде Windows (XP Service Pack 2) с PostgreSQL 8.2, и мне нужно переустановить PostgreSQL на новом сервере. Мне нужно было бы воссоздать базы данных в новой среде и как-то прикрепить старые файлы к новым экземплярам базы данных. Я знаю, что это возможно в SQL Server из-за того, как этот механизм хранит базы данных, но у меня нет подсказки в postgres.

Любые идеи? Они будут очень благодарны.

4b9b3361

Ответ 1

Если у вас есть вся папка данных, у вас есть все, что вам нужно (до тех пор, пока архитектура будет одинаковой). Просто попробуйте восстановить его на другой машине, прежде чем вытереть это, если вы ничего не скопировали.

Просто сохраните каталог данных на диске. При запуске Postgres задайте параметр, указывающий, где находится каталог данных (см. wiki.postgresql.org). Или удалите исходный каталог данных новой установки и поместите копию на свое место.

Ответ 2

Это возможно, вам просто нужно скопировать папку "данные" (внутри папки установки Postgres) со старого компьютера на новый, но есть несколько вещей, о которых нужно помнить.

Сначала, прежде чем копировать файлы, вы должны остановить службу сервера Postgres. Итак, Control Panel- > Administrative tools- > Services, найдите службу Postgres и остановите ее. Когда вы закончите копирование файлов и установили разрешения, запустите его снова.

Во-вторых, вам нужно установить разрешения для файлов данных. Поскольку сервер postgres фактически работает с другой учетной записью пользователя, он не сможет получить доступ к файлам, если вы просто скопируете их в папку данных, потому что у него не будет прав на это. Поэтому вам нужно изменить права собственности на файлы на пользователя "postgres". Мне пришлось использовать subinacl для этого, сначала установить его, а затем использовать его из командной строки (сначала перейдите в папку, где вы ее установили):

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

(Изменение владельца также должно быть возможно сделать из проводника: сначала вы должны отключить "Использовать простой общий доступ к файлам" в опциях "Папка", затем в диалоговом окне "Свойства" появится вкладка "Безопасность", и там есть варианты устанавливать разрешения и изменять право собственности, но я не мог этого сделать.)

Теперь, если служба сервера не может запускаться после повторного запуска вручную, обычно вы можете увидеть причину в средстве просмотра событий (Administrative tools → Event viewer). Postgres выведет событие с ошибкой, и проверка его даст вам представление о проблеме (иногда она будет жаловаться на файл postmaster.pid, просто удалите его и т.д.).

Ответ 3

Я делаю так, но самой сложной частью было изменение разрешения владельца:

  • перейти к сервисам из административных инструментов
  • найдите службу postgres и дважды щелкните по ней.
  • при переходе на вкладку входа в локальную систему
  • затем перезапустите

Ответ 4

Вопрос очень старый, но я хочу поделиться эффективным методом, который нашел.

Если у вас нет резервной копии с "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';