错误地从数据库中删除了表的行。我们有一个db备份,它会导致一个sql文件,可以像这样恢复:
psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql
这最终会在本地执行完全恢复。但我们需要的是将单个表的行恢复到生产环境。有什么关于如何在PostgreSQL 9.1中实现这一点的提示吗?
谢谢
错误地从数据库中删除了表的行。我们有一个db备份,它会导致一个sql文件,可以像这样恢复:
psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql
这最终会在本地执行完全恢复。但我们需要的是将单个表的行恢复到生产环境。有什么关于如何在PostgreSQL 9.1中实现这一点的提示吗?
谢谢
7条答案
按热度按时间myzjeezk1#
我不知道有什么工具可以做到这一点,但是下面这个一行程序可以从
my_backup.sql
文件中提取precious_table
:83qze16e2#
如果需要单表恢复等,请不要执行SQL备份。Use
pg_dump
's-Fc
option-“自定义”格式。这可以使用pg_restore
恢复。选择性恢复是可能的,因为是其他各种方便的功能。如果需要,pg_restore
可以在以后将自定义格式的转储转换为SQL转储。如果你被一个已有的dump卡住了,你唯一的选择是:
pg_dump
进行选择性转储,仅包括该表。因为它是一次性的,你可以在一些卸载的快速但不安全的机器上使用一个单独的Pg示例,在那里你打开所有的“让它更快,但如果你喜欢吃我的数据”选项,如fsync=off
。你永远不要在生产中使用它。oxalkeyp3#
有一个简单的方法。
“pg_restore”具有“--table/-t”选项。
对远程主机使用“-h”。查看其他选项here
ctrmrzij4#
你可以在罗德中使用grep + sed来获取表数据:
首先,你需要确定边界:
为了提取表test2的数据:
注意,您需要从第二个数字中减去一(即排除下一个副本stmt)
现在,您可以加载
new_table_name.sql
并恢复所需的数据。现在,您可以将数据加载到新表中kpbpu0085#
我最近写了一个关于如何使用restore individual postgres tables的分步指南。
简而言之,它不适用于SQL备份,您需要切换到
pg_dump
来生成备份文件:然后,每当您需要恢复特定表以进行数据恢复或错误调查时,您必须:
1.创建空本地数据库
my_database_restored
1.在空数据库中创建需要恢复的表
my_table
1.运行
pg_restore
,选择性地导入所需表的数据:0kjbasz66#
我碰巧有
pg_dumpall
转储周围。我想从名为edc
的数据库中恢复名为users
的表,因为您很可能会在不同的数据库甚至模式中拥有相同名称的表。对于我的例子,下面的
sed
oneliner可以工作:它的作用:
/^\\connect edc/,/^\\connect/
将搜索限制在我的数据库范围内;{…}
将执行范围内的所有内部命令;/\susers\(\s\|$\)/
匹配所有带有users
的行,包括行的末尾;/;\|\\\./
匹配具有;
或包含\.
的行p
强制输出匹配行(注意,使用-n
调用sed)。根据数据的复杂性,您可能需要对此进行调整。
您所要做的就是使用正确的开关将
sed
输出通过管道传输到psql
命令。krcsximq7#
我编写了一些命令来从纯文本pg_dumpall中只恢复一个表的数据。受Zouppen启发,谢谢。
从备份的纯文本SQL中恢复表的数据,例如使用pg_dumpall。
1.转到备份所在的目录
/data/bkp/
(pg_full_bak.dmp
)1.将表
my_table
中的数据从模式public
提取到文件my_table.sql
中1.检查数据是否正确
1.使用对表具有写权限的帐户连接到包含我们要恢复的空表
my_table
的数据库db_name
1.检查my_table是否为空
1.导入数据
1.检查它是否正常工作
这是为我工作下pg9.3
简单的方法:步骤2、4和6