代码之家  ›  专栏  ›  技术社区  ›  abubacker

我要用其他架构还原数据库

  •  51
  • abubacker  · 技术社区  · 14 年前

    我把一个名为 temp1 ,使用以下命令

    $  pg_dump -i -h localhost  -U postgres -F c -b -v -f pub.backup temp1 
    

    现在,我想在另一个名为“db_temp”的数据库中恢复转储,但在这一点上,我只想在“db_temp”数据库中的“temp”模式(而不是fms temp1数据库中的默认模式)中创建所有表。

    有什么方法可以用 pg_restore 命令?

    任何其他方法也值得赞赏!

    7 回复  |  直到 6 年前
        1
  •  10
  •   Magnus Hagander    14 年前

    pg_无法自我恢复。您所能做的就是使用pg_restore生成SQL输出,然后通过SED脚本发送该输出以进行更改。不过,您需要注意如何编写该SED脚本,这样它就不会匹配和更改数据中的内容。

        2
  •  55
  •   Steve Bennett    6 年前

    有一个简单的解决方案:

    • 以纯SQL格式创建备份转储(使用参数设置“p”格式) --format=p -F p )
    • 用您最喜欢的编辑器编辑pub.backup.sql dump,并在文件顶部添加以下两行:

    create schema myschema;

    SET search_path TO myschema;

    现在您可以使用命令恢复备份转储

    psql -f pub.backup.sql

    这个 set search_path to <schema> 命令将myschema设置为默认值,以便在此模式中创建新表和其他对象,而不依赖于它们以前所在的“默认”模式。

        3
  •  43
  •   shaunc    11 年前

    快速而肮脏的方式:

    1)重命名默认架构:

    alter schema public rename to public_save;
    

    2)创建新架构作为默认架构:

    create schema public;
    

    3)还原数据

    pg_restore -f pub.backup db_temp [and whatever other options]
    

    4)根据需要重命名架构:

    alter schema public rename to temp_schema;
    alter schema public_save rename to public;
    
        4
  •  10
  •   Hamish    14 年前

    最简单的方法可能是在还原后简单地重命名模式,即使用以下SQL:

    ALTER SCHEMA my_schema RENAME TO temp_schema
    

    我相信,因为您正在使用压缩的存档格式来输出pg_dump,所以在恢复之前不能更改它。选项是使用默认输出并对模式名进行搜索和替换,但这是有风险的,如果不小心可能会导致数据损坏。

        5
  •  3
  •   mu is too short    14 年前

    如果只有几个表,则可以一次恢复一个表, pg_restore 接受 -d database 当您指定 -t tablename . 当然,在恢复表之前必须设置模式,然后在恢复表之后整理索引和约束。

    或者,在另一个端口上设置另一个服务器,使用新的PostgreSQL服务器进行恢复,重命名模式,将其转储,然后恢复到原始数据库中。当然,这是一个有点笨拙的过程,但它能完成这项工作。

    如果你有冒险精神,你也许可以用十六进制编辑器更改转储文件中的数据库名。我认为在转储中只有一个地方提到了它,只要新的和旧的数据库名称相同,它就可以工作。YMMV,不要在生产环境中做这样的事情,不要责怪我,如果这件事爆发了,把你的家乡夷为平地,以及所有其他的常规免责声明。

        6
  •  2
  •   a_horse_with_no_name    6 年前

    重命名临时数据库中的架构。

    导出架构:

    pg_dump --schema-only --schema=prod > prod.sql
    

    创建新数据库。恢复导出:

    psql -f prod.sql
    
    ALTER SCHEMA prod RENAME TO somethingelse;
    
    pg_dump --schema-only --schema=somethingelse > somethingelse.sql
    

    (删除数据库)

    对于数据,您只需修改集合 search_path 在顶部。

        7
  •  1
  •   Steve Bennett    6 年前

    如前所述,pg_dump、psql或pg_restore不支持在转储/恢复过程中更改模式名。但使用“plain”格式导出然后修改.sql文件非常简单。这个bash脚本完成了以下基本工作:

    rename_schema () {
    
      # Change search path so by default everything will go into the specified schema
      perl -pi -e "s/SET search_path = $2, pg_catalog/SET search_path = $3, pg_catalog, $2;/" "$1"
    
      # Change 'ALTER FUNCTION foo.' to 'ALTER FUNCTION bar.'
      perl -pi -e 's/^([A-Z]+ [A-Z]+) '$2'\./$1 '$3'./' "$1"
    
      # Change the final GRANT ALL ON SCHEMA foo TO PUBLIC
      perl -pi -e 's/SCHEMA '$2'/SCHEMA '$3'/' "$1"
    
    }
    

    用途:

    pg_dump --format plain --schema=foo --file dump.sql MYDB
    rename_schema dump.sql foo bar
    psql -d MYDB -c 'CREATE SCHEMA bar;'
    psql -d MYDB -f dumpsql