AnA*_*ice 15 postgresql sed postgresql-9.1
表的行被错误地从数据库中删除.我们有一个db备份,它会生成一个可以像这样恢复的sql文件:
psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql
Run Code Online (Sandbox Code Playgroud)
这最终在本地进行完全恢复.但我们需要的是将单个表的行恢复为生产.有关如何使用PostgreSQL 9.1的任何提示?
谢谢
Zou*_*pen 17
我不知道这方面的任何工具,但是这一个班轮提取precious_table的my_backup.sql文件:
sed -n '/^COPY precious_table /,/^\\\.$/p' my_backup.sql
Run Code Online (Sandbox Code Playgroud)
Cra*_*ger 11
如果你需要单一的表恢复等,不要做SQL备份使用pg_dump的-Fc选项 - '自定义’格式.这可以使用恢复pg_restore.可以选择性恢复,以及各种其他方便的功能.pg_restore如果需要,可以在以后将自定义格式转储转换为SQL转储.
如果您遇到现有转储,您唯一的选择是:
使用文本编辑器将目标表数据提取到单独的文件中,然后将其恢复; 要么
将转储还原到一次性数据库,然后使用pg_dump包括该表的选择性转储.由于它是一次性的,你可以在一些卸载的快速但不安全的机器上使用一个单独的Pg实例,你可以打开所有"快速,但如果你愿意,可以吃我的数据"选项fsync=off.你永远不应该在生产中设置它.
您可以在roder中使用grep + sed来获取表数据:
首先,您需要确定边界:
$ 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;
Run Code Online (Sandbox Code Playgroud)
为了提取表test2的数据:
sed -n '100090,200097p' < db.sql | sed -e 's/^COPY test2/COPY new_table_name/' > new_table_name.sql
Run Code Online (Sandbox Code Playgroud)
注意,您需要从第二个数字中减去一个(即排除下一个副本stmt)
现在,您可以加载new_table_name.sql和还原所需的数据.现在,您可以将数据加载到新表中
有一个简单的方法。
'pg_restore' 有一个 '--table/-t' 选项。
pg_restore -a -t your_table /path/to/dump.sql
Run Code Online (Sandbox Code Playgroud)
对远程主机使用“-h”。在此处查看其他选项