From Amarok Wiki
... o tutorial de Amarok con MySQL
Amarok 1.2 y superiores soportan MySQL como motor de base de datos, además del motor SQLite, que sule estar compilado por defecto en las instalaciones de Amarok. Para tener soporte para MySQL deberás, bien tener instalada una versión de Amarok con soporte MySQL habilitado, o bien compilar Amarok de esta manera tú mism@. Para conseguir esto, simplemente compila Amarok con los parámetros --enable-mysql. No obstante, deberás tener instalados los paquetes de desarrollo de MySQL, como libmysqlclient-dev en Debian, o mysql en Arch Linux. Sigue los pasos de Cómo Instalar para más información.
En resumen, la línea para compilar Amarok con soporte MySQL es:
$ ./configure --enable-mysql && make && su -c 'make install'
Contents |
Configuración de MySQL
Nota: Amarok funciona de manera segura con versiones de MySQL anteriores a 5.0 y posteriores a 4.0, ya que un problema conocido con versiones más actuales es que la base de datos crece contínuamente y sin control después de cada escaneo de la colección, ya que Amarok añade entradas múltiples a la base de datos. De todas maneras, puede que ya tengas solucionado el problema si usas una determinada versión de MySQL y/o Amarok que no tengan el problema.
Pasos preliminares
La configuración preliminar se basa en asegurarse en primer término si el demonio de MySQL está funcionando. Para saberlo, puedes hacer
$ ps -A | grep mysql
Que deberá devolver los procesos con nombre similar a mysql. Si no está ejecutándose, tan solo tienes que arrancarlo con el proceso determinado por tu distribución.
Creación de usuarios
Para crear la contraseña de administrador si aún no lo has hecho tan sólo tienes que abrir una terminal y hacer...
$ mysql -u root
set password for root@localhost = password('hack_me');
flush privileges;
quit;
Obviamente, puedes cambiar hack_me por la contraseña que desees.
Una vez lo hayas echo, tienes que crear la base de datos MySQL para Amarok. Puedes usar el comando "mysql", el cual te pedirá la contraseña de usuario administrador (root).
$ mysql -p -u root CREATE DATABASE amarok; USE mysql; GRANT ALL ON amarok.* TO amarok@localhost IDENTIFIED BY 'PASSWORD_CHANGE_ME'; FLUSH PRIVILEGES;
En este ejemplo, se crea una base de datos llamada "amarok", el usuario que tendrá acceso a ella se llama amarok, y la contraseña es hack_me, otra vez. También se ha limitado el acceso de amarok al ordenador local, o localhost. Si lo que quieres es que cualquier usuario amarok remoto pueda acceder a la base de datos, cambia amarok@localhost por amarok@'%'.
Nota, por favor, que tienes que dar todos los privilegios (via GRANT ALL) al usuario amarok, ya que Amarok necesitará cambiar algunos permisos de su base de datos. Obviamente, no podrá acceder a otras bases de datos, por lo que no es un agujero de seguridad.
Configuración de Amarok
Una vez que la base de datos existe, abre la ventana de configuración de Amarok, y luego vé a la página de Colección. Del menú de abajo, cambia SQLite a MySQL. Tendrás que especificar el host al que se tendrá que conectar, probablemente "locahost"; el puerto seguramente será 3306; el nombre de la base de datos "amarok"; el nombre de usuario "amarok"; y la contraseña, la que hayas decidido (en el ejemplo anterior, hack_me).
Problemas con conexiones
Si quieres conectarte a MySQL con un usuario remoto (que no está en "localhost"), tendrás que modificar la configuración de MySQL para que el demonio escuche también remotamente, ya que, por defecto está escuchando sólo en localhost.
Así que tendrás que...
- Localizar el archivo de configuración "my.cnf", que suele estar en /etc/mysql/my.cnf.
- Abre tu editor de texto favorito (como nano, vim, kwrite, etc...)
- Comenta la línea de bind_address para que mysqld no la procese.
- Comenta la línea de skip_networking de la misma manera.
- Reinicia el demonio de mysql (mysqld) con el proceso determinado por tu distribución.
Con estos sencillos pasos, haremos que MySQLd escuche en un socket TCP, esto es, aceptando conexiones remotas. Si sigues teniendo problemas, asegúrate de que el firewall tiene el puerto 3306 (el predeterminado) abierto.
Conversiones entre bases de datos
SQLite a MySQL
Una manera no soportada para transferir tu base de datos SQLite3 a MySQL es:
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
al importar el dump a mysql pueden suceder problemas del tipo
ERROR 1071 (42000) at line 4: Specified key was too long; max key length is 1000 bytes
esto es debido a que mysql no soporte llaves primarias de tamaño mayor a 1000 bytes que suele ser excedido por campos VARCHAR(1024), se puede resolver cambiando el tamaño de las llaves primarias a un numero menor que 1000 bytes; cambiando a VARCHAR(1000).
hay que notar que para las llaves compuestas (esto es formada por dos campos o mas) puede ser necesario cambiar el tamaño de los campos que conformen la llave primaria para obtener un tamaño de llave primaria menor a 1000 bytes.
El mismo problema surgira con los indices generados al final del dump, hay que revisar que no se excedan los 1000 bytes del tamaño de estos.
MySQL a SQLite
Una manera no soportada para convertir tu base de datos MySQL a SQLite3 es
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
Pega esto al programa sqlite para crear las tablas paste to your "sqlite>" prompt to create the tables:
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 );
Y luego importa tu mysqldump a tu sqlite...
.read amarok.sql
Copias de seguridad automáticas
Esto puede ser conseguido con una tarea cron. Crea un script shell y ponlo en tu /etc/cron.daily si quieres que se ejecute cada dia, o cron.weekly para cada semana.
#!/bin/sh
# Backup the Amarok MySQL database
# Version 2007-02-06-b,
# now "/bin/sh -> /bin/dash" compatible; backup files now named "amarok.mysql.tar.bz2"; ask before overwrite
######### CHANGE SETTINGS HERE #########
# Location to place Amarok-database backups:
BACKUP_BASE_DIR=~/backup
# Name of MySQL-database:
AMAROKDB_NAME=amarok
# Username and password for Amarok-MySQL-database:
AMAROKDB_USER=amarok
AMAROKDB_PW=PASSWORD
# Location of amarokrc:
AMAROKRC=~/.kde/share/config/amarokrc
######### END OF SETTINGS SECTION #########
BACKUP_SUBDIRECTORY=`date +%Y-%m-%d`
if [ ! -w $BACKUP_BASE_DIR -o ! -d $BACKUP_BASE_DIR ]
then
printf %b "\n\n $BACKUP_BASE_DIR doesn't exist or is not writable!\n\n"
printf %b "STOP.\n\n"
exit 1;
fi
if [ ! -r $AMAROKRC ]
then
printf %b "\n\n $AMAROKRC doesn't exist or Amarok is not installed!\n\n"
printf %b "STOP.\n\n"
exit 1;
fi
mkdir -p $BACKUP_BASE_DIR/amarok/$BACKUP_SUBDIRECTORY
#using a temporary file in order not to overwrite an existing copy when the script is
#manually invoked a second time (e.g. right before restoration of existing backup of same date!)
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
# The config file amarokrc will also be secured:
cp -i -v $AMAROKRC $BACKUP_BASE_DIR/amarok/$BACKUP_SUBDIRECTORY
Este script va a crear un directorio llamado amarok dentro de tu BACKUP_BASE_DIR (cámbialo para que se ajuste a tus deseos), y guardar un dump de MySQL en él, junto con el archivo amarokrc. Cambia AMAROKDB_PW para que sea la misma que usa Amarok para acceder a la base de datos.
Reparar una base de datos corrupta
Cuando tu base de datos es correcto, no puedes ver todas las canciones en el explorador de colección, y podrás ver en /var/log/messages que la base de datos MySQL está corrupta. Para repararla, puedes hacer como root:
mysqlcheck -p --auto-repair --all-databases
Luego, reescanea la colección para actualizar la base de datos.
Sugerencias para compartir una base de datos MySQL
- Lo más importante es que todas las máquinas estén compartiendo la base de datos que tiene los archivos montados en exactamente el mismo camino, y que todas las copias de Amarok están configurados con los mismos directorios. Si uno de los directorios es diferente, todas las copias de Amarok estarán reescaneando constantemente la colección.
- Deberás restringir la actualización incremental desactivando "Vigilar cambios en directorios" o similar en el mensaje de configuración de la Colección. Lo ideal es que sólo una máquina escanee la base de datos y la colección. Alternativamente, puedes desactivar todas las escaneadas automáticas y hacer sólo manuales cuando lo necesites. (Recuerda: Herramientas / Escanear Colección)
- Asegúrate de que todos los ordenadores comparten la misma configuración MySQL para evitar problemas básicos. Si eres más avanzado, puedes crear nuevos usuarios para acceder a la base de datos de Amarok.