Ja, sie werden konvertiert. Ich werde dich morgen per E-Mail kontaktieren!
Du musst das Vertrauenslevel 1 erreichen, um private Nachrichten freizuschalten, und du hast noch nicht genug Zeit damit verbracht, hier Themen zu lesen, um das zu erreichen.
Hallo, ich arbeite mit einem Docker-Container (DigitalOcean) und versuche, MyBB zu importieren (ich weiß, dass dieses Tutorial für Vbulletin gedacht ist, aber die Gemfile-Sache ist ähnlich). Ich stecke bei bundle install fest:
Hallo,
wir haben versucht, vBulletin 3.8 nach Discourse zu importieren. Dieses Skript funktioniert einwandfrei mit einer Datenbank von 300 MB, etwa 40.000 Benutzern und 60.000 Beiträgen. Am Ende des Importvorgangs sind wir jedoch auf ein Zeichensatzproblem gestoßen.
- Unsere vBulletin 3.8-Datenbank ist mit dem Zeichensatz latin1 kodiert.
---->
Während der Importverarbeitung ist MySQL 5.6 im Discourse-Container ebenfalls auf UTF-8 konfiguriert. - Das Importskript erzwingt die Umwandlung der Daten in UTF-8.
Am Ende des Importvorgangs werden die Daten im Discourse-Forum jedoch mit UTF-8-Kodierungsfehlern angezeigt. Das sieht ungefähr so aus:
-
Vor dem Import in vB 3.8
-
Nach dem Import nach Discourse
Wir haben Folgendes versucht:
- Umwandlung des Zeichensatzes in vB 3.8 in UTF-8, bevor das Importskript ausgeführt wurde
- Test dieser vB 3.8-Datenbank auf einem neuen MySQL-Server; dort wird der Text normal angezeigt, es treten keine Kodierungsfehler auf.
Hätten Sie einen Rat in diesem Fall?
Wir danken für jede Unterstützung zu diesem Thema (und entschuldigen uns auch für unser Englisch, falls es schwer zu verstehen ist).
Hier ist ein Ausschnitt davon, wie ich ein ähnliches Problem gelöst habe:
### WIN1252-Kodierung
win_encoded = ''
begin
win_encoded = raw.force_encoding('utf-8').encode("Windows-1252",
invalid: :replace, undef: :replace, replace: ""
).force_encoding('utf-8').scrub
rescue => e
puts "\n#{'-'*50}\nWin1252 ist fehlgeschlagen für \n\n#{raw}\n\n"
win_encoded = ''
end
raw = win_encoded
Du hast mir das Leben gerettet.
Für die einfache Lösung habe ich das Konvertierungsskript aus dem Beitrag Migrate a phpBB3 forum to Discourse - #540 by gerhard ausprobiert, um mein Datenbank-Zeichensatzproblem schnell zu beheben. Jetzt funktioniert es wie am Schnürchen.
Vielen Dank für den Rat.
Hat jemand bereits eine Migration mit dem vBulletin-5-Importer durchgeführt? Ich könnte ihn in Zukunft nutzen und möchte wissen, ob er bereits problemlos eingesetzt wurde.
Ich habe gerade einen Import von vBulletin5 durchgeführt und einige Funktionen hinzugefügt (Permalinks, einige Formatierungen und vielleicht noch andere Dinge, an die ich mich nicht mehr erinnere). Ich beabsichtige, einen PR einzureichen, aber das ist noch nicht geschehen.
Ich habe einen vb5-Datenbank-Export, der Anhänge enthält. Kann ich diese in Discourse importieren, oder müssen alle Anhänge als Dateien vorliegen?
Auch ich bin darüber verwirrt. Wo genau im Discourse-Ordner sollten die Anhangsdateien kopiert werden? ![]()
Hallo nochmal,
Soweit ich das verstehe, werden Anhänge aus der Datenbank funktionieren, da sie offenbar genauso behandelt werden wie Avatare, die ebenfalls in der Datenbank gespeichert sind.
Mein Import läuft gut, aber ich bin bei 91 % der importierten Beiträge auf einen Fehler gestoßen ![]()
importing posts...
1425149 / 1564573 ( 91.1%) [1040 items/min] Traceback (most recent call last):
14: from script/import_scripts/vbulletin5.rb:726:in `<main>'
13: from /home/canapin/discourse/script/import_scripts/base.rb:47:in `perform'
12: from script/import_scripts/vbulletin5.rb:49:in `execute'
11: from script/import_scripts/vbulletin5.rb:300:in `import_posts'
10: from /home/canapin/discourse/script/import_scripts/base.rb:862:in `batches'
9: from /home/canapin/discourse/script/import_scripts/base.rb:862:in `loop'
8: from /home/canapin/discourse/script/import_scripts/base.rb:863:in `block in batches'
7: from script/import_scripts/vbulletin5.rb:320:in `block in import_posts'
6: from /home/canapin/discourse/script/import_scripts/base.rb:508:in `create_posts'
5: from /usr/local/rvm/gems/ruby-2.6.5/gems/rack-mini-profiler-2.0.4/lib/patches/db/mysql2.rb:8:in `each'
4: from /usr/local/rvm/gems/ruby-2.6.5/gems/rack-mini-profiler-2.0.4/lib/patches/db/mysql2.rb:8:in `each'
3: from /home/canapin/discourse/script/import_scripts/base.rb:509:in `block in create_posts'
2: from script/import_scripts/vbulletin5.rb:321:in `block (2 levels) in import_posts'
1: from script/import_scripts/vbulletin5.rb:450:in `preprocess_post_raw'
script/import_scripts/vbulletin5.rb:450:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)
Wie kann ich den betreffenden Beitrag korrekt identifizieren, um zu sehen, wie der Inhalt in der vBulletin-Datenbank aussieht?
Jemand hat vorgeschlagen, rescue zu verwenden, um diese Probleme zu lösen. Vielleicht findest du das nochmal heraus (ich kann mich nicht erinnern, ob es in diesem Thema oder in einem anderen war). Du könntest ein puts in das rescue einfügen, um die id und/oder den Text, der das Problem verursacht hat, auszugeben.
Du hast ein Kodierungsproblem.
Ich habe dies bei einem ähnlichen Import verwendet (ich denke, du würdest es in preprocess_post_raw einfügen):
begin
win_encoded = raw.force_encoding('utf-8').encode("Windows-1252",
invalid: :replace, undef: :replace, replace: ""
).force_encoding('utf-8').scrub
rescue => e
puts "\n#{'-'*50}\nWin1252 fehlgeschlagen für \n\n#{raw}\n\n"
win_encoded = ''
end
Hallo,
ich habe den Importer angepasst und dein Skript wie folgt hinzugefügt:
def preprocess_post_raw(raw)
return "" if raw.blank?
begin
win_encoded = raw.force_encoding('utf-8').encode("Windows-1252",
invalid: :replace, undef: :replace, replace: ""
).force_encoding('utf-8').scrub
rescue => e
puts "\n#{'-'*50}\nWin1252 failed for \n\n#{raw}\n\n"
win_encoded = ''
end
# decode HTML entities
raw = @htmlentities.decode(raw)
# fix whitespaces
raw = raw.gsub(/(\\r)?\\n/, "\n")
.gsub("\\t", "\t")
Die ungültige Byte-Sequenz in UTF-8 tritt an dieser Stelle auf: raw = raw.gsub(/(\\r)?\\n/, "\n") .gsub("\\t", "\t").
Anschließend habe ich den Importer erneut gestartet. Obwohl bereits importierte Daten übersprungen wurden, dauerte es etwa 6 Stunden, bis der Fehler auslösende Beitrag erreicht wurde, und die erwarteten Informationen zur Anzeige des Beitragsinhalts wurden nicht hinzugefügt.
Hast du eine Idee, warum das passiert?
Edit:
Dies ist wahrscheinlich der Rohinhalt des Beitrags, der den Fehler verursacht:
I wonder if Billy is enjoying the parade.
Qwertyuiopasdfghjklzxcvbnm��
Ich werde versuchen, das Importerskript so anzupassen, dass es die vorherigen 1,4 Millionen Beiträge wirklich überspringt. Viel Glück für mich. ![]()
Ich habe viele andere Importe angepasst, um eine import_after-Einstellung hinzuzufügen, die den Import nur neuer Daten ermöglicht. Du kannst dir einige andere ansehen, um zu sehen, wie ich das umgesetzt habe.
Hallo,
ich konnte fast alle meine Beiträge importieren! Ich habe ein paar Dutzend manuell korrigiert und den Import jedes Mal neu gestartet, wenn ein neuer UTF-8-Fehler auftrat… ![]()
Jetzt muss ich die Anhänge importieren (die in der VBulletin-Datenbank gespeichert sind), aber das funktioniert nicht:
Wenn der Prozess startet, steigt mein RAM-Verbrauch innerhalb von etwa 10 bis 20 Sekunden stark an, und dann tritt dieser Fehler auf:
importing attachments...
Failed to create upload: Cannot allocate memory - grep
Fail
Mein RAM:
Ich verwende eine Discourse-Entwicklungsversion in einem Ubuntu-18-Subsystem unter Windows 10 und habe 16 GB RAM.
Die Anhänge belegen 7 GB von den 13 GB der vBulletin-Datenbank.
Beachte, dass ich den vbulletin5-Importer verwende.
Das Problem liegt bei dieser Abfrage:
SELECT n.parentid nodeid, a.filename, fd.userid, LENGTH(fd.filedata) AS dbsize, filedata, fd.filedataid
FROM #{DB_PREFIX}attach a
LEFT JOIN #{DB_PREFIX}filedata fd ON fd.filedataid = a.filedataid
LEFT JOIN #{DB_PREFIX}node n on n.nodeid = a.nodeid
Wenn ich diese Abfrage in MySQL ausführe, wird mein verbleibender RAM innerhalb von Sekunden voll.
(Bearbeitung meines Beitrags, um unnötige Informationen und Fragen zu entfernen, da ich die Lösung selbst gefunden habe und einen Workaround bereitstelle)
Workaround:
Ich habe ein LIMIT und ein OFFSET zur SQL-Abfrage des Importers hinzugefügt. Ich habe die Anhänge importiert, indem ich jeweils 20.000 davon ausgewählt habe:
uploads = mysql_query <<-SQL
SELECT n.parentid nodeid, a.filename, fd.userid, LENGTH(fd.filedata) AS dbsize, filedata, fd.filedataid
FROM #{DB_PREFIX}attach a
LEFT JOIN #{DB_PREFIX}filedata fd ON fd.filedataid = a.filedataid
LEFT JOIN #{DB_PREFIX}node n on n.nodeid = a.nodeid
LIMIT 20000 OFFSET 0
SQL
Ich habe auch ein exit am Ende der Schleife uploads.each do |upload| hinzugefügt, um zu verhindern, dass das Importskript nach dem Import meiner 20.000 Uploads weiterläuft.
Nachdem meine 10.000 Uploads importiert waren, habe ich das Skript bearbeitet (danke an nano +353 ./scripts/import_scripts/vbulletin5.rb, um die Datei an der richtigen Zeile zu öffnen), um das SQL-Query-OFFSET um 10.000 zu erhöhen, und den Importer erneut gestartet … und dies für meine 65.000 Anhänge wiederholt.
Während des Imports der Anhänge trat ich auf mehrere Fehler und Warnungen, darunter:
W, [2020-08-20T12:05:37.402860 #31042] WARN -- : Bad date/time value "0000:00:00 00:00:00": mon out of rangePost for 490451 not found(verwaiste alte Anhänge, nehme ich an?)- einige EXIF-Datenfehler, scheint es
FailDieser hat mich verwirrt und das Importskript gestoppt. Ich habe den ersten “Fail” überprüft, den ich erhalten habe, und der Bulletin-Anhang war irgendwie beschädigt (kein Dateiname), also habe ich dieexit-Anweisung kommentiert, um dem Importer zu erlauben, seine Aufgabe fortzusetzen, wenn er “fehlschlägt”, in der Hoffnung, dass dies nichts kaputt macht.
puts "Fail"
#exit
Ich hatte auch einen ärgerlicheren Fehler, der den Import unterbrach:
1: from /usr/local/rvm/gems/ruby-2.6.5/gems/activerecord-6.0.3.2/lib/active_record/validations.rb:53:in `save!'
/usr/local/rvm/gems/ruby-2.6.5/gems/activerecord-6.0.3.2/lib/active_record/validations.rb:80:in `raise_validation_error':
Validation failed: Body is limited to 32000 characters; you entered 32323. (ActiveRecord::RecordInvalid)
Glücklicherweise war dies ein seltener Fehler, und ich habe einfach diesen Anhang übersprungen, bis ich auf den nächsten identischen Fehler stieß. Dies geschah vielleicht ein Dutzend Mal bei insgesamt 65.000 Anhängen. Ich habe das Importskript einfach mit einem anderen SQL-Query-OFFSET neu gestartet.
Hallo,
mir ist aufgefallen, dass das benutzerdefinierte Feld import_pass bei etwa 400 meiner verbleibenden 27.000 Benutzer fehlt (ich habe 154.000 inaktive Benutzer bereinigt).
Haben Sie eine Idee, warum das so ist?
Das Forum wurde im Mai von phpBB zu vBulletin migriert. Könnte das damit zusammenhängen?
Ich werde nicht versuchen, dieses Problem zu „beheben
Hey Leute,
Importierte Bilder haben ein falsches Seitenverhältnis, es sei denn, ich bake die Beiträge neu. Ich möchte einen Weg finden, das korrekte Seitenverhältnis zu erreichen (z. B. während des Imports), ohne die Beiträge neu zu backen.
Umfassendere Beschreibung des Problems:
Soweit ich verstehe, werden importierte Beiträge beim Erstellen des entsprechenden Beitrags in Discourse nicht „gebaked
Ich vermute, das liegt daran, dass Sie sie nach dem Import nicht „kochen“ lassen haben. Ich kann mir keine Möglichkeit vorstellen, das Problem zu lösen, ohne die Beiträge neu zu backen. Vielleicht möchten Sie nur die defekten Beiträge neu backen, anstatt alle?
Sollen sie nach dem Import automatisch im Laufe der Zeit neu gerendert werden? Beginnt das mit dem letzten oder dem ersten erstellten Beitrag?
Das ist jedoch kein großes Problem. Falls sie nicht automatisch neu gerendert werden, würde ich wahrscheinlich einen Neustart des Renderns für alle Beiträge starten und Geduld haben, obwohl ich zugeben muss, dass ich diesen Beitrag vor ein paar Tagen gelesen habe und er mich ein wenig beunruhigt hat: My journey into a massive posts rebake job. Ich habe dazu auch noch Fragen, werde sie aber im entsprechenden Thema stellen. ![]()
Hmm, ja, das sieht nach meinem Code aus. Entschuldige bitte dafür. ![]()
Dies sollte diesem Muster folgen:
batches(BATCH_SIZE) do |offset|
(SQL-Code)
LIMIT #{BATCH_SIZE}
OFFSET #{offset}
(Sonstiger Code)
end
Heben Sie einfach die Site-Einstellung „maximale Beitragslänge


