15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати
16.11.2023

Виправлення помилки “SET PASSWORD Has No Significance for User root@localhost” у MySQL

Помилка "SET PASSWORD has no significance for user 'root'@'localhost'" виникає в MySQL, коли сервер відмовляється обробляти команду SET PASSWORD для облікового запису root — зазвичай тому, що користувач root автентифікується через плагін auth_socket або unix_socket, а не через традиційний метод на основі пароля. У таких конфігураціях MySQL делегує автентифікацію операційній системі, що робить зміни облікових даних на основі пароля безглуздими на рівні SQL.

Цей посібник охоплює всі першопричини, правильну послідовність діагностики та кілька шляхів вирішення — включно з граничними випадками, що виникають у керованих середовищах VPS, серверах на основі cPanel та захищених виробничих системах.

Чому виникає ця помилка: аналіз першопричин

Розуміння точного тригера є необхідним перед застосуванням будь-якого виправлення. Помилка — це не збій дозволів у традиційному розумінні, а сигнал про те, що рівень автентифікації MySQL повністю обходиться для облікового запису root.

Плагін auth_socket / unix_socket

У сучасних Debian, Ubuntu та їхніх похідних MySQL (і MariaDB) налаштовують користувача root для автентифікації через плагін auth_socket за замовчуванням. Коли цей плагін активний, MySQL перевіряє ідентичність користувача ОС, що підключається, замість перевірки пароля. Відповідно, будь-яка спроба встановити пароль за допомогою SET PASSWORD відхиляється — сервер вважає цю команду нерелевантною для такої моделі автентифікації.

Ви можете перевірити це одразу після входу:

SELECT user, host, plugin, authentication_string
FROM mysql.user
WHERE user = 'root' AND host = 'localhost';

Якщо стовпець plugin повертає auth_socket (MySQL) або unix_socket (MariaDB), це і є вашою першопричиною.

Інші сприяючі фактори

  • Недостатні привілеї: Виконуючий користувач не має привілеїв SUPER або SYSTEM_USER, необхідних для зміни облікових даних root.
  • Обмежувальні директиви my.cnf / my.ini: Параметри на кшталт skip-grant-tables або власні політики validate_password можуть заважати операціям з паролями.
  • Невідповідність версій MySQL: Синтаксис SET PASSWORD був застарілим у MySQL 8.0 і видалений з певних контекстів. Кращим методом є ALTER USER.
  • Системні таблиці лише для читання: У деяких хмарних або контейнеризованих розгортаннях системна схема mysql може бути частково заблокована.

Порівняння: SET PASSWORD проти ALTER USER проти UPDATE

Ці три методи не є взаємозамінними. Вибір неправильного для вашої версії MySQL або плагіна автентифікації або призведе до розглянутої помилки, або мовчки завершиться невдачею.

МетодПідтримка версій MySQLПрацює з auth_socketРекомендовано
SET PASSWORD5.x, частково 8.0НіНі (застарілий)
ALTER USER5.7+, 8.0+Так (перемикає плагін)Так
UPDATE mysql.userВсі версії (з flush)Так (низькорівневий)Лише в аварійних ситуаціях
mysqladmin passwordВсі версіїНіОбмежене використання

Покрокове вирішення

Крок 1: Увійдіть до MySQL як root

На системах, що використовують auth_socket, ви повинні увійти як користувач root ОС — запит пароля не з’явиться:

sudo mysql -u root

Якщо ваша система використовує автентифікацію за паролем і ви знаєте поточний пароль:

mysql -u root -p

Крок 2: Підтвердіть плагін автентифікації

Виконайте діагностичний запит:

SELECT user, host, plugin, authentication_string
FROM mysql.user
WHERE user = 'root';

Зверніть увагу на значення у стовпці plugin перед продовженням. Це визначає, яке виправлення підходить для вашої ситуації.

Крок 3: Перевірте поточні привілеї

Перед зміною автентифікації підтвердіть набір прав облікового запису root:

SHOW GRANTS FOR 'root'@'localhost';

Вивід повинен містити GRANT ALL PRIVILEGES ON *.* ... WITH GRANT OPTION. Якщо ні, ви, ймовірно, підключені як користувач з недостатніми правами — повторно автентифікуйтесь за допомогою sudo mysql для використання довіри на рівні ОС.

Крок 4: Перейдіть на автентифікацію за паролем і встановіть новий пароль

Це основне виправлення, коли auth_socket або unix_socket є активним плагіном. Оператор ALTER USER одночасно змінює плагін автентифікації та встановлює пароль в одній атомарній операції:

ALTER USER 'root'@'localhost'
  IDENTIFIED WITH mysql_native_password
  BY 'YourStrongPassword!9#';

