Пользователи MySQL: как создать пользователя, дать права и сменить пароль
Коротко
Чтобы создать пользователя MySQL, войдите в консоль под root и выполните CREATE USER 'имя'@'localhost' IDENTIFIED BY 'пароль';, затем выдайте права на базу командой GRANT ALL PRIVILEGES ON база.* TO 'имя'@'localhost';. Начиная с MySQL 8 это две отдельные команды: GRANT больше не создаёт пользователя сам. Ниже - список пользователей, просмотр и отзыв прав, смена пароля, удаление и отличия MariaDB.
Содержание
- Как подключиться к MySQL под администратором
- Из чего состоит учётная запись MySQL
- Как создать пользователя MySQL: CREATE USER
- Как посмотреть список пользователей MySQL
- Как дать права пользователю на базу: GRANT
- Как сменить пароль пользователю MySQL
- Как удалить пользователя MySQL и другие действия
- Пользователь для удалённого подключения
- Отличия MariaDB
- Как создать пользователя в phpMyAdmin
- Ошибки при работе с пользователями MySQL
Как подключиться к MySQL под администратором
Все команды из статьи выполняются в клиенте mysql под пользователем с правом создавать учётные записи - обычно это root. Способ входа зависит от системы:
- Windows, XAMPP, Open Server:
mysql -u root -pиз папкиbinсервера (в XAMPP -C:\xampp\mysql\bin), пароль по умолчанию пустой - просто нажмите Enter; - Ubuntu и Debian:
sudo mysql- root там входит через системного пользователя (плагинauth_socketилиunix_socketв MariaDB) без пароля; - Docker:
docker exec -it имя_контейнера mysql -u root -p.

Если команда mysql не находится, добавьте папку bin в PATH или запускайте клиент по полному пути - подробно об этом в статье про запуск PHP и MySQL из командной строки Windows. Узнать, под кем вы сейчас работаете, можно запросом SELECT CURRENT_USER();.
Из чего состоит учётная запись MySQL
В MySQL пользователь - это пара "имя + хост", записанная как 'shop_user'@'localhost'. Хост указывает, откуда разрешено подключаться. 'shop_user'@'localhost' и 'shop_user'@'%' - две разные учётные записи со своими паролями и правами.
| Хост | Откуда пускает | Когда использовать |
|---|---|---|
localhost | С этого же сервера, через сокет или 127.0.0.1 | Сайт и база на одном сервере |
127.0.0.1 | Только по TCP с этого сервера | Docker-проброс, SSH-туннель |
192.168.1.% | Из локальной сети | Офисный сервер, соседние машины |
203.0.113.25 | С одного внешнего IP | Удалённое подключение с вашего компьютера |
% | С любого адреса | Только вместе с файрволом |
Если хост не указать, MySQL подставит %. Для сайта, который работает на том же сервере, почти всегда нужен localhost.
Как создать пользователя MySQL: CREATE USER
Базовая команда для MySQL 8.0, 8.4 LTS и 9.x:
-- Пользователь для сайта, вход только с этого сервера
CREATE USER 'shop_user'@'localhost' IDENTIFIED BY 'Vt7#qLm2$Rx9';
-- Не падать с ошибкой, если пользователь уже есть
CREATE USER IF NOT EXISTS 'report'@'localhost' IDENTIFIED BY 'Kp4!zW8nYs1e';
Пароль хранится в виде хеша, по умолчанию с плагином caching_sha2_password. Старый mysql_native_password в MySQL 8.4 выключен по умолчанию, а в 9.x удалён совсем, поэтому указывать его в IDENTIFIED WITH не стоит. Современные драйверы - PDO и mysqli в PHP 8.x, mysql2 в Node.js - работают с caching_sha2_password без настроек.
Добавить пользователя и базу для сайта по шагам
- Создайте базу:
CREATE DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; - Создайте пользователя:
CREATE USER 'shop_user'@'localhost' IDENTIFIED BY 'надёжный_пароль'; - Дайте ему права на эту базу:
GRANT ALL PRIVILEGES ON shop.* TO 'shop_user'@'localhost'; - Проверьте результат:
SHOW GRANTS FOR 'shop_user'@'localhost'; - Выйдите командой
exitи войдите новым пользователем:mysql -u shop_user -p shop.

Команда FLUSH PRIVILEGES после CREATE USER и GRANT не нужна: эти команды сразу обновляют права в памяти сервера. Она требуется только если таблицы mysql.* правили напрямую через INSERT или UPDATE, чего лучше не делать.
Как посмотреть список пользователей MySQL
Отдельной команды SHOW USERS в MySQL нет. Учётные записи лежат в системной таблице mysql.user, и посмотреть пользователей можно обычным SELECT:
-- Все пользователи, их хосты и способ аутентификации
SELECT user, host, plugin, account_locked
FROM mysql.user
ORDER BY user, host;

Служебные записи mysql.sys, mysql.session и mysql.infoschema создаёт сам сервер - не удаляйте их. Кто подключён прямо сейчас, показывает SHOW PROCESSLIST;, а свой собственный вход - SELECT USER(), CURRENT_USER();.
Как дать права пользователю на базу: GRANT
Синтаксис: GRANT привилегии ON база.таблица TO 'пользователь'@'хост';. Звёздочка означает "всё": shop.* - все таблицы базы shop, *.* - все базы сервера.
-- Все права на одну базу (обычный вариант для сайта)
GRANT ALL PRIVILEGES ON shop.* TO 'shop_user'@'localhost';
-- Только чтение - для отчётов и аналитики
GRANT SELECT ON shop.* TO 'report'@'localhost';
-- Чтение и запись данных без права менять структуру
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'api'@'localhost';
-- Права на одну таблицу
GRANT SELECT ON shop.orders TO 'report'@'localhost';
| Привилегия | Что разрешает | Кому нужна |
|---|---|---|
SELECT | Читать данные | Всем, кто работает с базой |
INSERT, UPDATE, DELETE | Добавлять, менять, удалять строки | Приложению |
CREATE, ALTER, DROP, INDEX | Менять структуру таблиц | Миграциям Laravel, установщикам CMS |
REFERENCES | Создавать внешние ключи | Миграциям со связями таблиц |
EXECUTE | Вызывать хранимые процедуры | Если в проекте есть процедуры |
ALL PRIVILEGES | Все права на указанный объект | Владельцу базы |
GRANT ALL PRIVILEGES на все базы
Запрос "mysql grant all privileges to user" обычно означает второго администратора. Такой пользователь получает права на все базы и право раздавать их другим:
CREATE USER 'admin2'@'localhost' IDENTIFIED BY 'Q9w!e8R#t7Y6';
GRANT ALL PRIVILEGES ON *.* TO 'admin2'@'localhost' WITH GRANT OPTION;
Не давайте *.* пользователю, под которым работает сайт. Если в коде найдётся SQL-инъекция, злоумышленник получит доступ ко всем базам сервера, а не к одной.
Проверить права: SHOW GRANTS
SHOW GRANTS FOR 'shop_user'@'localhost';
-- Права текущего пользователя
SHOW GRANTS;
Строка GRANT USAGE ON *.* в выводе означает "может подключаться, но прав нет" - она есть у каждого пользователя и сама по себе ничего не разрешает.
Отозвать права: REVOKE
-- Забрать право удалять строки
REVOKE DELETE ON shop.* FROM 'api'@'localhost';
-- Забрать все права, пользователь останется
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'admin2'@'localhost';
Роли в MySQL 8
Если однотипных пользователей много, удобнее завести роль, выдать права ей, а пользователям назначать роль:
CREATE ROLE 'shop_read';
GRANT SELECT ON shop.* TO 'shop_read';
GRANT 'shop_read' TO 'report'@'localhost', 'analyst'@'192.168.1.%';
-- Роль активна сразу после входа
SET DEFAULT ROLE ALL TO 'report'@'localhost', 'analyst'@'192.168.1.%';
Как сменить пароль пользователю MySQL
В MySQL 8 и MariaDB 10.4+ пароль меняется командой ALTER USER. Устаревший способ через UPDATE mysql.user SET password=... больше не работает: такого столбца нет.
-- Сменить пароль другому пользователю (под root)
ALTER USER 'shop_user'@'localhost' IDENTIFIED BY 'Nw3$pass2026!';
-- Сменить свой пароль
ALTER USER USER() IDENTIFIED BY 'Mj8#newPass';
Изменить пароль пользователя MySQL через терминал можно и без входа в клиент - утилитой mysqladmin:
# Спросит текущий пароль, затем установит новый
mysqladmin -u shop_user -p password 'Nw3$pass2026!'
После смены пароля обновите его в настройках сайта: в .env у Laravel (DB_PASSWORD), в wp-config.php у WordPress или в файле подключения через PDO.
Если забыли пароль root на своём сервере
Восстановить доступ к собственной MySQL можно запуском сервера без проверки прав. На время процедуры отключите сеть, чтобы никто не подключился извне.
- Остановите службу:
sudo systemctl stop mysql(в Windows - "Службы" → MySQL84 → "Остановить"). - Запустите сервер вручную:
sudo mysqld --skip-grant-tables --skip-networking --user=mysql &. - Подключитесь без пароля:
mysql -u root. - Загрузите таблицы прав командой
FLUSH PRIVILEGES;- без неё ALTER USER в этом режиме не сработает. - Задайте пароль:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'новый_пароль'; - Остановите временный сервер (
sudo pkill mysqld) и запустите службу обычным способом:sudo systemctl start mysql.
В Ubuntu сначала попробуйте просто sudo mysql: если root работает через auth_socket, пароль вообще не нужен, и сбрасывать ничего не придётся.
Как удалить пользователя MySQL и другие действия
-- Удалить пользователя вместе с его правами
DROP USER 'report'@'localhost';
DROP USER IF EXISTS 'old_user'@'%';
-- Переименовать или сменить хост
RENAME USER 'api'@'localhost' TO 'api'@'10.0.0.%';
-- Временно заблокировать вход, не удаляя
ALTER USER 'api'@'10.0.0.%' ACCOUNT LOCK;
ALTER USER 'api'@'10.0.0.%' ACCOUNT UNLOCK;
Удаление пользователя не трогает базы и таблицы: данные остаются, пропадает только доступ. Если под удаляемым пользователем созданы представления или триггеры с DEFINER, они перестанут работать - перед удалением проверьте их запросом к information_schema.views.
Пользователь для удалённого подключения
- Создайте пользователя с вашим IP:
CREATE USER 'dev'@'203.0.113.25' IDENTIFIED BY 'пароль'; - Выдайте права на нужную базу:
GRANT ALL ON shop.* TO 'dev'@'203.0.113.25'; - В файле
/etc/mysql/mysql.conf.d/mysqld.cnf(MariaDB -/etc/mysql/mariadb.conf.d/50-server.cnf) заменитеbind-address = 127.0.0.1на0.0.0.0. - Перезапустите сервер:
sudo systemctl restart mysql. - Откройте порт 3306 в файрволе только для своего IP:
sudo ufw allow from 203.0.113.25 to any port 3306.
Безопаснее не открывать порт вовсе, а подключаться через SSH-туннель - тогда на сервере достаточно пользователя с хостом localhost.
Отличия MariaDB
- CREATE USER, GRANT, SHOW GRANTS, ALTER USER и DROP USER пишутся так же.
- MariaDB по-прежнему понимает
GRANT ... IDENTIFIED BY, создающий пользователя вместе с правами, но лучше разделять команды - код будет переносимым. - Плагин по умолчанию -
mysql_native_password; можно выбрать более стойкийed25519:CREATE USER 'u'@'localhost' IDENTIFIED VIA ed25519 USING PASSWORD('пароль');. - Сменить пароль можно ещё и командой
SET PASSWORD FOR 'u'@'localhost' = PASSWORD('новый');. - Роли есть с версии 10.0.5, но включаются командой
SET DEFAULT ROLE имя_роли FOR 'u'@'localhost';.
Как создать пользователя в phpMyAdmin
Если консоль непривычна, то же самое делается мышкой. Как войти в панель, описано в статье про phpMyAdmin.
- Откройте вкладку "Учётные записи пользователей" на главной странице панели.
- Нажмите ссылку "Добавить учётную запись пользователя".
- Заполните "Имя пользователя", в поле "Имя хоста" выберите "Локальный" (localhost) и дважды введите пароль.
- Отметьте "Создать базу данных с таким же именем и предоставить на неё все привилегии", если базы ещё нет.
- Нажмите "Вперёд" внизу страницы.

