From Amarok Wiki


Contents

Einrichtung

Unterstützung in Amarok

Zusätzlich zur eingebauten SQLite-Datenbank-Engine unterstützt amaroK 1.2 auch MySQL-Datenbanken. Um Zugriff auf MySQL-Datenbanken zu bekommen, musst Du "configure" den Parameter "--enable-mysql" mitgeben und als root "make install" aufrufen. Die Kommandozeile von configure sollte dann so aussehen:

$ ./configure --enable-mysql

Stelle bitte sicher, dass die libmysqlclient Bibliotheken mitsamt ihrer Entwicklerversionen (-dev(el) Pakete) installiert sind.

MySQL einrichten

ACHTUNG! Neue Anmerkung: Auf http://www.kde-apps.org/content/show.php?content=32264 gibt es eine Sammlung "Database Scripts", mit denen "die Sammlung optimiert und eine Sicherungskopie gespeichert" werden kann. Bei neueren Versionen von Amarok (z.B. 1.4.4) zerstört dieses Script sämtliche persönlichen "Sternchen"- Bewertungen in der Datenbank, wenn MySQL als Backend verwendet wird! Auch Amarok 1.4.4 erlaubt über "Extras -> Script-Verwaltung" das automatische Herunterladen dieser Version. [Ist schon weitergeleitet]

Anmerkung: Ältere Versionen von Amarok arbeiten am Besten mit MySQL-Versionen kleiner als 5.0 zusammen. Ein bekanntes Problem mit älteren Amarok- und neueren MySQL-Versionen ist, dass Amaroks Datenbank ständig grösser wird und bei jedem Erfassen der Sammlung Mehrfacheinträge für jedes Lied hinzugefügt werden.

Stelle sicher dass der MySQL-Daemon läuft und auch in Zukunft bei jedem Neustart gestartet wird. Die meisten Distributionen haben unterschiedliche Mechanismen dies zu tun.

Erstelle ein root-Passwort für MySQL, wenn du nicht bereits eines hast.

$ mysql -u root 
set password for root@localhost = password('xxxxxxx'); 
flush privileges; 
quit; 

Das xxxxxx musst du natürlich mit dem Passwort ersetzen.

Sobald du damit fertig bist, musst du eine neue MySQL-Datenbank erstellen. Am einfachsten geschieht dies mit dem Kommando "mysql". (Es wird Dich nach deinem MySQL-Root-Passwort fragen)

$ mysql -p -u root
CREATE DATABASE amarok;
USE amarok;
GRANT ALL ON amarok .* TO amarok@localhost IDENTIFIED BY 'PASSWORD_CHANGE_ME';
FLUSH PRIVILEGES;

Im obigen Beispiel wird eine Datenbank namens "amarok" erstellt, auf welche der Benutzer "amarok" von localhost (also nur vom gleichen Rechner) aus Zugriff hat. Das Passwort für die Datenbank ist "PASSWORD_CHANGE_ME". Um Zugriff von entfernten Computern zuzulassen verwende bitte amarokuser@'%'.

Achtung: Standardmäßig benutzt Amarok eine Datenbank namens "amarok" und nicht mehr "amarokdb".

Es ist sehr wichtig, dass du dem Amarok-Benutzer die Rechte 'GRANT ALL' gibst, denn Amarok muss manchmal die Rechte an den Datenbanken ändern.

Sobald eine Datenbank existiert, öffnest du den Einrichtungsbildschirm von Amarok (unter Einstellungen) und wechselst auf den Reiter 'Sammlung'. Ändere dort die Auswahl im Ausklappmenü von 'SQLite' auf 'MySQL'. Du musst den Host (vermutlich localhost), den Port (normalerweise 3306) und den Namen der Datenbank (im vorigen Beispiel amarok) angeben. Zusätzlich müssen Benutzername und Passwort eines Benutzers angegeben werden, welcher Schreibzugriff auf die Datenbank hat (im obigen Beispiel ist der Benutzer "amarok" und das Passwort lautet PASSWORD_CHANGE_ME).

MySQL-Serverwissen: Bei den meisten MySQL-Installationen lauscht der Daemon standardmässig nur auf localhost.

Wenn du also Fehler angezeigt bekommst, dass die Verbindung zum Server/der Datenbank nicht aufgebaut werden konnte (keine Passwort bedingten Fehler) musst du die Einrichtungsdatei 'my.cnf' auf dem MySQL-Server bearbeiten (meist '/etc/mysql/my.cnf'). Kommentiere dort die Variable "bind_address" aus und starte MySQL neu. Ebenso kannst du die Variable "skip_networking" auskommentieren, MySQL wird dann an einem TCP-Socket lauschen.

Soweit ich weiss gibt es keine Möglichkeit MySQL mitzuteilen an welcher Schnittstelle es lauschen soll. Bei Verwendung von mehreren Schnittstellen solltest du also nicht vergessen die Firewallregeln anzupassen.

Bearbeiten

Um einen neuen Benutzer hinzuzufügen, muß die Tabelle mysql.user um einen Eintrag erweitert werden. Der Amarokbenutzer muss Datenbanken erstellen, sowie Datensätze aktualisieren, einfügen und abfragen dürfen. Hier ist ein Beispiel für diesen Benutzer (wie üblich wird "mysql -uroot -p" zum Zugriff auf MySQL verwendet) :

insert into user values('localhost','amarokuser','CHANGE_ME','y','y','y','y','y','y','y','y','y','y','n','n','n','n','n','y','y','y','y','y','n','n','n','y','y','n', "","","","","","","","");
flush privileges;

Jetzt wird die Datenbank erstell :

create database amarokcollection;

Alle Rechte an amarokcollection werden an amarokuser übertragen:

GRANT ALL ON amarokcollection.* TO amarokuser@localhost IDENTIFIED BY 'CHANGE_ME';
flush privileges;
quit;

Das war's.

Datenbanken konvertieren

SQLite -> MySQL

Ein Weg die sqlite3-Datenbank nach MySQL zu transferieren sieht so aus: (allerdings wird hierfür keine Funktionsgarantie gegeben)

cd ~/.kde/share/apps/amarok && \
sqlite3 collection.db .dump | \ 
grep -v "BEGIN TRANSACTION;" | \
grep -v "COMMIT;" | \
perl -pe 's/INSERT INTO \"(.*)\" VALUES/INSERT INTO \1 VALUES/' | 
mysql -u root -p amarok

Einige Leute hatten Problem mit dem vorherigen, hier gelisteten Skript, doch das obige funktioniert. Wenn Sie doch Fehler bekommen (Albumnamen mit Schrägstrichen können Ärger verursachen) dann lassen Sie die letzte Zeile oben weg und schreiben Sie die Ausgabe in eine Datei.

cd ......\1 VALUES/' > ~/tmp/amarok_dump

