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

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

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

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

Ответ 1

Предполагая, что вы использовали 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

    gem uninstall pg
    gem install pg
    

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

Ответ 2

Вот решение для пользователей 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

Ответ 3

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

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

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

Ответ 4

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

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

  • pg_dump и pg_restore.

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

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

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

Ответ 5

Обновление: этот процесс аналогичен обновлению с 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 data files:
    ./delete_old_cluster.sh

Ответ 6

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

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

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

Ответ 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
    

Ответ 8

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

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

Ответ 9

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

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

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

Ответ 10

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

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

  • Резервная БД
  • Удалите все копии PostgreSQL
  • Установить 9.5
  • Восстановить DB

Ответ 11

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

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

Ответ 12

Для 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

Ответ 13

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

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

Ответ 14

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

Создайте pg_dump -U $username --format=c --file=$mydatabase.sqlc $dbname всех ваших баз данных одну за другой, используя команду pg_dump -U $username --format=c --file=$mydatabase.sqlc $dbname

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

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

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

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

Перейдите в C:\PostgreSQL\data\pg11 затем откройте C:\PostgreSQL\data\pg11 postgresql.conf edit port = 5433 для port = 5432

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

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