FLUSH PRIVILEGES;

Для MariaDB еквівалентом є:

ALTER USER 'root'@'localhost'
  IDENTIFIED VIA mysql_native_password
  USING PASSWORD('YourStrongPassword!9#');

FLUSH PRIVILEGES;

> Примітка щодо безпеки: У MySQL 8.0.34 і пізніших версіях mysql_native_password є застарілим на користь caching_sha2_password. Для виробничих систем використовуйте:

>

> “`sql

> ALTER USER 'root'@'localhost'

> IDENTIFIED WITH caching_sha2_password

> BY 'YourStrongPassword!9#';

> “`

Крок 5: Надайте повні привілеї (якщо потрібно)

Якщо перевірка привілеїв на кроці 3 виявила неповні права, відновіть їх явно:

GRANT ALL PRIVILEGES ON *.*
  TO 'root'@'localhost'
  WITH GRANT OPTION;

FLUSH PRIVILEGES;

Не використовуйте застарілий синтаксис GRANT ... IDENTIFIED BY на MySQL 8.0+. Цей комбінований синтаксис був видалений. Завжди розділяйте оператори GRANT та ALTER USER.

Крок 6: Перевірте виправлення

Підтвердіть, що плагін було оновлено:

SELECT user, host, plugin FROM mysql.user WHERE user = 'root';

Вийдіть з MySQL і повторно підключіться за допомогою нового пароля для наскрізної перевірки:

mysql -u root -p

Аварійний метод: скидання через skip-grant-tables

Якщо ви повністю заблоковані і не можете автентифікуватись, використовуйте режим skip-grant-tables. Це обходить усі перевірки привілеїв і повинно використовуватися лише у контрольованому, офлайн-вікні технічного обслуговування.

1. Зупиніть службу MySQL:

sudo systemctl stop mysql
# or for MariaDB:
sudo systemctl stop mariadb

2. Запустіть MySQL з вимкненими таблицями прав:

sudo mysqld_safe --skip-grant-tables --skip-networking &

Прапорець --skip-networking є критичним — він запобігає будь-яким віддаленим підключенням під час цього небезпечного стану.

3. Підключіться без облікових даних:

mysql -u root

4. Скиньте привілеї, потім оновіть пароль:

FLUSH PRIVILEGES;

ALTER USER 'root'@'localhost'
  IDENTIFIED WITH mysql_native_password
  BY 'YourStrongPassword!9#';

FLUSH PRIVILEGES;

5. Перезапустіть MySQL у звичайному режимі:

sudo systemctl restart mysql

Перевірка та налаштування файлів конфігурації MySQL

Файл my.cnf (Linux) або my.ini (Windows) може містити директиви, що заважають операціям з паролями. Поширені розташування:

  • /etc/mysql/my.cnf
  • /etc/my.cnf
  • /etc/mysql/mysql.conf.d/mysqld.cnf

Перевірте наявність цих проблемних директив у розділі [mysqld]:

skip-grant-tables       # Disables all privilege enforcement — remove after recovery
validate_password       # May reject passwords that don't meet complexity rules
bind-address            # Affects remote access, not password changes directly

Якщо validate_password застосовує політику, що відхиляє обраний вами пароль, або виконайте вимоги політики, або тимчасово скоригуйте рівень політики:

SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 8;

Особливості платформ

Середовища cPanel та WHM

На VPS з cPanel облікові дані root MySQL керуються самим cPanel. Ручна зміна пароля root поза WHM може порушити внутрішні підключення до бази даних cPanel. Завжди використовуйте WHM > SQL Services > Change MySQL Root Password для таких середовищ. Якщо вам необхідно використовувати CLI, після цього запустіть /usr/local/cpanel/scripts/mysqlpasswd для повторної синхронізації збережених облікових даних cPanel.

Керовані середовища VPS

У середовищі VPS Хостингу, де у вас є повний доступ root до ОС, підхід sudo mysql (з використанням auth_socket) є найнадійнішою точкою входу. Уникайте вимкнення auth_socket, якщо ваш стек застосунків спеціально не вимагає автентифікації root на основі пароля — автентифікація на рівні ОС є архітектурно більш безпечною.

Виділені сервери

На Виділених серверах із захищеними конфігураціями MySQL плагін validate_password часто увімкнений із застосуванням політики STRONG. Переконайтеся, що ваш замінний пароль відповідає мінімальним вимогам: щонайменше 8 символів, змішаний регістр, цифри та спеціальні символи. Ви можете перевірити поточні налаштування політики за допомогою:

SHOW VARIABLES LIKE 'validate_password%';

Найкращі практики безпеки після вирішення помилки

Після вирішення проблеми з паролем root негайно застосуйте ці кроки з посилення безпеки:

  • Запустіть mysql_secure_installation для видалення анонімних користувачів, тестових баз даних та віддаленого входу root.
  • Вимкніть віддалений вхід root: Переконайтеся, що жоден запис 'root'@'%' не існує в mysql.user.
  • Створіть користувачів для конкретних застосунків з мінімально необхідними привілеями, а не використовуйте root для підключень застосунків.
  • Змінюйте облікові дані, збережені у файлах конфігурації застосунків (.env, wp-config.php, database.yml), відповідно до нового пароля.
  • Увімкніть SSL/TLS для підключень MySQL — особливо актуально, якщо сервер застосунків і сервер бази даних знаходяться на окремих хостах. Поєднайте це з дійсним SSL Сертифікатом на вашому веб-рівні.
  • Регулярно перевіряйте таблицю mysql.user для виявлення облікових записів з порожніми значеннями authentication_string або надто широкими символами підстановки хоста.

Контрольний список ключових технічних висновків

Використовуйте це як матрицю швидких рішень при зустрічі з цією помилкою:

  • Спочатку перевірте плагін — запустіть SELECT plugin FROM mysql.user WHERE user='root' перед спробою будь-якого виправлення.
  • Використовуйте ALTER USER, а не SET PASSWORDSET PASSWORD є застарілим у MySQL 8.0+ і несумісним з автентифікацією на основі сокетів.
  • Завжди використовуйте sudo mysql на системах Ubuntu/Debian — довіра на рівні ОС обходить плагін сокетів без його вимкнення.
  • Ніколи не залишайте skip-grant-tables активним у виробництві — це видаляє весь контроль доступу з вашого сервера бази даних.
  • Розділяйте GRANT від ALTER USER на MySQL 8.0+ — комбінований синтаксис GRANT ... IDENTIFIED BY більше не існує.
  • На серверах cPanel використовуйте WHM або скрипт повторної синхронізації cPanel — прямі зміни через CLI порушать внутрішні сесії бази даних cPanel.
  • Перевіряйте виправлення наскрізно — повторно підключайтесь за допомогою mysql -u root -p після кожної зміни, щоб підтвердити роботу нових облікових даних перед закриттям сесії.
  • Перегляньте my.cnf на наявність директив validate_password, якщо ALTER USER виконується успішно, але пароль відхиляється.

Часті запитання

Чому SET PASSWORD працює на одних серверах, але не на інших?

Поведінка залежить від плагіна автентифікації, призначеного обліковому запису root. На серверах, що використовують mysql_native_password або caching_sha2_password, SET PASSWORD може ще функціонувати в MySQL 5.7. На системах Ubuntu/Debian, де auth_socket є стандартним, команда відхиляється, оскільки пароль не зберігається і не перевіряється. MySQL 8.0 додатково застарів SET PASSWORD, зробивши ALTER USER єдиним надійним методом для всіх версій.

Чи можна повторно увімкнути auth_socket після переходу на автентифікацію за паролем?

Так. Запустіть ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;, а потім FLUSH PRIVILEGES;. Після цього sudo mysql знову працюватиме без пароля, а mysql -u root -p не вдасться. Це рекомендована конфігурація для систем, де потрібен лише локальний доступ до root через автентифікацію ОС.

У чому різниця між FLUSH PRIVILEGES та перезапуском MySQL?

FLUSH PRIVILEGES перезавантажує таблиці прав з диска в пам’ять без перезапуску служби. Цього достатньо після прямих змін UPDATE mysql.user. Оператори ALTER USER та GRANT записують безпосередньо до таблиць прав і набирають чинності негайно — FLUSH PRIVILEGES технічно є надлишковим після них, але нешкідливим і широко використовується як запобіжний захід.

Чому GRANT ALL PRIVILEGES ... IDENTIFIED BY не працює на MySQL 8.0?

MySQL 8.0 видалив можливість неявного створення або зміни користувачів у межах оператора GRANT. Клауза IDENTIFIED BY в GRANT була застарілою в MySQL 5.7 і видалена в 8.0. Ви повинні використовувати CREATE USER або ALTER USER окремо, а потім видавати оператор GRANT без клаузи IDENTIFIED BY.

Чи безпечно запускати базу даних MySQL на плані спільного хостингу?

Для особистих проектів з невеликим трафіком Спільний Веб-хостинг з керованим MySQL є достатнім. Однак у вас не буде прямого доступу до mysql.user, керування GRANT або файлів конфігурації. Для будь-якого навантаження, що вимагає прямого адміністративного контролю над MySQL — включно з вирішенням таких помилок, як ця — середовище VPS Хостингу з доступом root до ОС є відповідним вибором.

15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати