Как восстановить одну таблицу из резервной копии .sql postgresql?

Строки таблицы были ошибочно удалены из базы данных. У нас есть резервная копия db, в результате которой создается файл sql, который можно восстановить так:

psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql

Это приводит к полному восстановлению локально. Но нам нужно восстановить отдельные строки таблицы для производства. Любые советы о том, как сделать эту работу с PostgreSQL 9.1?

Спасибо

Ответ 1

Не делайте резервных копий SQL, если вам нужно восстановление одной таблицы и т.д. Использовать опцию pg_dump -Fc - формат. Это можно восстановить с помощью pg_restore. Выборочное восстановление возможно, как и всевозможные другие удобные функции. pg_restore может преобразовать дамп пользовательского формата в дамп SQL позже, если вам это нужно.

Если вы застряли в существующем дампе, ваши единственные варианты:

  • Используйте текстовый редактор, чтобы извлечь данные целевой таблицы в отдельный файл и просто восстановить это; или

  • Восстановите дамп в базе данных сбрасывания, затем используйте pg_dump, чтобы выбрать выборочный дамп, включая только эту таблицу. Так как это выбрасывает, вы можете использовать отдельный экземпляр Pg на каком-то незагруженном быстром, но небезопасном компьютере, где вы включаете все "быстро, но едите мои данные, если хотите", такие как fsync=off. Вы НИКОГДА не должны устанавливать это в процессе производства.

Ответ 2

Я не знаю ни одного инструмента для этого, но этот однострочный файл извлекает precious_table из my_backup.sql файла:

sed -n '/^COPY precious_table /,/^\\\.$/p' my_backup.sql

Ответ 3

Вы можете использовать grep + sed в roder для получения данных таблицы:

Сначала вам нужно определить границы:

$ fgrep -Ehn '^(COPY |CREATE TABLE )' db.sql
49:CREATE TABLE test (
60:CREATE TABLE test2 (
71:CREATE TABLE test3 (
82:COPY test (i) FROM stdin;
100090:COPY test2 (i) FROM stdin;
200098:COPY test3 (i) FROM stdin;

Чтобы извлечь данные для таблицы test2:

sed -n '100090,200097p' < db.sql | sed -e 's/^COPY test2/COPY new_table_name/' > new_table_name.sql

Обратите внимание: вам нужно вычесть один из второго числа (например, исключить следующую копию stmt)

Теперь вы можете загрузить new_table_name.sql и восстановить данные, которые вам нужны. Теперь вы можете загружать данные в новую таблицу

Ответ 4

Существует простой способ.

'pg_restore' имеет параметр '--table/-t'.

pg_restore -a -t your_table /path/to/dump.sql

Используйте '-h' для удаленного хоста. Другие варианты здесь

Ответ 5

У меня pg_dumpall сбрасывается. И я хотел бы восстановить таблицу с именем users из базы данных с именем edc, так как вы, скорее всего, будете иметь одинаково названные таблицы в разных базах данных и даже схемах.

В моем случае работает следующий sed oneliner:

sed -ne '/^\\connect edc/,/^\\connect/{/\susers\(\s\|$\)/,/;\|\\\./p}' pg92.dump

Что он делает:

  • /^\\connect edc/,/^\\connect/ ограничивает поиск областью моей базы данных;
  • {…} будет выполнять все внутренние команды для диапазона;
  • /\susers\(\s\|$\)/ соответствует всем строкам с users на свой собственный, в том числе в конце строки;
  • /;\|\\\./ соответствует строкам с ; или содержит \.
  • p принудительно выводит соответствующие строки (обратите внимание, что sed вызывается с помощью -n).

В зависимости от сложности ваших данных вам может потребоваться настроить это.

Все, что вам нужно сделать, это выполнить вывод sed в команду psql с помощью правильных переключателей.