nie można zalogować się jako root użytkownika mysql z normalnego konta użytkownika w Ubuntu 16.04

203

Właśnie zainstalowałem Ubuntu 16.04 LTS wraz z pakietami php, mariadba nginx. Uruchomiłem mysql_secure_installationi zmieniłem hasło roota.

Teraz, gdy próbuję zalogować się mysqlprzy użyciu konta root podczas logowania do Ubuntu jako zwykłego konta użytkownika, dostaję odmowę dostępu.

Kiedy się sudo mysqlloguję, mysql nawet nie pyta mnie o hasło. Po uruchomieniu mysql_secure_installtionwidzę, że stare ustawienia nigdy nie zostały ustawione na stałe.

Co ja robię źle?

zakres kodów
źródło

Odpowiedzi:

359

Niedawno zaktualizowałem moje Ubuntu 15.04 do 16.04 i to zadziałało dla mnie:

  1. Najpierw połącz w sudo mysql

    sudo mysql -u root
    
  2. Sprawdź swoje konta obecne w db

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
  3. Usuń bieżące konto root @ localhost

    mysql> DROP USER 'root'@'localhost';
    Query OK, 0 rows affected (0,00 sec)
    
  4. Utwórz ponownie użytkownika

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  5. Nadaj uprawnienia użytkownikowi (nie zapomnij opróżnić uprawnień)

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0,00 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0,01 sec)
    
  6. Wyjdź z MySQL i spróbuj połączyć się ponownie bez sudo.

Mam nadzieję, że to komuś pomoże :)

Loremhipsum
źródło
16
To była jedyna rzecz, która zadziałała dla mnie, czy ktoś dokładnie wie, co się stało z użytkownikiem root podczas instalacji mysql-server 16.04?
Ruggi,
32
Przytrzymaj, to nie %znaczy, że możesz połączyć się z dowolnego miejsca ... zdalnie?
Stevie G
9
Możesz zmienić wiersz na: CREATE USER 'root' @ 'localhost' IDENTIFIED BY '';
vladnev
11
Dla zainteresowanych: wzorzec niezabezpieczonego mysql root @ localhost to podstawa rozwoju lokalnego, ale nie powinien pojawiać się absolutnie nigdzie indziej.
Charney Kaye,
5
Instrukcja grant dla nowego użytkownika root tutaj nie podaje rootowi „with grant”, więc root nie może go udzielić bez uruchomienia go później: dba.stackexchange.com/a/62046/115679 Zmień instrukcję grant nagrant all privileges on *.* to 'root'@'localhost' with grant option;
Loren
132

Jeśli zainstalujesz 5.7 i nie podasz hasła rootużytkownikowi, użyje auth_socketwtyczki. Ta wtyczka nie ma znaczenia i nie potrzebuje hasła. Sprawdza tylko, czy użytkownik łączy się za pomocą gniazda UNIX, a następnie porównuje nazwę użytkownika.

Zaczerpnięte ze zmiany hasła użytkownika w MySQL 5.7 Z „plugin: auth_socket”

Aby więc zmienić z pluginpowrotem na mysql_native_password:

  1. Zaloguj się przez sudo:

    sudo mysql -u root
    
  2. Zmień plugini ustaw hasło za pomocą jednego polecenia:

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';
    

Oczywiście możesz również użyć powyższego polecenia, aby ustawić puste hasło.

Dla przypomnienia (i MariaDB < 10.2użytkowników) istnieje również inny sposób zmiany tylko pluginbez podania hasła (pozostawiając puste):

update mysql.user set plugin = 'mysql_native_password' where User='root';
// to change the password too (credits goes to Pothi Kalimuthu)
// UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root';
FLUSH PRIVILEGES;
Todor
źródło
2
Dzięki, z jakiegoś powodu to się nagle
ustawiło
4
Ponadto bardziej podoba mi się ta odpowiedź - jest o wiele mniej destrukcyjna ;-)
benzkji
3
Dla MariaDB <10.2, aby zmienić wtyczkę wraz z hasłem, oto zapytanie: UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;Źródło: stackoverflow.com/a/41537019/1004587
Pothi Kalimuthu
5
To powinna być zaakceptowana odpowiedź
Geo C.,
3
Chciałbym móc to zagłosować dwa razy.
James Smith
21

Krótko mówiąc, na MariaDB

UPDATE mysql.user SET plugin = 'mysql_native_password', 
      Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

gdzie zastępujesz NEWPASSWORD odpowiednim hasłem i wszystko inne dosłownie.

