Heroku pg:pull в удаленную базу данных linode

Я пытаюсь перенести свою базу данных heroku в базу данных, которую я разместил на linode (linux vm).

Я могу заставить heroku распознавать свою собственную базу данных, а также правильное имя пользователя/базы данных удаленной базы данных. Однако он пытается выбрать мой локальный хост pg db, а не удаленный.

Это описание Heroku команды pg:pull:

$ heroku help pg:pull
See more details with DEBUG=*
pull Heroku database into local or remote database

USAGE
  $ heroku pg:pull SOURCE TARGET

OPTIONS
  -a, --app=app                            (required) app to run command against
  -r, --remote=remote                      git remote of app to use
  --exclude-table-data=exclude-table-data  tables for which data should be excluded (use ';' to split multiple names)

DESCRIPTION
  Pull from SOURCE into TARGET.

  TARGET must be one of:
     * a database name (i.e. on a local PostgreSQL server)  => TARGET must not exist and will be created
     * a fully qualified URL to a local PostgreSQL server   => TARGET must not exist and will be created
     * a fully qualified URL to a remote PostgreSQL server  => TARGET must exist and be empty

  To delete a local database run `dropdb TARGET`
  To create an empty remote database, run `createdb` with connection command-line options (run `createdb --help` for details).

  Examples:

       # pull Heroku DB named postgresql-swimmingly-100 into local DB mylocaldb that must not exist
       $ heroku pg:pull postgresql-swimmingly-100 mylocaldb --app sushi

       # pull Heroku DB named postgresql-swimmingly-100 into empty remote DB at postgres://myhost/mydb
       $ heroku pg:pull postgresql-swimmingly-100 postgres://myhost/mydb --app sushi

Я подумал, что неплохо, поэтому я попробовал: heroku pg:credentials:url Что дает вам такую ​​​​информацию, как:

Connection information for default credential.
Connection info string:
   "dbname=[db name here] host=[aws ip here] port=5432 user=[db username] password=[db password here] sslmode=require"
Connection URL:
   postgres://[db username]:[db password here]@[db ip here]:5432/[db name here]

Я подумал, что замечательно, что я могу использовать этот URL-адрес подключения выше для базы данных heroku и следовать его синтаксису для моей собственной базы данных linode pg.

heroku pg:pull postgres://[heroku db username]:[heroku db password here]@[heroku db ip here]:5432/[heroku db name here] postgres://[linode db username here]:[linode db password here]@[linode ip here]/[linode db name here] --app [my-app-name-here]

Затем я получаю проблему с тем, что он даже не принимает, что его собственный uri db действителен:

Unknown database:
[Stuff I put in for their db url here, like the full string]
Valid options are: DATABASE_URL

Хорошо, это немного расстраивает, потому что я знаю, что указанные выше учетные данные работают... Я подключился к моей базе данных heroku из моего приложения rails, используя эти учетные данные. Что бы там ни было, они просто хотят чего-то другого, поэтому я смотрю на:

$ heroku pg:info
task: runHook init
plugin: heroku
root: /usr/lib/heroku
See more details with DEBUG=*
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           1/20
PG Version:            11.6
Created:               2019-06-03 16:06 UTC
Data Size:             9.8 MB
Tables:                15
Rows:                  450/10000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-[random name here]

Так что я согласен, может быть, они хотят это имя «Дополнение:» вместо этого:

$ heroku pg:pull postgresql-[random name here] postgres://[linode db username here]:[linode db password here]@[linode ip here]/[linode db name here] --app [my-app-name-here]

Это подводит меня очень близко, но теперь я в тупике, как заставить его смотреть на правильный IP-адрес/хост, вот что я получил:

heroku-cli: Pulling postgresql-[random name here] ---> postgres://[linode db username here]:[linode db password here]@[linode ip here]:5432/[linode db name here]
psql: FATAL:  no pg_hba.conf entry for host [my **LOCAL** ip address], user [linode db username here], database [linode db name here], SSL on
 ▸    Remote database is not empty. Please create a new database or use heroku pg:reset

