或许可以就字符错误的问题向 Duffield Ocean 提交一个工单?
您可以使用 SSH 客户端,例如 PuTTY,或者使用我认为已集成到 Windows 的 Linux 子系统(WSL)中的新 Shell(我使用的最后一个 Windows 版本以年份作为其版本标识,因此我无法提供更多帮助)。如果您使用的是 Mac,只需打开终端并使用 ssh 即可。
如果您的数据库很大,加载数据库可能需要一些时间,期间不会有输出,完成后只会显示一个新的命令提示符。我猜测它之前应该是正常工作的。
或许可以就字符错误的问题向 Duffield Ocean 提交一个工单?
您可以使用 SSH 客户端,例如 PuTTY,或者使用我认为已集成到 Windows 的 Linux 子系统(WSL)中的新 Shell(我使用的最后一个 Windows 版本以年份作为其版本标识,因此我无法提供更多帮助)。如果您使用的是 Mac,只需打开终端并使用 ssh 即可。
如果您的数据库很大,加载数据库可能需要一些时间,期间不会有输出,完成后只会显示一个新的命令提示符。我猜测它之前应该是正常工作的。
感谢 @pfaffman。我想我会就此联系他们。
我可以尝试使用不同的 SSH 客户端,看看效果是否更好。
数据库并不大。它已经挂起一个小时了,进度没有任何变化。我检查了服务器的 CPU,它几乎处于空闲状态。
没错,问题就出在这儿!再次感谢 @pfaffman。进度又回来了……
另一种解决方案是允许直接从执行导入的 Droplet 访问数据库,从而省去设置本地数据库的步骤。
如果已经过了一小时,很可能操作并未执行。你可以尝试如下命令:
cat database.sql | mysql
进一退一。
Pups::ExecError: if [ -z "$LETSENCRYPT_ACCOUNT_EMAIL" ]; then echo "LETSENCRYPT_ACCOUNT_EMAIL 环境变量是必需的,但尚未设置。"; exit 1; fi 执行失败,返回状态为 <Process::Status: pid 1187 exit 1>
我此前未安装 Let’s Encrypt,因此进行了安装。
在“准备 Discourse 主机和容器以进行导入”部分中,缺少一步:需要取消注释 LETSENCRYPT_ACCOUNT_EMAIL 的环境变量行,并填入您的邮箱地址。这一步帮我解决了该错误。
继续之前的操作,我现在到了最后的导入步骤。我进入导入容器并运行导入脚本。脚本立即退出,报错如下:
Traceback (most recent call last):
1: from script/import_scripts/smf2.rb:4:in `<main>'
script/import_scripts/smf2.rb:4:in `require': cannot load such file -- mysql2 (LoadError)
我进行了大量网络搜索,但至今一无所获。
编辑:我认为这可能是容器内未安装 MySQL 导致的。我尝试运行 ‘gem install mysql2’,但返回了以下错误:
mysql client is missing. You may need to 'apt-get install libmysqlclient-dev' or 'yum install mysql-devel', and try again.
编辑 2:
我成功安装了 mysql2。首先,我需要安装开发工具,但建议的源不可用。于是我运行了:
sudo apt-get install default-libmysqlclient-dev
之后,我成功执行了:
gem install mysql2
但我仍然遇到相同的错误。于是,我尝试在脚本中注释掉那个 require 语句,看看会发生什么。结果出现了新的错误:
Traceback (most recent call last):
6: from script/import_scripts/smf2.rb:627:in `<main>'
5: from script/import_scripts/smf2.rb:19:in `run'
4: from script/import_scripts/smf2.rb:447:in `parse!'
3: from script/import_scripts/smf2.rb:502:in `parser'
2: from script/import_scripts/smf2.rb:502:in `new'
1: from /usr/local/lib/ruby/2.6.0/optparse.rb:1089:in `initialize'
script/import_scripts/smf2.rb:504:in `block in parser': can't modify frozen String (FrozenError)
搜索该错误后,发现这是一个旧的 Ruby bug,但据说早已修复,因此我又卡住了。
打开 smf2.rb 文件,将冻结字符串选项从 true 改为 false,或者反过来,它位于第一行或第二行。修改后问题即可解决。
谢谢你,@Paracelsus!问题解决了。我把 true 改成了 false。
又前进一步!
编辑:
我之前遇到了一个奇怪的错误,似乎指向了错误的 IP。原因是我在 Settings.php 中设置了错误的密码。现在已修复。
接下来需要解决的是:
Traceback (most recent call last):
7: from script/import_scripts/smf2.rb:627:in `<main>'
6: from script/import_scripts/smf2.rb:28:in `run'
5: from script/import_scripts/smf2.rb:28:in `new'
4: from script/import_scripts/smf2.rb:62:in `initialize'
3: from script/import_scripts/smf2.rb:274:in `create_db_connection'
2: from script/import_scripts/smf2.rb:274:in `new'
1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `initialize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect': Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory (Mysql2::Error::ConnectionError)
我猜脚本调优文件中的这一行就是为了解决这个问题:
ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';
是否需要将其添加到导入容器中的某个位置?
好的,我已经解决了上述问题。这是最新版本的 MySQL 导致的问题,它不再支持旧的本地密码。最简单的解决方法是使用 MySQL 5.7 来运行此过程。只需将第 3 步从:
docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v ~/smf2:/backup --name=mysql mysql
改为:
docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v ~/smf2:/backup --name=mysql mysql:5.7
这样应该就能顺利解决了。我的导入操作终于开始运行了。
一个新问题:我似乎无法导入用户头像。应该就是这样吗?
我将需要调整尺寸的头像保存在自定义文件夹中,而不是 SMF 的标准文件夹,这会是原因吗?
除此之外,目前一切顺利。这份指南非常棒,增量数据库导入也非常顺畅
。
我们的迁移过程无需任何额外步骤。我一时想不起 SMF 将头像存储在哪里。你迁移附件了吗?我只导入了我们的 SQL 数据库和附件,所以我猜它们应该就在其中。
是的,他们确实在那里,但我将头像移动到了另一个文件夹,却忘了将其复制到导入功能用于与用户匹配的头像文件夹中。问题已解决(尽管我不得不重新执行导入操作)。
现在出现了一个新问题……被禁用的用户在导入时并未显示为“已暂停”,而只是显示为“已停用”。有什么办法可以让它们显示为“已暂停”吗?
我使用的是 v2.50 beta2,这是 SMF v2.0.17 的最新版本。由于当前的 templates/import/mysql-dep.template.yml 文件,生成的 smf2.rb 有所不同。
正如第 4 步中解释的,将 “quote =” 替换为当前迭代的内容:
quote = +“\n[quote="#{params[‘author’]}”
此外,以下内容也不存在:
不过,我还是继续执行了导入操作,但不幸的是,它因 “IGNORE_BBCODE 是否指 IgnoreUser” 而终止。
抱歉,我本应截取回溯(Traceback)的屏幕截图,但当时没有。无论如何,这就是我的记忆。
有什么建议吗?
谢谢。
我最近更新了此脚本。我会看一下。
非常感谢!请问如果我重新开始,会覆盖我已经导入的内容吗?例如用户、分类等。
祝好!
G。
通常不会。导入脚本足够智能,会记住您上次中断的位置!
感谢您的关注。
G.
将 SMF 转换为 Discourse 后,旧的 SMF 链接会失效吗?
并非如此。导入器将创建与旧 URL 匹配的重定向永久链接,将其指向新路径。