【问题标题】:How to upgrade PostgreSQL from version 9.6 to version 10.1 without losing data? [closed]如何在不丢失数据的情况下将 PostgreSQL 从 9.6 版升级到 10.1 版? [关闭]
【发布时间】:2014-08-14 06:53:30
【问题描述】:

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

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

我怕我会破坏数据库中的数据或者把它弄乱。

【问题讨论】:

  • 无论如何都要备份。

标签: postgresql upgrade


【解决方案1】:

我在 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) 编辑d:\postgresql\12\data中的postgresql.conf文件,将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 中使用反引号(或反引号)` 继续下一行的命令)

5) 最后启动新的 Postgresql 12 服务

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

【讨论】:

    【解决方案2】:

    更新:此过程与将 9.5 升级到至少 11.5 相同;只需修改命令以反映版本9.610,其中9.6 版本,10 版本。一定要相应地调整“旧”和“新”目录。


    我刚刚在 Ubuntu 上将 PostgreSQL 9.5 升级到 9.6,我想分享一下我的发现,因为需要注意一些特定于操作系统/包的细微差别。

    我不想手动转储和恢复数据,所以这里的其他几个答案都不可行。)

    简而言之,该过程包括在旧版本(例如,9.5 和 9.6)旁边安装新版本的 PostgreSQL,然后运行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
    

    【讨论】:

    • 对于 Mac Yosemite 中的我,PostgreSQL 9.2 -> 9.5:sudo su postgres,在 pg_upgrade 之前将两个安装的 pg_hba.conf 中的所有 METHOD 更改为 trust,在 /private/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
    • 我能够从 9.5 成功升级到 11.5,必须将 postgres apt 存储库添加到 ubuntu。然后按照以下步骤操作:tecadmin.net/install-postgresql-server-on-ubuntu
    【解决方案3】:

    尽管上面给出了所有答案,但我的 5 美分就到这里了。

    它适用于任何操作系统和任何到任何 postgres 版本。

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

    【讨论】:

    • 感谢Christian,这绝对是一个很棒且简单的解决方案,我就这样成功地从9.3升级到了9.5
    • 非常适合在 Windows 2012 服务器上从 9.1 升级到 9.5。
    • 此解决方案的一个问题是,如果您更改了一些 Postgres 配置文件(例如 postgresql.confpg_hba.conf),您需要在新安装中手动复制这些更改。相反,如果您使用pg_upgradecluster,配置文件将被复制到新集群:manpages.ubuntu.com/manpages/precise/man8/…
    • 请注意,在您启动命令后,您将收到 one 密码提示,但您必须逐个输入 2 个密码,并按 Enter 确认。或者你会得到pg_dumpall: could not connect to database "XXX": fe_sendauth: no password supplied
    • 从技术上讲,这不适用于任意版本,仅适用于 7.0 或以上的源版本,如手册所述:Current releases of the dump programs can read data from any server version back to 7.0.
    【解决方案4】:

    假设您已经使用 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. 最后重新安装railspggem

      gem uninstall pg
      gem install pg
      

    我建议您花一些时间阅读PostgreSQL documentation,以准确了解您在上述步骤中所做的事情,以尽量减少挫折感。

    【讨论】:

    • 我不得不使用以下命令来初始化数据库:initdb /usr/local/var/postgres9.4 -E utf8 --lc-collate=C --lc-ctype=utf-8 --lc-monetary=C --lc-numeric=C
    • 它会一步一步地按照你的指南。一切正常!非常感谢。
    • 小心delete_old_cluster.sh 命令。我首先手动删除了 /usr/local/postgres9.3 目录,然后运行了这个命令,似乎我丢失了整个 /usr/local/var/postgres 目录(我能够从 Time Machine 恢复它)
    • 如果您使用的是 Bundler,您应该使用 gem uninstall pg 删除 gem,然后让 bundler 通过运行 bundle 从 Gemfile.lock 重新安装正确的版本。
    • 小更新:brew 现在还可以选择使用brew services stop postgresqlbrew services start postgresql,而不是直接调用launchctl unloadlaunchctl load
    【解决方案5】:

    在 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 = 5433port = 5432

    就是这样。打开cmd输入psql -U postgres

    您现在可以使用命令pg_restore -U $username --dbname=$databasename $filename 一个一个恢复所有备份的数据库

    【讨论】:

      【解决方案6】:

      这是 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
      

      【讨论】:

      • 倒数第二句你说“大多数升级后的集群将在端口号 5433 上运行”可能应该说“9.3 集群将在端口号 5433 上运行,以便您可以在必要时恢复”。
      • 注意:对于 ubuntu 14.04 使用 "trusty-pgdb" 而不是 utopic-pgdb
      • 请注意,这不会进行就地升级。因此,对于 1TB 卷上的 700 GB 数据库来说,它完全没用。
      【解决方案7】:

      如果您使用的是自制和自制服务,您可能只需这样做:

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

      如果您使用高级 postgres 功能,我认为这可能无法完全工作,但它对我来说非常有效。

      【讨论】:

      • 非常适合 macOS Mojave 10.14.2 - 谢谢!
      • 2021 年仍在使用 OS Catalina 10.15.7
      【解决方案8】:

      看起来该解决方案现在已融入 Homebrew:

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

      【讨论】:

        【解决方案9】:

        对于 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

        【讨论】:

          【解决方案10】:

          我认为这是您将 postgres 更新到 9.6 的解决方案的最佳链接

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

          【讨论】:

            【解决方案11】:

            Windows 上,我在尝试使用 pg_upgrade 时总是遇到不同的错误消息。

            为我节省了很多时间:

            1. 备份数据库
            2. 卸载所有 PostgreSQL 副本
            3. 安装 9.5
            4. 恢复数据库

            【讨论】:

            • 从 9.5 到 9.6 都这样做了,并且效果也很好。很高兴能够进行简单的精确升级,而不是“最新”。我使用 Big SQL 获得了正确的安装程序 (openscg.com/bigsql/postgresql/installers.jsp)。
            【解决方案12】:

            我的解决方案是结合使用这两种资源:

            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 :)

            【讨论】:

              【解决方案13】:

              站在其他可怜生物的肩膀上,我能够在升级到优胜美地后按照以下步骤重新站起来并继续奔跑:

              假设您已经使用 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. 添加在优胜美地升级期间删除的目录:

                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
                

              【讨论】:

              • 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/ # 次要版本可能不同。
              • 谢谢。我在迁移数据之前不小心运行了brew cleanup,导致 postgres9.3 被卸载。这有帮助。 :)
              【解决方案14】:

              这是为我做的。

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

              简明扼要。老实说,我的目标不是了解 PostgreSQL 的精髓,我想把事情做好。

              【讨论】:

              • 这使用了 Ubuntu 的 pg_upgradecluster 工具,它比 PostgreSQL 的 pg_upgrade 工具慢得多,当然只能在 Ubuntu 上使用。
              • @alfonx 不正确。我在我的 Debian jessie 上有它。拥有 10 多个数据库,并且在眨眼之间转换了大约 400MB 的数据库数据。再说一次,我在 SSD 上使用虚拟 Debian。
              • 让我纠正一下自己:pg_upgradecluster 是“Debian PostgreSQL 基础架构”的一部分,因此仅适用于基于 Debian 的发行版。关于速度 pg_upgrade 提供了“--link”选项,在可能的情况下链接不复制数据:postgresql.org/docs/9.4/static/pgupgrade.html
              • 也许我们的目标是不同的结果。在整个发行版软件升级后,我最终得到了 PostgreSQL 的 2 个版本,而我的项目使用的数据卡在了旧版本(9.3)上。所以我只是搜索了上面的链接(在我的回答中)并升级了它,摆脱了旧的“集群”和旧的 PG 版本。
              • 我尝试使用 pg_upgradecluster 9.4 main 从 9.4 升级到 11,但出现错误 Error: specified cluster does not exist ... 我想,我必须先使用本指南再次安装 postgresql-9.4:@ 987654323@
              【解决方案15】:

              user manual 深入探讨了这个主题。你可以:

              • pg_upgrade 就地;或

              • pg_dumppg_restore

              如果有疑问,请使用转储。不要删除旧的数据目录,只是保留它以防出现问题/您犯了错误;这样你就可以回到原来的 9.3 安装。

              详情请参阅手册。

              如果您遇到困难,请发布一个详细的问题,说明您遇到困难的原因、位置以及您首先尝试了什么。这也取决于您如何安装 PostgreSQL,因为 OS X 的 PostgreSQL 有几种不同的“发行版”(不幸的是)。所以你需要提供这些信息。

              【讨论】:

                猜你喜欢
                • 2020-06-10
                • 2017-10-16
                • 2018-04-27
                • 2022-08-08
                • 2018-01-12
                • 1970-01-01
                • 2018-12-06
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多