15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij
16.11.2023

Naprawianie błędu “SET PASSWORD Has No Significance for User root@localhost” w MySQL

Błąd "SET PASSWORD has no significance for user 'root'@'localhost'" występuje w MySQL, gdy serwer odmawia przetworzenia polecenia SET PASSWORD dla konta root — zazwyczaj dlatego, że użytkownik root jest uwierzytelniany za pomocą wtyczki auth_socket lub unix_socket zamiast tradycyjnej metody opartej na haśle. W takich konfiguracjach MySQL deleguje uwierzytelnianie do systemu operacyjnego, przez co zmiany poświadczeń opartych na haśle są bezcelowe na poziomie SQL.

Ten przewodnik omawia wszystkie przyczyny źródłowe, właściwą sekwencję diagnostyczną oraz wiele ścieżek rozwiązania — w tym przypadki brzegowe pojawiające się w zarządzanych środowiskach VPS, serwerach opartych na cPanel i zabezpieczonych systemach produkcyjnych.

Dlaczego ten błąd występuje: analiza przyczyn źródłowych

Zrozumienie dokładnego wyzwalacza jest niezbędne przed zastosowaniem jakiejkolwiek poprawki. Błąd nie jest tradycyjnym błędem uprawnień — jest sygnałem, że warstwa uwierzytelniania MySQL jest całkowicie pomijana dla konta root.

Wtyczka auth_socket / unix_socket

W nowoczesnych systemach Debian, Ubuntu i ich pochodnych MySQL (i MariaDB) domyślnie konfiguruje użytkownika root do uwierzytelniania za pomocą wtyczki auth_socket. Gdy ta wtyczka jest aktywna, MySQL weryfikuje tożsamość łączącego się użytkownika systemu operacyjnego zamiast sprawdzać hasło. W konsekwencji każda próba ustawienia hasła za pomocą SET PASSWORD jest odrzucana — serwer uznaje to polecenie za nieistotne dla tego modelu uwierzytelniania.

Możesz to zweryfikować natychmiast po zalogowaniu:

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

Jeśli kolumna plugin zwraca auth_socket (MySQL) lub unix_socket (MariaDB), to jest właśnie Twoja przyczyna źródłowa.

Inne czynniki przyczyniające się do błędu

  • Niewystarczające uprawnienia: Wykonujący użytkownik nie posiada uprawnień SUPER ani SYSTEM_USER wymaganych do modyfikacji poświadczeń roota.
  • Restrykcyjne dyrektywy my.cnf / my.ini: Opcje takie jak skip-grant-tables lub niestandardowe zasady validate_password mogą zakłócać operacje na hasłach.
  • Niezgodność wersji MySQL: Składnia SET PASSWORD została uznana za przestarzałą w MySQL 8.0 i usunięta z niektórych kontekstów. Preferowaną metodą jest ALTER USER.
  • Tabele systemowe tylko do odczytu: W niektórych wdrożeniach chmurowych lub kontenerowych schemat systemowy mysql może być częściowo zablokowany.

Porównanie: SET PASSWORD vs. ALTER USER vs. UPDATE

Te trzy metody nie są wymienne. Wybranie niewłaściwej dla Twojej wersji MySQL lub wtyczki uwierzytelniania spowoduje albo opisywany błąd, albo ciche niepowodzenie.

MetodaObsługiwane wersje MySQLDziała z auth_socketZalecana
SET PASSWORD5.x, częściowo 8.0NieNie (przestarzała)
ALTER USER5.7+, 8.0+Tak (przełącza wtyczkę)Tak
UPDATE mysql.userWszystkie wersje (z flush)Tak (niskopoziomowa)Tylko awaryjnie
mysqladmin passwordWszystkie wersjeNieOgraniczone zastosowanie

Rozwiązanie krok po kroku

Krok 1: Zaloguj się do MySQL jako root

W systemach używających auth_socket musisz zalogować się jako użytkownik root systemu operacyjnego — nie pojawi się monit o hasło:

sudo mysql -u root

Jeśli Twój system używa uwierzytelniania hasłem i znasz aktualne hasło:

mysql -u root -p

Krok 2: Potwierdź wtyczkę uwierzytelniania

Uruchom zapytanie diagnostyczne:

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

Zanotuj wartość w kolumnie plugin przed kontynuowaniem. To określa, która poprawka ma zastosowanie w Twojej sytuacji.

Krok 3: Zweryfikuj bieżące uprawnienia

Przed modyfikacją uwierzytelniania potwierdź zestaw uprawnień konta root:

SHOW GRANTS FOR 'root'@'localhost';

Wynik powinien zawierać GRANT ALL PRIVILEGES ON *.* ... WITH GRANT OPTION. Jeśli nie zawiera, prawdopodobnie jesteś połączony jako użytkownik z niewystarczającymi prawami — ponownie uwierzytelnij się używając sudo mysql, aby skorzystać z zaufania na poziomie systemu operacyjnego.

Krok 4: Przełącz na uwierzytelnianie hasłem i ustaw nowe hasło

