Я пытаюсь восстановить / восстановить базу данных из имеющейся у меня базы:
У меня есть все последние файлы в 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/