Cómo crear un usuario en MySQL: 3 formas diferentes

MySQL es un sistema de gestión de bases de datos claramente orientado a la web, y una de los síntomas en su arquitectura ha venido siendo que la creación de los usuarios se realiza en la misma sentencia que el permiso (grant) de acceso a una o varias bases de datos. La orientación de MySQL va cambiando con el tiempo y el uso que se le da a las bases de datos cada vez trasciende más el entorno web, actualmente hay tres formas de crear un usuario:

la forma clásica, con la sentencia GRANT

Utilizando la sentencia GRANT podemos crear un usuario a la par que otorgarle uno o varios privilegios sobre los objetos de una base de datos, o la base de datos completa.
Al encontrarse una sentencia de tipo GRANT, el motor de MySQL revisa si el usuario existe previamente para el contexto que estamos asignándole permisos, y si dicho usuario no está presente en el sistema, lo crea.
No entraré en detalles sobre todas las opciones que nos permite ejecutar la sentencia GRANT, sino solo en las que se refieren a la creación del usuario.
Pongamos un ejemplo, queremos crear el usuario adolfo para la base de datos test:

- Nos conectamos con un usuario que tenga privilegios, root, como propietario de la base de datos, los tiene.

$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.0.67 Source distribution

Nos conectamos utilizando -u para indicarle el usuario y si quisieramos indicarle un password, deberiamos poner -p (sin añadirle la contraseña), en este caso la cuenta root, al ser una máquina de desarrollo, está desprotegida.

- Lanzamos la sentencia GRANT, indicando los permisos que otorgamos, la base de datos y los objetos de la misma sobre los que estamos asignando privilegios, el nombre del usuario y el password:

mysql> GRANT SELECT, INSERT ON test.* TO 'adolfo'@'localhost' IDENTIFIED BY 'pass_adolfo';

En este ejemplo permitimos al usuario adolfo que seleccione (SELECT) e inserte (INSERT) en todos los objetos (*) de la base de datos test, además indicamos que el contexto sea la máquina local de la base de datos (localhost), lo que impedirá que el usuario se conecte desde otras máquinas, y finalmente asignamos un password mediante IDENTIFIED BY.

Si quisieramos que el usuario no tuviera un password, deberemos omitir la cláusula IDENTIFIED BY.
En el caso de que el modo SQL del servidor estuviera en NO_AUTO_CREATE_USER, la creación de usuarios no estaría permitida a no ser que tuvieran asignado un password no vacío.

- Una vez hecho esto, podremos conectarnos con nuestro usuario y realizar las acciones para las que hemos asignado permisos:

$ mysql -u adolfo -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 5.0.67 Source distribution
mysql> use test;
Database changed
mysql> select * from frutas;
+-----------+----------+
| nombre    | color    |
+-----------+----------+
| fresa     | rojo     |
| manzana   | verde    |
| uva       | verde    |
+-----------+----------+
3 rows in set (0,03 sec)

Más detalles sobre la sentencia GRANT y los privilegios disponibles en la documentación de mysql.

la sentencia CREATE USER

A partir de la versión MySQL 5.0.2 existe la posibilidad de crear usuarios sin necesidad de asignarles privilegios, utilizando la sentencia CREATE USER.

Por ejemplo, para crear el usuario fernando:

$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.0.67 Source distribution
mysql> CREATE USER 'fernando'@'localhost' IDENTIFIED BY 'fer_pass';
Query OK, 0 rows affected (0,00 sec)

Al igual que con la sentencia GRANT, el contexto 'localhost' define que el usuario solamente se puede conectar desde el servidor de MySQL, y el IDENTIFIED BY define el password del usuario, se puede omitir, para un usuario sin password, siempre que el modo SQL no sea NO_AUTO_CREATE_USER.

Conexión con el usuario, utilizando la opción -p:

$ mysql -u fernando -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.0.67 Source distribution

