合并两个论坛的问题

你好,

我正在通过此处提供的教程将两个论坛合并在一起:here

我在命令 gunzip \u003c /path/to/data/other-2018-08-02-134227-v2018xxx.tar.gz | psql -d copyme 处卡住了。
它返回了大量带有乱码导入错误的行。

已执行的步骤:

  • 通过官方方法在 VPS 上安装 Discourse。
  • 通过 GUI 导入要合并的备份(forumother)。
  • 备份后者(以拥有最新 Discourse 版本的备份)。
  • 导入目标论坛(forumdest)的备份。
  • 通过 SFTP 将 forumother 的备份导入到 /var/discourse/shared/standalone/backups/default 文件夹中。

然后我转到上述文件夹并运行命令 tar xvzf forumother.tar.gz(使用备份的真实名称)。

进入 cd /var/discourse 然后 ./launcher enter app

sudo -u postgres psqlCREATE DATABASE "copyme" ENCODING = 'utf8'; 然后我用 ``q` 退出。

现在我卡在这里了。
命令 gunzip \u003c public/backups/default/forumother.tar.gz | psql -d copyme 无法按原样工作。
错误是 psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: role "root" does not exist

我可以看到这是一个连接问题,但我不知道如何解决它。

我尝试以 postgres 用户身份登录 su - postgres,然后运行命令 gunzip ...,但此时命令输出完全不一致。

postgres@testforum-app:~$ gunzip \u003c /var/www/discourse/public/backups/default/forum-francophon
e-home-assistant-2022-04-24-120337-v20220407195246.tar.gz | psql -d copyme3                  
invalid command \{wB                                                                         
invalid command \֬IeY┴WPC\u0018\u003cP%£6؜\u001f◆BP␌U@Q█5                                                  
␋┼┴▒┌␋␍ ␌└└▒┼␍ \                                                                            
␋┼┴▒┌␋␍ ␌└└▒┼␍ \\];*░Һ                                                                       
␋┼┴▒┌␋␍ ␌└└▒┼␍ \\FMݤ!\u0011≥"≠\u0014±↓\u001cQʏC\u001dMHȽ◆)\u0026E„/M6\u0010\u000b!◆┐                                           
␋┼┴▒┌␋␍ ␌└└▒┼␍ \\\u0018↑                                                                          
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│␊° █│37 █│49                            
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│␉␉                                      
␋┼┴▒┌␋␍ ␌└└▒┼␍ \лT4٩3┼←                                                                    
␋┼┴▒┌␋␍ ␌└└▒┼␍ \\\u0016^E\u001aC◆≥]B2Ɣ?8[\u0012N→^G9←\u001f@  ±\u001d4?W\u001fY\u0013°O͖↓\u0014HY┬4                                 
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│␉2                                      
...                                                           
invalid command \UWXJ\u0026qkW*S\u0019Qy2漆\u0026\u0015%\u003e\u0004N≤OI2·^;├                                               
␋┼┴▒┌␋␍ ␌└└▒┼␍ \\2d\u001d-ɸjrR*֬\u0016\u0014\u001e\u0026\u0013^_'\u0013\u0005Ƶ褚N2H\u0012hIu                                               
                                              S3                                             
invalid command \VI                                                                          
invalid command \}Jݐ                                                                         
invalid command \BQNr|΅tU~#_k#D,WHfqtC                                                       
invalid command \\\u0002syJ\u0006\u0016x%                                                                    
invalid command \E\u0016q                                                                         
invalid command \-KmJ                                                                        
invalid command \                                                                            
invalid command \/ly=}E~ԚYj\u003enO                                                               
invalid command \SM!{Co\u0001~UH^x)*O}9vUǙ\u001ek}LQ                                                   
invalid command \eH\u003c=\u0019g\u0006TR\u0003P\u0002R\u00061}{~/t!wiw\u0011hӒC\u0010ґJmCĥ=;O^p*-                                   
invalid command \\\u001cgq{cr}N;.                                                                  
invalid command \2p3a\u0013-.\u0010C:m\u001f_Y\u0016\u0017@c\u003c4/mvΩߵj]SޙU"O}$[                                         
invalid command \)                                                                           
invalid command \                                                                            
invalid command \V\u0006OtDIM2+͆Yq4\u0014ŠR\u0014                                                           
invalid command \WHElnHBDm%?PBFrOڙ}d"                                                        
invalid command \P\u0004jsחPm\u0006q\u0013\u0019J[B\u0001@$Wt*\u0003!\u0026|Zz))Q6AJ\u0012\u0005Y%!/6=JRJBPþA)YTZ┘=!M^␉CO)→└␋9\u0004\u001f┤E▒5█E≤Pі
T│ȐOȾ\u001cB)W┌Ad\u0004\u001c:\u0004\u001e}1,kNDoO\u001c\u001e')G^W5\u000b:B␊I│7!N;─À\u001f@#┘\u0017                                           
┼┴▒┌␋␍ ␌└└▒┼␍ \\\u00026◆3                                                                         
␋┼┴▒┌␋␍ ␌└└▒┼␍ \2�Ψ)VD4π]                                                                   
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│89                                      
├±␊@├␊├°┤└↑▒:·$                                                                    

我在论坛上搜索过,但没有找到关于此的信息。

所以,我将依靠您的帮助,并提前感谢您。

附注:我的英语不好,所以有可能我没有使用正确的词语来在论坛上进行搜索,或者我误解了本文开头引用的教程。

可能是 psql 正在尝试使用您的当前系统用户(root),而该用户在 Postgres 中不存在。您可能需要在运行 psql 时指定用户:psql -U postgres

然后检查此步骤:

6 个赞

谢谢你的回答,我今晚会试试,然后告诉你结果。

1 个赞

你好,

首先感谢你的帮助。我的回答有点长,但详细说明了所采取的步骤。

Ben,自从上次留言以来,我尝试了几次,但仍然无法执行 gunzip < blabla 命令,一直出现身份验证错误。

discourse@testforum-app:/var/www/discourse$ gunzip < public/backups/default/forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz | psql -U postgres -d copyme
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "postgres"

我将执行的步骤提供给你:

  • 我从一个全新的官方安装开始。

  • 我的两个备份都是用最新版本的 Discourse 制作的。

  • 我导入并恢复了我的“forumDest”备份。

  • 我将“ForumOther”备份上传到 /var/discourse/shared/standalone/backups/default

  • 我通过 SSH 连接

  • 我进入 cd /var/discourse

  • 我使用命令 ./launcher enter app 进入容器。
    我解压位于 /var/discourse/shared/standalone/backups/default 的“ForumOther.tar.gz”存档。

  • 我重置密码

root@testforum-app:/var/www/discourse/public/backups/default# ls
dump.sql.gz
forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz
home-assistant-communaute-francophone-2022-04-24-111032-v20220304162250.tar.gz
uploads

这是 ls 命令的结果,forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gzForumOther,而 home-assistant-communaute-francophone-2022-04-24-111032-v20220304162250.tar.gzForumDest

我使用以下命令重置了 postgres 密码:

sudo -u postgres psql
\password postgres
(输入新密码)
\q

结果如下:

root@testforum-app:/var/www/discourse/public/backups/default# sudo -u postgres psql
psql (13.6 (Debian 13.6-1.pgdg110+1))
Type "help" for help.

postgres=# \password postgres
Enter new password for user "postgres":
Enter it again:
postgres=# \q
  • 创建“copyme”数据库
root@testforum-app:/var/www/discourse/public/backups/default# su postgres
postgres@testforum-app:/var/www/discourse/public/backups/default$ psql
psql (13.6 (Debian 13.6-1.pgdg110+1))
Type "help" for help.
postgres=# CREATE DATABASE "copyme2" ENCODING = 'utf8';
CREATE DATABASE
postgres=# \q
postgres@testforum-app:/var/www/discourse/public/backups/default$
  • 我运行命令 postgres@testforum-app:/var/www/discourse/public/backups/default$ gunzip < forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz | psql -d copyme
    或者如你所述,gunzip < forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz | psql -U postgres -d copyme

我无法看到过程的开始,但最后总是出现以下信息:

invalid command \P�jvsחP�m���q��J[B���@$��W�t*����!&|Zz)��)��Q�6�AJ�Y��%!/6=�JR��J��BPþ�A�)�YTZ�j��=! M��^bCO)+mi9���u�p�E��a��50��E�y��P���і��TxȐ��OȾ����B�)Wl��Ad�������:���}1���,kNDo�O�'�)G��^W����5��
                                                                                                                                                                                                        :��B�eIx7!N��;q�À@�#j���*
invalid command \�6���`�3�
invalid command \�2��󟯹�Ψ�)��V��D��4{]�
ERROR: invalid byte sequence for encoding "UTF8": 0x89
postgres@testforum-app:/var/www/discourse/public/backups/default$

