如何从heroku下载db?

时间:2013-06-10 11:12:49

标签: postgresql heroku mysqldump heroku-postgres

我正在使用heroku,我想从我的应用程序(heroku)下载数据库,所以我可以对其进行一些更改,我已经安装了pgbackups,但使用heroku pgbackups:url下载.dump文件

如何下​​载postgresql文件或将.dump转换为postgresql文件?

6 个答案:

答案 0 :(得分:48)

如果您正在使用Heroku的pgbackup(您可能应该使用它):

$ heroku pg:backups capture
$ curl -o latest.dump `heroku pg:backups public-url`

将其翻译成带有

的postgres数据库
$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d mydb latest.dump

请参阅https://devcenter.heroku.com/articles/heroku-postgres-import-export

答案 1 :(得分:14)

在CLI中有一个命令 - heroku db:pull,它将为您执行此操作。 db:pull对你来说可能有点慢,所以你最好使用下一个选项。

如果您正在使用复杂的postgress数据类型(hstore,数组等),那么您需要使用pgtransfer插件https://github.com/ddollar/heroku-pg-transfer,它基本上会在Heroku上进行备份并在本地恢复它。

更新:db:pulldb:push已被弃用,应替换为pg:pullpg:push - 请参阅https://devcenter.heroku.com/articles/heroku-postgresql#pg-push-and-pg-pull

答案 2 :(得分:2)

我发现documentation pull/push中建议的第一种方法更容易。无需密码或用户名。

  

PG:拉

     

pg:pull可用于从Heroku Postgres中提取远程数据   数据库到本地计算机上的数据库。该命令看起来像   这个:

     

$ heroku pg:pull HEROKU_POSTGRESQL_MAGENTA mylocaldb --app sushi

     

此命令将创建一个名为“mylocaldb”的新本地数据库   然后从应用程序“sushi”中的DATABASE_URL数据库中提取数据。在   为防止意外数据覆盖和丢失,本地   数据库不得存在。系统将提示您已经放弃   继续之前现有的本地数据库。

起初我遇到了错误:/bin/sh: createdb: command not found;我在this SO post之后解决了这个问题。

文档中也有描述的替代方案(我还没有尝试过):

  

要从Heroku Postgres数据库导出数据,请创建一个新数据   备份并下载它。

$ heroku pg:backups:capture

$ heroku pg:backups:download

来源:Importing and Exporting Heroku Postgres Databases with PG Backups

答案 3 :(得分:0)

我认为在本地服务器上下载和复制数据库的最简单方法是:

 /**
     * Making json object request
     * */
    public void makeJsonObjReq(String url) {

        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
                url,
                new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        Log.d(TAG, response.toString());
//                      msgResponse.setText(response.toString());

                    }
                }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());

            }
        }) {

            /**
             * Passing some request headers
             * */
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("Content-Type", "application/json");
                return headers;
            }

            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("name", "android@android.com");
                return params;
            }

        };

        // Adding request to request queue
        ApplicationController.getInstance().addToRequestQueue(jsonObjReq,
                tag_json_obj);

        // Cancelling request
        // ApplicationController.getInstance().getRequestQueue().cancelAll(tag_json_obj);
    }



 /**
     * Making json array request
     * */
    public void makeJsonArryReq(String url, final int _type) {

        JsonArrayRequest req = new JsonArrayRequest(url,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, response.toString());
                        apiTaskListener.onTaskComplete("error",_type);


                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                apiTaskListener.onTaskComplete("error",_type);

            }
        });

        // Adding request to request queue
        ApplicationController.getInstance().addToRequestQueue(req,
                tag_json_arry);

        // Cancelling request
        // ApplicationController.getInstance().getRequestQueue().cancelAll(tag_json_arry);
    }

浏览此文档了解更多信息: https://devcenter.heroku.com/articles/heroku-postgresql#pg-push-and-pg-pull

答案 4 :(得分:0)

这是我喜欢使用的脚本。

namespace :heroku do

  desc "Import most recent database dump"
  task :import_from_prod => :environment do
    puts 'heroku run pg:backups capture --app APPNAME'
    restore_backup 'APPNAME'
  end

  def path_to_heroku
    ['/usr/local/heroku/bin/heroku', '/usr/local/bin/heroku'].detect {|path| File.exists?(path)}
  end

  def heroku(command, site)
    `GEM_HOME='' BUNDLE_GEMFILE='' GEM_PATH='' RUBYOPT='' #{path_to_heroku} #{command} -a #{site}`
  end

  def restore_backup(site = 'APPNAME')
    dump_file = "#{Rails.root}/tmp/postgres.dump"
    unless File.exists?(dump_file)
      pgbackups_url = heroku('pg:backups public-url -q', site).chomp
      puts "curl -o #{dump_file} #{pgbackups_url}"
      system "curl -o #{dump_file} '#{pgbackups_url}'"
    end
    database_config = YAML.load(File.open("#{Rails.root}/config/database.yml")).with_indifferent_access
    dev_db = database_config[Rails.env]
    system "pg_restore -d #{dev_db[:database]} -c #{dump_file}".gsub(/\s+/,' ')
    puts
    puts "'rm #{dump_file}' to redownload postgres dump."
    puts "Done!"
  end
end

答案 5 :(得分:0)

要从Heroku Postgres数据库中导出数据,只需执行以下步骤

  1. 登录到heroku
  2. 转到APP->设置->显示配置变量
  3. 复制DATABASE_URL
  4. 运行private void MoveNext() { bool result; try { result = true; } catch (Exception exception) { <>1__state = -2; <>t__builder.SetException(exception); return; } <>1__state = -2; <>t__builder.SetResult(result); }

请注意,这将提供postgresql文件,或者对于转储文件,您可以直接从postgres插件界面下载