To jest główna poprawka, gdy auth_socket lub unix_socket jest aktywną wtyczką. Instrukcja ALTER USER jednocześnie zmienia wtyczkę uwierzytelniania i ustawia hasło w jednej atomowej operacji:

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

FLUSH PRIVILEGES;

Dla MariaDB odpowiednikiem jest:

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

FLUSH PRIVILEGES;

> Uwaga dotycząca bezpieczeństwa: W MySQL 8.0.34 i nowszych mysql_native_password jest przestarzały na rzecz caching_sha2_password. W systemach produkcyjnych użyj:

>

> “`sql

> ALTER USER 'root'@'localhost'

> IDENTIFIED WITH caching_sha2_password

> BY 'YourStrongPassword!9#';

> “`

Krok 5: Przyznaj pełne uprawnienia (jeśli wymagane)

Jeśli sprawdzenie uprawnień w kroku 3 ujawniło niekompletne uprawnienia, przywróć je jawnie:

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

FLUSH PRIVILEGES;

Nie używaj starszej składni GRANT ... IDENTIFIED BY w MySQL 8.0+. Ta połączona składnia została usunięta. Zawsze rozdzielaj instrukcje GRANT i ALTER USER.

Krok 6: Zweryfikuj poprawkę

Potwierdź, że wtyczka została zaktualizowana:

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

Wyjdź z MySQL i połącz się ponownie używając nowego hasła, aby zweryfikować działanie od końca do końca:

mysql -u root -p

Metoda awaryjna: resetowanie przez skip-grant-tables

Jeśli jesteś całkowicie zablokowany i nie możesz się uwierzytelnić, użyj trybu skip-grant-tables. Pomija on wszystkie sprawdzenia uprawnień i powinien być używany wyłącznie w kontrolowanym, offline oknie konserwacyjnym.

1. Zatrzymaj usługę MySQL:

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

2. Uruchom MySQL z wyłączonymi tabelami uprawnień:

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

Flaga --skip-networking jest krytyczna — zapobiega zdalnym połączeniom podczas tego niezabezpieczonego stanu.

3. Połącz się bez poświadczeń:

mysql -u root

4. Odśwież uprawnienia, a następnie zaktualizuj hasło:

FLUSH PRIVILEGES;

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

FLUSH PRIVILEGES;

5. Uruchom ponownie MySQL normalnie:

sudo systemctl restart mysql

Sprawdzanie i dostosowywanie plików konfiguracyjnych MySQL

Plik my.cnf (Linux) lub my.ini (Windows) może zawierać dyrektywy zakłócające operacje na hasłach. Typowe lokalizacje:

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

