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

时间:2013-02-12 06:37:21

标签: postgresql sed 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 个答案:

答案 0 :(得分:17)

我不知道有任何工具可用,但这个单行提取precious_table文件中的my_backup.sql

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

答案 1 :(得分:10)

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

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

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

有一种简单的方法。

&#39; pg_restore在&#39;有一个&#39; - table / -t&#39;选项。

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

使用&#39; -h&#39;用于远程主机。 请参阅其他选项here

答案 4 :(得分:1)

我最近编写了有关如何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
  2. 在空数据库中创建需要还原的表my_table
  3. 运行pg_restore以有选择地导入所需表的数据:
pg_restore.exe -U postgres --data-only -d "my_database_restored" -t "my_table" "my_database.dump"

答案 5 :(得分:0)

我碰巧有pg_dumpall转储。我想从名为users的数据库中恢复名为edc的表,因为您很可能在不同的数据库甚至模式中同等地命名表。

对于我的情况,以下sed oneliner有效:

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

它的作用:

  1. /^\\connect edc/,/^\\connect/将搜索范围限制为我的数据库范围;
  2. {…}将执行该范围的所有内部命令;
  3. /\susers\(\s\|$\)/会匹配自己拥有users的所有行,包括行尾;
  4. /;\|\\\./;或包含\.
  5. 的行匹配
  6. p强制输出匹配的行(注意,使用-n调用sed。)
  7. 根据数据的复杂程度,您可能需要对此进行调整。

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

答案 6 :(得分:-1)

我写了一些命令,只从明文pg_dumpall恢复一个表的数据。受Zouppen启发,谢谢。那是给法国读者的。

Restaurer lesDONNÉESd'une tableàpartir d'une sauvegarde'plain text SQL'faite,par exemple,avec pg_dumpall

  1. 职位定位者dans le保留曲目[/ data / bkp /]副文件保存人[pg_full_bak.dmp]
$ cd /data/bkp/
$ ls -l
  1. 表格“ ma_table”和“公共” 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 lesdonnéessont bien celles参加者

    $ less ma_table.sql
    
  2. 表[ma_table]的基础表连接器[db_name],表[ma_table]的编码器可维护餐厅,

    $ psql -d db_name
    
  3. 餐厅的餐桌和餐厅[ma_table] est bien vide

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

    postgres@db_name# \i ma_table.sql
    
  2. 边疆区的重要国家/地区

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

在pg 9.3

下对我有用

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