현재 vBulletin 3을 사용하고 있는 포럼의 마이그레이션을 돕는 자원봉사를 하고 있습니다.
스테이징 환경에서 데이터베이스 덤프(20GB, 맞습니다)를 기반으로 시작했습니다.
vBulletin 5로 업그레이드했습니다. 5~6시간이 걸렸지만 순조롭게 진행되었습니다. 버전은 vBulletin 5.4입니다.
discourse에서 허용되는 형식으로 사용자 이름을 정리하는 작업도 수행했습니다.
이제 docker discourse를 설치하고, 준비 작업을 위해 이 가이드를 대략적으로 따랐습니다. '대략적으로’라는 말은 가이드의 대부분이 중복되거나 구식이었지만, 무엇을 해야 하는지에 대한 방향을 잡는 데 도움이 되었다는 뜻입니다.
Ruby 코딩 경험이 거의 없어서 눈앞이 캄캄해지는 단계에 도달했습니다.
즉, 설치 완료 후 ./launcher enter app 명령으로 컨테이너에 진입한 후 다음과 같은 작업을 수행했습니다:
freetds-dev와 libmariadb-dev 추가
Gemfile을 편집하여 php_serialize gem 추가.
셸에서 export IMPORT=1 실행하여 가져오기(import) 환경을 설정
discourse 사용자로 bundle install --no-deployment --without test --without development --path vendor/bundle 실행
다음과 같은 오류가 발생했습니다:
You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.
If this is a development machine, remove the /var/www/discourse/Gemfile freeze
by running `bundle config unset deployment`.
The list of sources changed
The dependencies in your gemfile changed
You have added to the Gemfile:
* mysql2
* redcarpet
* php_serialize
* sqlite3 (~> 1.3, >= 1.3.13)
* ruby-bbcode-to-md
* reverse_markdown
* tiny_tds
* csv
* parallel
따라서 다음을 계속 진행했습니다.
bundle config unset deployment 실행 후 이전 명령 재실행
mysql2와 php_serialize가 모두 존재하는지 확인 (존재했습니다)
기존 포럼의 아바타(가져오기할 첨부 파일 없음)를 추가하고 /home/discourse 내 해당 디렉터리의 소유권을 discourse 사용자에게 할당
script/import_scripts/vbulletin5.rb를 편집하여 DB 연결 참조 변경
discourse 사용자로 bundle exec ruby script/import_scripts/vbulletin5.rb 실행
이로 인해 tzinfo Integer values not supported라는 오류가 발생했는데, 이 문제를 이 discourse의 여기에서 언급된 것을 확인했습니다.
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
importing groups...
41 / 41 (100.0%) [2294 items/min] ]
importing users
Traceback (most recent call last):
15: from script/import_scripts/vbulletin5.rb:726:in `<main>'
14: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
13: from script/import_scripts/vbulletin5.rb:46:in `execute'
12: from script/import_scripts/vbulletin5.rb:79:in `import_users'
11: from /var/www/discourse/script/import_scripts/base.rb:916:in `batches'
10: from /var/www/discourse/script/import_scripts/base.rb:916:in `loop'
9: from /var/www/discourse/script/import_scripts/base.rb:917:in `block in batches'
8: from script/import_scripts/vbulletin5.rb:98:in `block in import_users'
7: from /var/www/discourse/script/import_scripts/base.rb:264:in `create_users'
6: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
5: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
4: from /var/www/discourse/script/import_scripts/base.rb:265:in `block in create_users'
3: from script/import_scripts/vbulletin5.rb:110:in `block (2 levels) in import_users'
2: from script/import_scripts/vbulletin5.rb:718:in `parse_timestamp'
1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.5/lib/tzinfo/timezone.rb:575:in `utc_to_local'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.5/lib/tzinfo/timestamp.rb:138:in `for': Integer values are not supported (ArgumentError)
또한 lastvisit를 사용자 쿼리에 추가해야 한다고 제안했는데, 그렇지 않으면 다른 오류가 발생하기 때문이라고 하였습니다. 그래서 이것도 수행했습니다.
그러나 이제 bundle exec ruby script/import_scripts/vbulletin5.rb로 마이그레이션을 실행하면 다음과 같은 결과가 나옵니다:
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
importing groups...
41 / 41 (100.0%) [120217 items/min]
importing users
Traceback (most recent call last):
13: from script/import_scripts/vbulletin5.rb:727:in `<main>'
12: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
11: from script/import_scripts/vbulletin5.rb:46:in `execute'
10: from script/import_scripts/vbulletin5.rb:79:in `import_users'
9: from /var/www/discourse/script/import_scripts/base.rb:916:in `batches'
8: from /var/www/discourse/script/import_scripts/base.rb:916:in `loop'
7: from /var/www/discourse/script/import_scripts/base.rb:917:in `block in batches'
6: from script/import_scripts/vbulletin5.rb:80:in `block in import_users'
5: from script/import_scripts/vbulletin5.rb:723:in `mysql_query'
4: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:22:in `query'
3: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:147:in `query'
2: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:147:in `handle_interrupt'
1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:148:in `block in query'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:148:in `_query': You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CASE WHEN u.scheme='blowfish:10' THEN token (Mysql2::Error)
WHEN u.scheme='lega' at line 2
불행히도 이전 가져오기 작업에서 무엇을 조정했는지 기록을 남겨두지 않아, 제가 아는 정보가 거의 없습니다. 이제 저는 이런 내용을 작성할 수 있는 개인 Discourse 인스턴스를 가지고 있습니다… 그 전에 그렇게 했어야 했는데 말이죠!
실제로 가져오기 작업을 수행할 때만 관련 사항을 더 잘 다룰 수 있습니다.
사용자 삭제에 관해서는, rails 콘솔을 통해 UserDestroyer를 사용하려고 했을 수도 있습니다:
스크립트를 수정하는 경우, 처음부터 시작하거나 최소한 알려진 정상 상태의 지점부터 시작하는 것이 일반적으로 권장됩니다. @pfaffman 님이 말씀하신 것처럼, 마이그레이션을 실행하기 직전에 만든 백업을 복원하는 것이 가장 쉬운 방법입니다.
일괄 가져오기 도구는 일반적으로 훨씬 적은 시간이 소요되지만, 이 특정 도구는 메모리에 데이터를 캐시하기 때문에 막대한 양의 RAM을 소모할 수 있습니다. 압축이 풀린 2GB 크기의 SQL 파일에서 vBulletin 일괄 마이그레이션을 수행한 특정 사례에서, 해당 프로세스에는 22GB의 RAM이 필요했습니다 (다시 확인해 보았으며, 오타가 아닙니다).
스크립트를 수정하는 경우, 각 테이블별로 100개 또는 1000개의 레코드를 가진 입력 데이터의 테스트 버전을 만드는 것을 권장합니다 (참조 무결성에 주의하세요 - 즉, 다른 테이블에서 참조하는 테이블을 truncate하지 마세요). 8시간 이상 걸리는 프로세스로 변경 사항을 테스트하면 정신력이 매우 빠르게 소모될 것입니다.
스택 트레이스에 대한 더 구체적인 팁: 실행한 특정 파일에 대한 언급이 있는 줄을 찾아보세요. 이 경우 인코딩 문제이기는 하지만, 더 중요한 사실은 이것이 사용자 이름에 관한 것이라는 점입니다:
사용자 이름을 정리(sanitize)해야 한다고 하셨으므로, 스크립트가 기대하는 대로 인코딩했는지 두 번 확인해 보시는 것이 좋습니다.