MySQL Error 1045 (28000) en Gentoo: Resuelto

Después de varias semanas de pelearme con el dichoso error 1045 (28000) al momento de conectarme, y de también recibir algunos consejos del panda, hoy por la mañana por fin pude entrar a MySQL en Gentoo.

El problema

Después de instalar, usaba emerge –config para crear las bases de datos del sistema y ponerle password al usuario root. Me decía que escribiera el password, que confirmara y después solamente “Done”. Sin embargo, siempre que quería entrar con mysql -u root -p y darle el password, me salía el error arriba mencionado. Reinstalé fácil unas 20 veces (sí, con portage), e incluso bajé los binarios y hasta el código fuente y lo compilé, pero seguía teniendo el mismo problema.

Buscando información

Me acabé TODOS los mensajes del foro de MySQL referentes a este error, busqué cuanto resultado relevante me salía en google, pero las diversas soluciones que mostraban ahí simplemente no funcionaban. Incluso inicié el servicio con la opción –skip-grant-tables para poder entrar sin necesidad de usuarios o password, y sí, lograba entrar. Fue ahí donde me di cuenta de que la tabla user de la base de datos mysql estaba vacía… Se creaba, pero no se pasaban datos al momento de configurarlo.

Si configuraba con emerge, no me salía ningún mensaje de error; si lo hacía con mysql_install_db solo me decía que había fallado, pero no me decía cuál era el problema. Incluso con este último, las tablas sí se creaban, pero resultaba en lo mismo: ningún usuario (ni siquiera el root). Hasta llegué a pensar que quizá era un bug de Gentoo, pero muchos usuarios tenían el mismo problema en diferentes plataformas.

La solución

Por increíble que parezca, la solución era, como siempre, muy simple, pero muy mal documentada. Primero, ¿cómo di con ella? Me eché un clavado al script mysql_install_db y busqué el lugar donde estaba el mensaje de error que me enviaba; luego, fui a ver el if para saber qué comando estaba ejecutando y de ahí comenzó la iluminación divina.

No es nada del otro mundo intuir que si las tablas se crean pero no se llenan de datos, hay un problema con el segundo proceso. Dentro del script, me encontré esto:

fill_help_tables=”$pkgdatadir/fill_help_tables.sql”
create_system_tables=”$pkgdatadir/mysql_system_tables.sql”
fill_system_tables=”$pkgdatadir/mysql_system_tables_data.sql”

if { echo “use mysql;”; cat $create_system_tables $fill_system_tables; } | eval “$filter_cmd_line” | $mysqld_install_cmd_line > /dev/null

else
echo “Installation of system tables failed!”
echo
echo “Examine the logs in $ldata for more information.”

El punto conflictivo era el comando $fill_system_tables, que, como vemos en su definición, ejecuta mysql con el argumento mysql_system_tables_data.sql. Opté por borrar todas las base de datos (es instalación nueva) de /var/lib/mysql, iniciar el servicio sin grant tables, y ejecutar:

mysql mysql < mysql_system_tables_data.sql

Acto seguido, me sale una línea de error que antes no había visto: “Duplicated entry for “localhost”. El script mysql_install_db recibe este error y no continúa con la ejecución, pero nunca lo hace visible tampoco.

Se me hizo raro que el localhost estuviera duplicado, sobre todo porque ya antes el panda me había dicho que era bueno definir el nombre del host en /etc/hostname. Y ya lo había hecho, pero como no había tenido éxito, y XFCE me mostraba algunos errores al iniciar, siempre lo quitaba. ¡Ah! Pues el problema era que Gentoo pone por default el hostname como “localhost”, y mysql crea por default un usuario root para el localhost e intenta crear otro root para el hostname. Al tener el mismo valor, y siendo el campo host una llave primaria, los insert nunca se realizan (porque primero se hacen en una tabla temporal y después se pasan a la de user) y por ende nunca se crean usuarios. Configuré el hostname correctamente y también el /etc/hosts, y pensé que todo estaría bien, hasta que me di cuenta de que el comando /sbin/hostname seguía regresando “localhost”, y ese comando es el que el script de instalación usa para determinar el nombre del host…

Borré otra vez las tablas creadas con el último fallido mysql_install_db y reinicié la máquina. Ahora el hostname estaba correcto y XFCE ya estaba contento. Abro terminal, me hago root, y ejecuto mysql_install_db… ¡Éxito al fin!

Conclusión

Este error parece ser más común de lo que pensaba, pero las causas que lo provocan son diversas. Aprendí mucho, sí, y fue divertido, pero también es un hecho que deberían documentar más las razones por las que esto se presenta, y también mostrar los mensajes de error que se generan al estar ejecutando mysql_install_db, y en todo caso, también pasarlos al portage cuando se está configurando con emerge –config.

Debo ponerle siempre nombre a la máquina cada vez que instale Linux (lo curioso es que en todas las otras máquinas sí está todo bien configurado, pero como en Gentoo uno hace todo, se me había pasado, por eso solo en Gentoo me daba el error).

Ya escribí mi experiencia en los foros de MySQL (en inglés) a ver si a alguien le sirve de algo. Dejo aquí en el blog todo en español para posibles consultas futuras.