Як оновити PostgreSQL з версії 9.6 до версії 10.1 без втрати даних?


207

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

Чи є детальні інструкції щодо оновлення бази даних PostgreSQL?

Боюся, що я знищу дані в базі даних або зіпсую їх.


8
Робіть резервні копії в будь-якому випадку.
Патрік Осіті

Відповіді:


401

Припускаючи, що ви використовували домашню заварку для встановлення та оновлення 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 (зверніть увагу: змініть версію контейнера, якщо ви оновлюєте щось інше, ніж нижче) :

    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
сонячні записи

Це дотримуйтесь вашого керівництва крок за кроком. І все спрацювало! Дуже дякую.
Трантор Лю

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

1
Якщо ви використовуєте Bundler, вам слід видалити дорогоцінний камінь за допомогою, gem uninstall pgале потім дозволити bundler перевстановити правильну версію з Gemfile.lock, просто запустивши bundle.
danielricecodes

1
Незначне оновлення: brewтепер також є можливість використовувати, brew services stop postgresqlа brew services start postgresqlне безпосередньо телефонувати launchctl unloadі launchctl load.
флористичний

59

Незважаючи на всі відповіді вище, тут іде мої 5 копійок.

Він працює в будь-якій ОС та з будь-якої будь-якої постгресової версії.

  • Зупинити будь-який запущений екземпляр постграми;
  • Встановіть нову версію та запустіть її; Перевірте, чи можете ви також підключитися до нової версії;
  • Змінити стару версію 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.
Марк Тілеманс

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
Johnny

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 / статичний / 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
Jarno Argillander

1
Мені вдалося успішно оновити з 9,5 до 11,5 довелося додати сховища доречних сховищ до ubuntu. а потім просто виконайте ці кроки: tecadmin.net/install-postgresql-server-on-ubuntu
shakee93

14

Якщо ви користуєтеся домашньою та домашньою послугою, ви, ймовірно, можете просто зробити:

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

Я думаю, це може не спрацювати повністю, якщо ви використовуєте розширені функції постгресу, але для мене це прекрасно працювало.


1
Відмінно працював для macOS Mojave 10.14.2 - Дякую!
8bithero

13

Посібник користувача глибоко висвітлює цю тему. Ти можеш:

  • pg_upgradeна місці; або

  • pg_dumpі pg_restore.

Якщо ви сумніваєтеся, робіть це з відвалами. Не видаляйте старий каталог даних, а зберігайте його на випадок, якщо щось піде не так / ви помилитесь; таким чином ви можете просто повернутися до незмінної установки 9.3.

Детальніше див. У посібнику.

Якщо ви застрягли, опублікуйте детальне запитання, де пояснюється, як ви застрягли, де і що ви спробували спочатку. Трохи залежить від того, як ви встановили PostgreSQL, оскільки існує декілька різних "розподілів" PostgreSQL для OS X (на жаль). Тому вам потрібно буде надати цю інформацію.


8

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

Припускаючи, що ви використовували домашню заварку для встановлення та оновлення 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 / Підвал /postgresql/9.4.*/bin/ # Незначні версії можуть бути різними.
Аарон Макміллін

1
Дякую за це Я випадково запустився brew cleanupдо переміщення даних, що призвело до видалення postgres9.3. Це допомогло. :)
markquezada

5

Виглядає, що рішення було виведено на домашню мову:

$ 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
Можливо, ми прагнемо до різних результатів. Після всеосяжного оновлення програмного забезпечення я отримав 2 версії 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

Для налаштування та запуску постгресів я використав команду:

> 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 через домашню мову:

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

(У powerhell використовуйте 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.