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

137

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

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

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

  • 7
    Делайте резервные копии в любом случае.
Теги:
upgrade

11 ответов

350
Лучший ответ

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

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

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

  • Инициализировать новую базу данных 10.1:

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

  • запустите 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/
    
  • Переместите новые данные на место:

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

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

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

  • Наконец, переустановите рельсы pg gem

    gem uninstall pg
    gem install pg
    

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

  • 2
    Спасибо! Все работает как шарм!
  • 8
    Я должен использовать следующую команду для инициализации базы данных: initdb /usr/local/var/postgres9.4 -E utf8 --lc-collate=C --lc-ctype=utf-8 --lc-monetary=C --lc-numeric=C
Показать ещё 25 комментариев
41

Вот решение для пользователей 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»
Показать ещё 1 комментарий
31

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

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

  • Остановить любой запущенный экземпляр postgres;
  • Установите новую версию и запустите ее; Проверьте, можете ли вы также подключиться к новой версии;
  • Измените старую версию postgresql.confport с 5432 на 5433;
  • Запустите экземпляр postgres старой версии;
  • Откройте терминал и компакт-диск в новой версии bin,
  • Выполнить pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username>
  • Остановить запуск исполняемого экземпляра postgres;
  • 4
    Спасибо, Кристиан, это определенно отличное и простое решение, я успешно перешел с 9.3 на 9.5, вот так
  • 3
    Отлично работал для обновления с 9.1 до 9.5 на сервере Windows 2012.
Показать ещё 4 комментария
8

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

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

  • pg_dump и pg_restore.

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

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

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

7

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

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

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

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

  • Инициализировать новую базу данных 9.4:

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

  • Установите postgres 9.3 (поскольку он больше не был на моей машине):

    brew install homebrew/versions/postgresql93

  • Добавить каталоги, удаленные во время обновления 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

  • выполните 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/

  • Переместите новые данные на место:

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

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

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

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

    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. Это помогло. :)
3

Обновление. Этот процесс тот же, что и для обновления с 9.6 до 10; просто измените команды, чтобы отразить версии 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 data files:
    ./delete_old_cluster.sh
  • 0
    Для меня в Mac Yosemite, PostgreSQL 9.2 -> 9.5: sudo su postgres , измените все METHOD в pg_hba.conf обеих установок, чтобы они доверяли перед pg_upgrade, запуск pg_upgrade в / private / tmp not ~ не работал, поэтому 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

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

Сэкономить много времени для меня просто:

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

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

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

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

  • 1
    При этом используется инструмент pg_upgradecluster Ubuntu, который может быть намного медленнее, чем инструмент pg_upgrade PostgreSQL, и, конечно, доступен только в Ubuntu.
  • 0
    @alfonx Не правда. У меня есть это на моей Debian jessie . Имел 10+ БД и объем ~ 400 МБ данных базы данных был преобразован в мгновение ока. Опять же, я использую виртуальный Debian на SSD.
Показать ещё 2 комментария
0

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

https://sandymadaan.wordpress.com/2017/02/21/upgrade-postgresql9-3-9-6-in-ubuntu-retaining-the-databases/
0

Для Mac через доморощенный:

brew tap petere/postgresql,

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

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

brew unlink postgresql

brew link -f postgresql-9.6

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

Проверьте это: https://github.com/petere/homebrew-postgresql

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.

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

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 после вытягивания кода:)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню