Heroku не удалось переместить базу данных postgres в локальную с нераспознанным типом блока данных (0)

#postgresql #heroku #pull #heroku-ci

#postgresql #heroku #тянуть #heroku-ci

Вопрос:

Я подключился к базе данных heroku postgres с помощью pgadmin и создал простую таблицу с двумя простыми столбцами:

 id - bigint identity 
name - text
 

и просто две строки:

 id   name
1    name1
2    name2
 

Когда я выполняю команду

 heroku pg:pull DATABASE_URL mylocaldb1234 --app nameless-dusk-05113
 

Я получаю сообщение об ошибке:

 pg_restore: error: unrecognized data block type (0) while searching archive
 !    pg_restore errored with 1
 

Я проверил локальную и удаленную версии postgres, они одинаковые.
Локальная версия:

 psql --version
psql (PostgreSQL) 12.5

pg_restore --version
pg_restore (PostgreSQL) 12.5
 

Удаленная версия:

 heroku pg:info
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           5/20
PG Version:            12.5
Created:               2021-01-07 07:29 UTC
Data Size:             8.2 MB
Tables:                1
Rows:                  2/10000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-spherical-97042
 

удаленная версия pg_restore:

 heroku run pg_restore --version
Running pg_restore --version on ⬢ nameless-dusk-05113... up, run.7775 (Free)
pg_restore (PostgreSQL) 12.5 (Ubuntu 12.5-1.pgdg18.04 1)
 

Ответ №1:

heroku pg:pull предполагается автоматизировать немного более ручной процесс, описанный здесь: https://devcenter.heroku.com/articles/heroku-postgres-import-export .

Хотя я столкнулся с той же ошибкой heroku pg:pull , более ручной процесс работал. В частности,

 $ heroku pg:backups:capture
$ heroku pg:backups:download  # this creates a file latest.dump in your current directory
$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d mydatabasename latest.dump
 

Если mydatabasename он еще не существует, вам нужно будет создать его перед запуском pg_restore .

 $ createdb -U postgres mydatabasename