Глиф Учебники

Как создать пользователя MySQL и дать ему права

Справочник · SQL · 2 минуты чтения

Войдите в MySQL администратором и выполните три команды: создать базу, создать пользователя, выдать права.

Bash
sudo mysql

В Ubuntu и Debian администратор root входит так, без пароля, — проверка идёт по системному пользователю. В других системах — mysql -u root -p.

SQL
CREATE DATABASE shop CHARACTER SET utf8mb4;
CREATE USER 'shop'@'localhost' IDENTIFIED BY 'длинный-сложный-пароль';
GRANT ALL PRIVILEGES ON shop.* TO 'shop'@'localhost';

Теперь программа или сайт подключаются пользователем shop и работают только с базой shop. Проверьте вход — войдите пользователем shop (пароль программа спросит) сразу в базу shop:

Bash
mysql -u shop -p shop

FLUSH PRIVILEGES после CREATE USER и GRANT не нужен: эти команды применяются сразу.

Что значит 'shop'@'localhost'

Пользователь в MySQL — это пара «имя и адрес, с которого он подключается»:

ЗаписьОткуда можно войти
'shop'@'localhost'только с этого же сервера
'shop'@'192.168.1.20'только с одного адреса
'shop'@'192.168.1.%'из всей сети 192.168.1.x
'shop'@'%'с любого адреса

'shop'@'localhost' и 'shop'@'%' — разные пользователи, с разными паролями и правами. Для сайта на том же сервере, что и база, нужен localhost.

'%' пускает с любого адреса в интернете, если порт MySQL (3306) открыт наружу. Боты подбирают пароли к открытым базам круглосуточно. Разрешайте вход только из своей сети или с нужного адреса и не открывайте порт 3306 в брандмауэре для всех.

Чтобы подключаться с другого компьютера, мало создать пользователя: сам сервер MySQL в Ubuntu по умолчанию слушает только 127.0.0.1. Это меняет параметр bind-address в его файле настроек, после чего сервер перезапускают.

Какие права выдать

ЗадачаКоманда
Всё в одной базеGRANT ALL PRIVILEGES ON shop.* TO 'shop'@'localhost';
Только чтениеGRANT SELECT ON shop.* TO 'report'@'localhost';
Чтение и изменение строкGRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'app'@'localhost';
Посмотреть праваSHOW GRANTS FOR 'shop'@'localhost';
Забрать правоREVOKE DELETE ON shop.* FROM 'app'@'localhost';

Не давайте программам права на все базы (ON *.*) и WITH GRANT OPTION: если пароль утечёт, пострадает только одна база.

Сменить пароль и удалить

SQL
ALTER USER 'shop'@'localhost' IDENTIFIED BY 'новый-пароль';
DROP USER 'shop'@'localhost';

DROP USER удаляет пользователя и его права, но не базу и не данные.

Частые ошибки

А в PostgreSQL

SQL
CREATE USER shop WITH PASSWORD 'длинный-сложный-пароль';
CREATE DATABASE shop OWNER shop;

Владелец базы получает на неё все права. Войти администратором в Ubuntu — sudo -u postgres psql. В SQLite пользователей нет вовсе: доступ к базе определяется правами на её файл.