21

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

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

这最终会在本地进行完全还原。但是我们需要将单个表的行恢复到生产环境。关于如何使用 PostgreSQL 9.1 进行这项工作的任何提示?

谢谢

4

7 回答 7

24

我不知道有任何工具可以做到这一点,但是这个单行precious_tablemy_backup.sql文件中提取:

sed -n '/^COPY precious_table /,/^\\\.$/p' my_backup.sql
于 2014-02-25T16:15:15.090 回答
14

如果您需要单表还原等,请不要进行 SQL 备份。使用pg_dump'-Fc选项- “自定义”格式。这可以使用pg_restore. 可以进行选择性恢复,以及各种其他方便的功能。pg_restore如果需要,可以稍后将自定义格式的转储转换为 SQL 转储。

如果您遇到现有转储,您唯一的选择是:

  • 使用文本编辑器将目标表数据提取到单独的文件中,然后将其恢复;或者

  • 将转储还原到一次性数据库,然后用于pg_dump选择仅包括该表的转储。由于它是一次性的,因此您可以在一些卸载的快速但不安全的机器上使用单独的 Pg 实例,在该机器上打开所有“让它快速但如果你愿意就吃掉我的数据”选项,例如fsync=off. 你不应该在生产中设置它。

于 2013-02-12T09:19:52.653 回答
7

您可以在 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;

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

于 2013-02-12T09:55:06.977 回答
7

有一个简单的方法。

'pg_restore' 有一个 '--table/-t' 选项。

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

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

于 2015-04-11T18:50:12.287 回答
2

我最近写了一个关于如何恢复单个 postgres 表的分步指南。

简而言之,它不适用于 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
  2. my_table在空数据库中创建需要恢复的表
  3. 运行pg_restore以选择性地导入所需表的数据:
pg_restore.exe -U postgres --data-only -d "my_database_restored" -t "my_table" "my_database.dump"
于 2020-12-01T01:46:03.813 回答
0

我碰巧有pg_dumpall垃圾场。而且我想users从名为的数据库中恢复名为的表edc,因为您很可能在不同的数据库甚至模式中拥有同名的表。

就我而言,以下sedoneliner 有效:

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

它能做什么:

  1. /^\\connect edc/,/^\\connect/将搜索限制在我的数据库范围内;
  2. {…}将执行范围内的所有内部命令;
  3. /\susers\(\s\|$\)/单独匹配所有行users,包括行尾;
  4. /;\|\\\./匹配包含;或包含的行\.
  5. p强制输出匹配的行(注意,使用 sed 调用-n)。

根据数据的复杂性,您可能需要对此进行调整。

您所要做的就是使用正确的开关将sed输出传送到命令。psql

于 2013-02-12T10:35:54.530 回答
-1

我已经编写了一些命令来仅从纯文本 pg_dumpall 恢复一个表的 DATA。灵感来自 Zouppen,谢谢。这是给法国读者的。

Restaurer les DONNÉES d'une table à partir d'une sauvegarde 'plain text SQL' faite, par exemple, avec pg_dumpall

  1. se positionner dans le répertoire [/data/bkp/] contenant le fichier de sauvegarde [pg_full_bak.dmp]
$ cd /data/bkp/
$ ls -l
  1. extraire les données de la table "ma_table" du schéma "public" dans le fichier {ma_table.sql}
$ sed -n '/^COPY public.ma_table /,/^\\\.$/p' pg_full_bak.dmp > ma_table.sql
$ ls -l
  1. s'assurer que les données Sont bien celles 出席者

    $ less ma_table.sql
    
  2. se connecter sur la base [db_name] contenant la table [ma_table] vide à restaurer, avec un compte ayant les droits en écriture sur la table [ma_table]

    $ psql -d db_name
    
  3. vérifier que la table à restaurer [ma_table] est bien vide

postgres@db_name# select count(*) nb from ma_table ;
+------+
|  nb  |
+------+
|   0  |
+------+
  1. => 进口商 les données effacées <=

    postgres@db_name# \i ma_table.sql
    
  2. vérifier que les données ont bien été importées

    postgres@db_name# select count(*) nb
    from ma_table
    ;
    +-------+
    |   nb  |
    +-------+
    | 9876  |
    +-------+
    

这在 pg 9.3下对我有用

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

于 2019-11-28T16:41:22.923 回答