如何在不丢失数据的情况下将PostgreSQL从9.6版升级到10.1版?


207

我正在Ruby on Rails应用程序上使用PostgreSQL数据库(在Mac OS X 10.9上)。

是否有关于如何升级PostgreSQL数据库的详细说明?

恐怕会破坏数据库中的数据或将其弄乱。


8
无论如何都要进行备份。
Patrick Oscity 2014年

Answers:


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 (注意:如果要从以下版本以外的版本进行升级,请更改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. 最后,重新安装rails pggem

    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 2014年

它会逐步按照您的指南进行操作。一切正常!非常感谢。
Trantor Liu

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 postgresqlbrew services start postgresql而不是直接调用launchctl unloadlaunchctl load
佛罗伦萨

59

尽管有上述所有答案,但这里还是我的5美分。

它可以在任何OS上以及从任何版本到任何Postgres版本的版本上运行。

  • 停止任何正在运行的postgres实例;
  • 安装新版本并启动它;检查您是否也可以连接到新版本;
  • 将旧版本的postgresql.conf-> port从更改54325433
  • 启动旧版本的postgres实例;
  • 打开一个终端并cd进入新版本bin文件夹;
  • pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username>
  • 停止旧的postgres运行实例;


3
在Windows 2012服务器上从9.1升级到9.5的过程中表现出色。
罗尔夫(Rolf)2016年

4
该解决方案的问题在于,如果您更改了某些Postgres配置文件(例如postgresql.confpg_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 '17

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上运行,以便您可以在必要时还原”。
Andrew Thaddeus Martin

3
注意:对于Ubuntu 14.04,请使用“ trusty-pgdb”代替utopic-pgdb
Johnny

3
请注意,这样做不是做一个就地升级。因此,对于我的1TB卷上的700 GB DB来说,这完全没用。
假名称

16

更新:至少通过11.5升级9.5的过程相同。只需修改,以反映版本的命令9.610,其中9.6版本,10版本。确保也相应地调整“旧”和“新”目录。


我刚刚在Ubuntu上将PostgreSQL 9.5升级到9.6,并认为我会分享我的发现,因为有几个特定于OS / package的细微差别需要注意。

我不想手动转储和还原数据,因此这里的其他几个答案不可行。)

简而言之,该过程包括将新版本的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"?

发生这种情况是因为在没有此开关的情况下应用了默认配置选项,这导致使用了错误的连接选项,从而导致了套接字错误。

从新的 PostgreSQL版本执行pg_upgrade命令:

/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,pg_upgrade前两个安装的所有pg_hba.conf里方法变更信任,运行在/私营/ tmp目录pg_upgrade不〜没那么工作sudo mkdir /foobarchmod 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,不得不向untuntu添加postgres apt存储库。然后按照以下步骤操作:tecadmin.net/install-postgresql-server-on-ubuntu
shakee93

14

如果您正在使用自制软件和自制软件服务,则可能只需执行以下操作:

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_dumppg_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. 添加在优胜美地升级期间删除的目录:

    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
它使用Ubuntu的pg_upgradecluster工具,该工具可能比PostgreSQL的pg_upgrade工具要慢得多,当然只有Ubuntu才可用。
alfonx

@alfonx不正确。我在Debian上有它jessie。眨眼间就转换了10个以上的DB,并转换了约400MB的数据库数据。再说一次,我在SSD上使用了虚拟Debian。
dimitarvp 2015年

让我纠正一下自己:pg_upgradecluster是“ Debian PostgreSQL基础结构”的一部分,因此仅在基于Debian的发行版中可用。关于速度pg_upgrade提供了“ --link”选项,该选项在可能的情况下链接不复制数据:postgresql.org/docs/9.4/static/pgupgrade.html
alfonx 2015年

1
也许我们的目标是不同的结果。经过发行版范围的软件升级后,我最终获得了2个版本的PostgreSQL,而我的项目使用的数据被卡在了旧版本(9.3)上。因此,我只是在上面的链接中找到了(在我的答案中)并对其进行了升级,摆脱了旧的“集群”和旧的PG版本。
dimitarvp 2015年

我尝试使用9.4从11升级到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:

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

自从有了npm以来,在Windows 10上,我安装了rimraf软件包。 npm install rimraf -g

使用命令一一备份所有数据库 pg_dump -U $username --format=c --file=$mydatabase.sqlc $dbname

然后安装了最新的PostgreSQL版本,即11.2,这一次提示我使用端口5433。

其次是PostgreSQL的旧版本的卸载是10。请注意,卸载程序可能会警告您不要删除folder 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 = 5433port = 5432

而已。打开cmd并输入psql -U postgres

现在,您可以使用以下命令一个接一个地还原所有支持的数据库 pg_restore -U $username --dbname=$databasename $filename


0

我在Windows 10上从Postgresql 11升级到Postgresql 12的解决方案如下。

首先,您将需要能够停止并启动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 = 5433port = 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中,使用反引号(或反引号)`在下一行继续执行命令)

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/
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.