Si usted se encuentra problemas cuando intenta conectar al servidor MySQL, los siguientes elementos explican algunas medidas que se pueden tomar para corregir el problema.
Asegúrese de que el servidor se está ejecutando. Si no se está ejecutando, no puede conectarse a él. Por ejemplo, si intenta conectarse a el servidor y ve un mensaje como cualquiera de los siguientes, podría ser que el servidor no se esté ejecutando:
shell> mysql
ERROR 2003: Can't connect to MySQL server on 'host_name
' (111)
shell> mysql
ERROR 2002: Can't connect to local MySQL server through socket
'/tmp/mysql.sock' (111)
También podría ser que el servidor se esté ejecutando,
pero usted se esté intentando conectar utilizando un puerto
TCP/IP, named pipe, o archivo socket de Unix diferentes de
aquellos a los que el servidor atiende. Para corregir esto
cuando invoca a un programa cliente, especifique la opción
--port
para indicar el puerto adecuado, o
la opción --socket
para indicar la named
pipi o el archivo socket de Unix apropiados. Para averiguar
dónde se encuentra el archivo socket, puede ejecutar:
shell> netstat -ln | grep mysql
Las tablas grant deben estar correctamente configuradas para
que el servidor pueda utilizarlas en el control de acceso.
Para algunos tipos de distribución (como las distribuciones
binarias de Windows, o las distribuciones RPM de Linux), el
proceso de instalación inicializa la base de datos
mysql
que contiene las tablas grant. Para
distribuciones que no hacen esto, usted debe inicializar las
tablas grant manualmente ejecutando el script
mysql_install_db. Para más detalles,
consulte Sección 2.9.2, “Pasos a seguir después de la instalación en Unix”.
Una manera de determinar si debe inicializar las tablas
grant es buscar un directorio mysql
bajo el directorio de datos. (El directorio de datos
normalmente se llama data
o
var
y se encuentra bajo su directorio
de instalación de MySQL.) Asegúrese de que tiene un
archivo llamado user.MYD
en el
directorio mysql
de la base de datos.
Si no, ejecute el script
mysql_install_db. Tras ejecutar este
script e iniciar el servidor, compruebe los privilegio
siniciales ejecutando este comando:
shell> mysql -u root test
El servidor debería dejarle conectar sin error.
Tras una nueva instalación, usted debería conectarse al servidor y configurar sus usuarios y sus permisos de acceso:
shell> mysql -u root mysql
El servidor debería dejarle conectar porque el usuario
MySQL root
no tiene clave de acceso
inicialmente. Esto, además, es un riesgo de seguridad, así
que asignar la clave de acceso para las cuentas
root
es algo que debe hacer mientras se
configuran el resto de usuarios. Puede consultar las
instrucciones para asignar las claves iniciales aquí
Sección 2.9.3, “Hacer seguras las cuentas iniciales de MySQL”.
Si usted ha actualizado una instalación MySQL existente a una nueva versión, ¿ejecutó el script mysql_fix_privilege_tables? En caso negativo, hágalo. La estructura de las tablas grant cambia ocasionalmente cuando se añaden nuevas características, así que tras una actualización debería siempre asegurarse de que sus tablas tienen la estructura actual. Para más instrucciones, consulte Sección 2.10.2, “Aumentar la versión de las tablas de privilegios”.
Si un programa cliente recibe el siguiente mensaje de error cuando intenta conectar, significa que el servidor está esperando las claves de acceso en un formato más nuevo del que el cliente es capaz de generar:
shell> mysql Client does not support authentication protocol requested by server; consider upgrading MySQL client
Para más información sobre atajar este problema, consulte
Sección 5.6.9, “Hashing de contraseñas en MySQL 4.1” y
Sección A.2.3, “Client does not support authentication protocol
”.
Si intenta conectarse como root
y obtiene
el siguiente error, significa que usted no tiene un registro
en la tabla user
con un valor en la
columna User
de 'root'
y que mysqld no puede resolver el nombre
de host para su cliente:
Access denied for user ''@'unknown' to database mysql
En este caso, debería reiniciar el servidor con la opción
--skip-grant-tables
y editar su archivo
/etc/hosts
o
\windows\hosts
para añadir una entrada
para su host.
Recuerde que los programas cliente utilizan parámetros de
conexión especificados en archivos de opciones o variables
de entorno. Si un programa cliente parece estar enviando
parámetros de conexión por defecto incorrectos cuando no
los especifica en línea de comandos, compruebe su entorno y
cualquier archivo de opciones implicado. Por ejemplo, si
obtiene Access denied
cuando intenta
ejecutar un cliente sin ninguna opción, asegúrese de que
no ha especificado una clave de acceso antigua en sus
archivos de opciones.
Puede suprimir el uso de archivos de opciones por parte de
un programa cliente invocándolo con la opción
--no-default
. Por ejemplo:
shell> mysqladmin --no-defaults -u root version
Los archivos de opciones que los clientes utilizan están enumerados en Sección 4.3.2, “Usar ficheros de opciones”. Las variables de entorno se enumeran en Apéndice E, Variables de entorno.
Si obtiene el siguiente error, significa que está
utilizando una clave de root
incorrecta:
shell> mysqladmin -u root -pxxxx
ver
Access denied for user 'root'@'localhost' (using password: YES)
Si este error precedente ocurre aún cuando usted no ha
especificado ninguna clave de acceso, significa que tiene
una clave incorrecta en algún archivo de opciones. Intente
utilizar la opción --no-defaults
como se
explica en el punto anterior.
Para más información sobre el cambio de claves, consulte Sección 5.7.5, “Asignar contraseñas a cuentas”.
Si usted ha perdido u olvidado la clave de
root
, puede reiniciar
mysqld con
--skip-grant-tables
para cambiar la
clave. Consulte Sección A.4.1, “Cómo reiniciar la contraseña de root”.
Si usted cambia la clave utilizando SET
PASSWORD
, INSERT
, o
UPDATE
, debe cifrar la clave utilizando
la función PASSWORD()
. Si no utiliza
PASSWORD()
para estas sentencias, la
clave no funcionará. Por ejemplo, la siguiente sentencia
asigna una clave, pero no la cifra, así que el usuario no
es capaz de conectar tras ella:
mysql> SET PASSWORD FOR 'abe'@'host_name
' = 'eagle';
En vez de esto, debe establecer la clave así:
mysql> SET PASSWORD FOR 'abe'@'host_name
' = PASSWORD('eagle');
La función PASSWORD()
no es necesaria
cuando se especifica la clave utilizando sentencias
GRANT
o (a partir de MySQL 5.0.2)
CREATE USER
, o también con el comando
mysqladmin password, los cuales utilizan
automáticamente PASSWORD()
para cifrar
la clave. Consulte Sección 5.7.5, “Asignar contraseñas a cuentas” y
Sección 13.5.1.1, “Sintaxis de CREATE USER
”.
localhost
es un sinónimo para su nombre
de máquina local, y también es la máquina por defecto al
que los clientes se intentan conectar si no se especifica
explícitamente.
Para evitar este problema en sistemas como ese, puede
utilizar la opción --host=127.0.0.1
para
mencionar la máquina t explícitamente. Esto crea una
conexión TCP/IP al servidor mysqld
local. También puede utilizar TCP/IP especificando una
opción --host
que utilice el nombre real
de la máquina local. En este caso, el nombre de host debe
ser especificado en una fila de la tabla
user
del servidor, aun cuando el cliente
esté corriendo en la misma máquina que el servidor.
Si obtiene un error Access denied
cuando
intenta conectarse a la base de datos con mysql- u
user_name
, puede que tenga un problema con la
tabla user
. Compruebe esto ejecutando
mysql -u root mysql
e introduciendo esta
sentencia SQL:
mysql> SELECT * FROM user;
El resultado debería incluir una fila cuyas columnas
Host
y User
coincidan
con el nombre de su máquina y su nombre de usuario MySQL.
El mensaje de error Access denied
indica
con qué nombre de usuario se está intentando entrar al
sistema, la máquina cliente desde la que se está
intentando conectar, y si se está utilizando clave de
acceso o no. Normalmente, debería tener una línea en la
tabla user
que concuerde exactamente con
el nombre de máquina y el nombre de usuario que se ha
obtenido en el mensaje de error. Por ejemplo, si obtiene un
mensaje de error que contiene using password:
NO
, significa que se ha intentado entrar sin
utilizar una clave de acceso.
Si el siguiente error aparece cuando se intenta conectar
desde una máquina diferente a la que está ejecutando el
servidor MySQL, significa que no hay ninguna fila en la
tabla user
con un valor
Host
que concuerde con la máquina
cliente:
Host ... is not allowed to connect to this MySQL server
Puede corregir esto estableciendo una cuenta para la combinación de nombre de máquina y usuario que está utilizando cuando se intenta conectar.
Si usted no conoce el número de IP o el nombre de máquina
del ordenador desde el que se está conectando, debería
poner una fila con un valor de '%'
en la
columna Host
de la tabla
user
, y reiniciar
mysqld en el servidor con la opción
--log
. Tras intentar conectar desde la
máquina cliente, la información en el log de MySQL indica
desde donde se conectó realmente. (Entonces cambie el valor
'%'
en la tabla user
para introducir el nombre real de la máquina que se muestra
en el log. De otra manera obtendría un sistema inseguro,
porque permitiría conexiones desde cualquier máquina para
ese usuario dado.)
En Linux, hay otra razón por la que este error puede
ocurrir, y es que esté utilizando una versión binaria de
MySQL que haya sido compilada con una versión diferente de
la librería glibc
de la que usted está
utilizando. En este caso, usted debería actualizar su
sistema operativo o glibc
, o descargarse
una distribución MySQL en código fuente y compilarla usted
mismo. Un paquete RPM de código fuente es, normalmente,
trivial de compilar e instalar, así que esto no es un gran
problema.
Si especifica un nombre de máquina cuando se intenta conectar, pero obtiene un mensaje de error donde el nombre de máquina no se muestra, o es un número IP, significa que el servidor MySQL obtuvo un error al intentar resolver el número IP de el cliente a un nombre:
shell> mysqladmin -u root -pxxxx
-hsome-hostname
ver Access denied for user 'root'@'' (using password: YES)
Esto indica que existe un problema con DNS. Para arreglarlo, ejecute mysqladmin flush-hosts para reestablecer la cache interna de DNS. Consulte Sección 7.5.6, “Cómo usa MySQL las DNS”.
Estas son algunas soluciones permanentes:
Intente encontrar qué le ocurre a su servidor DNS y arréglelo.
Especifique números IP en vez de nombres de máquina en las tablas grant de MySQL
Introduzca una línea para la máquina cliente en
/etc/hosts
.
Ejecute mysqld con la opción
--skip-name-resolve
.
Ejecute mysqld con la opción
--skip-host-cache
.
En Unix, si está ejecutando el servidor y el cliente en
la misma máquina, conéctese a
localhost
. Las conexiones a
localhost
en Unix utilizan un archivo
socket en vez de TCP/IP.
En Windows, si está ejecutando cliente y servidor en la
misma máquina, y el servidor tiene activada la
característica de conexión mediante named pipe,
conéctese a .
(punto). Las
conexiones a .
utilizan una named
pipe en vez de TCP/IP.
Si el comando mysql -u root test
funciona
pero mysql -h
termina con un your_hostname
-u root
testAccess
denied
(donde
your_hostname
es el nombre real
de su máquina local), puede que no haya especificado
correctamente el nombre de su máquina en la tabla
user
. Un problema común es que el valor
de Host
en la fila de la tabla
user
especifique un nombre de máquina
incompleto, pero las rutinas de resolución de nombres de
dominio de su sistema retornen un nombre de dominio completo
(o viceversa). Por ejemplo, si tiene una entrada con valor
'tcx'
en Host
de la
tabla user
, pero sus DNS dicen que su
nombre de máquina es 'tcx.subnet.se'
,
esta entrada no funcionará. Intente añadir una entrada a
la tabla user
con un valor de
Host
que contenga un comodín; por
ejemplo 'tcx.%'
. ¡En cualquier caso, el
uso de nombres que acaben con '%
' es
inseguro y no
recomendado!
Si mysql -u
funciona pero user_name
testmysql -u
no
funcionado, entonces es que no tiene concedidos los permisos
para acceder a la base de datos
user_name
other_db_name
other_db_name
para ese usuario
dado.
Si mysql -u
funciona
cuando se ejecuta en la máquina del servidor, pero
user_name
mysql -h
no lo hace
cuando se ejecuta en una máquina cliente remota, entonces
no tiene activado el acceso a el servidor para el usuario
dado en la máquina remota.
host_name
-u
user_name
Si no es capaz de averiguar por qué obtiene el error de
Access denied
, borre de la tabla
user
todos los valores que contengan
comodines (que contengan caracteres '%
' o
'_
'). Un error muy común es insertar un
nuevo registro con
Host
='%'
y
User
='
,
pensando que esto permite especificar que
some_user
'localhost
se conecte desde la misma
máquina. La razón por la que esto no funciona es que los
privilegios por defecto incluyen un registro con
Host
='localhost'
y
User
=''
. Debido a que
ese registro es más específico que '%'
,
se utiliza preferentemente frente al nuevo registro cuando
conecta desde localhost
. El procedimiento
correcto es insertar una segunda entrada con
Host
='localhost'
y
User
='
,
o borrar la entrada con
some_user
'Host
='localhost'
y
User
=''
. Tras borrar
la entrada, recuerde ejecutar una sentencia FLUSH
PRIVILEGES
para recargar las tablas grant.
Si obtiene el siguiente error, puede ser que tenga un
problema con las tablas db
o
host
:
Access to database denied
Si la entrada seleccionada de la tabla db
contiene un valor vacio en la columna
Host
, asegúrese de que hay una o más
entradas correspondientes en la tabla
host
especificando a qué máquinas se
aplica la entrada de la tabla db
.
Si usted puede conectar al servidor MySQL, pero obtiene un
mensaje Access denied
siempre que ejecuta
una sentencia SELECT ... INTO OUTFILE
o
LOAD DATA INFILE
, su entrada en la tabla
user
no tiene el privilegio
FILE
activado.
Si cambia las tablas grant directamente (por ejemplo,
mediante sentencias INSERT
,
UPDATE
, o DELETE
) y
sus cambios parecen que son ignorados, recuerde que debe
ejecutar la sentencia FLUSH PRIVILEGES
statement or el comando mysqladmin
flush-privileges para que el servidor relea las
tablas de privilegios. En otro caso, los cambios no tendrán
efecto hasta la próxima vez que el servidor sea reiniciado.
Recuerde que tras cambiar la clave de
root
con un comando
UPDATE
, no necesita especificar la nueva
clave hasta que se haga la relectura de privilegios, porque
el servidor no sabrá que la clave ha cambiado hasta ese
momento.
Si sus privilegios parecen haber cambiado en el medio de una sesión, podría ser que un administrador de MySQL los haya cambiado. La recarga de las tablas grant afecta a las nuevas conexiones de cliente, pero también a las ya existentes tal y como se indica en Sección 5.6.7, “Cuándo tienen efecto los camios de privilegios”.
Si tiene problemas de acceso con un programa Perl, PHP,
Python u ODBC, intente conectar al servidor con
mysql -u
o
user_name
db_name
mysql -u
. Si puede
conectar utilizando el programa cliente
mysql, el problema está en su programa,
no en los privilegios de acceso. (No hay ningún espacio
entre user_name
-pyour_pass
db_name
-p
y la clave; también puede
utilizar la sintaxis
--password=
para especificar la clave. Si utiliza la opción
your_pass
-p
sola, MySQL le preguntará por la
clave.)
Para hacer comprobaciones, inicie el servidor
mysqld con la opción
--skip-grant-tables
. Puede cambiar las
tablas grant y utilizar el script
mysqlaccess para comprobar que sus
modificaciones tienen el efecto deseado. Cuando esté
satisfecho con los cambios, ejecute mysqladmin
flush-privileges para decirle al servidor
mysqld que comience a utilizar las nuevas
tablas grant. (Recargar las tablas sobresee la opción
--skip-grant-tables
. Esto permite decirle
al servidor que comience a utilizar las tablas sin tener que
reiniciarlo.)
Si todo lo anterior falla, inicie el servidor
mysqld con una opción de depuración
(por ejemplo, --debug=d,general,query
).
Esto imprime la información de host y usuario sobre los
intentos de conexión, así como información sobre cada
comando ejecutado. Consulte
Sección D.1.2, “Crear ficheros de traza”.
Si tiene cualquier otro problema con las tablas grant de
MySQL y cree que debe enviar el problema a la lista de
correo, proporcione siempre un volcado de las tablas grant
MySQL. Puede hacer ete volcado con el comando
mysqldump mysql. Como siempre, envíe su
problema utilizando el script mysqlbug.
Consulte Sección 1.6.1.3, “Cómo informar de bugs y problemas”. En elgunos casos,
podría necesitar reiniciar mysqld con
--skip-grant-tables
para ejecutar
mysqldump.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.