Los privilegios necesarios para ejecutar la sentencia CREATE USER son CREATE USER o bien INSERT en la base de datos mysql.
El usuario recién creado no tiene privilegio alguno, por lo que deberemos asignarle permisos utilizando sentencias GRANT (esta vez sin la cláusula IDENTIFIED BY).

Más detalles sobre esta sentencia en la documentación de mysql.

modo hardcore: insertando en la tabla users

Este es un método que MySQL no recomienda demasiado, es un poco más complejo que los otros dos, pero va bien a la hora de resolver problemas, como que por ejemplo alguno de las formas anteriores esté dando algún problema extraño.
Para ello es necesario un usuario con privilegio INSERT en la base de datos mysql. También debo decir que se ha de tener mucho cuidado con esta base de datos, ya que contiene toda la información de usuarios y permisos.

Ejemplo de creación del usuario mariano usando INSERT en nuestra base de datos. Nos conectamos con un usuario con privilegios, en este caso root, y seleccionamos la base de datos mysql mediante la sentencia USE.

$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 5.0.67 Source distribution
mysql> use mysql
Database changed

Y después realizamos la sentencia de inserción para añadir nuestro usuario:

mysql> INSERT INTO user VALUES('localhost','mariano',PASSWORD('pass_mariano'),'Y','Y',
'N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N',
'N','N','N','','','','',0,0,0,0);
Query OK, 1 row affected (0,00 sec)

Es necesario llamar a la función PASSWORD() para almacenar el password codificado, en los otros casos, el IDENTIFIED BY se encarga de hacer la codificación.
En este caso se le dan permisos globales de INSERT y SELECT, para saber a qué corresponde cada columna, se puede hacer un DESCRIBE user.

mysql> DESCRIBE user;
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field                 | Type                              | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host                  | char(60)                          | NO   | PRI |         |       |
| User                  | char(16)                          | NO   | PRI |         |       |
| Password              | char(41)                          | NO   |     |         |       |
| Select_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv         | enum('N','Y')                     | NO   |     | N       |       |
(...)

Para asignar privilegios a bases de datos específicas o tablas específicas, se debe usar GRANT.
Utilizando este método, tenemos que forzar que se refresquen las tablas de permisos usando FLUSH PRIVILEGES.

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0,01 sec)

Una vez hecho esto, ya nos podremos conectar:

$ mysql -u mariano -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 28
Server version: 5.0.67 Source distribution

Más información sobre el uso de este método, en comparación con el GRANT, en la documentación de mysql.

otras consideraciones

También se pueden crear usuarios desde la herramienta visual MySQL Administrator, que forma parte de las GUI Tools que ofrece gratuitamente MySQL y se pueden descargar desde aquí. (Es multiplataforma, pero en Mac funciona bastante mal)

Para saber con qué usuario estamos conectados en este momento, podemos usar la función CURRENT_USER() o USER().

mysql> SELECT CURRENT_USER();
+------------------+
| CURRENT_USER()   |
+------------------+
| adolfo@localhost |
+------------------+
1 row in set (0,00 sec)

Al crear un usuario, se define el contexto desde el que se puede conectar, por ejemplo 'adolfo'@'localhost' solamente se puede conectar desde el mismo servidor de la base de datos, para crear usuarios que se puedan conectar desde varias máquinas, se puede crear un usuario por cada máquina o usar el comodín '%', el usuario 'adolfo'@'%' se podría conectar desde cualquier máquina, y el usuario 'fernando'@'192.168.1.%' se podría conectar desde máquinas con una dirección IP comprendida entre 192.168.1.1 y 129.168.1.255.

Por ejemplo:

GRANT SELECT, INSERT ON test.* TO 'adolfo'@'%' IDENTIFIED BY 'pass_adolfo';
CREATE USER 'fernando'@'192.168.1.%' IDENTIFIED BY 'fer_pass';

En el caso de que estemos realizando la creación de un usuario mediante el método INSERT y nos aparezca el siguiente error:

ERROR 1136 (21S01): Column count doesn't match value count at row 1

La razón es que algunas de las columnas de la tabla user no tienen valor por defecto (por ejemplo ssl_type), y no las hemos informado todas, es necesario hacerlo.

