将 XenForo 论坛迁移到 Discourse

在我迁移的论坛中,曾经安装过 xengallery,因此我不得不更改以下内容,因为表 xfgallery 已不再存在。

  def get_xf_sql(type, id)
    case type
    when :gallery
      return "SELECT NULL WHERE 1=0;"
    when :attachment
      <<-SQL
        SELECT a.attachment_id, a.data_id, d.filename, d.file_hash, d.user_id
        FROM #{TABLE_PREFIX}attachment AS a
        INNER JOIN #{TABLE_PREFIX}attachment_data d ON a.data_id = d.data_id
        WHERE attachment_id = #{id}
        AND content_type = 'post'
      SQL
    end
  end
1 个赞

您可以尝试再次运行脚本,看看它是否完成。

您的系统是否在单个分区上?

mysql-server 安装步骤现已过时。需要安装 mariadb-server。

sudo apt-get install mariadb-server mariadb-client libmariadb-dev-compat libmariadb-dev

我能够按照其余步骤操作并导入 XF DB,因此有人应该更新指南。

我现在卡在以下步骤,需要帮助。

echo "gem 'mysql2'" >> Gemfile
bundle install --no-deployment

运行上述命令时出现以下错误。我检查了 Gemfile,它只包含这一行 - gem ‘mysql2’

此 Gemfile 未包含显式的全局源。
不使用显式全局源可能会导致在运行 bundler 之前根据您本地安装的 gem 生成不同的 lockfile。
请在此处 Gemfile 中定义全局源:source "https://rubygems.org"。
在本地安装的 gem 中找不到 gem 'mysql2'。
root@ip-172-566-459-13-app:/#

好的,我已经进入下一步。上面有人发帖说我们需要在容器的 /var/www/discourse 文件夹中,然后添加 gem。

现在是最后一步

RAILS_ENV=production bundle exec ruby script/import_scripts/xenforo.rb

我收到了这个错误。我可能做错了什么?

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:63:in "rescue in new_client": We could not find your database: discourse. Available database configurations can be found in config/database.yml. (ActiveRecord::NoDatabaseError)To resolve this error:- Did you not create the database, or did you delete it? To create the database, run: bin/rails db:create- Has the database name changed? Verify that config/database.yml contains the correct database name.

已解决:我之前是以 root 用户运行的,必须切换到 ‘discourse’ 用户。导入已开始。

4 个赞

我租用了一个配置为 4CPU 和 16GB RAM 的相当不错的服务器。按照帖子迁移的速度,仅帖子迁移就需要 9 天。用户迁移花了 2.5 小时。可以肯定地说,目前对我来说这是不可行的,但我至少可以花几个月的时间熟悉它,直到我找到批量迁移的解决方案。

附注:
在迁移脚本中,我看到重复的电子邮件未被导入。确定重复的电子邮件有哪些不同的方法?我注意到 xyz@gmail.comxyz+1@gmail.comxy.z@gmail.com 被视为相同。

还有其他模式吗?

我曾在配置与我的个人电脑相似的 VPS 上进行迁移,但不知何故,速度总是比在我的电脑上慢得多。

现在,我总是本地进行迁移。您有多少帖子?

1 个赞

250 万条帖子。
将在 M1 Mac 上尝试本地迁移以进行比较。

1 个赞

差不多就是这样。唯一性检查是在给定电子邮件地址的转换为小写和规范化版本上执行的。

我们通过删除所有点并忽略用户名中 + 之后的所有内容来进行规范化。

3 个赞

单CPU速度是重要因素。

在我的机器上,每分钟800-1000个用户或帖子的速率是相当典型的。

请注意,当您进行最终导入时,它只会导入尚未导入的用户和帖子,因此不会花费很长时间。

关闭 Normalize emails 站点设置(直到最近它还是默认关闭的)。它可能需要在此函数中关闭:

