Postgresql 如何从Postgres Heroku上以前的备份中恢复特定数据?(例如,意外删除的行)
情况是这样的:使用Heroku&Postgres,您可以自动生成备份转储文件但是你能用它做什么呢?Postgresql 如何从Postgres Heroku上以前的备份中恢复特定数据?(例如,意外删除的行),postgresql,heroku,ngrok,Postgresql,Heroku,Ngrok,情况是这样的:使用Heroku&Postgres,您可以自动生成备份转储文件但是你能用它做什么呢? 如果要完全返回备份状态,请将其转储到数据库中 本地转储以“查看”,或在开发环境中使用生产数据 将数据库的特定行设置回以前的状态(例如,还原意外删除的行) 我发现自己在后一点上非常挣扎,我想分享一下我是如何做到的 如何从Postgres Heroku上以前的备份中恢复特定数据?摘要/TL;博士 通过3个步骤,您将能够非常简单地执行: INSERT INTO production_db.table_n
INSERT INTO production_db.table_name
SELECT * FROM backup_db.table_name -- backup_db being remote
首先在本地安装备份,其次获取SQL脚本,第三步使用向外部世界打开本地主机
走吧?
1.将转储文件下载到并转储到以下位置:
- 如果有可用的服务器,可以在远程数据库上执行此操作。但如果像我一样,您不想在Heroku或其他地方提供另一个生产数据库,本地数据库完全可以
- 我喜欢使用(可在Linux、Mac和Windows上使用),但使用命令行和
也可以(通过示例阅读)psql
- 在PGAdmin中,您需要创建一个数据库。然后右键单击它并使用
功能。选择您的转储文件,单击恢复
,即可设置:您的备份数据在本地可用干得好李>还原
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是。确实如此。抢手货