categorías: 

Comentarios

[...] Como crear un usuario en Mysql [...]

como se hace pare tener un asuario esque no lo es tengo 12 anyos ok aaaaaaaah!! no tengo urt vale.

Lo siento ouissal, no tengo ni idea de lo que me pides.

aprende a escribir!!!!!!! los niños de estoy dias son una desgracia.me acuerdo cuando yo era un niño si hacias algo mal te daban un latigaso hasta sangarte. cuidado.

que idiota niño aprende a escribir. los niños de estos dias son una desgracia.

boby no creo que sea necesario ser tan drástico!!!! solo con que se explicara un poco mejor sería suficiente para ayudarle :)

Magnífico el comentario de aprende a escribir: "Los niños de estoy días", "latigaso hasta sangarte" ... :P

cree el grant pero no se como disponer de este.

me sale siempre el usuario root...no se que hacer?

@xiomy_palacios, necesitaría más datos para poderte ayudar, si no me dices la instrucción exacta que has utilizado o cuando te sale el usuario root no podré hacer nada

@Curro a mi me parece muy bruto! el pobre chaval no creo que tenga culpa ;)

[...] Cómo crear un usuario en MySQL: 3 formas diferentes (3.080 visitas) [...]

al abrir la pantalla de mysql la primera instruccion que me pide es la contraseña de root. utilice las tres opciones que anteriormente mencionan para crear el usuario diferente de root... pero launica manera que puedo crearlo es dentro del usuario root

Para conectarte con otro usuario que no sea root, deberías poner

<code>mysql -u nombre_usuario -p </code>

El -p solo en caso que requiera password.

Si el problema que tienes es que pruebas a crear usuarios desde otro usuario que no es root y no te deja, probablemente sea porque no tienes privilegios suficientes desde ese usuario, te debería aparecer un error parecido a este:

<code>ERROR 1227 (42000): Access denied; you need the CREATE USER privilege for this operation</code>

En ese caso, deberás conectarte como root y asignarle permisos al usuario con el que quieras crear otros usuarios:

<code>GRANT create user ON *.* TO usuario_generador@localhost;</code>

¿como se crea un usuario con su sin iniciar sesion root?

¿porque cuando uso?
GRANT SELECT, INSERT ON demo.* TO 'jose'@'localhost' IDENTIFIED BY '1';
para crear un suaurio
si crea el usuario pero sin privilegios SELECT e INSERT
lo hago como root
algien me puede ayudar

@antonio, en el comentario inmediatamente anterior al tuyo encontrarás la respuesta

@Hiram puede ser que la base de datos demo no exista o que no estés utilizando esa sino otra?

si existe la base de datos, y la estoy usando

use demo;
GRANT SELECT, INSERT ON demo.* TO 'jose'@'localhost' IDENTIFIED BY '1';

si crea el usuario correctamente, pero sin los privilegios que le puse en este caso SELECT,INSERT lo crea vacio sin privilegios

¿Estás comprobando los privilegios en la tabla user del esquema information_schema?
¿estás creando el usuario con un usuario de mysql que tenga el privilegio create user y también privilegios sobre las tablas?
¿has probado las tres maneras que propongo en este artículo?

Saludos!

[...] usar la sentencia CREATE DATABASE nombre_bbdd; y para crear el usuario, podemos usar una de las tres formas de crear usuarios en MySQL que publiqué hace unos [...]

la verdad es que he visto miles de foros blogs y demas en busca de material para aprender y la verdad es que sin gente como ustedes el conocimiento estaria solo al alcance de unos cuantos, pues por medios como estos yo he aprendido muchisimo acerca de programacion mysql php java, etc etc

mi mas sincero respeto, tanto al que responde komo al que pregunta

gracias!

Exelente informe se agradece

Se nota que son unos reprimidos , será que los golpeaban de niños , será por ese motivo que se creen superiores por escribir adecuadamente , en realidad lo importante es el interés del niño , deberían ayudar primero y tratar de corregir luego. quizás ustedes no tengan hijos. gente adulta maltratando a un niño , es de no creer su actitud.