Bearbeiten Sie die Datei mit Ihrem bevorzugten Editor um die Fehler zu beseitigen. Löschen Sie alle in der amaroK-Datenbank erzeugten Tabellen. Ich nutze dazu phpMyAdmin, wenn Sie das jedoch lieber mit MySQL-Kommandos erledigen wollen ... suchen Sie nach Infos in der [http://dev.mysql.com/doc/refman/5.1/de/ MySQL Referenz). Probieren Sie den letzten Schritt nochmals mit der Ausgabedatei.

cat ~/tmp/amarok_dump | mysql -u root -p amarok

Wenn ein Fehler erscheint wie z.B.

ERROR 1071 (42000) at line 25380: Specified key was too long; max key length is 1000 bytes

dann öffnen Sie amarok_dump und ersetzen jedes Vorkommen von VARCHAR(1024) mit VARCHAR(996)

Das Originalskript versuchte die folgenden Ersetzung: s/VARCHAR\(256\)/VARCHAR\(255\)/. Mein SQLite-Dump hat jedoch nur VARCHAR(255) Referenzen. Wenn Sie Ihre Ausgabedatei testen wollen nutzen Sie den folgenden Befehl.

grep "VARCHAR(256)" ~/tmp/amarok_dump

Erhalten Sie Ergebnisse so können Sie versuchen diese zu beheben:

perl -pe 's/VARCHAR\(256\)/VARCHAR\(255\)/' < ~/tmp/amarok_dump > ~/tmp/amarok_dump2 && mv ~/tmp/amarok_dump2 ~/tmp/amarok_dump

MySQL bringt ein sehr nützliches Kommandozeilenwerkzeug namens 'replace' mit. Dies kann mehrfach vorkommende Strings in einer Datei ersetzen:

replace "VARCHAR(256)" "VARCHAR(255)" -- ~/tmp/amarok_dump

Sie können mehrere Suchen/Ersetzen-Paare angeben, dürfen aber nicht vergessen sie am Ende zu terminieren mit:

-- ~/tmp/amarok_dump

Eine alternative Methode SQLite-Daten zu importieren ist folgender Ablauf:

  • Starte amaroK, wechsel nach MySQL und erfasse die Sammlung (spiele aber kein Lied)
  • Lade den 'SQLite Database Browser' herunter
  • Exportiere die Statistik-Datenbanktabelle in eine Datei namens 'amarok_dump.sql'
  • Entferne alle BEGIN TRANSACTION, COMMIT und CREATE sql Kommandos.
  • Importe die Datei mit Hilfe von MySQL:
cat amarok_dump.sql | mysql -u root -p amarok

Falls Sie Fehler angezeigt bekommen könnte der Grund ein bereits gespieltes Lied sein und dass dadurch schon ein Eintrag in der Statistik ist. Ist dies die Ursache so müssen Sie 'amarok_dump.sql' bearbeiten. Suchen Sie nach der Zeile und löschen Sie alles davor, denn die Kommandos wurden von MySQL schon ausgeführt und würden zu weiteren Fehlern führen). Wollen Sie die fehlerhafte Zeile dennoch nutzen, so korrigieren Sie den Fehler und ersetzen 'INSERT INTO' mit 'REPLACE INTO'. Führen Sie das obige Kommando nochmals aus.

MySQL -> SQLite

Ein Weg (ohne Funktionsgarantie) um deine MySQL-Datenbank nach SQLite3 zu transferieren:

cd ~/.kde/share/apps/amarok && \
mv collection.db collection.db.old && \
mysqldump -uroot -p -n -t amarok | sed -e "s/\\\'/\'\'/g" | sed -e "s/\\\\\"/\"\"/g" > amarok.sql && \
sqlite3 collection.db

Füge in Deine "sqlite>" Eingabeaufforderung folgendes ein um die Tabellen zu erstellen:

CREATE TABLE album (id INTEGER PRIMARY KEY ,name VARCHAR(255) );
CREATE TABLE artist (id INTEGER PRIMARY KEY ,name VARCHAR(255) );
CREATE TABLE directories (dir VARCHAR(255) UNIQUE,changedate INTEGER );
CREATE TABLE genre (id INTEGER PRIMARY KEY ,name VARCHAR(255) );
CREATE TABLE images (path VARCHAR(255),artist VARCHAR(255),album VARCHAR(255) );
CREATE TABLE related_artists (artist VARCHAR(255),suggestion VARCHAR(255),changedate INTEGER );
CREATE TABLE statistics (url VARCHAR(255) UNIQUE,createdate INTEGER,accessdate INTEGER,percentage FLOAT,playcounter INTEGER);
CREATE TABLE tags (url VARCHAR(255),dir VARCHAR(255),createdate INTEGER,album INTEGER,artist INTEGER,genre INTEGER,title VARCHAR(255),year INTEGER,comment VARCHAR(255),track NUMERIC(4),bitrate INTEGER,length INTEGER,samplerate INTEGER,sampler BOOL );
CREATE TABLE year (id INTEGER PRIMARY KEY ,name VARCHAR(4) );
CREATE INDEX album_idx ON album( name );
CREATE INDEX album_tag ON tags( album );
CREATE INDEX artist_idx ON artist( name );
CREATE INDEX artist_tag ON tags( artist );
CREATE INDEX directories_dir ON directories( dir );
CREATE INDEX genre_idx ON genre( name );
CREATE INDEX genre_tag ON tags( genre );
CREATE INDEX images_album ON images( album );
CREATE INDEX images_artist ON images( artist );
CREATE INDEX percentage_stats ON statistics( percentage );
CREATE INDEX playcounter_stats ON statistics( playcounter );
CREATE INDEX related_artists_artist ON related_artists( artist );
CREATE INDEX sampler_tag ON tags( sampler );
CREATE INDEX url_stats ON statistics( url );
CREATE INDEX url_tag ON tags( url );
CREATE INDEX year_idx ON year( name );
CREATE INDEX year_tag ON tags( year );

