miércoles, 12 de marzo de 2014

Causas de errores Access denied. Mysql


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 scriptmysql_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 scriptmysql_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
  • Si intenta conectarse como root y obtiene el siguiente error, significa que usted no tiene un registro en la tablauser 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\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 PASSWORDINSERT, o UPDATE, debe cifrar la clave utilizando la funciónPASSWORD(). 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” ySecció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 -h some-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 your_hostname -u root test termina con unAccess 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 deHost 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 Hostque contenga un comodín; por ejemplo 'tcx.%'. ¡En cualquier caso, el uso de nombres que acaben con '%' esinseguro y no recomendado!
  • Si mysql -u user_name test funciona pero mysql -u user_name other_db_name no funcionado, entonces es que no tiene concedidos los permisos para acceder a la base de datos other_db_name para ese usuario dado.
  • Si mysql -u user_name funciona cuando se ejecuta en la máquina del servidor, pero mysql -h host_name -u user_name 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.
  • 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='some_user', pensando que esto permite especificar que 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 conHost='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='some_user', o borrar la entrada con 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 tabladb.
  • 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 privilegioFILE activado.
  • Si cambia las tablas grant directamente (por ejemplo, mediante sentencias INSERTUPDATE, 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 conmysql -u user_name db_name o mysql -u user_name -pyour_pass db_name. 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 -p y la clave; también puede utilizar la sintaxis --password=your_pass para especificar la clave. Si utiliza la opción -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 mysqldque 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 comandomysqldump 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.

Fuente:enlace

No hay comentarios:

Publicar un comentario

Entradas populares