Как восстановить одну таблицу из резервной копии .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
с помощью правильных переключателей.