PostgreSQL 13 更新后卡在更新循环中

我已阅读了此处文档,但它们未涵盖我的情况:PostgreSQL 13 update

我卡在“每次重建都会再次执行升级,即升级循环”的问题上:

-------------------------------------------------------------------------------------
POSTGRES 升级完成

旧版 10 数据库存储在 /shared/postgres_data_old

要完成升级,请再次使用以下命令重建:

./launcher rebuild app
-------------------------------------------------------------------------------------

文档指出这是因为“上一次升级的残留文件仍然存在。在继续之前,请将它们移至其他地方。”

但我没有任何旧文件:

root@connect:/var/discourse# ls /mnt/volume_ams3_01/shared/standalone/
backups  letsencrypt  log  postgres_backup  postgres_data  postgres_data_new  postgres_run  redis_data  ssl  state  tmp  uploads

另外两点说明:

  • postgres_data 文件夹是空的。
  • 我使用 DigitalOcean Spaces 配置了独立的共享文件夹。

我可以尝试哪些方法来解决此问题?

你好 Alex,

我不确定是什么导致了重启循环,但你可能可以绕过它。postgres_data_new 目录包含你的数据库吗?如果是,请检查该目录中的 PG_VERSION 文件,以确认升级是否成功。此外,如果你能复制完整的日志,那将很有帮助。

2 个赞

是的,postgres_data_new 包含我的数据库,其中的 PG_VERSION 文件确认版本为 13

我不确定哪些日志对您有帮助,以及在哪里可以找到它们。

在这种情况下,您应该能够将 postgres_data_new 复制到 postgres_data 目录,然后执行重新构建。launcher 将检测到数据库在 PG13 上已是最新状态,并从此处继续。

1 个赞

你好,Michael!我忘了提到,自从最初在这里发帖后,我确实尝试过(两次)。但我仍然被困在这个循环中。

1 个赞

我不确定如何捕获 ./launcher rebuild app 的输出,但以下是我得到的内容。

它开始如下:

root@connect:/var/discourse# ./launcher rebuild app
Ensuring launcher is up to date
Fetching origin
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 60 app
app
cd /pups && git pull && git checkout v1.0.3 && /pups/bin/pups --stdin
From https://github.com/discourse/pups
   17f04ec..e0ff889  master     -> origin/master
 * [new tag]         v1.1.1     -> v1.1.1
 * [new tag]         v1.1.0     -> v1.1.0
Updating 17f04ec..e0ff889
Fast-forward
 .github/workflows/ci.yml     |  29 ++++++
 .github/workflows/lint.yml   |  27 +++++
 .rubocop.yml                 |   3 +
 Gemfile                      |   2 +
 Guardfile                    |   4 +-
 README.md                    |  21 ++++
 Rakefile                     |  14 +--
 bin/pups                     |   8 +-
 lib/pups.rb                  |  32 ++++--
 lib/pups/cli.rb              |  92 ++++++++++-------
 lib/pups/command.rb          |  25 +++--
 lib/pups/config.rb           | 240 +++++++++++++++++++++++--------------------
 lib/pups/docker.rb           |  69 +++++++++++++
 lib/pups/exec_command.rb     | 182 ++++++++++++++++----------------
 lib/pups/file_command.rb     |  60 +++++------
 lib/pups/merge_command.rb    |  94 ++++++++---------
 lib/pups/replace_command.rb  |  70 +++++++------
 lib/pups/runit.rb            |  47 +++++----
 lib/pups/version.rb          |   4 +-
 pups.gemspec                 |  37 ++++---
 test/cli_test.rb             | 102 +++++++++++++++---
 test/config_test.rb          | 215 ++++++++++++++++++++++++++++----------
 test/docker_test.rb          | 157 ++++++++++++++++++++++++++++
 test/exec_command_test.rb    |  62 ++++++-----
 test/file_command_test.rb    |  17 ++-
 test/merge_command_test.rb   |  64 ++++++------
 test/replace_command_test.rb |  86 ++++++++--------
 test/test_helper.rb          |   2 +
 28 files changed, 1158 insertions(+), 607 deletions(-)
 create mode 100644 .github/workflows/ci.yml
 create mode 100644 .github/workflows/lint.yml
 create mode 100644 .rubocop.yml
 create mode 100644 lib/pups/docker.rb
 create mode 100644 test/docker_test.rb
