Восстановите базу данных PostgreSQL -9.6 из старого полного дампа и / или обновленного базового каталога и других восстановленных файлов. - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь восстановить / восстановить базу данных из имеющейся у меня базы:

  • У меня есть все последние файлы в PGDATA/base (/var/lib/postgresql/9.6/main/base/), но у меня есть не полный /var/lib/postgresql/9.6/main/

  • У меня есть все файлы из старого резервного (и не сильно отличающегося) дампа, который я восстановил в новой установке PostgreSQL -9.6.

  • У меня есть много спасенных файлов с жесткого диска (с ddrescue), и я получил тысячи файлов без имени (с «#», а затем с номером вместо «в потерянном» +) найденный каталог), например,

    • У меня есть файл pg_class
    • У меня есть каталог pg_clog с 0000 файлом

Редактировать:

Возможно, у меня есть содержимое pg_xlog, но у меня нет имени файлов. У меня есть 5 файлов размером 16777216 байт:

#288294 (date 2019-04-01)
#288287 (date 2019-05-14)
#288293 (date 2019-07-02)
#261307 (date 2019-11-27)
#270185 (date 2020-01-28)

Также мой старый дамп с 2019-04-23, так что первый может быть таким же?

Итак, мой следующий шаг идет попытаться прочитать эти файлы с pg_xlogdump и / или попытаться присвоить им имена с этими именными файлами (начиная с 00000001000000000000000A по дате и поместить их в новый каталог pg_xlog, который, как я видел, система присваивает им имена файлов, может быть?). Кроме того, я понял, что в последнем указан день, когда произошел сбой жесткого диска, поэтому у меня есть последний.

Каталог PGDATA/base, который я спас с жесткого диска (поврежден), содержит каталоги 1, 12406, 12407 и 37972 с большим количеством файлов внутри. С помощью pg_filedump -fi я проверяю, что мои обновленные данные хранятся в файлах в каталоге 37972.

Те же (но старые) данные хранятся в файлах в каталоге PGDATA/base/16387 в восстановленном дампе.

Я пытался напрямую скопировать файлы из одного в другой, смешивая обновленные данные со старой базой данных, но это не работает. После устранения ошибок разрешений я могу go войти в базу данных "Франкенштейн" следующим образом:

 postgres@host:~$ postgres --single -P -D /var/lib/postgresql/9.6/main/ dbname

И я попытался сделать что-то, например, переиндексацию, и я получил эту ошибку:

PostgreSQL stand-alone backend 9.6.16
backend> reindex system dbname;
ERROR:  could not access status of transaction 136889
DETAIL:  Could not read from file "pg_subtrans/0002" at offset 16384: Success.
CONTEXT:  while checking uniqueness of tuple (1,7) in relation "pg_toast_2619"
STATEMENT:  reindex system dbname;

Конечно, pg_subtrans/0002 файл является частью "Франкенштейна", а не хорошим (потому что я его еще не нашел, не с таким именем), поэтому я попытался: сначала скопировать другой файл, который кажется похожим, и затем, чтобы сгенерировать 8192 нуля с dd для этого файла, в обоих случаях я получаю ту же ошибку (а в случае, если файл не существует, получают DETAIL: Could not open file "pg_subtrans/0002": No such file or directory.). Во всяком случае, я не знаю, что должно быть в этом файле. Как вы думаете, я могу получить эти данные из другого файла? Или я могу найти отсутствующий файл с помощью какого-либо инструмента? Так pg_filedump покажи мне пустой файл для другого файла в этом каталоге pg_subtrans/0000.

Дополнительное примечание: Я нашел этот полезный пост в блоге, в котором говорится о восстановлении из только что спасенных файлов, используя * 1072 Файл *, pg_class, reindex system и другие инструменты, но мне так сложно понять, как адаптировать его к моей конкретной и более простой проблеме (я думаю, что моя проблема легче, потому что у меня есть дамп): https://www.commandprompt.com/blog/recovering_a_lost-and-found_database/

1 Ответ

0 голосов
/ 18 февраля 2020

Это обречено. Без информации в pg_xlog и (в частности) pg_clog вы не сможете получить эту информацию обратно.

Знающий эксперт-криминалист мог бы спасти некоторые ваши данные, но это не простой процесс.

...