Как обновить PostgreSQL с версии 9.6 до версии 10.1 без потери данных?


207

Я использую базу данных PostgreSQL для своего приложения Ruby on Rails (в Mac OS X 10.9).

Есть ли подробные инструкции по обновлению базы данных PostgreSQL?

Боюсь, я уничтожу данные в базе данных или испорчу их.


8
Делайте резервные копии в любом случае.
Патрик Осцити

Ответы:


402

Предполагая, что вы использовали home-brew для установки и обновления Postgres, вы можете выполнить следующие шаги.

  1. Остановить текущий сервер Postgres:

    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  2. Инициализируйте новую базу данных 10.1:

    initdb /usr/local/var/postgres10.1 -E utf8

  3. запустите pg_upgrade (примечание: измените версию bin, если вы обновляете что-то другое, чем показано ниже) :

    pg_upgrade -v \
        -d /usr/local/var/postgres \
        -D /usr/local/var/postgres10.1 \
        -b /usr/local/Cellar/postgresql/9.6.5/bin/ \
        -B /usr/local/Cellar/postgresql/10.1/bin/
    

    -v включить подробное внутреннее ведение журнала

    -d старый каталог конфигурации кластера базы данных

    -D новый каталог конфигурации кластера базы данных

    -b старый исполняемый каталог PostgreSQL

    -B новый каталог исполняемых файлов PostgreSQL

  4. Переместить новые данные на место:

    cd /usr/local/var
    mv postgres postgres9.6
    mv postgres10.1 postgres
    
  5. Перезапустите Postgres:

    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  6. Проверьте /usr/local/var/postgres/server.logдетали и убедитесь, что новый сервер запущен правильно.

  7. Наконец, переустановите рельсы pgкамень

    gem uninstall pg
    gem install pg

Я предлагаю вам потратить некоторое время на чтение документации PostgreSQL, чтобы точно понять, что вы делаете на вышеуказанных этапах, чтобы минимизировать разочарования.


8
Я должен использовать следующую команду для инициализации базы данных:initdb /usr/local/var/postgres9.4 -E utf8 --lc-collate=C --lc-ctype=utf-8 --lc-monetary=C --lc-numeric=C
sunsations

Следуйте вашему руководству шаг за шагом. И все заработало! Огромное спасибо.
Трантор Лю

3
Будьте осторожны с delete_old_cluster.shкомандой. Сначала я вручную удалил каталоги /usr/local/postgres9.3, затем запустил эту команду и, похоже, потерял весь каталог / usr / local / var / postgres (мне удалось восстановить его из Time Machine)
peter_v

1
Если вы используете Bundler, вы должны удалить gem с помощью, gem uninstall pgно затем позволить bundler переустановить правильную версию из Gemfile.lock, просто запустив bundle.
danielricecodes

1
Незначительное обновление: brewтеперь также имеет возможность использовать brew services stop postgresqlи brew services start postgresqlвместо прямого вызова launchctl unloadи launchctl load.
florish

59

Несмотря на все ответы выше, здесь идут мои 5 центов.

Он работает на любой ОС и от любой до любой версии Postgres.

  • Остановить любой работающий экземпляр postgres;
  • Установите новую версию и запустите ее; Проверьте, можете ли вы также подключиться к новой версии;
  • Изменить старую версию postgresql.conf-> portс 5432на 5433;
  • Запустите старую версию postgres;
  • Откройте терминал и cdв binпапку с новой версией ;
  • Бегать pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username>
  • Остановить старый запущенный экземпляр postgres;

4
Спасибо Кристиан, это определенно отличное и простое решение, я успешно перешел с 9.3 на 9.5, как это
fnicollet

3
Прекрасно работал для обновления с 9.1 до 9.5 на сервере Windows 2012.
Рольф

4
Проблема этого решения заключается в том, что если вы изменили некоторые файлы конфигурации Postgres (например, postgresql.confили pg_hba.conf), вам потребуется вручную реплицировать эти изменения в новой установке. Вместо этого, если вы используете pg_upgradecluster, файлы конфигурации будут скопированы в новый кластер: manpages.ubuntu.com/manpages/precise/man8/…
Alphaaa

1
Обратите внимание, что сразу после запуска команды вы получите один запрос пароля, но вам нужно будет ввести 2 пароля один за другим, подтверждая каждый нажатием Enter. Или вы получитеpg_dumpall: could not connect to database "XXX": fe_sendauth: no password supplied
Lu55

2
Технически это не будет работать для любой-к-любой версии, только для исходных версий на уровне 7.0 или выше, как указано в руководстве:Current releases of the dump programs can read data from any server version back to 7.0.
Mark Tielemans