Ariel tampoco seas dramático, no se contra quien descargas tu rabia pero tampoco sabes si boby es un adulto ;)

Yo he dejado clara mi postura, no entiendo la pregunta pero tampoco hay que ponerse ni drástico ni dramático.

TEngo un problema.. pues tengo dos bases de datos en diferentes equipos, ambas bases son misma version y todo... pero necesito conectar un sitio en php q esta en la makina 2 a la maquina 1, pero me marca esto:

Warning: mysql_connect() [function.mysql-connect]: Host 'devil.gateway.2wire.net' is not allowed to connect to this MySQL server

Pense que era por privilegio de usuarios por eso empece a indagar y sigo en eso.. si alguien pudiera orientarme, se los agradeceria..

gracias de antemano

El error que te está dando es porque si quieres dar permisos para que un usuario se conecte desde otra máquina, debes sustituir el usuario@'localhost' por usuario@'nombre_maquina' donde nombre_maquina es la ip o nombre único del servidor al que quieras acceder.
De todas formas no es una práctica demasiado recomendable, ya que hará que los datos se transmitan directamente entre las máquinas, puede que no sea la solución más segura.

I am so bad with MySQL, I keep getting that same error

Si me pueden ayudar con este problema
DBI connect failed : Access denied for user: '@localhost' to database 'mysql'

El error que te está dando es porque no has generado los permisos correctos para el usuario, tendrías que especificar qué sentencias has ejecutado para saber más, pero probablemente sea un problema a la hora de hacer el GRANT.

[...] base de datos es accesible desde fuera del propio servidor. Si no sabes como se hace te recomiendo este post y este otro [...]

Mmm te recomiendo que visites esta página

http://www.sindominio.net/ayuda/preguntas-inteligentes.html

Te ayudará mucho a educarte en cómo debes preguntar, tengas la edad que tengas, tengas el conocimiento que tengas... SWTF y RTFM.

Y una visita por acá para que complementes o inicies bien tu conocimiento:

http://dev.mysql.com/doc/refman/5.0/es/index.html

Hola, tengo problemas configure el mysql recuerdo la clave pero no se cual es el usuario no recuerdo haberle ingresado ningun nombre de usuario cuando la configure solo me pidio la contraseña ahora no puedo entrar al mysql

estoy tratando de instalar estos programas porque quiero hacer una pagina web en php pero todo ha sido complicado con la istalación por fa ayudenme no se que hacer para toda instalación se presenta un problema

quiro una fanta

che no hay una pagina para poderse registrar si la tienes publicala

¿crear usuarios con su -c?

Disculpa, cree una base de datos como localhost con Mysql, ahora necesito saber como acceder a ella en otra computadora que estan en la misma red, recuerdo que una vez vi algo por el estilo creando nuevos usuarios pero no se como es exactamente agradeceria mucho tu ayuda

<p>bere, la respuesta a tu pregunta está en el final del artículo.</p>

es un sitio muy bueno, la neta se la rifan

¿como puedo ingresar a una cuenta en MySQL?
cual es la sintáxis?

Q tal espero y me puedan ayudar ya que soy novato en mysql.
desde la consola entro como root y creo un usuario de la siguiente manera
GRANT ALL ON tabla.* to usuario@localhost IDENTIFIED BY "contraseña";
me resulta correcto y cuando intento ingresar desde la consola mysql de la siguiente forma:
mysql -u usuario -p
me produce el siguiente error:
Access denied for user 'usuario'@'localhost' (using password: YES)
espero y puedan ayudarme

<p>zurdo, donde pones GRANT ALL ON tabla.* ... en lugar de tabla, debe ser el nombre de la base de datos en realidad, poniendo:</p>
<p>GRANT ALL ON bbdd.* to usuario@'localhost' IDENTIFIED BY 'contraseña';</p>
<p>te deberia funcionar, bbdd.* indica que de la base de datos "bbdd", le damos permisos a todas las tablas (*)</p>