Я также пробовал:

$ heroku pg:pull postgresql-[random name here] postgres://[linode ip here]:5432/[linode db name here] --app [my-app-name-here]

Думал, что это каким-то образом возвращается к моему локальному, когда он не может понять удаленный. Та же ошибка, но имя пользователя - это имя пользователя моего локального компьютера, и все же мой IP-адрес, а не удаленный.

Это так близко, но почему он выбрал мой локальный IP-адрес? Он получил правильное имя пользователя linode / имя базы данных, но пытается подключить его локально, что, очевидно, не то, что я хотел.

Любые предложения будут очень признательны... Чувствую, что я следовал их командам так хорошо, как только мог.

На линоде у меня изменены настройки, поэтому он открыт на 0.0.0.0:5432, а не только на локальном хосте. Таким образом, он должен иметь возможность принимать внешние соединения.

РЕДАКТИРОВАТЬ: я просматривал эти ресурсы в поисках помощи, но обнаружил, что в них катастрофически не хватает каких-либо конкретных деталей, которые являются решающим моментом для того, чтобы сделать это: https://devcenter.heroku.com/articles/heroku-postgresql#pg-push-and-pg-pull< /а>

https://blog.heroku.com/push_and_pull_databases_to_and_from_heroku

EDIT: я получил файл дампа..... но это означает, что команды heroku не работают. Да, я могу сделать это с файлом дампа. Однако я расстроен, говоря нам, что эта команда API может работать и не может... кто-нибудь докажет, что я не прав. Я буду хвалить вас, если это возможно.


person ekr990011    schedule 27.02.2020    source источник


Ответы (1)


* a database name (i.e. on a local PostgreSQL server)  => TARGET must not exist and will be created
* a fully qualified URL to a local PostgreSQL server   => TARGET must not exist and will be created
* a fully qualified URL to a remote PostgreSQL server  => TARGET must exist and be empty

To create an empty remote database, run `createdb` with connection command-line options (run `createdb --help` for details).

# pull Heroku DB named postgresql-swimmingly-100 into empty remote DB at postgres://myhost/mydb
$ heroku pg:pull postgresql-swimmingly-100 postgres://myhost/mydb --app sushi

heroku-cli: Pulling postgresql-[random name here] ---> postgres://[linode db username here]:[linode db password here]@[linode ip here]:5432/[linode db name here]
psql: FATAL:  no pg_hba.conf entry for host [my **LOCAL** ip address], user [linode db username here], database [linode db name here], SSL on
 ▸    Remote database is not empty. Please create a new database or use heroku pg:reset

Странно, что он указывает ваш локальный IP-адрес. Однако он распознает его как удаленную базу данных, а не как локальную.

Распространенная проблема отсутствия pg_hba.conf заключается в том, что SSL не включен, но там написано SSL on. Возможно, эта ошибка вводит в заблуждение. Позже он говорит Remote database is not empty, поэтому он пытается въехать, но не может из-за TARGET must exist and be empty

Убедились ли вы, что удаленный сервер базы данных пуст, и на всякий случай запустили createdb?

createdb -h [host] -p [port] -U [dbuser] [dbname]
person Tin Nguyen    schedule 02.03.2020
comment
Привет, да, база данных на удаленном сервере была пустой (и уже создана мной), так как я только что обошёл всё это, загрузив файл last.dump с хероку — подтолкнул его и восстановил с его помощью пустую базу данных (восстановив файл last. дамп также требует пустой БД). Он был создан, но в нем нет таблиц. Локально у меня вообще нет базы данных в pg. Возможно, он хотел, чтобы он был создан, но пуст локально, и тогда он работал бы, но... это означало бы локально, а не на моем удаленном сервере :( devcenter.heroku.com/articles/ - person ekr990011; 02.03.2020