Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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
Postgresql 如何从Postgres Heroku上以前的备份中恢复特定数据?(例如,意外删除的行)_Postgresql_Heroku_Ngrok - Fatal编程技术网

Postgresql 如何从Postgres Heroku上以前的备份中恢复特定数据?(例如,意外删除的行)

Postgresql 如何从Postgres Heroku上以前的备份中恢复特定数据?(例如,意外删除的行),postgresql,heroku,ngrok,Postgresql,Heroku,Ngrok,情况是这样的:使用Heroku&Postgres,您可以自动生成备份转储文件但是你能用它做什么呢? 如果要完全返回备份状态,请将其转储到数据库中 本地转储以“查看”,或在开发环境中使用生产数据 将数据库的特定行设置回以前的状态(例如,还原意外删除的行) 我发现自己在后一点上非常挣扎,我想分享一下我是如何做到的 如何从Postgres Heroku上以前的备份中恢复特定数据?摘要/TL;博士 通过3个步骤,您将能够非常简单地执行: INSERT INTO production_db.table_n

情况是这样的:使用Heroku&Postgres,您可以自动生成备份转储文件但是你能用它做什么呢?

  • 如果要完全返回备份状态,请将其转储到数据库中
  • 本地转储以“查看”,或在开发环境中使用生产数据
  • 将数据库的特定行设置回以前的状态(例如,还原意外删除的行)
  • 我发现自己在后一点上非常挣扎,我想分享一下我是如何做到的

    如何从Postgres Heroku上以前的备份中恢复特定数据?

    摘要/TL;博士 通过3个步骤,您将能够非常简单地执行:

    INSERT INTO production_db.table_name
    SELECT * FROM backup_db.table_name -- backup_db being remote
    
    首先在本地安装备份,其次获取SQL脚本,第三步使用向外部世界打开本地主机

    走吧? 1.将转储文件下载到并转储到以下位置:
    • 如果有可用的服务器,可以在远程数据库上执行此操作。但如果像我一样,您不想在Heroku或其他地方提供另一个生产数据库,本地数据库完全可以
    • 我喜欢使用(可在Linux、Mac和Windows上使用),但使用命令行和
      psql
      也可以(通过示例阅读)
    • 在PGAdmin中,您需要创建一个数据库。然后右键单击它并使用
      恢复
      功能。选择您的转储文件,单击
      还原
      ,即可设置:您的备份数据在本地可用
    2.从远程数据库访问它 我想做以下几件事:

    SELECT * FROM backup_db.table_name
    -- So I could then do
    INSERT INTO production_db.table_name
    SELECT * FROM backup_db.table_name
    
    我会准备好的。超级简单,对吧?很明显?这肯定已经做了数百次了。哦,不

    Postgres 9.1+中有一个名为db_link的实用程序,但由于以下语法的应用,该实用程序受到了很大的限制:

    SELECT fname, lname FROM db_link('host=localhost dbname=backup-28-08', 'SELECT fname, lname FROM users') AS remote (varchar255 fname varchar255 lname)
    
    每个列名都需要重复两次,包括其类型。相当沉重,我们远远不是简单的
    SELECT*from backup\u db.table\u name

    因此,这里的想法是使用
    信息\u模式
    表内容,它用每个表的列名、类型等来描述每个表。我发现了这样一个问题:这对我有很大帮助(谢谢)

    但它的解决方案是一个两步过程,首先生成一个函数,然后查询它:

    SELECT dblink_star_func('dbname=ben', 'public', 'test');
    SELECT * FROM star_test() WHERE data = 'success';
    
    我仍然瞄准一艘1号班轮。在经历了一些小小的痛苦(不是SQL大师)之后,要点如下:

    我现在可以做到:

    SELECT * FROM remote_db(NULL::users) -- (Still not 100% about why I need the NULL::)
    -- And also
    INSERT INTO users
    SELECT * FROM remote_db(NULL::users)
    
    太棒了,对吧

    3.远程访问本地主机 如果您的远程数据库已经可以从internet访问(=具有IP地址、域名,例如Heroku,它看起来像:
    ec2-54-217-229-169.eu-west-1.compute.amazonaws.com:5672/df68cfpbufjd9p
    您可以跳过这一步。但是,如果您使用本地数据库,则需要使其从外部世界可用(以便Heroku数据库可以访问它)

    为此,我使用了奇妙的

    安装后,我只需输入以下命令:

    ngrok -proto=tcp 5432 #5432 being the default port for Postgresql. (Adapt if necessary)
                                                                                                                                                                                                        
    Tunnel Status                 online                                                                                                                                                                
    Version                       1.7/1.6                                                                                                                                                               
    Forwarding                    tcp://ngrok.com:51727 -> 127.0.0.1:5432                                                                                                                               
    Web Interface                 127.0.0.1:4040                                                                                                                                                        
    # Conn                        0                                                                                                                                                                     
    Avg Conn Time                 0.00ms    
    
    您只需将
    db_link
    (在要点中)插入
    host=ngrock.com port=51727
    ,您就可以轻松上路了

    4.进一步 这方面有许多可能的改进。以下是我已经看到的一些:

    • 将脚本视为
      db\u link
      函数的默认功能
    • 如果备份和生产中的数据库结构不同,则更能防止错误
    • 在数据库结果和备份结果之间制作比较工具(仅返回差异线)
    • 处理简单联接
    • 更进一步的是要有一个应用程序级适配器(例如Rails中的ActiveRecord),它可以允许操纵后端对象,而不是像现在这样的原始SQL

    希望我是清楚的!请询问更多细节,否则

    我注意到你的要点似乎已经不存在了-你有镜子吗?回答我自己的问题:aug riedinger似乎已将他的Github用户名更改为augnustin,因此新的URL是。确实如此。抢手货