Importiere nun Deinen MySQLDump in der "sqlite>" Eingabeaufforderung:

.read amarok.sql

Automatische Backups

Hinweis: Auch die Datei '~/.kde/share/config/amarokrc' muss gesichert werden, weil sie "wichtige Versionsdaten" enthält.

Dies kann sehr einfach mit einem Cron-Job erledigt werden. Erstellen Sie ein Shell-Skript und speichern es im Ordner "/etc/cron.weekly" (der Ordner kann auf Ihrem System anders heissen).

 #!/bin/sh
 # Backup der Amarok-MySQL Datenbank
 # Version 2007-02-06-b, 
 # Jetzt "/bin/sh -> /bin/dash" kompatibel; Backupdateien heißen jetzt "amarok.mysql.tar.bz2"

 ######### HIER EINSTELLUNGEN ANPASSEN #########
 # Speicherort für die Amarok-Backups:
 BACKUP_BASE_DIR=~/backup
 
 # Name der MySQL-Datenbank für Amarok:
 AMAROKDB_NAME=amarok
 
 # Name and Passwort für Amarok-MySQL-Datenbank:
 AMAROKDB_USER=amarok
 AMAROKDB_PW=PASSWORD
 
 # Speicherort der Konfigurationsdatei amarokrc:
 AMAROKRC=~/.kde/share/config/amarokrc
 ######### ENDE DER EINSTELLUNGEN #########
 
 BACKUP_SUBDIRECTORY=`date +%Y-%m-%d`
 
 if [ ! -w $BACKUP_BASE_DIR -o ! -d $BACKUP_BASE_DIR ]
 then
   printf %b "\n\n $BACKUP_BASE_DIR existiert nicht oder ist nicht schreibbar!\n\n"
   printf %b "STOP.\n\n"
   exit 1;
 fi
 
 if [ ! -r $AMAROKRC ]
 then
   printf %b "\n\n $AMAROKRC existiert nicht oder Amarok ist nicht installiert!\n\n"
   printf %b "STOP.\n\n"
   exit 1;
 fi
 
 mkdir -p $BACKUP_BASE_DIR/amarok/$BACKUP_SUBDIRECTORY

                #Temporäre Datei, damit erneutes Aufrufen des Scripts keine alten
                #Backups überschreibt (z.B. genau vor dem Wiederherstellen einer Sicherungskopie!!)
 mysqldump -u $AMAROKDB_USER -p$AMAROKDB_PW $AMAROKDB_NAME -c -e --hex-blob > /tmp/amarok.mysql

 tar --remove-files -C /tmp -cvvjf /tmp/amarok.mysql.tar.bz2 amarok.mysql

 mv -i -v /tmp/amarok.mysql.tar.bz2 $BACKUP_BASE_DIR/amarok/$BACKUP_SUBDIRECTORY
 
 # Auch die Konfigurationsdatei amarokrc wird gesichert:
 cp -i -v $AMAROKRC $BACKUP_BASE_DIR/amarok/$BACKUP_SUBDIRECTORY
 


Dieses Skript erstellt einen Ordner unter '~/backup/amarok' mit Namen des aktuellen Datums und speichert darin ein Abbild der Amarok-MySQL-Datenbank in einer .tar.bz2-gepackten Datei sowie eine Kopie der Datei '~/.kde/share/config/amarokrc'. Ersetzen Sie das Passwort durch Ihres, sowie Namen und Benutzernamen der Amarok-MySQL-Datenbank, soweit erforderlich. Weiterhin werden die Rechte "GRANT ALL" für den Benutzer der Datenbank benötigt.

Sicherungskopie wiederherstellen

Hiermit kann die Datenbank mittels des Backups wiederhergestellt werden. Zunächst die alte Datenbank löschen und eine neue, leere anlegen:

# New version. Previous example forgot to mention the need to reset
# the access rights via "GRANT ALL"...

$ mysql -p -u root
DROP DATABASE amarok;
CREATE DATABASE amarok;
USE mysql;
GRANT ALL ON amarok.* TO amarok@localhost IDENTIFIED BY 'PASSWORD_CHANGE_ME';
FLUSH PRIVILEGES;
QUIT;

Hier wird das Backup in die Datenbank importiert. Das Datum natürlich wie erforderlich abändern:

$ cd ~/backup/amarok/2006-07-12/
$ tar -xvjf amarok.mysql.tar.bz2
$ mysql -p -u amarok -h localhost amarok < amarok.mysql

Jetzt sollte die Datenbank wieder OK sein. Das erste Vorkommen von 'amarok' ist der Benutzername; das Zweite der Name der Datenbank.

Auch die Datei ~/.kde/share/config/amarokrc muss ggf. gegen die Sicherungskopie ausgetauscht werden.

Eine beschädigte Datenbank reparieren

Wenn Ihre MySQL-Datenbank beschädigt ist können Sie z.B. nicht mehr alle Lieder in Ihrer Sammlung sehen und es tauchen Fehlermeldungen in '/var/log/messages' auf. Um die Datenbank zu reparieren rufen Sie das Kommando 'mysqlcheck' als root auf:

mysqlcheck -p --auto-repair --all-databases

Nun müssen Sie noch Ihre Sammlung neu erfassen um die Datenbank auf den aktuellen Stand zu bringen.

Tipps zum gemeinsamen Benutzen von MySQL-Datenbanken

  • Es ist sehr wichtig dass alle Computer, die die Datenbank verwenden sollen, die Musikdateien im gleichen Pfad (Mount-Punkt) vorfinden. Weiterhin ist es wichtig, dass bei allen Kopien von amaroK die gleichen Ordner ausgewählt sind. Wenn sich Ordner oder Pfade unterscheiden, werden die unterschiedlichen Prozesse immer mit dem Neuerfassen deiner Sammlung beschäftigt sein.
  • Stellen Sie sicher, dass auf allen PCs, die sich die Datenbank teilen, die gleiche Version von Amarok läuft.
  • Verwenden Sie ein Wrapper-Skript für die Amarok-Binärdatei, um einen Start von Amarok zu verhindern, wenn die Laufwerke mit der Musik nicht zur Verfügung stehen (die Datenbank würde sonst geleert).
  • Erlaube nur einem System die Option 'Änderungen überwachen' (Einstellungen > amaroK einrichten > Sammlung) zu nutzen. Wenn neue Musik hinzukommt fügt nur der eine Computer Einträge der Datenbank hinzu. Alternativ kannst du das automatische Überwachen auch bei allen Systemen abschalten und manuelles Erfassen durchführen wann immer du willst (Extras > Sammlung neu erfassen).
  • Stelle sicher, dass auf allen Computern die gleichen Informationen für Datenbankname, Benutzername und Passwort verwendet werden.

(Es ist vielleicht auch möglich Verschiedene Benutzer für den Zugriff auf die amaroK-Datenbank einzurichten.

  • Wichtige Anmerkung: Seit der Einführung von dynamischen Sammlungen in Amarok 1.4.2, müssen Sie, wenn gemeinsam genutzte Datenbanken verwendet werden sollen, den Eintrag
DynamicCollection=false
zu der Sektion [Collection] in
~/.kde/share/config/amarokrc
hinzufügen.

Wurde hier berichtet.


External Links