este yo tengo una duda como seria para seleccionar solo tablas especificas

GRANT ALL ON tabla.* to 'usuario'@'localhost' IDENTIFIED BY "contraseña";

tengo una bd en sql server 2000 y cada vez que intento acceder a ella por medio de una aplicacion de access me pide el usuario y contraseña. y es molesto estar colocandola cada vez que quiero entrar. como se la quito???????
urgente

no mames no sabia que tenias que sumar esos numeros!!!
ya me dio hueva escribir todo de nuevo...

HOla soy nueva y quisiera saber si en el modo hardcore es necesario escribir tantas n's y para que sirven....
ayuda !!!!

boby espero que tengas hijos y que sean los peores del mundo y cuando se mueran en tu cara te digan "esque somos una desgracia"

¿Acaso no les parece tonto que los que se quejen que el chico escribió mal sigan escribiendo mal ellos también? y es algo que repiten una y otra vez, primero, me parece una bestialidad lo de los golpes, segundo así no se educa, tercero se escribe latigaZo, pero a lo que venía, me pareció un excelente post, gracias por la ayuda, el primer resultado google que revise fue este y todo salió perfecto!

Hola, como andan?

Tengo una pregunta.. ¿el usuario que puede acceder desde cualquier máquina, también puede hacerlo desde localhost? gracias

Dios los bendiga.

segun veo en la consulta uno le dice desde donde quieres que pueda acceder el usuario

si quieres que lo pueda hacer desde localhost deberías crearlo con 'usuario'@'localhost'

y según vi en otro lado (no recuerdo si sale arriba, porque lei hasta donde me servía XD), si quieren que el usuario sea valido en todas las máquinas yo uso 'usuario'@'%' pero hay que tener cuidado porque así se puede entrar desde CUALQUIER máquina

Gracias por la información.
Pistonuda la entrada del blog. Son buenos hasta los comentarios sobre el niño.
Muy instructivos.
;-)

Hola gracias por la info me sirvio mucho... espero que sigas subiendo nuevos tutoriales de mysql saludos!

Hola a todos, no puedo ingresar como usuario, ¿Podria alguien ayudarme?
He hecho lo siguiente:

Entro como root:

mysql -u root -p
Enter password:

mysql>

ahora creo una base de datos con nombre "mailserver":

create database mailserver;

ahora creo el usuario "mailuser"

GRANT SELECT ON mailserver.*
TO 'mailuser'@'127.0.0.1'
IDENTIFIED BY 'aquí_una_contraseña';
flush privileges;
exit

Ahora entro a mi base de datos

mysql -u mailuser -p mailserver
Enter password:

Y NO PUEDO, ESCRIBO LA CONTRASEÑA Y NO ME DEJA ENTRAR:

Si entro como root y veo los privilegios del usuario mailuser me muestra una contraseña del tipo >> '*58930GD88D8G8D8GSLJFSF'
Si intento entrar con esta contraseña de numeros y letras tampoco me deja entrar
¿Donde estoy haciendo el fallo?

Gracias y enhorabuena por este foro

Ante todo muchas gracias por la info..
esta muy buena..
Me quedo todo muy claro menos la ultima parte, exactamente esta estrofa:

"La razón es que algunas de las columnas de la tabla user no tienen valor por defecto (por ejemplo ssl_type), y no las hemos informado todas, es necesario hacerlo."

mi pregunta es: ¿A que se refiere cuando escribes:"y no las hemos informado todas"..?, y si pudiera explicar que significa "N" , "Y" porque los veo por montones en la ultima forma de crear usuario.
Muchas Gracias...xD

Muy bien redactado, creo que hay una sutil diferencia entre user y current_user mientras el primero te lista la información del usuario actual independientemente esté autorizado ante la base de datos; el segundo reconoce aquella situación en la que dicho usuario es un usuario invitado.

Añadir nuevo comentario

 
 
 

Creative Commons License
Excepto donde se indique lo contrario, el contenido de este sitio está sujeto a una licencia de Creative Commons.