tidak dapat masuk sebagai root pengguna mysql dari akun pengguna normal di ubuntu 16.04

203

Saya baru saja menginstal Ubuntu 16.04 LTS beserta paketnya php, mariadbdan nginx. Saya berlari mysql_secure_installationdan mengubah kata sandi root.

Sekarang ketika saya mencoba login untuk mysqlmenggunakan akun root saat login di Ubuntu sebagai akun pengguna normal saya mendapat akses ditolak.

Ketika saya login menggunakan sudo mysql, mysql bahkan tidak meminta saya kata sandi. Jika saya menjalankan, mysql_secure_installtionsaya melihat bahwa pengaturan lama tidak pernah diset secara permanen.

Apa yang saya lakukan salah?

kodecope
sumber

Jawaban:

359

Baru-baru ini saya memutakhirkan Ubuntu 15.04 hingga 16.04 dan ini berhasil bagi saya:

  1. Pertama, hubungkan di sudo mysql

    sudo mysql -u root
    
  2. Periksa akun Anda di db

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
  3. Hapus akun root @ localhost saat ini

    mysql> DROP USER 'root'@'localhost';
    Query OK, 0 rows affected (0,00 sec)
    
  4. Buat kembali pengguna Anda

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  5. Berikan izin kepada pengguna Anda (jangan lupa untuk membuka hak istimewa)

    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. Keluar dari MySQL dan coba sambungkan kembali tanpa sudo.

Saya harap ini akan membantu seseorang :)

Loremhipsum
sumber
16
Ini adalah satu-satunya hal yang bekerja untuk saya, apakah ada yang tahu persis apa yang terjadi dengan pengguna root ketika Anda menginstal server mysql pada 16,04?
Ruggi
32
Tahan, Tidak %berarti Anda dapat terhubung dari mana saja ... dari jarak jauh?
Stevie G
9
Anda dapat mengubah baris menjadi: CREATE USER 'root' @ 'localhost' IDENTIFIED BY '';
vladnev
11
Bagi yang berkepentingan dengan keamanan: pola koneksi mysql root @ localhost yang tidak aman adalah bahan pokok pengembangan lokal tetapi tidak terlihat sama sekali di tempat lain.
Charney Kaye
5
Pernyataan hibah untuk pengguna root baru di sini tidak memberikan "dengan hibah" untuk di-root sehingga root tidak dapat memberikan tanpa menjalankan ini setelah itu: dba.stackexchange.com/a/62046/115679 Silakan ubah pernyataan hibah kegrant all privileges on *.* to 'root'@'localhost' with grant option;
Loren
132

Jika Anda menginstal 5.7 dan tidak memberikan kata sandi kepada rootpengguna, itu akan menggunakan auth_socketplugin. Plugin itu tidak peduli dan tidak perlu kata sandi. Itu hanya memeriksa apakah pengguna terhubung menggunakan soket UNIX dan kemudian membandingkan nama pengguna.

Diambil dari Ubah Kata Sandi Pengguna di MySQL 5.7 Dengan "plugin: auth_socket"

Jadi untuk mengubah pluginkembali ke mysql_native_password:

  1. Login dengan sudo:

    sudo mysql -u root
    
  2. Ubah plugindan atur kata sandi dengan satu perintah:

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

Tentu saja Anda juga dapat menggunakan perintah di atas untuk mengatur kata sandi kosong.

Sebagai catatan, (dan MariaDB < 10.2pengguna) juga ada cara lain untuk hanya mengubah plugintanpa memberikan kata sandi (membiarkannya kosong):

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
sumber
2
Terima kasih, untuk beberapa alasan, pengaturan ini secara otomatis tiba-tiba setelah upgrade apt-get, saya rasa ...
Tominator
4
Juga, saya lebih suka jawaban ini - itu jauh kurang destruktif ;-)
benzkji
3
Untuk MariaDB <10.2, untuk mengubah plugin bersama dengan kata sandi, inilah pertanyaannya: UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;Sumber: stackoverflow.com/a/41537019/1004587
Pothi Kalimuthu
5
Ini seharusnya jawaban yang diterima
Geo C.
3
Saya berharap saya bisa memilih ini dua kali.
James Smith
21

Singkatnya, di MariaDB

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

tempat Anda mengganti NEWPASSWORD dengan kata sandi yang Anda inginkan, dan yang lainnya kata demi kata.