您可以在您定制的 xenforo 脚本版本中通过 SiteSetting.normalize_emails=false 来设置。我不确定那些重复电子邮件的用户发生了什么;有两种明显的处理方法:给他们一个假的电子邮件地址或跳过导入他们。看起来是给了他们假的电子邮件地址?(而且他们很可能是假的用户的可能性相当大)。如果脚本跳过了他们,那么再次运行脚本将导入他们。

3 个赞

是的,在我的笔记本电脑上,它的处理速度快得多,每分钟可以处理 1000 个项目。这大约是服务器上的两倍快。不过,这仍然需要大约 3 天的时间。

我查看了被跳过的电子邮件,似乎它很好地忽略了那些账户。我将在最终导入前将它们合并。只有大约 20 几个这样的情况。

请注意,当您进行最终导入时,它只会导入尚未导入的用户和帖子,因此不会花费很长时间。

感谢您的提醒。我注意到了这一点,这似乎是在我进行最终导入时能够节省时间的关键。那么,我是否应该先进行一次备份并恢复到 D-3,然后再进行另一次备份并使用新的数据库备份文件恢复到第 0 天?是这样吗?

1 个赞

这些备份和恢复是在 Xenforo 网站上进行的,还是您有一个实时 Discourse 网站,您将把 Xenforo 数据导入到其中?

只要您不对脚本进行需要重新导入数据的更改,并且您笔记本电脑上的内容就是您想要在 Discourse 服务器上的内容,那么您就可以继续获取 Xenforo 数据库的新转储并导入它们(用于测试、查看需要多长时间等等),然后在切换日,冻结 Xenforo 网站,获取该数据库,再次运行脚本并上传到您的 Discourse 服务器。

如果您已经在 Discourse 网站上有想要保留的数据,那么情况会复杂得多,因为您需要冻结该网站,然后获取 Xenforo 数据,然后按上述方法进行。

1 个赞

这将是 Discourse 的全新安装,因此过程会很简单。

我有很多时间,因为我想多次测试迁移,彻底熟悉 Discourse,按照我想要的方式配置所有插件,甚至可能自己动手进行一些插件定制。

您所解释的内容完全消除了我的一块心病,因为我原以为我还得弄清楚批量导入的问题。

2 个赞

导入脚本是否会输出任何日志?我的测试导入已卡在 98.2% 几个小时了。

另外我发现,如果我重新启动迁移,它大约需要 30 秒才能跳过一批 1000 篇帖子。因此,现在的有效速度是每分钟 2000 个项目。与第一次导入的每分钟 1000 篇帖子相比,这并没有显著的改进,因为即使在切换当天的最后一次导入,也需要大约一天的时间。其中 23 小时将仅仅是跳过已导入的项目。

只有你看到的。

你应该停止它,然后重新启动它。

是的,它会跳过所有已导入的数据。而且它的速度比每分钟 2000 个帖子快得多。我怀疑你现在重新启动它时就会看到。

这就是我重启然后发了上面的帖子。它是每分钟 2000 帖。为了确定,我又试了一次。

1 个赞

已成功导入头像和附件。复制了这些文件夹。

/internal_data/attachments
/data/avatars

回答我的问题,头像和附件在导入后即定型。如果用户在导入其 ID 后更改了头像,则在第二次运行时将跳过该帖子或用户,因此不会导入/更新。

现在只需要弄清楚对话导入(也可以跳过,但最好有)和永久重定向。

@Fajfi - 感谢您为导入脚本做出的贡献。头像和附件导入完美运行。它仍在运行,尚未进行到点赞部分。

已修复对话导入。能够将超过五十万条消息从 XF2.3 导入到 discourse。已提交一个 PR,供有兴趣的人参考。

----编辑----

提交了另一个 PR,用于修复点赞导入。令人惊讶的是,到目前为止还没有人从 XF2.1+ 迁移到 discourse。点赞在 2019 年 XF2.1 发布时被重命名为反应。

5 个赞