是否尝试过全新安装,不进行恢复,而是连接到现有的后端数据库?
我想这意味着可能会丢失 UI 中未持久化到数据库的任何设置?但不确定还有什么被备份和恢复了。
是否尝试过全新安装,不进行恢复,而是连接到现有的后端数据库?
我想这意味着可能会丢失 UI 中未持久化到数据库的任何设置?但不确定还有什么被备份和恢复了。
也许您应该考虑从 Bitnami 迁移到实际的标准安装。您的问题并非由“数据库迁移中的错误”引起,而是 Bitnami 特有的问题。
Kubernetes 是否已有标准安装程序?
Kubernetes 是否允许手动安装?如果可以,您可以通过这种方式进行标准安装。(我从未尝试过,所以我不知道 Kubernetes 的工作原理)
我非常清楚标准安装的优势以及 Bitnami Helm Chart 的独立性和未经授权的性质。我无意暗示错误在于 Discourse 本身。我选择使用 Bitnami 是基于对以下两项成本的权衡:一是排查 Bitnami Chart 问题所需的成本,二是开发我自己的等效 Helm Chart(基于官方支持的安装方式)并排查其问题的成本。
我考虑过,但我试图避免修改默认 Chart 设置,以保持在“主路径”上。话虽如此,我确实尝试过仅将 Discourse 服务器升级到 v3.2.0,通过覆盖 Deployment 镜像标签,同时保留现有数据库,看看迁移是否会成功;但它仍然失败了。
我尝试过通过 kubectl exec 连接到 postgres 容器,使用 Discourse 本身生成的 SQL dump 文件手动删除和恢复数据库,但这会因 sidebar_sections 表的错误而失败。最近,我创建了一个新的虚拟机,并按照标准安装方法安装了 Discourse v3.3.0。当我尝试备份恢复时,出现了同样的错误。
我的结论是,尽管生产备份存档是由 Discourse 本身生成的,但我生产实例 v3.0.6 的数据库结构在某种程度上与 Discourse 期望的不同,导致迁移出错。如果真是这样,我对我的选择感到悲观。我目前唯一的想法是开始修改备份存档中的 SQL dump 文件,删除导致数据库迁移恢复过程中出现 DuplicateTable 错误的表。
如果您想使用 Bitnami 的 Helm Charts,那么您需要使用他们的支持。
希望这能让那些和我一样在这个困境中挣扎了几个小时的人有所启发,以下是我在 Bitnami Helm chart (v11 到 v12) 的情况下,从 Discourse v3.0.6 升级到 v3.2.0 的最终过程。虽然根据上面的评论,进一步的免责声明应该不是必需的,但这个问题是由于 Bitnami 的 Helm chart 及其自定义镜像中的一个 bug 造成的;这个问题不会影响官方的 Discourse 版本。
下面的说明展示了如何进行升级。“生产站点”是指 Discourse 站点的 Helm chart 发布版本,“迁移站点”是指在 discourse-dev 命名空间中并行部署的临时 chart 发布版本。
安装 Bitnami chart v12.6.2 (Discourse v3.2.0) 的新实例。将 Discourse 服务器 Deployment 缩减到零。
$ kubectl scale -n discourse-dev deployment discourse --replicas 0
deployment.apps/discourse scaled
创建 SQL 文件 db_init.sql:
cat > /tmp/db_init.sql << EOF
DROP DATABASE bitnami_application;
CREATE DATABASE bitnami_application;
GRANT ALL PRIVILEGES ON DATABASE bitnami_application TO bn_discourse;
CREATE EXTENSION hstore;
CREATE EXTENSION pg_trgm;
ALTER database bitnami_application owner to bn_discourse ;
EOF
复制到数据库 pod 并执行:
$ kubectl cp -n discourse-dev db_init.sql discourse-dev-postgresql-0:/tmp/
$ kubectl exec -n discourse-dev -it discourse-dev-postgresql-0 -- bash -c \
'PGPASSWORD=$POSTGRES_PASSWORD psql -U postgres \
< /tmp/db_init.sql'
DROP DATABASE
CREATE DATABASE
GRANT
ERROR: extension "hstore" already exists
ERROR: extension "pg_trgm" already exists
ALTER DATABASE
解压备份存档,将 SQL 转储文件复制到数据库 pod,然后应用:
$ ls
discourse-2024-03-04-143102-v20230119094939.tar.gz
$ tar xvf discourse-2024-03-04-143102-v20230119094939.tar.gz
$ gunzip dump.sql.gz
$ kubectl cp -n discourse-dev dump.sql discourse-dev-postgresql-0:/tmp/
$ kubectl exec -n discourse-dev -it discourse-dev-postgresql-0 -- bash -c \
'PGPASSWORD=$POSTGRES_PASSWORD psql -U bn_discourse \
--dbname bitnami_application \
< /tmp/dump.sql'
启动 Discourse pod。
$ kubectl scale -n discourse-dev deployment discourse --replicas 1
deployment.apps/discourse scaled
查看日志并删除阻止升级的相关表:
$ kubectl logs --prefix -f -n discourse-dev -c discourse -l app.kubernetes.io/name=discourse
$ kubectl logs --prefix -f -n discourse-dev -l app.kubernetes.io/name=postgresql
观察数据库迁移失败的情况,并手动删除相关表,直到迁移成功:
$ kubectl exec -n discourse-dev -it discourse-dev-postgresql-0 -- bash -c \
'PGPASSWORD=$POSTGRES_PASSWORD psql -U bn_discourse --dbname bitnami_application -c " \
DROP TABLE sidebar_sections; \
DROP TABLE sidebar_urls; \
DROP TABLE chat_threads; \
DROP TABLE form_templates; \
DROP TABLE category_settings; \
DROP TABLE category_form_templates; \
DROP TABLE theme_svg_sprites; \
DROP TABLE user_chat_thread_memberships; \
DROP TABLE summary_sections; \
"'
恢复 uploads 文件夹备份:
$ PODNAME=$(kubectl get pod -n discourse-dev -l app.kubernetes.io/name=discourse --output=jsonpath={.items..metadata.name} | cut -f1 -d' ')
$ kubectl cp -n discourse-dev -c discourse uploads $PODNAME:/bitnami/discourse/public/
$ kubectl exec -n discourse-dev -c discourse $PODNAME -- bash -c 'chown -R 999:0 /bitnami/discourse/public/uploads/'
出于某种原因,插件没有自动下载和安装。请手动执行此操作并验证插件功能。
root@discourse-54c6d6fb7c-z9285:/bitnami/discourse/plugins$ git clone https://github.com/discourse/discourse-oauth2-basic
root@discourse-54c6d6fb7c-z9285:/bitnami/discourse/plugins$ git clone https://github.com/discourse/discourse-math
root@discourse-54c6d6fb7c-z9285:/bitnami/discourse/plugins$ chown -R 999:0 discourse-oauth2-basic discourse-math
使用 Backups 管理面板创建新恢复站点的备份。
https://$BASE_URL/u/admin-login 通过电子邮件链接登录。