如何从.sql postgresql备份中恢复单个表?

rqenqsqc  于 2023-05-17  发布在  PostgreSQL
关注(0)|答案(7)|浏览(275)

错误地从数据库中删除了表的行。我们有一个db备份,它会导致一个sql文件,可以像这样恢复:

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

这最终会在本地执行完全恢复。但我们需要的是将单个表的行恢复到生产环境。有什么关于如何在PostgreSQL 9.1中实现这一点的提示吗?
谢谢

myzjeezk

myzjeezk1#

我不知道有什么工具可以做到这一点,但是下面这个一行程序可以从my_backup.sql文件中提取precious_table

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

83qze16e2#

如果需要单表恢复等,请不要执行SQL备份。Use pg_dump 's -Fc option-“自定义”格式。这可以使用pg_restore恢复。选择性恢复是可能的,因为是其他各种方便的功能。如果需要,pg_restore可以在以后将自定义格式的转储转换为SQL转储。
如果你被一个已有的dump卡住了,你唯一的选择是:

  • 使用文本编辑器将目标表数据提取到一个单独的文件中,然后进行恢复;或
  • 将转储还原到一次性数据库,然后使用pg_dump进行选择性转储,仅包括该表。因为它是一次性的,你可以在一些卸载的快速但不安全的机器上使用一个单独的Pg示例,在那里你打开所有的“让它更快,但如果你喜欢吃我的数据”选项,如fsync=off。你永远不要在生产中使用它。
oxalkeyp

oxalkeyp3#

有一个简单的方法。
“pg_restore”具有“--table/-t”选项。

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

对远程主机使用“-h”。查看其他选项here

ctrmrzij

ctrmrzij4#

你可以在罗德中使用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;

为了提取表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并恢复所需的数据。现在,您可以将数据加载到新表中

kpbpu008

kpbpu0085#

我最近写了一个关于如何使用restore individual postgres tables的分步指南。
简而言之,它不适用于SQL备份,您需要切换到pg_dump来生成备份文件:

pg_dump.exe --host localhost --port 5432 --username "postgres" --schema "public" --format custom --blobs --verbose --file "my_database.dump" "my_database"

然后,每当您需要恢复特定表以进行数据恢复或错误调查时,您必须:
1.创建空本地数据库my_database_restored
1.在空数据库中创建需要恢复的表my_table
1.运行pg_restore,选择性地导入所需表的数据:

pg_restore.exe -U postgres --data-only -d "my_database_restored" -t "my_table" "my_database.dump"
0kjbasz6

0kjbasz66#

我碰巧有pg_dumpall转储周围。我想从名为edc的数据库中恢复名为users的表,因为您很可能会在不同的数据库甚至模式中拥有相同名称的表。
对于我的例子,下面的sed oneliner可以工作:

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

它的作用:

  1. /^\\connect edc/,/^\\connect/将搜索限制在我的数据库范围内;
  2. {…}将执行范围内的所有内部命令;
  3. /\susers\(\s\|$\)/匹配所有带有users的行,包括行的末尾;
  4. /;\|\\\./匹配具有;或包含\.的行
  5. p强制输出匹配行(注意,使用-n调用sed)。
    根据数据的复杂性,您可能需要对此进行调整。
    您所要做的就是使用正确的开关将sed输出通过管道传输到psql命令。
krcsximq

krcsximq7#

我编写了一些命令来从纯文本pg_dumpall中只恢复一个表的数据。受Zouppen启发,谢谢。
从备份的纯文本SQL中恢复表的数据,例如使用pg_dumpall。
1.转到备份所在的目录/data/bkp/pg_full_bak.dmp

cd /data/bkp/
ls -l

1.将表my_table中的数据从模式public提取到文件my_table.sql

sed -n '/^COPY public.my__table /,/^\\\.$/p' pg_full_bak.dmp > my_table.sql
ls -l

1.检查数据是否正确

less my_table.sql

1.使用对表具有写权限的帐户连接到包含我们要恢复的空表my_table的数据库db_name

psql -d db_name

1.检查my_table是否为空

select count(*) nb from my_table ;
+------+
|  nb  |
+------+
|   0  |
+------+

1.导入数据

\i my_table.sql

1.检查它是否正常工作

select count(*) nb from my_table;
+-------+
|   nb  |
+-------+
| 9876  |
+-------+

这是为我工作下pg9.3

简单的方法:步骤2、4和6

相关问题