Ich hatte in meinen Redmine Installationen immer wieder Probleme, dass bestimmte e-Mails vom Mail System zwar angenommen wurden, aber beim Import in die Redmine Instanz ein 500er Fehler produziert wird.
Nach längerem Suchen hat sich herausgestellt, dass e-Mails, welche Emoji's oder andere Sonderzeichen aus den oberen Bereichen des UTF8 Zeichensatzes (japanische Zeichen, mathematische Zeichen,...) von Redmine beim Import nicht verarbeitet werden können.
Man kann sich diesen Effekt leicht anschauen, in dem man ein neues Ticket anlegt und in dem Tickettext ein Smiley aus dem UTF8 Zeichenvorrat einfügt. In diesem Fall wirft Redmine beim Speichern einen Fehler.
Nach intensiverer Recherche hat sich herausgestellt, dass nicht Redmine oder Rails das Problem sind, sondern die MySQL (oder bei mir die MariaDB) Datenbank. Leider sind derzeit die einzigen Reporter dieses Fehlers eher aus dem asiatischen Bereich und man braucht für die Recherche Google Translate ;-),...
Hier mal eine Kurzanleitung, was ich getan habe um das Problem zu fixen:
Hier mal die ganze Arbeit als Code Segment in der Shell:
#! /bin/sh
# Change database mode to long inno_db (don't know if it works,...)
cat < _EOF_
[Mysqld]
innodb_file_per_table = 1
innodb_file_format = barracuda
innodb_large_prefix = 1
_EOF_ > /etc/mysql/conf.d/utf8mb4.cnf# restart mysql/mariadb
service mysql restart# extract tables and construct mysql script
echo 'show tables;' | mysql -u root -p redmine | perl -ne 'chop; print "alter table $_ ROW_FORMAT=DYNAMIC;\nalter table $_ convert to character set utf8mb4 collate utf8mb4_unicode_ci;\n";' > /tmp/recode-redmine.sql# strip the two first ones, because these are the headings!
ed $DEST.pem <<ED-Here-Session
1,2d
wq
ED-Here-Session
# change the database with:
mysql -u root -p redmine < /tmp/recode-redmine.sql
# change the complete database encoding:
echo 'ALTER DATABASE redmine CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' | mysql -u root -p# in ..../redmine/config/database.yml change the following line:
# encoding: utf8 with encoding: utf8mb4
Wie immer gilt: Keine Gewähr & Es ist gut, wenn man versteht, was die Kommandos tun, sonst besser bleiben lassen!
Teile auf Twitter Teile auf Facebook
Kommentare
Thomas Koch 8 Jahre, 7 Monate her
Vielen Dank für die Ausarbeitung! Es hat mir echt geholfen gleich 2 Probleme zu lösen...
Link | AntwortLeider lässt sich das default_row_format erst ab MySQL 5.7.8 global festlegen (und ist dann dort sogar schon auf DYNAMIC als Default).
Im Moment ist ein Konvertieren der DB eine etwas riskante Angelegenheit, da von redmines db:migrate das row_format als compact (Default) durchgeführt wird. Eventuell sind dadurch zukünftige Updates nicht so trivial zu integrieren.
Das Problem schlägt auch bei einer Neuinstallation zu. Ich hatte nämlich versucht ein Neues Redmine gleich mit utf8mb4 zu erstellen, doch schon das Initiale bundle exec rake db:migrate schlägt bei einigen Indexen fehl, wegen max key length:
Beispiel:
Mysql2::Error: Specified key was too long; max key length is 767 bytes: CREATE UNIQUE INDEX `changesets_repos_rev` ON `changesets` (`repository_id`, `revision`)
Peter Pfläging 8 Jahre, 7 Monate her
Ich hatte das gleiche Problem. Ich bin zwar nicht der echte Guru in Rails, aber meinem Verständnis nach hat der Script: <code> /opt/redmine/config/initializers/enable_urf8mb4.rb</code> (ca in der Mitte des Artikels) genau das Problem gelöst.
Link | AntwortZumindest bei 2 Testinstanzen hat genau dieses Ruby Script das Problem gelöst. Das bedeutet man sollte dieses Script möglichst früh in der Redmine Installation anlegen, dann sind die 767byte Probleme weg!
Thomas Koch 8 Jahre, 7 Monate her
Vielen Dank für die schnelle Antwort.
Link | AntwortLeider kann ich die Referenz zum dem genannten Script (enable_urf8mb4.rb) nicht finden, aber das klingt vielversprechend. Auf welchen Artikel beziehen sie sich?
Peter Pfläging 8 Jahre, 7 Monate her
Sorry, jetzt ist mir was ganz Peinliches passiert. Ich habe dan Artikel upgedated, aber leider nicht veröffentlicht. Jetzt ist die neue Version des Artikels draußen mit dem ganzen Ablauf und dem entsprechenden Script!
Link | AntwortPeter Pfläging 8 Jahre, 7 Monate her
Ok, noch mal daneben. bitte im Artikel: /blog/archives/1058 nachschauen, dort ist die komplette Anleitung,...
Link | AntwortRoland 7 Jahre, 7 Monate her
Vielen Dank für das Skript! Wir konnten so erfolgreich auf UTF8mb4 migrieren.
Link | AntwortPeter Pfläging 7 Jahre, 7 Monate her
Super, ich hoffe, das wandert so in den Redmine Core.
Link | AntwortNeuer Kommentar