Problem polega na tym, że kiedy MariaDB lub MySQL są instalowane / aktualizowane (szczególnie jeśli w pewnym momencie root jest ustawiony bez hasła), to w tabeli Użytkownicy hasło jest faktycznie puste (lub ignorowane), a logowanie zależy od użytkownika systemu odpowiadającego do użytkownika MySQL. Możesz to przetestować w następujący sposób, przechodząc do systemu root, a następnie wpisz:

mysql -uroot -p

Następnie wpisz brak hasła lub nieprawidłowe hasło. Prawdopodobnie zostaniesz wpuszczony. (Możesz nawet zalogować się z katalogu głównego systemu Unix, # mysqlponieważ hasło jest nieistotne, a użytkownik jest zdefiniowany).

Więc co się dzieje? Cóż, jeśli zalogujesz się jako root i wykonaj następujące czynności:

select User,host,plugin from mysql.user; 
+----------------+-----------+-----------------------+
| User           | host      | plugin                |
+----------------+-----------+-----------------------+
| root           | localhost | auth_socket           |
+----------------+-----------+-----------------------+

zanotujesz auth_socket(które możesz przeczytać unix_socketna MariaDB). Gniazda te ignorują hasła i pozwalają odpowiedniemu użytkownikowi Unix wejść bez sprawdzania hasła. Dlatego możesz zalogować się przy użyciu konta root, ale nie przy użyciu innego użytkownika.

Rozwiązaniem jest więc zaktualizowanie użytkowników, aby nie korzystali z auth_socket/unix_socketi poprawnie ustawili hasło.

Na MariaDB (<10.2, patrz komentarze poniżej), który jest na Ubuntu w wersji 16 od 2017 roku, powinno to wystarczyć. NEWPASSWORD to twoje hasło. mysql_native_passwordpiszesz dosłownie.

UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

(Możliwe, że ustawienie pustej wtyczki działałoby. YMMV. Nie próbowałem tego. To jest alternatywa.)

UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

Inaczej:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';

Następnie

FLUSH PRIVILEGES;

Dla przypomnienia, rozwiązanie polegające na usunięciu użytkownika i ponownym utworzeniu go za pomocą „%” całkowicie zablokowało mi bazę danych i może powodować inne problemy, chyba że otrzymasz grantpoprawną instrukcję - łatwiej jest po prostu zaktualizować katalog główny, który już masz.

Z mojego doświadczenia wynika, że ​​problem występuje tylko w przypadku użytkownika root, ponieważ inni użytkownicy zostaną dodani ręcznie, a nie w ramach pierwszej instalacji / aktualizacji.

Gazzer
źródło
2
Okazało się, że działa idealnie. Zastanawiam się jednak, dlaczego zmiana hasła roota mysql_secure_installationnie przyniosła takiego samego efektu. Gdzie przechowuje nowe hasło?
Mausy5043
Czy potrafisz zredagować swoją odpowiedź i powiedzieć więcej o każdym poleceniu w trakcie pracy? Nie jestem pewien, które dotyczą. Czy te dwie zasady UPDATEdotyczą MariaDB <10.2 i ALTERinnych wersji? A czy drugi UPDATEjest alternatywą dla pierwszego, czy też musimy wpisać oba? Na koniec, czy „mysql_native_password” należy wpisać dosłownie, czy też powinniśmy zastąpić je naszym zamierzonym hasłem root do MySQL?
Michael Scheper,
1
@MichaelScheper Minęło trochę czasu, więc nie chcę zbyt wiele edytować, ale oto, co pamiętam. (1) Wykonaj tylko pierwszą AKTUALIZACJĘ (<10.2 może nie być wymogiem). (2) Tak, wpisz „mysql_native_password” dosłownie. Zasadniczo mówisz mariadbowi: „Nie używaj przywilejów uniksowych, korzystaj z przywilejów bazy danych”. To mysql_native_passwordjest ta opcja.
Gazzer
Cholera, źle przeliterowałem „przywilej”!
Gazzer
1
Wygląda na to, że spóźniłeś się z limitem czasowym edycji tylko o 1,5 minuty! Czasami też mnie to frustruje. W każdym razie dzięki!
Michael Scheper,
8

Jeśli zainstalowałeś MySQL / MariaDB z podstawowego repozytorium, użytkownicy nie mogą zalogować się do MySQL jako użytkownik root MySQL z ich logowań uniksowych (nie dotyczy, jeśli mają dostęp sudo )

  1. Zaloguj się do powłoki root MySQL:

    $ sudo mysql -u root -p
    
  2. Wykonaj poniższe zapytania:

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. Otwórz nową powłokę, a następnie:

    $ mysql -u root -p
    

Źródło

Gayan Weerakutti
źródło
Kiedy to zrobiłem, nie mogłem już sudo mysql jako root. Musiałem najpierw su, a następnie mogłem zalogować się do mysql jako root. Więc zmieniłem go z powrotem na auth_socket.
do
Jedno polecenie:mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
Chris Stryczyński
Jeśli chcesz stracić dostęp do instancji MySQL, ta odpowiedź jest łatwa.
Danila Vershinin
2

Spróbuj utworzyć nowe konto mysql, dla mnie to zadziałało (mysql 5.7.12):

  1. Zaloguj się jako sudo:

    sudo mysql -uroot
    
  2. Utwórz nowego użytkownika i nadaj mu uprawnienia (bez hasła):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. Zaloguj się jako nowy użytkownik:

    mysql -uadmin
    
Alex Yakovlev
źródło
2

Musiałem zrobić dwie rzeczy (dzięki @Todor i @Loremhipsum):

update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';

i wtedy:

FLUSH PRIVILEGES;

Nie polecam upuszczać użytkownika root.

Franc Drobnič
źródło
1

Najpierw wypróbuj ten kod,

echo "CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';" > your_init_file.sql
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;" >> your_init_file.sql 
echo "FLUSH PRIVILEGES;" >> your_init_file.sql

i wtedy,

killall mysqld
mysqld_safe --init-file=$PWD/your_init_file.sql

następnie naciśnij Ctrl+Zi wpisz:, bgaby uruchomić proces z pierwszego planu w tle, a następnie zweryfikuj swój dostęp poprzez:

mysql -u root -proot
mysql> show grants;
ADHITHYA SRINIVASAN
źródło
1

Jeśli po prostu uruchomisz komendę mysql dla użytkownika root, uzyskasz dostęp bez pytania o hasło, ponieważ uwierzytelnianie gniazd włączone dla root @ localhost. .

Jedynym sposobem ustawienia hasła jest przejście na uwierzytelnianie rodzime, takie jak:

$ sudo mysql

mysql> ALTER USER 'root' @ 'localhost' IDENTIFIED WITH mysql_native_password BY 'test';

Vadiaz
źródło
0

Dostosowałem niektóre skrypty obsługi, które utworzyłem, do korzystania z MariaDB i napotkałem dokładnie ten problem. Łącząc tutaj wiele informacji, odpowiedź Gazzera jest naprawdę zerowa w numerze; wszystko sprowadza się do ustawienia auth_socket/ unix_socket.

Tak więc podczas korzystania z MariaDB 5.5 (pod Ubuntu 14.04) i MariaDB 10 pod (Ubuntu 16.04), zalogowanie się do MySQL i uruchomienie tego polecenia natychmiast wszystko wyjaśniło:

UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;

Inne odpowiedzi - w tym najwyższa głosowana odpowiedź Loremhipsum na ten post - naprawdę zachęcają do złych praktyk, zalecając upuszczenie użytkownika, a następnie jego odtworzenie. Dla mnie jest to dość radykalne rozwiązanie. Najlepsze / najprostsze rozwiązanie do zniesienia pluginwartości, wyzerowania uprawnień i kontynuowania życia.

JakeGould
źródło
-1

Miałem ten sam problem i uruchomiłem następujące rozwiązanie:

mysql_upgrade --force
klob
źródło
Niestety to nie zadziałało. Ponownie instaluję ubuntu.
zakres kodów
1
Właśnie zrobiłem nową instalację Ubuntu 16.04 i zainstalowałem serwer mariad. Po instalacji uruchomiłem mysql_secure_installation i ustawiłem hasło. Po przejściu pozostałych kroków w instalacji mysql_secure_installation uruchomiłem go ponownie i wygląda na to, że nie zapisuje zmian. Nadal nie mogę się zalogować z mojego normalnego konta użytkownika. Czy to może być błąd?
zakres kodów
To nigdy nie pomoże. Problem nie ma nic wspólnego z faktyczną instalacją pliku binarnego MariaDB, ale raczej rootz pluginustawieniem niestandardowych ustawień użytkownika . Jedyny przypadek, w którym uaktualnienie bazy danych może pomóc w takim przypadku, to mysql_upgradesam proces uwzględnia pluginustawienie, w co wątpię.
JakeGould,