56

Вот решение для пользователей Ubuntu

Сначала мы должны остановить postgresql

sudo /etc/init.d/postgresql stop

Создайте новый файл с именем /etc/apt/sources.list.d/pgdg.list и добавьте строку ниже

deb http://apt.postgresql.org/pub/repos/apt/ utopic-pgdg main

Следуйте приведенным ниже командам

wget -q -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql-9.4
sudo pg_dropcluster --stop 9.4 main 
sudo /etc/init.d/postgresql start

Теперь у нас есть все, просто нужно обновить его, как показано ниже

sudo pg_upgradecluster 9.3 main
sudo pg_dropcluster 9.3 main

Вот и все. В основном модернизированный кластер будет работать на порту с номером 5433. Проверьте это с помощью следующей команды

sudo pg_lsclusters

2
Второе-последнее предложение, в котором вы говорите: «В большинстве случаев модернизированный кластер будет работать на порту 5433», вероятно, должно звучать так: «Кластер 9.3 будет работать на порту 5433, чтобы вы могли вернуться в случае необходимости».
Эндрю Фаддей Мартин

3
Примечание: для Ubuntu 14.04 используйте «trusty-pgdb» вместо «utopic-pgdb»
Джонни

3
Обратите внимание, что это НЕ делает обновление на месте. поэтому он абсолютно бесполезен для моих 700 ГБ БД на томе 1 ТБ.
Поддельное имя

16

Обновление : этот процесс такой же, как для обновления 9,5 до 11,5; просто изменить команды , чтобы отразить версии 9.6и 10, где 9.6это старая версия , и 10это новая версия. Обязательно измените «старый» и «новый» каталоги соответственно.


Я только что обновил PostgreSQL 9.5 до 9.6 в Ubuntu и подумал, что поделюсь своими выводами, так как есть пара специфических для ОС / пакетов нюансов, о которых нужно знать.

( Я не хотел делать дамп и восстанавливать данные вручную , поэтому некоторые другие ответы здесь были нежизнеспособны.)

Вкратце, этот процесс состоит из установки новой версии PostgreSQL вместе со старой версией (например, 9.5 и 9.6), а затем запуска pg_upgradeдвоичного файла, что подробно объясняется (некоторые) на https://www.postgresql.org/ docs / 9.6 / static / pgupgrade.html .

Единственный «хитрый» аспект pg_upgradeзаключается в том, что неудача при передаче правильного значения для аргумента или невозможность войти в систему как правильный пользователь или cdв правильное местоположение перед выполнением команды может привести к загадочным сообщениям об ошибках.

В Ubuntu (и, возможно, Debian), при условии, что вы используете «официальный» репозиторий deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg mainи если вы не изменили пути файловой системы по умолчанию или параметры времени выполнения, следующая процедура должна выполнить эту работу.

Установите новую версию (обратите внимание, что мы указываем 9.6явно):

sudo apt install postgresql-9.6

После успешной установки обе версии будут работать параллельно, но на разных портах. В выводе об установке это упоминается внизу, но его легко пропустить:

Creating new cluster 9.6/main ...
  config /etc/postgresql/9.6/main
  data   /var/lib/postgresql/9.6/main
  locale en_US.UTF-8
  socket /var/run/postgresql
  port   5433

Остановите оба экземпляра сервера (это остановит оба экземпляра одновременно):

sudo systemctl stop postgresql

Переключитесь на выделенного пользователя системы PostgreSQL:

su postgres

Перейдите в его домашнюю директорию (если этого не сделать, возникнут ошибки):

cd ~

pg_upgrade требует следующих входных данных ( pg_upgrade --helpговорит нам об этом):

When you run pg_upgrade, you must provide the following information:
  the data directory for the old cluster  (-d DATADIR)
  the data directory for the new cluster  (-D DATADIR)
  the "bin" directory for the old version (-b BINDIR)
  the "bin" directory for the new version (-B BINDIR)

Эти входные данные могут быть указаны с «длинными именами», чтобы их было проще визуализировать:

  -b, --old-bindir=BINDIR       old cluster executable directory
  -B, --new-bindir=BINDIR       new cluster executable directory
  -d, --old-datadir=DATADIR     old cluster data directory
  -D, --new-datadir=DATADIR     new cluster data directory

Мы также должны пропустить --new-optionsкоммутатор, потому что неисполнение этого приводит к следующему:

connection to database failed: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/lib/postgresql/.s.PGSQL.50432"?

