# 将 vBulletin 4 论坛迁移到 Discourse

**URL:** <https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881>\
**Category:** Sysadmins\
**Tags:** how-to\
**Created:** [2016年十二月28日 14:59 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881 "2016-12-28T14:59:29Z")\
**Posts on this page:** 20\
**Page:** 4

<div class="post-metadata">

**Author:** ![jsavage](https://avatars.discourse-cdn.com/v4/letter/j/ce7236/32.png) [@jsavage](https://meta.discourse.org/u/jsavage)\
**Post date:** [2019年九月8日 17:46 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/67 "2019-09-08T17:46:36Z")

</div>

目前没有预算。不过，也许吧。

---

<div class="post-metadata">

**Author:** ![ravenzachary](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ravenzachary/32/163227_2.png) [@ravenzachary](https://meta.discourse.org/u/ravenzachary)\
**Post date:** [2019年九月12日 06:38 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/68 "2019-09-12T06:38:05Z")

</div>

有人遇到过运行导入脚本时出现这个问题吗？

_正在处理帖子…_  
37785 / 48843 (77.4%) 已终止\*

该进程在完成前被终止。当我加载论坛时，导入的消息似乎已经存在，但我担心它没有正常完成，可能会出现问题。

有什么建议吗？也许是内存不足错误？我可以简单地重新运行脚本以从中断处继续，还是它会尝试重新导入重复数据？谢谢。

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2019年九月12日 11:21 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/69 "2019-09-12T11:21:52Z")

</div>

重新运行脚本。它不会重复数据。

---

<div class="post-metadata">

**Author:** ![ravenzachary](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ravenzachary/32/163227_2.png) [@ravenzachary](https://meta.discourse.org/u/ravenzachary)\
**Post date:** [2019年九月12日 17:44 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/71 "2019-09-12T17:44:09Z")

</div>

> [@pfaffman](#):
>
> 重新运行脚本。它不会重复数据。

谢谢，@pfaffman！这非常有效。

---

<div class="post-metadata">

**Author:** ![canyon289](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canyon289/32/156918_2.png) [@canyon289](https://meta.discourse.org/u/canyon289)\
**Post date:** [2019年九月22日 16:51 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/72 "2019-09-22T16:51:06Z")

</div>

您好，  
首先，感谢您提供这份出色的指南。我非常感激为此付出的努力。

关于我的问题：  
我在运行导入脚本时遇到了连接数据库的问题，尽管我使用的是 MariaDB 来存储 vBulletin 的备份数据，而不是 MySQL。我已经确认 MariaDB 正在运行，我也成功将 vBulletin 的备份数据导入其中，并且对脚本中的用户名、主机名和密码进行了四次核对，但依然无法成功。

我觉得自己可能忽略了某个简单的细节，如果有人能指点我一下，那将非常有帮助。

我使用的版本如下：

> mysql2 0.5.2  
> mariadb-server-10.3  
> discourse master git commit [cb8fa46](https://github.com/discourse/discourse/commit/cb8fa4697024ed70620d362aca21b34cd6ec29ff)

详细描述如下：

当我尝试运行以下命令时：

```plaintext
apt-get update && apt-get install libmysqlclient-dev mysql-server-5.7

```

我收到了以下错误：

```plaintext
E: Package 'libmysqlclient-dev' has no installation candidate
E: Package 'mysql-server-5.7' has no installation candidate

```

这很合理，也许这些软件包在此时已从仓库中移除。

因此，我改为运行：

```plaintext
apt-get update && apt-get install mariadb-server-10.3 libmariadbd-dev

```

MariaDB 作为直接替代品运行良好，所有步骤都顺利执行，直到我尝试运行迁移脚本时出现以下错误：

```plaintext
root@discourse:/src# su discourse -c 'bundle exec ruby script/import_scripts/vbulletin.rb'
root:@localhost wants vb4
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
==================================================
Access denied for user 'root'@'localhost'
Cannot connect in to database.

Hostname: localhost
Username: root
Password: 
database: vb4

Edit the script or set these environment variables:

export DB_HOST="localhost"
export DB_NAME="vbulletin"
export DB_PW=""
export DB_USER="root"
export TABLE_PREFIX="vb_"
export ATTACHMENT_DIR '/path/to/your/attachment/folder'

Exiting.

```

关于权限问题：

```plaintext
root@discourse:/src# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 59
Server version: 10.3.17-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show grants;
+------------------------------------------------------------------------------------------------+
| Grants for root@localhost |
+------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED VIA unix_socket WITH GRANT OPTION |
| GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION |
+------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)

```

我已经多次仔细检查了用户名和密码，甚至手动设置过它们。

 ![image](https://global.discourse-cdn.com/meta/original/3X/3/9/398b695ee98b8d178911750eb6e34cdbfef19bc0.png)

---

<div class="post-metadata">

**Author:** ![canyon289](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canyon289/32/156918_2.png) [@canyon289](https://meta.discourse.org/u/canyon289)\
**Post date:** [2019年九月23日 16:35 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/73 "2019-09-23T16:35:16Z")

</div>

我做了进一步的调查，发现基础镜像从 Ubuntu 16.04 变更为 Debian 确实是导致 MySQL 无法使用的原因，但我仍然困惑如何让 mysql2 连接到 MariaDB。

> <https://github.com/discourse/discourse_docker/commit/b95ea6f77a250793dc8e33f5e54571294db543e6#diff-882bf22f18ee0c4eb3af760ec94920e2R3>
>
> This reverts commit 29204e415846c121554d41c34f241f2291e7a587.

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2019年九月23日 16:42 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/74 "2019-09-23T16:42:44Z")

</div>

我前段时间提交了一个 PR，让 `mysql-dep.template.yml` 使用 MariaDB。我已经多次使用过它。

看起来您似乎不想使用密码？我建议使用密码。脚本假设存在密码。

---

<div class="post-metadata">

**Author:** ![canyon289](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canyon289/32/156918_2.png) [@canyon289](https://meta.discourse.org/u/canyon289)\
**Post date:** [2019年九月23日 16:44 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/75 "2019-09-23T16:44:59Z")

</div>

明白了。我会尝试设置密码，看看是否有效。不过据我所知，导入脚本应该仍然可以在 MariaDB 上运行。如果是这样，我会继续排查问题。感谢您的快速帮助！

---

<div class="post-metadata">

**Author:** ![canyon289](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canyon289/32/156918_2.png) [@canyon289](https://meta.discourse.org/u/canyon289)\
**Post date:** [2019年九月23日 16:50 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/76 "2019-09-23T16:50:44Z")

</div>

@pfaffman 就是这样！非常感谢。等我整理好论坛后，我可以提交一个 VB3 版本的 PR，以防它对任何人有用。

这也是我的测试实例，所以我发布这些细节没问题，它很快就会被拆除 🙂

 ![image](https://global.discourse-cdn.com/meta/original/3X/3/d/3d8d4aa8837e1352d3fe5102e18657a8c7b600f0.png)

---

<div class="post-metadata">

**Author:** ![canyon289](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canyon289/32/156918_2.png) [@canyon289](https://meta.discourse.org/u/canyon289)\
**Post date:** [2019年九月24日 15:44 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/77 "2019-09-24T15:44:14Z")

</div>

感谢大家的帮助，迁移过程总体顺利。虽然有一些附件缺失，但整体结果非常理想。

给未来阅读此帖的朋友：我从 Vb3.8.7 进行了迁移。

由于我的数据库结构与脚本不完全匹配（但非常接近），我需要对 vbulletin.rb 中的 SQL 查询进行一些修改。为了加快进度，我决定放弃自定义标题。

Github 差异对比：[File fix other by canyon289 · Pull Request #1 · canyon289/discourse · GitHub](https://github.com/canyon289/discourse/pull/1/files)

 ![image](https://global.discourse-cdn.com/meta/original/3X/d/a/da43b3fe7c1f23ec8b8e9c5412ccc828e6d5031e.png)

对于替换 MySQL 的 MariaDB 安装，我使用了以下命令：

`apt-get update && apt-get install mariadb-server-10.3 libmariadbd-dev`

要将 MariaDB 密码从空值更改为具体值，以下链接最为详尽：

> **[How to Reset MySQL or MariaDB Root Password](https://geekrewind.com/how-to-reset-mysql-or-mariadb-root-password/)**
>
> Easily reset MySQL root password on Ubuntu Linux with our step-by-step guide. Recover access without reinstalling your database server.

再次感谢本线程中的各位以及所有为 Discourse 提供代码和帮助的人！

---

<div class="post-metadata">

**Author:** ![ravenzachary](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ravenzachary/32/163227_2.png) [@ravenzachary](https://meta.discourse.org/u/ravenzachary)\
**Post date:** [2019年九月27日 21:23 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/78 "2019-09-27T21:23:09Z")

</div>

我刚刚完成了一次迁移，所有 2000 多个主题都自动继承了来自 vBulletin 4 实例的分类。系统不允许我删除该分类，也无法将这些迁移后的帖子重新设置为“未选择分类”。系统提示：“无法删除此分类，因为它包含 2322 个主题”。

请问有什么变通方法吗？

---

<div class="post-metadata">

**Author:** ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)\
**Post date:** [2019年九月28日 19:01 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/79 "2019-09-28T19:01:56Z")

</div>

请重新迁移这些话题，或者更改它们的类别。由于数量众多，您需要通过 Ruby 命令行来完成此操作。

---

<div class="post-metadata">

**Author:** ![steven\_so](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/steven_so/32/165018_2.png) [@steven\_so](https://meta.discourse.org/u/steven_so)\
**Post date:** [2019年十二月29日 18:46 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/80 "2019-12-29T18:46:40Z")

</div>

你好，

我不确定这个的具体背景。

“将附件复制到你的 Discourse 实例（路径请检查你的 VB4 设置）。”

有人能帮忙吗？

---

<div class="post-metadata">

**Author:** ![jozsi](https://avatars.discourse-cdn.com/v4/letter/j/53a042/32.png) [@jozsi](https://meta.discourse.org/u/jozsi)\
**Post date:** [2019年十二月29日 21:25 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/81 "2019-12-29T21:25:31Z")

</div>

你好，

我注意到有一个 vBulletin 5 的脚本，但我找不到任何关于它的反馈。本主题中的信息是否也适用于它？

谢谢！

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2019年十二月30日 10:47 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/82 "2019-12-30T10:47:46Z")

</div>

该脚本的工作方式应非常相似。

---

<div class="post-metadata">

**Author:** ![mrussi](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mrussi/32/165472_2.png) [@mrussi](https://meta.discourse.org/u/mrussi)\
**Post date:** [2020年一月4日 04:42 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/83 "2020-01-04T04:42:14Z")

</div>

正在为 vB4 安装运行导入，但在导入子类别时失败。请多包涵，我是一名 Rails/Ruby 新手。

```plaintext
    Traceback (most recent call last):
        20: from script/import_scripts/vbulletin.rb:943:in `<main>'
        19: from /home/vagrant/discourse/script/import_scripts/base.rb:47:in `perform'
        18: from script/import_scripts/vbulletin.rb:84:in `execute'
        17: from script/import_scripts/vbulletin.rb:293:in `import_categories'
        16: from /home/vagrant/discourse/script/import_scripts/base.rb:403:in `create_categories'
        15: from /home/vagrant/discourse/script/import_scripts/base.rb:403:in `each'
        14: from /home/vagrant/discourse/script/import_scripts/base.rb:422:in `block in create_categories'
        13: from /home/vagrant/discourse/script/import_scripts/base.rb:454:in `create_category'
        12: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/suppressor.rb:48:in `save!'
        11: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/transactions.rb:319:in `save!'
        10: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/transactions.rb:366:in `with_transaction_returning_status'
         9: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/transactions.rb:212:in `transaction'
         8: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:281:in `transaction'
         7: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/connection_adapters/abstract/transaction.rb:278:in `within_new_transaction'
         6: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
         5: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/connection_adapters/abstract/transaction.rb:280:in `block in within_new_transaction'
         4: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:281:in `block in transaction'
         3: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/transactions.rb:375:in `block in with_transaction_returning_status'
         2: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/transactions.rb:319:in `block in save!'
         1: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/validations.rb:53:in `save!'
/home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/validations.rb:81:in `raise_validation_error': Validation failed: Slug is invalid (ActiveRecord::RecordInvalid)

```

我添加了一些调试输出来排查问题。类别中的 `slug` 值为 nil。

当循环遍历 `create_categories(children_categories) do |category|` 时，该类别看起来是有效的。我还在 `def create_category`（位于 base.rb 中）中，在调用 `.save!` 之前，记录了 `opts`、`import_id` 和 `new_category`。根据函数的预期，所有数据似乎都是有效的。

有人以前遇到过这种情况吗？

```plaintext
       37 / 53 ( 69.8%) [345139 items/min]
category:
{"forumid"=>355, "title"=>"News", "description"=>"RSS Feed", "displayorder"=>6, "parentid"=>205}

Entering create_category...
opts:
{:id=>355, :name=>"News", :position=>6, :description=>"RSS Feed", :parent_category_id=>6}
import_id:
355

new_category:
#<Category id: nil, name: "News", color: "BF1E2E", topic_id: nil, topic_count: 0, created_at: nil, updated_at: nil, user_id: -1, topics_year: 0, topics_month: 0, topics_week: 0, slug: nil, description: nil, text_color: "FFF", read_restricted: false, auto_close_hours: nil, post_count: 0, latest_post_id: nil, latest_topic_id: nil, position: 6, parent_category_id: 6, posts_year: 0, posts_month: 0, posts_week: 0, email_in: nil, email_in_allow_strangers: false, topics_day: 0, posts_day: 0, allow_badges: true, name_lower: nil, auto_close_based_on_last_post: false, topic_template: nil, contains_messages: nil, sort_order: nil, sort_ascending: nil, uploaded_logo_id: nil, uploaded_background_id: nil, topic_featured_link_allowed: true, all_topics_wiki: false, show_subcategory_list: false, num_featured_topics: 3, default_view: nil, subcategory_list_style: "rows_with_featured_topics", default_top_period: "all", mailinglist_mirror: false, minimum_required_tags: 0, navigate_to_first_post_after_read: false, search_priority: 0, allow_global_tags: false, reviewable_by_group_id: nil, required_tag_group_id: nil, min_tags_from_required_group: 1>
    Traceback (most recent call last):

```

---

<div class="post-metadata">

**Author:** ![Hisham](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hisham/32/156823_2.png) [@Hisham](https://meta.discourse.org/u/Hisham)\
**Post date:** [2020年二月5日 00:38 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/84 "2020-02-05T00:38:19Z")

</div>

我们的开发人员尝试了该脚本，但进展有限。是否有人愿意以咨询方式为我们完成这项工作？

---

<div class="post-metadata">

**Author:** ![michaeld](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/michaeld/32/1594_2.png) [@michaeld](https://meta.discourse.org/u/michaeld)\
**Post date:** [2020年二月5日 05:59 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/85 "2020-02-05T05:59:18Z")

</div>

好的，请给我发私信。

---

<div class="post-metadata">

**Author:** ![Hisham](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hisham/32/156823_2.png) [@Hisham](https://meta.discourse.org/u/Hisham)\
**Post date:** [2020年二月7日 07:27 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/86 "2020-02-07T07:27:07Z")

</div>

请原谅我的无知，但我该如何发送私信？我没有找到明显的选项。或者您可以直接通过 abboud at cedrus dot com 给我发邮件。

关于导入的问题：我们基于 vBulletin 的论坛中有一些帖子包含指向同一论坛内其他帖子的链接。这些链接在导入时会被转换吗？如果不会，它们会发生什么变化？会被删除吗？

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2020年二月7日 09:07 UTC](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881/87 "2020-02-07T09:07:41Z")

</div>

我不确定当前版本是否会重写它们。我有的这个脚本（我打算提交 PR）会修复它们。

[上一頁](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881.md?page=3)

[下一頁](https://meta.discourse.org/t/migrate-a-vbulletin-4-forum-to-discourse/54881.md?page=5)
