情况如下:使用 Heroku 和 Postgres,您可以自动生成备份转储文件。但是你能用它做什么呢?
- 如果您想完全回到备份状态,请将其转储到您的数据库中
- 将其转储到本地以“查看”,或在开发环境中使用生产数据
- 将数据库的特定行设置为以前的状态(例如,恢复意外删除的行)
我发现自己在后一点上非常挣扎,所以我想分享我是如何做到的。
如何从 Postgres Heroku 上的先前备份中恢复特定数据?
情况如下:使用 Heroku 和 Postgres,您可以自动生成备份转储文件。但是你能用它做什么呢?
我发现自己在后一点上非常挣扎,所以我想分享我是如何做到的。
如何从 Postgres Heroku 上的先前备份中恢复特定数据?
只需 3 个步骤,您就可以非常简单地执行:
INSERT INTO production_db.table_name
SELECT * FROM backup_db.table_name -- backup_db being remote
首先在本地安装备份,其次获取 SQL 脚本,第三次使用ngrok向外部世界打开您的 localhost 。
psql
阅读这篇文章)Create a database
. 然后右键单击它并使用该restore
功能。选择您的转储文件,单击Restore
,一切就绪:您的备份数据在本地可用!好工作!我想做以下事情:
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_db.table_name
所以这里的想法是使用information_schema
表内容,它用列名、类型等描述每个表。我在 SO 上找到了这个问题:Specify dblink column definition list from a local existing type这对我有很大帮助(谢谢bentrm) .
但它的解决方案是一个两步过程,首先生成一个函数,然后查询它:
SELECT dblink_star_func('dbname=ben', 'public', 'test');
SELECT * FROM star_test() WHERE data = 'success';
我仍然瞄准 1 班轮。经过一些小痛苦(不是 SQL 大师),这里是要点:https ://gist.github.com/augnustin/d30973ea8b5bf0067841
我现在可以这样做:
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)
太棒了,对吧?
如果您的远程数据库已经可以从 Internet 获得(=有一个 IP 地址,一个域名,例如 Heroku,它看起来像:)ec2-54-217-229-169.eu-west-1.compute.amazonaws.com:5672/df68cfpbufjd9p
您可以跳过这一步。但是,如果您使用本地数据库,则需要使其可从外部世界访问(以便 Heroku 数据库可以访问它)。
为此,我使用了美妙的ngrok。
安装后我只需要输入以下命令:
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
可以了!
对此有许多可能的改进。以下是我已经看到的一些:
db_link
功能希望我很清楚!否则请询问更多详情