所以,我明白是编码有问题?

我尝试过:
分离命令:

  • 解压 ForumOther 备份 gunzip < forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz,这似乎提取了一些无法理解的语言。
  • 进入数据库 psql -d copyme
postgres@testforum-app:/var/www/discourse/public/backups/default$ psql -d copyme
psql (13.6 (Debian 13.6-1.pgdg110+1))
Type "help" for help.

copyme=#

但一旦连接到“copyme”数据库,我就不知道该做什么了。

我查看了以下关于 IMPORT 命令的内容,但结果一样,它们应该在哪里执行?如何执行?使用哪个用户?

让我们一步一步来。

如果我成功了,我会更精确地记录我的程序,比原始教程(它有解释主要原则并存在的优点)更详细一些。

再次感谢你的时间和帮助。

大家好,

我的问题已经取得了很大进展。

现在,在导入脚本执行之前我卡住了。

我运行 bundle install 然后运行 IMPORT=1 bundle install,此时我收到此错误:

安装 tiny_tds(2.1.5) 时出错,Bundler 无法继续

我仍然运行完整命令 IMPORT=1 DB_NAME=copyme DB_PASS=password SOURCE_BASE_URL= UPLOADS_PATH=/var/www/discourse/public/uploads/default bundle exec ruby script/bulk_import/discourse_merger.rb

