Heroku pg: тянуть к удаленной базе данных линод - PullRequest
2 голосов
/ 27 февраля 2020

Я пытаюсь перенести базу данных heroku в базу данных, размещенную на линоде (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 db и следовать его синтаксису для моего собственного линода pg db.

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]

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

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]

Итак, я go хорошо, может быть, они вместо этого хотят это имя "Add-on:":

$ 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 не только на localhost. Поэтому он должен быть в состоянии принимать внешние соединения.

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

https://blog.heroku.com/push_and_pull_databases_to_and_from_heroku

РЕДАКТИРОВАТЬ: Я получил файл дампа ..... но это означает, что команды heroku не работают. Да, я могу сделать это с файлом дампа. Однако я расстроен, говоря нам, что эта команда API может работать, и она не может ... никто не докажет, что я неправ. Я похвалу тебя, если сможешь.

1 Ответ

0 голосов
/ 02 марта 2020
* 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]
...