Это происходит потому, что параметры конфигурации по умолчанию применяются при отсутствии этого переключателя, что приводит к неправильным параметрам подключения, что приводит к ошибке сокета.

Выполните pg_upgradeкоманду из новой версии PostgreSQL:

/usr/lib/postgresql/9.6/bin/pg_upgrade --old-bindir=/usr/lib/postgresql/9.5/bin --new-bindir=/usr/lib/postgresql/9.6/bin --old-datadir=/var/lib/postgresql/9.5/main --new-datadir=/var/lib/postgresql/9.6/main --old-options=-cconfig_file=/etc/postgresql/9.5/main/postgresql.conf --new-options=-cconfig_file=/etc/postgresql/9.6/main/postgresql.conf

Выход из выделенной учетной записи пользователя системы:

exit

Обновление теперь завершено, но новый экземпляр будет привязан к порту 5433(стандартное значение по умолчанию - это так 5432), поэтому имейте это в виду при попытке протестировать новый экземпляр перед его «включением».

Запустите сервер как обычно (опять же, это запустит и старый, и новый экземпляры):

systemctl start postgresql

Если вы хотите сделать новую версию версией по умолчанию, вам необходимо отредактировать эффективный файл конфигурации, например /etc/postgresql/9.6/main/postgresql.conf, и убедиться, что порт определен следующим образом:

port = 5432

Если вы сделаете это, либо измените номер порта старой версии 5433на одновременно (перед запуском служб), либо просто удалите старую версию (это не приведет к удалению фактического содержимого базы данных; вам придется использовать его apt --purge remove postgresql-9.5для этого) ):

apt remove postgresql-9.5

Приведенная выше команда остановит все экземпляры, поэтому вам нужно запустить новый экземпляр в последний раз с помощью:

systemctl start postgresql

В качестве последнего замечания, не забудьте учесть pg_upgradeхороший совет:

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
    ./analyze_new_cluster.sh

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh

1
Для меня в Mac Йосемити, PostgreSQL 9.2 -> 9.5: sudo su postgresизмените все METHOD в pg_hba.conf на монтаж на доверии перед тем pg_upgrade, работает pg_upgrade в / частных / TMP не ~ не работает так sudo mkdir /foobarс chmod 777 /foobarи побежал туда. Наконец команда pg_upgrade:/Library/PostgreSQL/9.5/bin/pg_upgrade -b /Library/PostgreSQL/9.2/bin -B /Library/PostgreSQL/9.5/bin -d /Library/PostgreSQL/9.2/data -D /Library/PostgreSQL/9.5/data -o -cconfig_file=/Library/PostgreSQL/9.2/data/postgresql.conf -O -cconfig_file=/Library/PostgreSQL/9.5/data/postgresql.conf
Ярно

1
я был в состоянии успешно обновить с 9,5 до 11,5 пришлось добавить репозитории postgres apt в Ubuntu. а затем просто следуйте этим шагам: tecadmin.net/install-postgresql-server-on-ubuntu
shakee93

14

Если вы используете услуги homebrew и homebrew, вы, вероятно, можете просто:

brew services stop postgresql
brew upgrade postgresql
brew postgresql-upgrade-database
brew services start postgresql

Я думаю, что это может не сработать полностью, если вы используете расширенные функции Postgres, но это отлично сработало для меня.


1
Отлично сработало для macOS Mojave 10.14.2 - Спасибо!
8bithero

13

Руководство пользователя охватывает эту тему подробно. Ты можешь:

  • pg_upgradeна месте; или

  • pg_dumpи pg_restore.

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

Подробнее см. В руководстве.

Если вы застряли, опубликуйте подробный вопрос, объясняющий, как вы застряли, где и что вы пробовали в первую очередь. Это также немного зависит от того, как вы установили PostgreSQL, поскольку существует несколько различных «дистрибутивов» PostgreSQL для OS X (к сожалению). Так что вам нужно предоставить эту информацию.


8

Стоя на плечах других бедных существ, пробирающихся сквозь эту гадость, я смог выполнить следующие шаги, чтобы вернуться к работе после перехода на Yosemite:

Предполагая, что вы использовали home-brew для установки и обновления Postgres, вы можете выполнить следующие шаги.

  1. Остановить текущий сервер Postgres:

    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  2. Инициализируйте новую базу данных 9.4:

    initdb /usr/local/var/postgres9.4 -E utf8

  3. Установите postgres 9.3 (так как его больше не было на моей машине):

    brew install homebrew/versions/postgresql93

  4. Добавить каталоги, удаленные во время обновления Yosemite:

    mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep

  5. запустить pg_upgrade:

    pg_upgrade -v -d /usr/local/var/postgres -D /usr/local/var/postgres9.4 -b /usr/local/Cellar/postgresql93/9.3.5/bin/ -B /usr/local/Cellar/postgresql/9.4.0/bin/

  6. Переместить новые данные на место:

    cd /usr/local/var
    mv postgres postgres9.3
    mv postgres9.4 postgres
  7. Перезапустите Postgres:

    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  8. Проверьте /usr/local/var/postgres/server.logдетали и убедитесь, что новый сервер запущен правильно.

  9. Наконец, переустановите связанные библиотеки?

    pip install --upgrade psycopg2
    gem uninstall pg
    gem install pg

1
pg_upgrade -v -d / usr / local / var / postgres -D /usr/local/var/postgres9.4 -b /usr/local/Cellar/postgresql93/9.3.*/bin/ -B / usr / local / Cellar /postgresql/9.4.*/bin/ # Незначительные версии могут отличаться.
Аарон Макмиллин

1
Спасибо за это. Я случайно запустил brew cleanupперед переносом данных, и это привело к удалению postgres9.3. Это помогло. :)
markquezada

5

Похоже, что решение было добавлено в Homebrew:

$ brew info postgresql
...
==> Caveats
To migrate existing data from a previous major version of PostgreSQL run:
  brew postgresql-upgrade-database
....

1

Это сделало это для меня.

https://gist.github.com/dideler/60c9ce184198666e5ab4

Коротко и точно. Честно говоря, я не ставлю перед собой цель разобраться в сути PostgreSQL, я хочу, чтобы все было сделано.


1
При этом используется инструмент pg_upgradecluster Ubuntu, который может быть намного медленнее, чем инструмент pg_upgrade PostgreSQL, и, конечно, доступен только в Ubuntu.
alfonx

@alfonx Не правда. У меня есть это на моем Debian jessie. Имел 10+ БД и объем ~ 400 МБ данных базы данных был преобразован в мгновение ока. Опять же, я использую виртуальный Debian на SSD.
dimitarvp

Позвольте мне исправить себя: pg_upgradecluster является частью "инфраструктуры Debian PostgreSQL", поэтому доступна только в дистрибутивах на основе Debian. Что касается скорости, pg_upgrade предлагает параметр «--link», в котором ссылки не копируют данные, где это возможно: postgresql.org/docs/9.4/static/pgupgrade.html
alfonx

1
Возможно, мы стремимся к другим результатам. После обновления программного обеспечения для всего дистрибутива я получил две версии PostgreSQL, и данные, которые использовали мои проекты, были прикреплены к более старой версии (9.3). Так что я просто нашел ссылку выше (в своем ответе) и обновил ее, избавившись от старого «кластера» и более старой версии PG.
dimitarvp

Я пытался перейти с 9.4 на 11 с, pg_upgradecluster 9.4 mainно я получаю сообщение об ошибке Ошибка: specified cluster does not exist... Наверное, сначала мне нужно снова установить postgresql-9.4 с этим руководством: wiki.postgresql.org/wiki/Apt#Quickstart
rubo77

1

В Windows я продолжал сталкиваться с различными сообщениями об ошибках при попытке использования pg_upgrade.

Я сэкономил много времени, чтобы просто:

  1. Резервная БД
  2. Удалите все копии PostgreSQL
  3. Установить 9,5
  4. Восстановить БД

Сделал это для 9,5 до 9,6 и работал отлично, а также. Хорошо, что можно делать легкое и точное обновление, а не «последнее». Я использовал Big SQL, чтобы получить правильный установщик ( openscg.com/bigsql/postgresql/installers.jsp ).
Кодер

0

Моим решением было сделать комбинацию этих двух ресурсов:

https://gist.github.com/tamoyal/2ea1fcdf99c819b4e07d

и

http://www.gab.lc/articles/migration_postgresql_9-3_to_9-4

Второй один помог более , то первым из них. Также, чтобы не делать, не следуйте инструкциям, так как некоторые из них не нужны. Также, если вы не можете сделать резервную копию данных через консоль postgres, вы можете использовать альтернативный подход и сделать резервную копию с помощью pgAdmin 3 или другой программы, как я делал в моем случае.

Также ссылка: https://help.ubuntu.com/stable/serverguide/postgresql.html Помогла установить зашифрованный пароль и установить md5 для аутентификации пользователя postgres.

После того, как все сделано, чтобы проверить serverверсию postgres, запустите в терминале:

sudo -u postgres psql postgres