这次,是这个错误:

git 来源 https://github.com/nlalonde/ruby-bbcode-to-md 尚未检出。
请在尝试启动应用程序之前运行 `bundle install`。

你有什么想法吗?
谢谢

你好,

在合并两个论坛的目标上又向前迈进了一步。

我不再有任何依赖问题,但在启动脚本时似乎遇到了权限问题。

我使用 Discourse 的官方安装上的本地数据库启动了脚本。

我运行的脚本命令和返回结果:

discourse@testforum-app:/var/www/discourse$ IMPORT=1 DB_NAME=copyme DB_PASS=hacf2022 SOURCE_B
exec ruby script/bulk_import/discourse_merger.rb
Loading application...
Traceback (most recent call last):
        3: from script/bulk_import/discourse_merger.rb:817:in `<main>'
        2: from script/bulk_import/discourse_merger.rb:817:in `new'
        1: from script/bulk_import/discourse_merger.rb:21:in `initialize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.2.4/lib/active_record/dynam
e:Class (NoMethodError)
Did you mean?  connection_db_config
               connection_pool
               connection_class
               connection_class?
               connection_class=

谢谢

我还附上我运行的命令(这可能对其他人有用)。

将 other.forum.backup 上传到 /var/discourse/shared/standalone/backups/default 并解压 tar xvzf other.forum.backup.tar.gz

cd `/var/discourse
./laucher enter app
su postgres
psql
CREATE DATABASE "copyme" ENCODING = 'utf8';
\password postgres
\q
exit
su discourse
gunzip < public/backups/default/dump.sql.gz | psql -d copyme
exit

安装依赖 nano、sqlite3 和 mysql2
使用 root 用户

apt update && apt upgrade
apt-get install -y nano sqlite3 libsqlite3-dev mariadb-server libmariadb-dev
gem install sqlite3 mysql2

ruby bbcode to md

git clone https://github.com/nlalonde/ruby-bbcode-to-md.git
cd ruby-bbcode-to-md
gem build ruby-bbcode-to-md.gemspec
gem install ruby-bbcode-to-md-*.gem

安装 Tiny_tds
你需要 FreeTDS 来安装 Tiny_tds。

wget http://www.freetds.org/files/stable/freetds-1.3.10.tar.gz
tar -xzf freetds-1.3.10.tar.gz
cd freetds-1.3.10
./configure --prefix=/usr/local --with-tdsver=7.3
make
make install