Sprawdź te problematyczne dyrektywy w sekcji [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

Jeśli validate_password wymusza zasadę odrzucającą wybrane przez Ciebie hasło, albo spełnij wymagania zasady, albo tymczasowo dostosuj poziom zasady:

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

Uwagi dotyczące konkretnych platform

Środowiska cPanel i WHM

W instalacjach VPS z cPanel poświadczenia roota MySQL są zarządzane przez sam cPanel. Ręczna zmiana hasła roota poza WHM może zepsuć wewnętrzne połączenia bazy danych cPanel. Zawsze używaj WHM > SQL Services > Change MySQL Root Password w tych środowiskach. Jeśli musisz użyć CLI, uruchom afterward /usr/local/cpanel/scripts/mysqlpasswd, aby zsynchronizować przechowywane poświadczenia cPanel.

Zarządzane środowiska VPS

W środowisku Hostingu VPS, gdzie masz pełny dostęp root do systemu operacyjnego, podejście sudo mysql (wykorzystujące auth_socket) jest najbardziej niezawodnym punktem wejścia. Unikaj wyłączania auth_socket, chyba że Twój stos aplikacji wymaga konkretnie uwierzytelniania roota opartego na haśle — uwierzytelnianie na poziomie systemu operacyjnego jest architektonicznie bezpieczniejsze.

Serwery dedykowane

Na Serwerach Dedykowanych z zabezpieczonymi konfiguracjami MySQL wtyczka validate_password jest często włączona z wymuszaniem zasad STRONG. Upewnij się, że Twoje zastępcze hasło spełnia minimalne wymagania: co najmniej 8 znaków, mieszane wielkości liter, cyfry i znaki specjalne. Możesz sprawdzić bieżące ustawienia zasad za pomocą:

SHOW VARIABLES LIKE 'validate_password%';

Najlepsze praktyki bezpieczeństwa po rozwiązaniu błędu

Po rozwiązaniu problemu z hasłem roota natychmiast zastosuj te kroki wzmacniające bezpieczeństwo:

  • Uruchom mysql_secure_installation, aby usunąć anonimowych użytkowników, testowe bazy danych i zdalne logowanie roota.
  • Wyłącz zdalne logowanie roota: Upewnij się, że żaden wpis 'root'@'%' nie istnieje w mysql.user.
  • Twórz użytkowników specyficznych dla aplikacji z minimalnymi wymaganymi uprawnieniami zamiast używać roota do połączeń aplikacji.
  • Rotuj poświadczenia przechowywane w plikach konfiguracyjnych aplikacji (.env, wp-config.php, database.yml), aby pasowały do nowego hasła.
  • Włącz SSL/TLS dla połączeń MySQL — szczególnie istotne, jeśli serwer aplikacji i serwer bazy danych znajdują się na oddzielnych hostach. Połącz to z ważnym Certyfikatem SSL na warstwie webowej.
  • Regularnie audytuj tabelę mysql.user, aby identyfikować konta z pustymi wartościami authentication_string lub zbyt szerokimi symbolami wieloznacznymi hosta.

Lista kontrolna kluczowych wniosków technicznych

Użyj tego jako szybkiej macierzy decyzyjnej, gdy napotkasz ten błąd:

  • Najpierw sprawdź wtyczkę — uruchom SELECT plugin FROM mysql.user WHERE user='root' przed podjęciem jakiejkolwiek próby naprawy.
  • Używaj ALTER USER, nie SET PASSWORDSET PASSWORD jest przestarzały w MySQL 8.0+ i niekompatybilny z uwierzytelnianiem opartym na gnieździe.
  • Zawsze używaj sudo mysql w systemach Ubuntu/Debian — zaufanie na poziomie systemu operacyjnego omija wtyczkę gniazda bez jej wyłączania.
  • Nigdy nie pozostawiaj aktywnego skip-grant-tables w środowisku produkcyjnym — usuwa to wszelką kontrolę dostępu z serwera bazy danych.
  • Rozdzielaj GRANT od ALTER USER w MySQL 8.0+ — połączona składnia GRANT ... IDENTIFIED BY już nie istnieje.
  • Na serwerach cPanel używaj WHM lub skryptu resync cPanel — bezpośrednie zmiany przez CLI zepsują wewnętrzne sesje bazy danych cPanel.
  • Weryfikuj poprawkę od końca do końca — ponownie połącz się za pomocą mysql -u root -p po każdej zmianie, aby potwierdzić działanie nowych poświadczeń przed zamknięciem sesji.
  • Przejrzyj my.cnf pod kątem dyrektyw validate_password, jeśli ALTER USER powiedzie się, ale hasło zostanie odrzucone.

Często zadawane pytania

Dlaczego SET PASSWORD działa na niektórych serwerach, a na innych nie?

Zachowanie zależy od wtyczki uwierzytelniania przypisanej do konta root. Na serwerach używających mysql_native_password lub caching_sha2_password, SET PASSWORD może nadal działać w MySQL 5.7. W systemach Ubuntu/Debian, gdzie auth_socket jest domyślny, polecenie jest odrzucane, ponieważ żadne hasło nie jest przechowywane ani sprawdzane. MySQL 8.0 dodatkowo uznał SET PASSWORD za przestarzały, czyniąc ALTER USER jedyną niezawodną metodą działającą we wszystkich wersjach.

Czy mogę ponownie włączyć auth_socket po przełączeniu na uwierzytelnianie hasłem?

Tak. Uruchom ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;, a następnie FLUSH PRIVILEGES;. Po tym sudo mysql będzie działać ponownie bez hasła, a mysql -u root -p zakończy się niepowodzeniem. Jest to zalecana konfiguracja dla systemów, w których wymagany jest tylko lokalny dostęp do roota uwierzytelniony przez system operacyjny.

Jaka jest różnica między FLUSH PRIVILEGES a restartem MySQL?

FLUSH PRIVILEGES przeładowuje tabele uprawnień z dysku do pamięci bez restartowania usługi. Jest wystarczający po bezpośrednich modyfikacjach UPDATE mysql.user. Instrukcje ALTER USER i GRANT zapisują bezpośrednio do tabel uprawnień i wchodzą w życie natychmiast — FLUSH PRIVILEGES jest technicznie zbędny po nich, ale nieszkodliwy i powszechnie stosowany jako środek ostrożności.

Dlaczego GRANT ALL PRIVILEGES ... IDENTIFIED BY nie działa w MySQL 8.0?

MySQL 8.0 usunął możliwość tworzenia lub modyfikowania użytkowników niejawnie w instrukcji GRANT. Klauzula IDENTIFIED BY w GRANT została uznana za przestarzałą w MySQL 5.7 i usunięta w 8.0. Musisz użyć CREATE USER lub ALTER USER osobno, a następnie wydać instrukcję GRANT bez klauzuli IDENTIFIED BY.

Czy bezpieczne jest uruchamianie bazy danych MySQL na planie hostingu współdzielonego?

W przypadku projektów osobistych o niskim ruchu Hosting Współdzielony z zarządzanym MySQL jest wystarczający. Jednak nie będziesz mieć bezpośredniego dostępu do mysql.user, zarządzania GRANT ani plików konfiguracyjnych. W przypadku każdego obciążenia wymagającego bezpośredniej kontroli administracyjnej nad MySQL — w tym rozwiązywania takich błędów jak ten — środowisko Hostingu VPS z dostępem root do systemu operacyjnego jest właściwym wyborem.

15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij