mysql cara memperbaiki Akses ditolak untuk 'root' @ 'localhost' pengguna

123

Sebelum saya mengacaukan sesuatu, ketika saya login menggunakan $ mysql -u root -p, dan menunjukkan database:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| game_data          |
| test               |
+--------------------+

Kemudian saya mencoba membuat pengguna baru dan melihat ada yang salah dengan HAK ISTIMEWA.

Jadi saya menghapus pengguna baru, dan saya kira saya menghapus 'root' dan 'Admin' secara tidak sengaja.

Lalu saya mencoba membuat 'root' lagi, tetapi mendapatkan akses ditolak kesalahan saat melakukan memberikan semua hak istimewa.

mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
mysql> grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Jika saya masuk ke MySQL lagi menggunakan $ mysql -u root -p, dan menunjukkan database,

+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+

Semua database lain hilang.

Bagaimana cara memperbaiki MySQL sekarang?

Saya tidak dapat menemukan database 'mysql', tidak dapat membuat database, membuat pengguna, apa pun yang saya coba lakukan akan mendapatkan kesalahan.

GALAT 1045 (28000): Akses ditolak untuk 'root' @ 'localhost' pengguna (menggunakan kata sandi: YES).

Haruskah saya menginstal ulang MySQL menggunakan MacPorts? Jika menginstal ulang, saya akan kehilangan database game_data, kan?

Vogelsire
sumber
Coba akses server dengan 'root'@'127.0.0.1' yang berbeda dari 'root' @ 'localhost'. Kemudian keluarkan perintah untuk membuat 'root' @ 'localhost' pengguna dan berikan semua hak istimewa untuk itu.
Gimmy
Lihat juga Bagaimana cara agar MySQL memberikan hak kepada pengguna root? pada Pengguna Super. Mencoba menghindari pengaturan ulang kata sandi.
jww
Saya hanya punya spasi di antara -pdan kata sandi. Saya tahu ini konyol tapi mungkin bisa membantu seseorang.
Vinay Wadhwa

Jawaban:

132

Ikuti langkah-langkah di bawah ini.

  1. Mulai server MySQL contoh atau daemon dengan --skip-grant-tablesopsi (pengaturan keamanan).

    $ mysqld --skip-grant-tables
    
  2. Jalankan pernyataan ini.

    $ mysql -u root mysql
    $mysql> UPDATE user SET Password=PASSWORD('my_password') where USER='root';
    $mysql> FLUSH PRIVILEGES;
    

Jika Anda menghadapi bidang Kata Sandi yang tidak dikenal, gunakan di atas:

update user set authentication_string=password('my_password') where user='root';
  1. Akhirnya, restart instance / daemon tanpa --skip-grant-tablesopsi.

    $ /etc/init.d/mysql restart
    

Anda sekarang harus dapat terhubung dengan kata sandi baru Anda.

$ mysql -u root -p

Masukkan kata kunci: my_password

Perbaiki untuk MySQL "Tidak dapat mengunci ibdata1" kesalahan

sudo mv /usr/local/mysql/data/ibdata1 /usr/local/mysql/data/ibdata1.bak
sudo mv /usr/local/mysql/data/ib_logfile0 /usr/local/mysql/data/ib_logfile0.bak
sudo mv /usr/local/mysql/data/ib_logfile1 /usr/local/mysql/data/ib_logfile1.bak
sudo cp -a /usr/local/mysql/data/ibdata1.bak /usr/local/mysql/data/ibdata1
sudo cp -a /usr/local/mysql/data/ib_logfile0.bak /usr/local/mysql/data/ib_logfile0
sudo cp -a /usr/local/mysql/data/ib_logfile1.bak /usr/local/mysql/data/ib_logfile1
sudo /etc/init.d/mysql restart
Yogus
sumber
1
"$ mysqld --skip-grant-tables" dan "InnoDB: Tidak dapat mengunci ./ibdata1, galat: 35 InnoDB: Periksa apakah Anda belum memiliki proses mysqld lain InnoDB: menggunakan data InnoDB atau file log yang sama."?
lihat pembaruan saya di atas
Yogus
Saya menemukan bahwa menghentikan mysql sebelum mengeluarkan perintah 1 menghentikan kesalahan kunci terjadi - service mysql stop
Frank Tzanabetis
7
Tampaknya kolom 'kata sandi' tidak ada lagi ... telah diganti oleh 'otentikasi_string'. Jadi string pembaruan kata sandi sekarang: UPDATE user SET authentication_string = PASSWORD ('my_password') di mana USER = 'root';
jdmcnair
1
Terima kasih! Dan sekarang saya ingin tahu: apa yang menyebabkan ini? Di Windows?
Ilia Andrienko
64

Tidak satu pun di atas yang membantu saya. Saya menemukan saya perlu menghapus metode plugin. Di 5.6, saya bisa melakukan:

sudo mysql -u root
use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;

Di 5.7, saya merasa perlu:

sudo mysql -u root
use mysql;
[mysql] update user set plugin='mysql_native_password' where User='root';
[mysql] flush privileges;

Menurut dokumen, dengan plugin disetel ke string kosong, seharusnya secara efektif default ke mysql_native_password, tetapi mungkin menjadi bingung oleh hash kata sandi kosong. Untuk nuansa lebih lanjut, Anda dapat membaca dokumentasi di sini: https://dev.mysql.com/doc/refman/5.7/en/native-authentication-plugin.html