Ошибки при работе с пользователями MySQL
| Ошибка | Причина | Как исправить |
|---|---|---|
| ERROR 1410: You are not allowed to create a user with GRANT | В MySQL 8 GRANT не создаёт пользователя | Сначала CREATE USER, потом GRANT; проверьте, что хост совпадает |
| ERROR 1396: Operation CREATE USER failed | Такой пользователь уже есть | CREATE USER IF NOT EXISTS или DROP USER |
| ERROR 1819: password does not satisfy the current policy | Включён компонент validate_password | Длиннее пароль с цифрами, буквами разного регистра и символами |
| ERROR 1045: Access denied for user | Неверный пароль или нет записи для этого хоста | Сверьте пару имя@хост в mysql.user |
| ERROR 1044: Access denied to database | Нет прав на базу | GRANT на нужную базу |
| Authentication plugin 'caching_sha2_password' cannot be loaded | Старый клиент или драйвер | Обновите клиент, PHP или Workbench |
Частая ловушка с ERROR 1045: пользователь создан как 'dev'@'%', а в системе остался анонимный ''@'localhost' - при входе с этого сервера MySQL выбирает более точный хост и не пускает. Удалите анонимные записи командой DROP USER ''@'localhost';.
Частые вопросы
Как создать пользователя MySQL и дать ему права на базу?
Выполните CREATE USER 'u'@'localhost' IDENTIFIED BY 'пароль';, затем GRANT ALL PRIVILEGES ON база.* TO 'u'@'localhost';. FLUSH PRIVILEGES после этого не нужен.
Как посмотреть пользователей в MySQL?
Запросом SELECT user, host FROM mysql.user; - команды SHOW USERS в MySQL нет. Права конкретного пользователя показывает SHOW GRANTS FOR 'u'@'localhost';.
Почему GRANT выдаёт ошибку 1410?
С MySQL 8.0 GRANT не создаёт новых пользователей. Создайте учётную запись командой CREATE USER с тем же хостом, а потом повторите GRANT.
Как сменить пароль пользователю MySQL?
Командой ALTER USER 'u'@'localhost' IDENTIFIED BY 'новый'; под root или mysqladmin -u u -p password 'новый' в терминале.
Как удалить пользователя MySQL?
DROP USER 'u'@'localhost'; удаляет учётную запись и все её права. Базы и данные при этом остаются.Чем пользователь @localhost отличается от @'%'?
Это разные учётные записи. localhost пускает только с этого сервера, % - с любого адреса; для сайта на том же сервере нужен localhost.