Masalahnya di sini adalah ketika MariaDB atau MySQL diinstal / diperbarui (terutama jika pada beberapa titik root diatur tanpa kata sandi) maka dalam tabel Users kata sandi itu benar-benar kosong (atau diabaikan), dan masuk tergantung pada sistem pengguna yang sesuai ke pengguna MySQL. Anda dapat menguji ini sebagai berikut dengan beralih ke root sistem, lalu ketik:

mysql -uroot -p

Kemudian masukkan tanpa kata sandi atau kata sandi yang salah . Anda mungkin akan diijinkan masuk (Anda bahkan dapat masuk dari root unix hanya # mysqlkarena kata sandi tidak relevan dan pengguna didefinisikan).

Jadi, apa yang terjadi? Nah, jika Anda login sebagai root dan lakukan hal berikut:

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

Anda akan perhatikan auth_socket(yang dapat dibaca unix_socketdi MariaDB). Soket ini mengabaikan kata sandi dan memungkinkan pengguna Unix yang sesuai masuk tanpa pemeriksaan kata sandi. Inilah sebabnya mengapa Anda bisa masuk dengan root tetapi tidak dengan pengguna yang berbeda.

Jadi solusinya adalah memperbarui Pengguna untuk tidak menggunakan auth_socket/unix_socketdan mengatur kata sandi dengan benar.

Pada MariaDB (<10.2, lihat komentar di bawah) yang ada di Ubuntu versi 16 pada 2017 ini sudah cukup. NEWPASSWORD adalah kata sandi Anda. mysql_native_passwordAnda mengetik kata demi kata.

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

(Mungkin saja pengaturan plugin untuk dikosongkan akan berfungsi. YMMV. Saya tidak mencoba ini. Jadi ini adalah alternatif.)

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

Jika tidak:

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

Kemudian

FLUSH PRIVILEGES;

Sebagai catatan, solusi yang melibatkan menghapus pengguna dan membuatnya kembali dengan '%' membuat saya benar-benar terkunci dari database, dan dapat menyebabkan masalah lain kecuali Anda mendapatkan grantpernyataan yang tepat - lebih mudah untuk hanya memperbarui root yang sudah Anda miliki.

Dalam pengalaman saya, masalah hanya terjadi pada pengguna root, karena pengguna lain akan ditambahkan secara manual bukan bagian dari instalasi / pembaruan awal.

Gazzer
sumber
2
Menemukan ini berfungsi dengan sempurna. Buat saya bertanya-tanya mengapa mengubah kata sandi root dengan mysql_secure_installationtidak memiliki efek yang sama. Di mana ia menyimpan kata sandi baru?
Mausy5043
Bisakah Anda mengedit jawaban Anda dan mengatakan lebih banyak tentang masing-masing perintah saat Anda melakukannya? Saya tidak jelas yang berlaku. Apakah dua UPDATEs yang berlaku untuk MariaDB <10.2 dan ALTERuntuk versi lain? Dan apakah yang kedua UPDATEmerupakan alternatif dari yang pertama, atau apakah kita perlu mengetik keduanya? Akhirnya, apakah 'mysql_native_password' adalah sesuatu untuk mengetik kata demi kata, atau haruskah kita menggantinya dengan kata sandi root yang kami maksud untuk MySQL?
Michael Scheper
1
@MichaelScheper Sudah lama kembali jadi saya tidak ingin mengedit terlalu banyak, tapi inilah yang saya ingat. (1) Lakukan PEMBARUAN pertama saja (<10.2 mungkin bukan keharusan). (2) Ya, ketikkan kata sandi 'mysql_native_password'. Pada dasarnya, apa yang Anda lakukan adalah memberitahu mariadb: "Jangan gunakan hak Unix, gunakan hak database". The mysql_native_passwordadalah pilihan yang.
Gazzer
Sial, aku salah mengeja 'hak istimewa'!
Gazzer
1
Sepertinya Anda hanya melewatkan batas waktu pengeditan 1½ menit juga! Saya kadang-kadang frustrasi karena hal itu. Bagaimanapun, terima kasih!
Michael Scheper
8

Jika Anda telah menginstal MySQL / MariaDB dari repositori dasar, pengguna tidak dapat masuk ke MySQL sebagai pengguna root MySQL dari login Unix mereka (tidak berlaku jika mereka memiliki akses sudo )

  1. Login ke shell root MySQL:

    $ sudo mysql -u root -p
    
  2. Jalankan pertanyaan di bawah ini:

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. Buka shell baru, lalu:

    $ mysql -u root -p
    

Sumber

Gayan Weerakutti
sumber
Ketika saya melakukan ini, saya tidak bisa sudo mysql sebagai root lagi. Saya harus su dulu, dan kemudian bisa login ke mysql sebagai root. Jadi saya mengubahnya kembali ke auth_socket.
hingga
Perintah tunggal:mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
Chris Stryczynski
Jika Anda ingin kehilangan akses ke instance MySQL Anda, maka jawaban ini adalah cara mudah.
Danila Vershinin
2

Cobalah untuk membuat akun mysql baru, bagi saya itu telah berfungsi (mysql 5.7.12):

  1. Login sebagai sudo:

    sudo mysql -uroot
    
  2. Buat pengguna baru dan berikan dia hak istimewa (tanpa kata sandi):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. Masuk sebagai pengguna baru:

    mysql -uadmin
    
Alex Yakovlev
sumber
2

Saya harus melakukan dua hal (terima kasih kepada @Toror dan @Loremhipsum):

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

lalu:

FLUSH PRIVILEGES;

Saya tidak akan merekomendasikan untuk menjatuhkan pengguna root.

Franc Drobnič
sumber
1

Coba kode ini dulu,

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

lalu,

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

lalu tekan Ctrl+Zdan ketik: bguntuk menjalankan proses dari latar depan ke latar belakang, lalu verifikasi akses Anda dengan:

mysql -u root -proot
mysql> show grants;
ADHITHYA SRINIVASAN
sumber
1

Jika Anda hanya menjalankan perintah mysql di bawah pengguna root, Anda akan diberikan akses tanpa diminta kata sandi, karena otentikasi soket diaktifkan untuk root @ localhost. .

Satu-satunya cara untuk mengatur kata sandi adalah beralih ke otentikasi asli seperti:

$ sudo mysql

mysql> ALTER USER 'root' @ 'localhost' DIIDENTIFIKASI DENGAN mysql_native_password OLEH 'test';

Vadiaz
sumber
0

Saya telah mengadaptasi beberapa skrip provisi yang telah saya buat untuk menggunakan MariaDB dan mengalami masalah yang tepat ini. Menyusun banyak informasi di sini jawaban Gazzer benar-benar nol dalam masalah ini; semuanya bermuara pada pengaturan auth_socket/ unix_socket.

Jadi ketika menggunakan MariaDB 5.5 (di bawah Ubuntu 14.04) dan MariaDB 10 di bawah (Ubuntu 16.04), masuk ke MySQL dan menjalankan perintah ini segera menghapus semuanya:

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

Jawaban lain — termasuk jawaban dengan suara paling tinggi pada pos ini oleh Loremhipsum — benar-benar mendorong praktik buruk dengan merekomendasikan menjatuhkan pengguna dan kemudian membuatnya kembali. Bagi saya, itu adalah solusi yang cukup radikal. Solusi terbaik / paling sederhana untuk menghapus pluginnilai, menghapus hak istimewa dan melanjutkan kehidupan.

JakeGould
sumber
-1

Saya memiliki masalah yang sama dan menjalankan yang berikut ini memperbaikinya:

mysql_upgrade --force
klob
sumber
Sayangnya itu tidak berhasil. Saya menginstal ulang ubuntu.
codescope
1
Saya baru saja menginstal ubuntu 16.04 dan menginstal mariad-server. Setelah menginstal saya menjalankan mysql_secure_installation dan mengatur kata sandi. Setelah melewati sisa langkah di mysql_secure_installation, saya menjalankannya lagi dan sepertinya tidak menyimpan perubahan. Saya masih tidak bisa masuk dari akun pengguna normal saya. Mungkinkah itu bug?
codescope
Ini tidak akan pernah membantu. Masalahnya tidak ada hubungannya dengan instalasi aktual dari biner MariaDB melainkan pengguna rootyang diatur dengan pluginpengaturan yang tidak standar. Satu-satunya kasus tepi di mana pemutakhiran DB mungkin membantu dalam kasus seperti ini adalah jika mysql_upgradeproses itu sendiri menyumbang pluginpengaturan yang saya ragu.
JakeGould