对于 tiny_tds

gem install tiny_tds
gem install ruby-bbcode-to-md

运行脚本

su discourse
bundle config unset deployment
IMPORT=1 bundle install
IMPORT=1 DB_NAME=copyme DB_PASS=passpostgres SOURCE_BASE_URL=http://other.forum.fr UPLOADS_PATH=/var/www/discourse/public/uploads/default bundle exec ruby script/bulk_import/discourse_merger.rb
1 个赞

看起来你运气不太好,正好赶上了这个时间点。11 天前,Discourse 升级到了 Rails 7。导入脚本使用了 ActiveRecord::Base.connection_config 方法,该方法在 Rails 7.0.0rc1 中已被移除。

@loic 看起来在升级时可能忽略了导入脚本。

1 个赞

哦,谢谢你的回答,

这是个好消息,因为我不知道它可能来自哪里。

我会等待更新,除非我能自己更新合并脚本?

谢谢。

1 个赞

我刚开了一个 PR,应该很快就会被合并 :slight_smile:

3 个赞

你好,

非常感谢您的跟进和迅速的响应。

由于迁移两个论坛是一个充满陷阱的漫长过程,我再次遇到了一个问题。
我刚刚修改了 discourse_merge.rb 文件,然后重新运行了命令。

现在我遇到了一个现有的 HASH 问题。

我明白这是一个重复问题,但具体是什么性质的呢?

我已经删除了一位重复的用户,在尝试重命名他以进行测试后,现在又出现了这个 token 问题(尽管我认为用户级别的重复问题应该已经被处理了?)

再次感谢您的帮助。

discourse@testforum-app:/var/www/discourse$ IMPORT=1 DB_NAME=copyme DB_PASS=password SOURCE_BASE_URL=http://other.forum.fr UPLOADS_PATH=/var/www/discourse/public/uploads/default bundle exec ruby script/bulk_import/discourse_merger.rb
Loading application...
Starting...
Preloading I18n...
Fixing highest post numbers...
Loading imported group ids...
Loading imported user ids...
Loading imported category ids...
Loading imported topic ids...
Loading imported post ids...
Loading groups indexes...
Loading users indexes...
Loading categories indexes...
Loading topics indexes...
Loading posts indexes...
Loading post actions indexes...

merging users...
copying email_tokens...
Traceback (most recent call last):
        7: from script/bulk_import/discourse_merger.rb:817:in `<main>'
        6: from script/bulk_import/discourse_merger.rb:71:in `start'
        5: from /var/www/discourse/script/bulk_import/base.rb:100:in `run'
        4: from script/bulk_import/discourse_merger.rb:82:in `execute'
        3: from script/bulk_import/discourse_merger.rb:145:in `copy_user_stuff'
        2: from script/bulk_import/discourse_merger.rb:445:in `copy_model'
        1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.3.5/lib/pg/connection.rb:262:in `copy_data'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.3.5/lib/pg/connection.rb:262:in `get_last_result': ERROR:  duplicate key value violates unique constraint "index_email_tokens_on_token_hash" (PG::UniqueViolation)
DETAIL:  Key (token_hash)=(07165399523fcdce0679e45950f0260b61386a5c886e3e68fa6cf047d84d1caf) already exists.
CONTEXT:  COPY email_tokens, line 1

您好。

尽管遇到了一些问题,我还是完成了这次迁移。

最后的问题源于用户在两个论坛上使用了不同的主要地址,以及一个论坛缺少表。

一旦我有时间,我会把完整的流程放在这里。

再次感谢 @Constanza_Abarca 的帮助。

1 个赞

这是否意味着这两个实例运行的是不同版本和/或安装了不同的插件?我认为,如果我自己进行合并,我的期望是,在其他任何事情之前,我应该:

  • 从两者中进行备份
  • 确保两者都运行相同版本的 Discourse
  • 确保目标安装了源的所有插件
  • (可选?)确保源安装了目标的所有插件
  • 再次进行备份
3 个赞

你好,

这两个论坛的版本相同,但插件可能不同。

这些只是我手动做的一些小修改。

对于真正的合并,我将尝试使用已安装的插件来查看。