Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从.sql postgresql备份还原单个表?_Postgresql_Sed_Postgresql 9.1 - Fatal编程技术网

如何从.sql postgresql备份还原单个表?

如何从.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

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

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_dump
    进行选择性转储,仅包括该表。由于它是一次性的,您可以在一些未加载的快速但不安全的机器上使用一个单独的Pg实例,在该机器上,您可以打开所有的选项,如
    fsync=off
    。你不应该在生产中设置


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