如何从.sql postgresql备份还原单个表?
表的行被错误地从数据库中删除。我们有一个数据库备份,它会生成一个sql文件,可以像这样还原:如何从.sql postgresql备份还原单个表?,postgresql,sed,postgresql-9.1,Postgresql,Sed,Postgresql 9.1,表的行被错误地从数据库中删除。我们有一个数据库备份,它会生成一个sql文件,可以像这样还原: psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql 这最终会在本地执行完全恢复。但我们需要的是将单个表的行恢复到生产状态。关于如何使用PostgreSQL 9.1实现这一点,有什么建议吗 谢谢如果需要单表还原等,请不要执行SQL备份,这是“自定义”格式。这可以使用pg\u r
psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql
这最终会在本地执行完全恢复。但我们需要的是将单个表的行恢复到生产状态。关于如何使用PostgreSQL 9.1实现这一点,有什么建议吗
谢谢如果需要单表还原等,请不要执行SQL备份,这是“自定义”格式。这可以使用
pg\u restore
进行恢复。选择性恢复是可能的,其他各种方便的功能也是如此pg_restore
可以在以后需要时将自定义格式转储转换为SQL转储
如果您被现有转储卡住,您唯一的选择是:
- 使用文本编辑器将目标表数据提取到一个单独的文件中,然后恢复该文件;或
- 将转储恢复到一次性数据库,然后使用
进行选择性转储,仅包括该表。由于它是一次性的,您可以在一些未加载的快速但不安全的机器上使用一个单独的Pg实例,在该机器上,您可以打开所有的选项,如pg_dump
。你不应该在生产中设置fsync=off
$ 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
sed-n'100090200097p'new_table_name.sql
注意,您需要从第二个数字中减去一(即排除下一个副本stmt)
现在,您可以加载new\u table\u name.sql
并恢复所需的数据。
现在,您可以将数据加载到新表中我碰巧有转储文件。我想从名为edc
的数据库中恢复名为users
的表,因为在不同的数据库甚至模式中,很可能会有相同名称的表
就我的情况而言,以下sed
oneliner有效:
sed-ne'/^\\connect edc/,/^\\connect/{/\susers\(\s\\\\$\)/,/;\\\\\\./p}pg92.dump
它的作用是:
/^\\connect edc/,/^\\connect/
将搜索限制在我的数据库的范围内李>
{…}
将执行该范围内的所有内部命令李>
/\susers\(\s\\\\$)/
单独匹配所有具有用户的行,包括在行的末尾李>
/;\\\\\/代码>将行与匹配代码>或包含\。
p
强制输出匹配行(注意,sed是用-n
调用的)
根据数据的复杂性,您可能需要对此进行调整
您所要做的就是通过右开关将sed
输出传输到psql
命令。我不知道有任何工具可以实现这一点,但这一行代码从my\u backup.sql
文件中提取preciouse\u table
:
sed -n '/^COPY precious_table /,/^\\\.$/p' my_backup.sql
有一个简单的方法
“pg_restore”有一个“--table/-t”选项
pg_restore -a -t your_table /path/to/dump.sql
对远程主机使用'-h'。
请参阅其他选项我编写了一些命令,仅从纯文本pg_dumpall恢复一个表的数据。灵感来自Zouppen,谢谢。这是给法国读者的
<> P.>餐馆老板,桌子上的''.' un''''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.'
在sauvegarde的fichier的上下文[pg_full_bak.dmp]
表“mau table”和表“public”之间的关系{mau table.sql}
s'assurer que les données sont bien celles出席
基础上的se连接器[db_name]与基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础上的基础
餐馆的餐桌上摆满了食物
=>进口商les données effacées我最近写了一份关于如何使用的分步指南
简而言之,它不适用于SQL备份,您需要切换到pg_dump
以生成备份文件:
pg_dump.exe--主机localhost--端口5432--用户名“postgres”--架构“public”--格式自定义--blob--详细--文件“my_database.dump”“my_database”
然后,无论何时出于数据恢复或bug调查目的需要恢复特定表,您都必须:
创建一个空的本地数据库my\u database\u restored
在空数据库中创建需要还原的表
运行pg_restore
有选择地导入所需表的数据:
pg_restore.exe-U postgres--data only-d“my_database_restored”-t“my_table”“my_database.dump”
是否可以创建pg_dumpall
备份为-Fc
格式?@vyegorov,pg_dumpall没有-F标志——它只能以SQL格式转储数据库。我的宝贝。。。这是答案,因为如果您有这个问题,您已经有了.sql转储,并且可能没有数据以推荐的格式重新执行转储。当然,为了将来的使用,应该使用pg_dump-Fc
,但是这个奇妙的sed
一行程序可以完成要求的工作。好的,对不起,文件应该首先由pg_dump
创建
$ cd /data/bkp/
$ ls -l
$ sed -n '/^COPY public.ma_table /,/^\\\.$/p' pg_full_bak.dmp > ma_table.sql
$ ls -l
$ less ma_table.sql
$ psql -d db_name
postgres@db_name# select count(*) nb from ma_table ;
+------+
| nb |
+------+
| 0 |
+------+
postgres@db_name# \i ma_table.sql
postgres@db_name# select count(*) nb
from ma_table
;
+-------+
| nb |
+-------+
| 9876 |
+-------+