Aug*_*ger 6 postgresql heroku ngrok
情况如下:使用Heroku和Postgres,您可以自动生成备份转储文件.但你能用它做什么呢?
我发现自己在后一点上苦苦挣扎,我想分享我是如何做到的.
如何从Postgres Heroku上的先前备份恢复特定数据?
通过3个步骤,您将能够非常简单地执行:
INSERT INTO production_db.table_name
SELECT * FROM backup_db.table_name -- backup_db being remote
Run Code Online (Sandbox Code Playgroud)
首先在本地安装备份,第二个安装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
Run Code Online (Sandbox Code Playgroud)
我会全力以赴.超级简单吧?很明显?这必须已经完成了数百次.好吧,不!
db_link在Postgres 9.1+中有一个实用程序,但它非常有限,因为以下语法适用:
SELECT fname, lname FROM db_link('host=localhost dbname=backup-28-08', 'SELECT fname, lname FROM users') AS remote (varchar255 fname varchar255 lname)
Run Code Online (Sandbox Code Playgroud)
每个列名称需要重复两次,包括其类型.相当沉重,我们远非简单SELECT * FROM backup_db.table_name
所以这里的想法是使用information_schema表内容,它描述每个表及其列名,类型等.我在SO上找到了这个问题:从本地现有类型指定dblink列定义列表,这对我有很大的帮助(感谢bentrm) .
但它的解决方案是一个两步流程,首先生成一个函数,然后查询它:
SELECT dblink_star_func('dbname=ben', 'public', 'test');
SELECT * FROM star_test() WHERE data = 'success';
Run Code Online (Sandbox Code Playgroud)
我仍然瞄准一个班轮.经过一些小小的痛苦(不是SQL大师),这里是要点:https://gist.github.com/aug-riedinger/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)
Run Code Online (Sandbox Code Playgroud)
太棒了吧?
如果您的远程数据库已经可以从互联网(=具有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
Run Code Online (Sandbox Code Playgroud)
而你只需要插入db_link(在GIST)来host=ngrock.com port=51727,你是好去!
对此有许多可能的改进.以下是我已经看到的一些内容:
db_link功能希望我很清楚!否则请询问更多细节
| 归档时间: |
|
| 查看次数: |
2494 次 |
| 最近记录: |