Crea un nuevo usuario en MySQL y dale acceso completo a una base de datos

628

Quiero crear un nuevo usuario en MySQL y darle acceso completo solo a una base de datos, digamos dbTest, que creo con un comando como create database dbTest;. ¿Cuáles serían los comandos de MySQL para hacer eso?

jimgh
fuente

Respuestas:

829

Pruebe esto para crear el usuario:

CREATE USER 'user'@'hostname';

Pruebe esto para darle acceso a la base de datos dbTest:

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

Si está ejecutando el código / sitio accediendo a MySQL en la misma máquina, el nombre de host sería localhost.

Ahora, el desglose.

GRANT - Este es el comando utilizado para crear usuarios y otorgar derechos a bases de datos, tablas, etc.

ALL PRIVILEGES- Esto le dice que el usuario tendrá todos los privilegios estándar. Sin embargo, esto no incluye el privilegio de usar el comando GRANT.

dbtest.*- Estas instrucciones MySQL para aplicar estos derechos para su uso en toda la base de datos dbtest. Puede reemplazar el * con nombres de tabla específicos o almacenar rutinas si lo desea.

TO 'user'@'hostname'- 'usuario' es el nombre de usuario de la cuenta de usuario que está creando. Nota: Debe tener las comillas simples allí. 'hostname' le dice a MySQL desde qué hosts se puede conectar el usuario. Si solo lo desea desde la misma máquina, uselocalhost

IDENTIFIED BY 'password' - Como habrás adivinado, esto establece la contraseña para ese usuario.

Dan McGrath
fuente
82
Si permite el acceso a la red y desea una conexión desde cualquier host, puede cambiar 'hostname' a '%'. Por ejemplo, ... TO 'dbuser' @ '%' IDENTIFIED ... '%' es el comodín del host.
physicsmichael
17
¡No olvide eliminar los privilegios cuando trabaje en usuarios y tablas! :-)
corsiKa
31
Esto funcionó para mí: CREAR USUARIO 'user1' @ 'localhost' IDENTIFICADO POR 'contraseña'; OTORGAR TODOS LOS PRIVILEGIOS EN db_database1. * A 'user1' @ 'localhost' IDENTIFICADO POR 'contraseña'; ENJUAGUE PRIVILEGIOS;
Mohamad Fakih
44
@DanMcGrath: ¿Es obligatoria la cláusula IDENTIFIED BY 'contraseña', si el usuario ya existe y tiene una contraseña?
nanosoft
8
El uso de GRANT para crear un nuevo usuario se eliminará en futuras versiones de MySQL (está en desuso en el momento de escribir esto). En el futuro tendrá que hacerse con dos llamadas, CREAR USUARIO y OTORGAR.
Darren Felton
325

Sintaxis

Para crear un usuario en MySQL / MariaDB 5.7.6 y superior, use la CREATE USERsintaxis :

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'new_password';

luego, para otorgar todo el acceso a la base de datos (p my_db. ej. ), use GRANTSyntax , p. ej.

GRANT ALL ON my_db.* TO 'new_user'@'localhost';

Donde ALL( priv_type ) se puede reemplazar con específica privilegio tales como SELECT, INSERT, UPDATE, ALTER, etc.

Luego, para volver a cargar los permisos recién asignados, ejecute:

FLUSH PRIVILEGES;

Ejecutando

Para ejecutar los comandos anteriores, debe ejecutar el mysqlcomando y escribirlos en prompt, luego cerrar sesión por quitcomando o Ctrl- D.

Para ejecutar desde el shell, use el -eparámetro (reemplace SELECT 1con uno de los comandos anteriores):

$ mysql -e "SELECT 1"

o imprimir la declaración de la entrada estándar:

$ echo "FOO STATEMENT" | mysql

Si tiene acceso denegado con lo anterior, especifique los parámetros -u(para el usuario) y -p(para la contraseña), o para el acceso a largo plazo establezca sus credenciales ~/.my.cnf, por ejemplo

[client]
user=root
password=root

Integración de Shell

Para las personas que no están familiarizadas con la sintaxis de MySQL, aquí hay prácticas funciones de shell que son fáciles de recordar y usar (para usarlas, debe cargar las funciones de shell incluidas más abajo).

Aquí hay un ejemplo:

$ mysql-create-user admin mypass
| CREATE USER 'admin'@'localhost' IDENTIFIED BY 'mypass'

$ mysql-create-db foo
| CREATE DATABASE IF NOT EXISTS foo

$ mysql-grant-db admin foo
| GRANT ALL ON foo.* TO 'admin'@'localhost'
| FLUSH PRIVILEGES

$ mysql-show-grants admin
| SHOW GRANTS FOR 'admin'@'localhost'
| Grants for admin@localhost                                                                                   
| GRANT USAGE ON *.* TO 'admin'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4' |
| GRANT ALL PRIVILEGES ON `foo`.* TO 'admin'@'localhost'

$ mysql-drop-user admin
| DROP USER 'admin'@'localhost'

$ mysql-drop-db foo
| DROP DATABASE IF EXISTS foo

Para usar los comandos anteriores, debe copiar y pegar las siguientes funciones en su archivo rc (p .bash_profile. Ej. ) Y volver a cargar su shell u obtener el archivo. En este caso simplemente escriba source .bash_profile:

# Create user in MySQL/MariaDB.
mysql-create-user() {
  [ -z "$2" ] && { echo "Usage: mysql-create-user (user) (password)"; return; }
  mysql -ve "CREATE USER '$1'@'localhost' IDENTIFIED BY '$2'"
}

# Delete user from MySQL/MariaDB
mysql-drop-user() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-user (user)"; return; }
  mysql -ve "DROP USER '$1'@'localhost';"
}

# Create new database in MySQL/MariaDB.
mysql-create-db() {
  [ -z "$1" ] && { echo "Usage: mysql-create-db (db_name)"; return; }
  mysql -ve "CREATE DATABASE IF NOT EXISTS $1"
}

# Drop database in MySQL/MariaDB.
mysql-drop-db() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-db (db_name)"; return; }
  mysql -ve "DROP DATABASE IF EXISTS $1"
}

# Grant all permissions for user for given database.
mysql-grant-db() {
  [ -z "$2" ] && { echo "Usage: mysql-grand-db (user) (database)"; return; }
  mysql -ve "GRANT ALL ON $2.* TO '$1'@'localhost'"
  mysql -ve "FLUSH PRIVILEGES"
}

# Show current user permissions.
mysql-show-grants() {
  [ -z "$1" ] && { echo "Usage: mysql-show-grants (user)"; return; }
  mysql -ve "SHOW GRANTS FOR '$1'@'localhost'"
}

Nota: Si prefiere no dejar rastros (como contraseñas) en su historial de Bash, verifique: ¿Cómo evitar que se muestren comandos en el historial de bash?

kenorb
fuente
1
¿Necesita crear el usuario y otorgar privilegios por separado? Descubrí que el comando de concesión parece crear el usuario en sí mismo, al menos mirando en la tabla mysql.user que se ve de esa manera.
Tim
@CreativityKills Funcionará con la contraseña si la agrega a su ~/.my.cnfcomo se sugirió anteriormente.
kenorb
dejar rastros de la contraseña en el historial de shell no es una gran idea
dmirkitanov
@dmirkitanov Puede evitar eso agregando un espacio, consulte: ¿Cómo evitar que se muestren comandos en el historial de bash?
kenorb
58

Para crear un usuario y otorgar todos los privilegios en una base de datos.

Inicie sesión en MySQL:

mysql -u root

Ahora crea y otorga

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

Usuario anónimo (solo para pruebas locales)

Alternativamente, si solo desea otorgar acceso completo sin restricciones a una base de datos (por ejemplo, en su máquina local para una instancia de prueba, puede otorgar acceso al usuario anónimo, así:

GRANT ALL PRIVILEGES ON dbTest.* To ''@'hostname'

Se consciente

Esto está bien para los datos basura en desarrollo. No hagas esto con nada que te importe.

superluminario
fuente
3
Puede crear un usuario anónimo así, ¡pero no lo haga! No hay una buena razón para tener un usuario con todos los privilegios y sin contraseña, pero podría arruinarte un día / año / negocio / trabajo algún día si alguien tiene acceso a tu servidor que no debería tener. ¿Por qué hacer algo más fácil para ellos?
Luke Cousins
2
Si alguien ha obtenido acceso remoto a mi macbook, tengo más cosas de las que preocuparme que el contenido de mi base de datos de desarrollo. Debería volver a repetir, esto es solo para pruebas locales, no haga esto con datos reales.
superluminary
44
Exactamente, con todas esas otras cosas de las que preocuparse, no se preocupe también por el contenido de su base de datos de desarrollo. Su base de datos de desarrollo podría (probablemente tendrá) fragmentos de datos de la base de datos en vivo (por ejemplo, para replicar un error), por lo que se debe hacer todo lo posible para mantener la seguridad. Simplemente no hay necesidad de tener acceso a la base de datos sin una contraseña. Ni siquiera ahorra tiempo. No vale la pena la molestia potencial.
Luke Cousins
1
Quizás. En mi caso son datos basura, viviré con el riesgo.
superluminary
17
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"

ignore la opción -p , si el usuario mysql no tiene contraseña o simplemente presione el botón "[Entrar]" para omitir . Las cadenas rodeadas de llaves deben reemplazarse con valores reales.

SK Venkat
fuente
13

Puede crear nuevos usuarios utilizando la declaración CREAR USUARIO y otorgarles derechos mediante GRANT .

candiru
fuente
CREAR USUARIO 'jeffrey' @ 'localhost' IDENTIFICADO POR 'mypass';
cgl
6

Para mí esto funcionó.

CREATE USER 'spowner'@'localhost' IDENTIFIED BY '1234'; 
GRANT ALL PRIVILEGES ON test.* To 'spowner'@'localhost'; 
FLUSH PRIVILEGES;

dónde

  • spowner: nombre de usuario
  • 1234: contraseña del spowner
  • prueba: la base de datos 'spowner' tiene derecho de acceso a
Park JongBum
fuente
2

El siguiente comando funcionará si desea crear un nuevo usuario y darle todo el acceso a una base de datos específica (no todas las bases de datos en su Mysql) en su host local.

GRANT ALL PRIVILEGES ON test_database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Esto otorgará todos los privilegios a una base de datos test_database(en su caso dbTest) a ese usuario en localhost.

Verifique qué permisos emitió ese comando anterior a ese usuario ejecutando el siguiente comando.

SHOW GRANTS FOR 'user'@'localhost'

Por si acaso, si desea limitar el acceso del usuario a una sola tabla

GRANT ALL ON mydb.table_name TO 'someuser'@'host';
Prabhakar Undurthi
fuente
Error de sintaxis y un error tipográfico en su primera línea, los "PRIVILEGIOS EN 'test_datase'" no deben tener comillas, deben tener el ". *" Después, por ejemplo, test_datase. *, Y es un error tipográfico, debe ser "test_database ".
Brettins
0

En caso de que hostse omita la parte, el valor predeterminado es el símbolo comodín %, lo que permite a todos los hosts.

CREATE USER 'service-api';

GRANT ALL PRIVILEGES ON the_db.* TO 'service-api' IDENTIFIED BY 'the_password'

SELECT * FROM mysql.user;
SHOW GRANTS FOR 'service-api'
dummyDev
fuente