Mario Olivio Flores
sumber
5
Ini menyelesaikannya untuk saya. Ketika saya melihat status daemon mysql, saya melihat peringatan ini: "[Peringatan] 'entri pengguna' root @ localhost 'memiliki kata sandi dan plugin otentikasi yang ditentukan. Kata sandi akan diabaikan." Mengatur plugin ke '' memungkinkan saya untuk masuk lagi. Terima kasih, @Mario Flores
SpacePope
Plugin saya kosong. Lucunya diubah menjadi kosong secara otomatis. Harap dicatat bahwa saya berbicara tentang instalasi di komputer pribadi saya di mana saya menggunakan dist-upgrade, sehingga mungkin menjadi alasan mengapa pengguna root rusak.
Teman Kim
2
set plugin='mysql_native_password'melakukannya untuk saya, terima kasih! Untuk referensi: dev.mysql.com/doc/refman/5.7/en/…
Koen.
Mengapa ini masih menjadi masalah untuk pemasangan paket ground up yang masuk ke tahun 2018?
mckenzm
1
ubuntu 18, dan berhasil
Rahal Kanishka
8

Pastikan juga catatan yang diperlukan dalam tabel usermemiliki pluginbidang kosong (mungkin ada, misalnya, "unix_socket").

Sejak versi 5.5.7 mysql memiliki berbagai dukungan plugin auth https://dev.mysql.com/doc/refman/5.6/id/authentication-plugins.html

Jadi, jika Anda memiliki pluginbidang yang tidak kosong maka kata sandi akan diabaikan dan akan ada peringatan di log kesalahan mysql (bagi saya itu /var/log/mysql/error.log):

[Warning] 'user' entry 'root@localhost' has both a password and an authentication plugin specified. The password will be ignored.

d9k
sumber
1
Untuk orang lain yang menjalankan ini, ketika menjalankan server mysql 5.7.15, ini benar-benar mengunci pengguna Anda jika Anda tidak menyediakan plugin. Mungkin yang Anda cari adalah plugindari mysql_native_password.
Jonathan Cantrell
8
grep 'temporary password' /var/log/mysqld.log
Sort date (newest date)

Anda mungkin melihat sesuatu seperti ini;

[root@SERVER ~]# grep 'temporary password' /var/log/mysqld.log
2016-01-16T18:07:29.688164Z 1 [Note] A temporary password is generated for root@localhost: O,k5.marHfFu
2016-01-22T13:14:17.974391Z 1 [Note] A temporary password is generated for root@localhost: b5nvIu!jh6ql
2016-01-22T15:35:48.496812Z 1 [Note] A temporary password is generated for root@localhost: (B*=T!uWJ7ws
2016-01-22T15:52:21.088610Z 1 [Note] A temporary password is generated for root@localhost: %tJXK7sytMJV
2016-01-22T16:24:41.384205Z 1 [Note] A temporary password is generated for root@localhost: lslQDvgwr3/S
2016-01-22T22:11:24.772275Z 1 [Note] A temporary password is generated for root@localhost: S4u+J,Rce_0t
[root@SERVER ~]# mysql_secure_installation

Mengamankan penyebaran server MySQL.

Enter password for user root: 

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password:

Jika Anda melihatnya tertulis

... Failed! Error: Your password does not satisfy the current policy requirements
That means your password needs to have a character such as ! . # - etc...
mix characters well, upper case, lower case, ! . , # etc...

New password: 

Re-enter new password: 
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done! 
[root@SERVER ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.10 MySQL Community Server (GPL)

Tonton 10 menit terakhir dari video ini , itu mengajarkan Anda bagaimana Anda melakukannya.

Tadeh
sumber
Meskipun ini dapat menjawab pertanyaan, Anda harus memberikan deskripsi yang lebih rinci tentang konten yang tertaut dan menjelaskan bagaimana hubungannya dengan pertanyaan tersebut. Ini akan membantu memastikan bahwa jawaban ini tetap berguna jika halaman yang ditautkan dihapus atau offline. Untuk informasi lebih lanjut, lihat posting Meta Stack Exchange ini .
bwDraco
Ini adalah use case yang saya lihat, saya menginstal mysql di RHEL7 di AWS dengan Ansible dan saya mendapatkan perilaku yang sama setelah mengkonfigurasi ulang dan me-restart DB. Apakah Anda tahu mengapa hal ini terjadi pada awalnya, memblokir Kemungkinan untuk mengakses mysqld lokal dan mengonfigurasinya. Ini hanya untuk tujuan pengujian.
einarc
Tampaknya itu tergantung pada bagaimana Anda menginisialisasi server, lihat langkah 4 di sini: dev.mysql.com/doc/refman/5.7/en/…
einarc
3

Cobalah:

mysql --no-defaults --force --user=root --host=localhost --database=mysql 
UPDATE user SET Password=PASSWORD('NEWPASSWORD') where USER='root';
FLUSH PRIVILEGES;
Gustavo Duarte
sumber
6
Bisakah Anda jelaskan apa yang --no-defaults --forcedilakukan sakelar? Kalau tidak, itu adalah duplikat VLQ dari jawaban yang diterima di atas.
Luke Kanada
@CanadianLuke tidak ada default melompati file konfigurasi apa pun yang ada di dalamnya, jika tidak termasuk, paksa melanjutkan operasi bahkan jika salah satu perintah SQL yang dikeluarkan gagal. Jika ragu, periksa manual
deucalion
3
Itu perlu diedit untuk jawabannya
Kanada Luke
2
Saya mendapatkanERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jonathan
1
@JonathanLeaders lihat: stackoverflow.com/questions/30692812/…
Gustavo Duarte
3

Dalam kasus saya, saya mengalami kerusakan basis data, setelah memulai kembali mysql di Debian login root tanpa kata sandi. Solusinya adalah ini:

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

Beberapa jawaban lain juga telah menyebutkan plugin native_password tetapi ini adalah bagaimana Anda dapat melakukannya tanpa mengotak-atik rumit. Begitulah cara itu dimaksudkan untuk diubah.

John
sumber