Note: checking out 'v1.0.3'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at d1db030 cut a new version
I, [2021-10-19T05:37:44.995716 #1]  INFO -- : Loading --stdin
I, [2021-10-19T05:37:45.001857 #1]  INFO -- : > locale-gen $LANG && update-locale
I, [2021-10-19T05:37:45.031533 #1]  INFO -- : Generating locales (this might take a while)...
Generation complete.

I, [2021-10-19T05:37:45.032260 #1]  INFO -- : > mkdir -p /shared/postgres_run
I, [2021-10-19T05:37:45.037403 #1]  INFO -- :
I, [2021-10-19T05:37:45.038002 #1]  INFO -- : > chown postgres:postgres /shared/postgres_run
I, [2021-10-19T05:37:45.041480 #1]  INFO -- :
I, [2021-10-19T05:37:45.041974 #1]  INFO -- : > chmod 775 /shared/postgres_run
I, [2021-10-19T05:37:45.044313 #1]  INFO -- :
I, [2021-10-19T05:37:45.044759 #1]  INFO -- : > rm -fr /var/run/postgresql
I, [2021-10-19T05:37:45.047047 #1]  INFO -- :
I, [2021-10-19T05:37:45.047605 #1]  INFO -- : > ln -s /shared/postgres_run /var/run/postgresql
I, [2021-10-19T05:37:45.051062 #1]  INFO -- :
I, [2021-10-19T05:37:45.051463 #1]  INFO -- : > socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
2021/10/19 05:37:45 socat[33] E connect(6, AF=1 "/shared/postgres_run/.s.PGSQL.5432", 36): No such file or directory
I, [2021-10-19T05:37:45.058669 #1]  INFO -- :
I, [2021-10-19T05:37:45.058976 #1]  INFO -- : > rm -fr /shared/postgres_run/.s*
I, [2021-10-19T05:37:45.061427 #1]  INFO -- :
I, [2021-10-19T05:37:45.061743 #1]  INFO -- : > rm -fr /shared/postgres_run/*.pid
I, [2021-10-19T05:37:45.063969 #1]  INFO -- :
I, [2021-10-19T05:37:45.064258 #1]  INFO -- : > mkdir -p /shared/postgres_run/13-main.pg_stat_tmp
I, [2021-10-19T05:37:45.068148 #1]  INFO -- :
I, [2021-10-19T05:37:45.068570 #1]  INFO -- : > chown postgres:postgres /shared/postgres_run/13-main.pg_stat_tmp
I, [2021-10-19T05:37:45.070400 #1]  INFO -- :
I, [2021-10-19T05:37:45.074243 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown:
I, [2021-10-19T05:37:45.077577 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown:
I, [2021-10-19T05:37:45.081084 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown:
I, [2021-10-19T05:37:45.084463 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown:
I, [2021-10-19T05:37:45.084841 #1]  INFO -- : > chown -R root /var/lib/postgresql/13/main
I, [2021-10-19T05:37:45.766251 #1]  INFO -- :
I, [2021-10-19T05:37:45.766560 #1]  INFO -- : > [ ! -e /shared/postgres_data ] && install -d -m 0755 -o postgres -g postgres /shared/postgres_data && sudo -E -u postgres /usr/lib/postgresql/13/bin/initdb -D /shared/postgres_data || exit 0
I, [2021-10-19T05:37:45.769955 #1]  INFO -- :
I, [2021-10-19T05:37:45.770597 #1]  INFO -- : > chown -R postgres:postgres /shared/postgres_data
I, [2021-10-19T05:37:45.841916 #1]  INFO -- :
I, [2021-10-19T05:37:45.842605 #1]  INFO -- : > chown -R postgres:postgres /var/run/postgresql
I, [2021-10-19T05:37:45.845109 #1]  INFO -- :
I, [2021-10-19T05:37:45.845574 #1]  INFO -- : > /root/upgrade_postgres
initdb: warning: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
debconf: delaying package configuration, since apt-utils is not installed

然后它运行得太快(在 /shared/postgres_data/base/whatever 中有很多行),并以如下内容结束:

  /shared/postgres_data/base/16400/203028
  /shared/postgres_data/base/16400/203045
  /shared/postgres_data/base/16400/203047
  /shared/postgres_data/base/16400/203049
  /shared/postgres_data/base/16400/203050
  /shared/postgres_data/base/13014/2613
  /shared/postgres_data/base/13014/2683
  /shared/postgres_data/base/1/2613
  /shared/postgres_data/base/1/2683
                                                            ok
Setting next OID for new cluster                            ok
Sync data directory to disk                                 ok
Creating script to analyze new cluster                      ok
Creating script to delete old cluster                       ok

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
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES COMPLETE

Old 10 database is stored at /shared/postgres_data_old

To complete the upgrade, rebuild again using:

./launcher rebuild app
-------------------------------------------------------------------------------------

a68ed0b1b54e4a0e2dae2543dc27d87be02ca1f81738e0d2e43511a46524a980

您介意分享一下您在 containers/app.yml 中包含哪些模板吗?

好的:

templates:
  # - "templates/postgres.10.template.yml"
  - "templates/postgres.13.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.replygif.template.yml" # 用于 ReplyGIF 插件:https://github.com/cpradio/discourse-plugin-replygif

(我将注释掉 replygif 那一行,反正我也不用它。)

这是什么意思?我认为这可能与此相关。

为什么这不直接是没有任何版本号的 postgres 模板?

这可能是问题所在。

1 个赞

嗨,Jay!

你说得对,这是个错误,看起来很可能就是问题所在。我已经将其改为 templates/postgres.template.yml,并重新构建了两遍,但我仍然被困在这个循环中。

我遵循了这篇指南(在它可用时)来使用 DigitalOcean Spaces 进行备份和图像上传。

我的 postgres 数据似乎分布在两个地方:

  • /var/postgres_data_discourse(PG_VERSION = 10)
  • /mnt/volume_ams3_01/shared/standalone/postgres_data_new(PG_VERSION = 13)
  • /mnt/volume_ams3_01/shared/standalone/postgres_data(PG_VERSION = 13)——我按照之前的建议,手动从 postgres_data_new 复制了这些文件

我目前的猜测是,这与您的卷映射有关。

但上述内容看起来表明您有一个独立于 Discourse 正在更新的 PostgreSQL 实例。Discourse 与 /var/postgres_data_discourse 处的 PostgreSQL 无关。也许您尝试使用自己的 PostgreSQL 实例,而不是 Discourse 提供的?这看起来不像是一个标准安装。

1 个赞

这是一个 2016 年的标准安装,之后我一直在对其进行更新,所以也许在此期间有什么变化?

关于卷映射,我遵循了上述指南中的步骤。

我不认为我尝试过安装自己的 PostgreSQL——我不够专业,不知道为什么要这样做 :smiley:

我可以确认,当我尝试从 PostgreSQL 10 升级到 12 时遇到了“循环问题”,因此将其搁置以便稍后处理。前几天我完全无法重新构建,根据错误消息,我判断这与 PostgreSQL 有关,于是尝试升级,希望能解决问题。

能否回退到 PostgreSQL 10 的模板,看看它会抛出什么错误?

编辑:欢迎任何其他建议!目前我不确定该如何继续。

在您的第一篇文章中提及这一点本会更好。

我会执行干净安装并恢复您最近的备份。这是最简单的解决方式。您的操作系统可能也过时了。

2 个赞

这似乎为了解决一个问题而大费周章,但至少这是一个明确的解决路径。感谢您帮助我解决这个问题,Jay!:folded_hands:

我并不是说没有其他方法可以摆脱你的困境,但这种“大锤式”方法成功的概率很高,而且不需要特殊知识。如果我是修复者,可能会尝试一些细小的方法,但它们都很难在这里一一描述,尤其是在不清楚应该尝试哪一个、或者它们是否可能有效的情况下。

如果该系统是在 2016 年搭建的,并且仍在使用当时的操作系统,那么现在升级操作系统也完全不算早。就我个人而言,我认为启动一台新服务器要比进行操作系统升级容易得多(当然,这一观点形成于 15 年前,如今的情况可能已大不相同)。

2 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.