PHPFlowPHP, MySQL, Laravel и JavaScript

Пользователи MySQL: как создать пользователя, дать права и сменить пароль

Обновлено:

Коротко

Чтобы создать пользователя MySQL, войдите в консоль под root и выполните CREATE USER 'имя'@'localhost' IDENTIFIED BY 'пароль';, затем выдайте права на базу командой GRANT ALL PRIVILEGES ON база.* TO 'имя'@'localhost';. Начиная с MySQL 8 это две отдельные команды: GRANT больше не создаёт пользователя сам. Ниже - список пользователей, просмотр и отзыв прав, смена пароля, удаление и отличия MariaDB.

Содержание
  1. Как подключиться к MySQL под администратором
  2. Из чего состоит учётная запись MySQL
  3. Как создать пользователя MySQL: CREATE USER
  4. Как посмотреть список пользователей MySQL
  5. Как дать права пользователю на базу: GRANT
  6. Как сменить пароль пользователю MySQL
  7. Как удалить пользователя MySQL и другие действия
  8. Пользователь для удалённого подключения
  9. Отличия MariaDB
  10. Как создать пользователя в phpMyAdmin
  11. Ошибки при работе с пользователями 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 командой mysql -u root -p
Вход в консольный клиент MySQL под администратором: после приглашения mysql> можно вводить команды

Если команда 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 без настроек.

Добавить пользователя и базу для сайта по шагам

  1. Создайте базу: CREATE DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
  2. Создайте пользователя: CREATE USER 'shop_user'@'localhost' IDENTIFIED BY 'надёжный_пароль';
  3. Дайте ему права на эту базу: GRANT ALL PRIVILEGES ON shop.* TO 'shop_user'@'localhost';
  4. Проверьте результат: SHOW GRANTS FOR 'shop_user'@'localhost';
  5. Выйдите командой exit и войдите новым пользователем: mysql -u shop_user -p shop.
CREATE DATABASE, CREATE USER и GRANT в консоли MySQL
Три команды, после которых у сайта есть своя база и пользователь с правами только на неё

Команда 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;
Вывод SELECT user, host FROM mysql.user
Список пользователей MySQL: имя, хост и плагин аутентификации каждой учётной записи

Служебные записи 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 можно запуском сервера без проверки прав. На время процедуры отключите сеть, чтобы никто не подключился извне.

  1. Остановите службу: sudo systemctl stop mysql (в Windows - "Службы" → MySQL84 → "Остановить").
  2. Запустите сервер вручную: sudo mysqld --skip-grant-tables --skip-networking --user=mysql &.
  3. Подключитесь без пароля: mysql -u root.
  4. Загрузите таблицы прав командой FLUSH PRIVILEGES; - без неё ALTER USER в этом режиме не сработает.
  5. Задайте пароль: ALTER USER 'root'@'localhost' IDENTIFIED BY 'новый_пароль';
  6. Остановите временный сервер (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.

Пользователь для удалённого подключения

  1. Создайте пользователя с вашим IP: CREATE USER 'dev'@'203.0.113.25' IDENTIFIED BY 'пароль';
  2. Выдайте права на нужную базу: GRANT ALL ON shop.* TO 'dev'@'203.0.113.25';
  3. В файле /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.
  4. Перезапустите сервер: sudo systemctl restart mysql.
  5. Откройте порт 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.

  1. Откройте вкладку "Учётные записи пользователей" на главной странице панели.
  2. Нажмите ссылку "Добавить учётную запись пользователя".
  3. Заполните "Имя пользователя", в поле "Имя хоста" выберите "Локальный" (localhost) и дважды введите пароль.
  4. Отметьте "Создать базу данных с таким же именем и предоставить на неё все привилегии", если базы ещё нет.
  5. Нажмите "Вперёд" внизу страницы.
Добавление пользователя MySQL в phpMyAdmin
Форма добавления пользователя в phpMyAdmin с созданием одноимённой базы

Ошибки при работе с пользователями 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.