После ввода пароля запустите в терминале postgres:

SHOW SERVER_VERSION;

Это выведет что-то вроде:

 server_version 
----------------
 9.4.5

Для настройки и запуска postgres я использовал команду:

> sudo bash # root
> su postgres # postgres

> /etc/init.d/postgresql start
> /etc/init.d/postgresql stop

А затем для восстановления базы данных из файла:

> psql -f /home/ubuntu_username/Backup_93.sql postgres

Или, если не работает, попробуйте с этим:

> pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d name_of_database ~/your_file.dump

И если вы используете Rails, сделайте bundle exec rake db:migrateпосле того, как потянете код :)


0

Для Mac с помощью homebrew:

brew tap petere/postgresql,

brew install <formula>(например: brew install petere/postgresql/postgresql-9.6)

Удалить старый Postgres:

brew unlink postgresql

brew link -f postgresql-9.6

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

Проверьте это для получения дополнительной информации: https://github.com/petere/homebrew-postgresql


0

На Windows 10, так как у меня был npm, я установил пакет rimraf. npm install rimraf -g

Резервное копирование всех ваших баз данных по одной с помощью команды pg_dump -U $username --format=c --file=$mydatabase.sqlc $dbname

Затем установил последнюю версию PostgreSQL, т.е. 11.2, которая на этот раз побудила меня использовать порт 5433.

После удаления более старых версий PostgreSQL у меня было 10. Обратите внимание, что программа удаления может выдать предупреждение о том, что папка не удаляется C:\PostgreSQL\10\data. Вот почему у нас есть следующий шаг, используя rimraf для окончательного удаления папки и ее подпапок.

Перейдите в каталог установки PostgreSQL и выполните команду rimraf 10. 10 - это имя каталога. Обратите внимание, используйте вашу старую версию PostgreSQL, т.е. 9.5 или что-то еще.

Теперь добавьте C:\PostgreSQL\pg11\bin, C:\PostgreSQL\pg11\libв Windows переменные среды. Обратите внимание, что моя новая установленная версия 11, поэтому я использую pg11.

Перейдите, чтобы C:\PostgreSQL\data\pg11затем открыть postgresql.confредактирование port = 5433вport = 5432

Вот и все. Откройте cmd и введитеpsql -U postgres

Теперь вы можете восстановить все ваши резервные базы данных по одной, используя команду pg_restore -U $username --dbname=$databasename $filename


0

Мое решение для обновления с Postgresql 11 до Postgresql 12 в Windows 10 заключается в следующем.

В качестве первого замечания вы должны быть в состоянии остановить и запустить службу Postgresql. Вы можете сделать это с помощью следующих команд в Powershell.

Начало: pg_ctl start -D “d:\postgresql\11\data”

Стоп: pg_ctl stop -D “d:\postgresql\11\data”

Положение дел: pg_ctl status -D “d:\postgresql\11\data”

Было бы целесообразно сделать резервную копию перед обновлением. Экземпляр Postgresql 11 должен быть запущен. Затем скопировать глобалы сделать

pg_dumpall -U postgres -g -f d:\bakup\postgresql\11\globals.sql

а затем для каждой базы данных

pg_dump -U postgres -Fc <database> > d:\backup\postgresql\11\<database>.fc

или

pg_dump -U postgres -Fc -d <database> -f d:\backup\postgresql\11\<database>.fc

Если это еще не сделано, установите Postgresql 12 (поскольку Postgresql 11 также установлен, это будет порт 5433)

Затем выполнить обновление следующим образом:

1) Остановить службу Postgresql 11 (см. Выше)

2) Отредактируйте postgresql.confфайл d:\postgresql\12\dataи измените port = 5433наport = 5432

3) Измените путь среды пользователя Windows ( windows startзатем введите env), чтобы он указывал на Postgresql 12 вместо Postresql 11

4) Запустите обновление, введя следующую команду.

pg_upgrade `
-b c:\program files\postgresql\11\bin `
-B c:\program files\postgresql\12\bin `
-d d:\postgresql\11\data `
-D d:\postgresql\12\data --username=postgres

(В powershell используйте backtick (или backquote) `для продолжения команды на следующей строке)

5) и, наконец, запустить новый сервис Postgresql 12

pg_ctl start -D “d:\postgresql\12\data”


-1

Я думаю, что это лучшая ссылка для вашего решения, чтобы обновить Postgres до 9,6

https://sandymadaan.wordpress.com/2017/02/21/upgrade-postgresql9-3-9-6-in-ubuntu-retaining-the-databases/
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.