Kesalahan MySQL:: 'Akses ditolak untuk pengguna' root '@' localhost '

264

$ ./mysqladmin -u root -p ' dihapus '
Masukkan kata sandi:

mysqladmin: terhubung ke server di kesalahan 'localhost' gagal:
'Akses ditolak untuk pengguna' root '@' localhost '(menggunakan kata sandi: YES)'

Bagaimana saya bisa memperbaikinya?

Trivedi Harsh
sumber
1
@clearlight Bukan pertanyaan yang sama, posting ini adalah masalah dengan mysqladmin memenangkan hak istimewa super ke mysql, posting lainnya adalah masalah dengan koneksi sederhana dari soket.
e-info128
Coba hapus jika ada ~/.my.cnffile.
e-info128
11
Saya tahu ini sudah tua, tetapi ingin mengatakan ini untuk pengunjung masa depan. Jangan masukkan kata sandi mysql Anda, terutama untuk root, dalam perintah itu sendiri, atau itu akan disimpan dalam riwayat shell Anda. Biarkan saja -popsi itu sendiri dan mysql akan meminta kata sandi.
Scotty C.

Jawaban:

358
  1. Buka & Edit /etc/my.cnfatau /etc/mysql/my.cnf, tergantung distro Anda.
  2. Tambahkan di skip-grant-tablesbawah[mysqld]
  3. Mulai ulang Mysql
  4. Anda harus bisa masuk ke mysql sekarang menggunakan perintah di bawah ini mysql -u root -p
  5. Lari mysql> flush privileges;
  6. Tetapkan kata sandi baru dengan ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
  7. Kembali ke /etc/my.cnf dan hapus / komentar skip-grant-tables
  8. Mulai ulang Mysql
  9. Sekarang Anda dapat masuk dengan kata sandi baru mysql -u root -p
Kishore Venkataramanan
sumber
6
Halo, saya punya masalah yang sama. Saya melakukan hal di atas, dan itu menyelesaikan masalah, tetapi setiap kali saya reboot CentOS, saya harus melakukan semua langkah lagi (saya mendapat pesan: Akses ditolak untuk pengguna 'root' @ 'localhost' (menggunakan kata sandi: TIDAK) - ketika menjalankan perintah mysql (atau perintah sql) dan saya lakukan berulang-ulang seperti di atas pada setiap reboot
Eitan
19
Sayang sekali ini tidak bekerja dengan MariaDB:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USER 'root'@'localhost' IDENTIFIED BY 'NewPassword'' at line 1
Philipp Ludwig
11
Saya menemukan ini berfungsi @ PhilippLudwig set PASSWORD FOR 'root'@'localhost' = PASSWORD('root');Saya melakukan ini setelah langkah 5. Berikut adalah bagaimana output command prompt saya terlihat:MariaDB [(none)]> MariaDB [(none)]> set PASSWORD FOR 'root'@'localhost' = PASSWORD('root'); Query OK, 0 rows affected (0.00 sec)
therobyouknow
3
Untuk langkah 3 restart MariaDB: Saya menemukan karya-karya berikut:sudo systemctl restart mariadb
therobyouknow
7
Beberapa orang mungkin menemukan file di
/etc/mysql/my.cnf
590

Semua solusi yang saya temukan jauh lebih kompleks daripada yang diperlukan dan tidak ada yang berhasil untuk saya. Inilah solusi yang memecahkan masalah saya. Tidak perlu memulai ulang mysqld atau memulainya dengan hak istimewa khusus.

sudo mysql

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

Dengan satu permintaan, kami mengubah auth_plugin menjadi mysql_native_password dan menyetel kata sandi root untuk di- root (jangan ragu untuk mengubahnya di dalam kueri)

Sekarang Anda harus bisa login dengan root. Informasi lebih lanjut dapat ditemukan di dokumentasi mysql

(keluar dari konsol mysql dengan Ctrl + D atau dengan mengetikkan exit )

pengguna1878906
sumber
41
Saya tidak dapat melakukan ini ... "Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MariaDB Anda untuk sintaks yang tepat untuk digunakan dekat ...".
TCB13
2
Jawaban ini berhasil, saya sengaja menambahkan jawaban tidak berguna, permisi!
taher
25
Bekerja dengan sangat baik pada Ubuntu 18.04
Almino Melo
2
@ TCB13 dan siapa pun yang menghadapi masalah ini. "Saya tidak dapat melakukan ini ..." Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MariaDB Anda untuk sintaks yang tepat untuk digunakan di dekat ... ". Gunakan FLUSH PRIVILEGES sebelum menjalankan perintah alter
coder
3
Anda menghemat hari saya :)
xger86x
50

Saya mencoba banyak langkah untuk memperbaiki masalah ini. Ada begitu banyak sumber untuk solusi yang mungkin untuk masalah ini yang sulit untuk menyaring pengertian dari omong kosong. Saya akhirnya menemukan solusi yang baik di sini :

Langkah 1: Identifikasi Versi Database

$ mysql --version

Anda akan melihat beberapa output seperti ini dengan MySQL:

$ mysql  Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using  EditLine wrapper

Atau keluaran seperti ini untuk MariaDB:

mysql  Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1

Catat basis data dan versi mana yang Anda jalankan, karena Anda akan menggunakannya nanti. Selanjutnya, Anda harus menghentikan basis data sehingga Anda dapat mengaksesnya secara manual.

Langkah 2: Menghentikan Server Database

Untuk mengubah kata sandi root, Anda harus mematikan server database terlebih dahulu.

Anda dapat melakukannya untuk MySQL dengan:

$ sudo systemctl stop mysql

Dan untuk MariaDB dengan:

$ sudo systemctl stop mariadb

Langkah 3: Restart Server Database Tanpa Memeriksa Izin

Jika Anda menjalankan MySQL dan MariaDB tanpa memuat informasi tentang hak pengguna, itu akan memungkinkan Anda untuk mengakses baris perintah basis data dengan hak akses root tanpa memberikan kata sandi. Ini akan memungkinkan Anda untuk mendapatkan akses ke database tanpa menyadarinya.

Untuk melakukan ini, Anda harus menghentikan database dari memuat tabel hibah, yang menyimpan informasi hak istimewa pengguna. Karena ini sedikit risiko keamanan, Anda juga harus melewati jaringan juga untuk mencegah klien lain terhubung.

Mulai database tanpa memuat tabel hibah atau mengaktifkan jaringan:

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

Ampersand di akhir perintah ini akan membuat proses ini berjalan di latar belakang sehingga Anda dapat terus menggunakan terminal Anda.

Sekarang Anda dapat terhubung ke database sebagai pengguna root, yang seharusnya tidak meminta kata sandi.

$ mysql -u root

Anda akan segera melihat prompt shell basis data.

MySQL Prompt

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Prompt MariaDB

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Sekarang Anda memiliki akses root, Anda dapat mengubah kata sandi root.

Langkah 4: Mengubah Kata Sandi Root

mysql> FLUSH PRIVILEGES;

Sekarang kita benar-benar dapat mengubah kata sandi root.

Untuk MySQL 5.7.6 dan yang lebih baru serta MariaDB 10.1.20 dan yang lebih baru , gunakan perintah berikut:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

Untuk MySQL 5.7.5 dan yang lebih lama serta MariaDB 10.1.20 dan yang lebih lama , gunakan:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

Pastikan untuk mengganti new_passworddengan kata sandi pilihan baru Anda.

Catatan: Jika ALTER USERperintah tidak berfungsi, biasanya ini mengindikasikan masalah yang lebih besar. Namun, Anda dapat mencoba UPDATE ... SETmengatur ulang kata sandi root.

[PENTING] Ini adalah baris spesifik yang memperbaiki masalah khusus saya:

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';

Ingatlah untuk memuat kembali tabel hibah setelah ini.

Dalam kedua kasus, Anda akan melihat konfirmasi bahwa perintah telah berhasil dijalankan.

Query OK, 0 rows affected (0.00 sec)

Kata sandi telah diubah, jadi Anda sekarang dapat menghentikan instance manual dari server database dan memulai kembali seperti sebelumnya.

Langkah 5: Mulai Ulang Server Database Secara Normal

Tutorial ini masuk ke beberapa langkah lebih lanjut untuk me-restart database, tetapi satu-satunya bagian yang saya gunakan adalah ini:

Untuk MySQL, gunakan: $ sudo systemctl start mysql

Untuk MariaDB, gunakan:

$ sudo systemctl start mariadb

Sekarang Anda dapat mengonfirmasi bahwa kata sandi baru telah diterapkan dengan benar dengan menjalankan:

$ mysql -u root -p

Perintah sekarang harus meminta kata sandi yang baru ditetapkan. Masukkan, dan Anda harus mendapatkan akses ke prompt database seperti yang diharapkan.

Kesimpulan

Anda sekarang memiliki akses administratif ke server MySQL atau MariaDB yang dipulihkan. Pastikan kata sandi root baru yang Anda pilih kuat dan aman dan simpan di tempat yang aman.

Blairg23
sumber
1
Pernyataan ALTER USER diperkenalkan di MariaDB 10.2.0.
Benoit Desrosiers
2
Wow ! baris mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';ini telah menjadi penyelamat bagi saya!
lucyjosef
35

Tidak ada jawaban di atas yang membantu saya dengan masalah ini, jadi inilah solusi yang saya temukan .

Bagian yang relevan:

Dalam sistem Ubuntu yang menjalankan MySQL 5.7 (dan versi yang lebih baru), root pengguna MySQL diatur untuk mengotentikasi menggunakan plugin auth_socket secara default daripada dengan kata sandi. Ini memungkinkan beberapa keamanan yang lebih besar dan kegunaan dalam banyak kasus, tetapi juga dapat mempersulit hal-hal ketika Anda perlu mengizinkan program eksternal (misalnya, phpMyAdmin) untuk mengakses pengguna.

Untuk menggunakan kata sandi untuk terhubung ke MySQL sebagai root, Anda harus mengganti metode otentikasi dari auth_socket ke mysql_native_password. Untuk melakukan ini, buka prompt MySQL dari terminal Anda:

sudo mysql

Selanjutnya, periksa metode otentikasi mana yang masing-masing akun pengguna MySQL Anda gunakan dengan perintah berikut:

SELECT user,authentication_string,plugin,host FROM mysql.user;

Keluaran

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

Dalam contoh ini, Anda dapat melihat bahwa pengguna root sebenarnya mengautentikasi menggunakan plugin auth_socket. Untuk mengonfigurasi akun root untuk mengautentikasi dengan kata sandi, jalankan perintah ALTER USER berikut. Pastikan untuk mengubah kata sandi menjadi kata sandi pilihan Anda, dan perhatikan bahwa perintah ini akan mengubah kata sandi root yang Anda atur di Langkah 2:

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

Lalu, jalankan FLUSH PRIVILEGES yang memberi tahu server untuk memuat ulang tabel hibah dan menerapkan perubahan baru Anda:

FLUSH PRIVILEGES;

Periksa kembali metode otentikasi yang digunakan oleh masing-masing pengguna Anda untuk mengonfirmasi bahwa root tidak lagi diautentikasi menggunakan plugin auth_socket:

SELECT user,authentication_string,plugin,host FROM mysql.user;

Keluaran

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

Anda dapat melihat dalam contoh ini keluaran bahwa pengguna MySQL root sekarang mengotentikasi menggunakan kata sandi. Setelah Anda mengonfirmasi ini di server Anda sendiri, Anda dapat keluar dari shell MySQL:

exit

sonrad10
sumber
27

Untuk pengguna Ubuntu / Debian

( dapat bekerja pada distro lain terutama yang berbasis debian)

Jalankan yang berikut ini untuk terhubung sebagai root(tanpa kata sandi)

sudo /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf

Jika Anda tidak ingin menambahkan --defaults-filesetiap kali Anda ingin terhubung root, Anda dapat menyalin /etc/mysql/debian.cnfke direktori home Anda:

sudo cp /etc/mysql/debian.cnf ~/.my.cnf

lalu:

sudo mysql
Hebat
sumber
2
Hanya itu yang dibutuhkan. 'root' bukan 'root' di Ubuntu secara default, tampaknya.
Chaim Eliyah
21

Setelah mencoba semua jawaban yang lain, inilah yang akhirnya berhasil untuk saya

sudo mysql -- It does not ask me for any password

-- Then in MariaDB/MySQL console:
update mysql.user set plugin = 'mysql_native_password' where User='root';
FLUSH PRIVILEGES;
exit;

Saya menemukan jawabannya di posting ini: https://medium.com/@chiragpatel_52497/solved-error-access-denied-for-user-root-localhost-of-mysql-programming-school-6e3611838d06

Pico12
sumber
1
GARIS PLUGIN INI BENAR-BENAR MEMBANTU. Saya mencoba banyak komposisi tetapi ini adalah satu-satunya yang berfungsi untuk Ver 14.14 Distrib 5.7.27, untuk Linux (x86_64)
AlexNikonov
2
Ini membantu saya dengan mysql 5.7 juga. Jadi berlaku tidak hanya untuk mariadb
podarok
Saya hanya menggunakan ini di MySQL 8 Ubuntu 20.04 dan berhasil. Jawaban lain menggunakan skip-grant-table(my.conf atau dalam mysqlperintah) tidak berfungsi. Saya bisa menggunakan akun layanan ( askubuntu.com/a/120769/169836 ) tetapi UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';tidak berhasil. Hanya ketika ketika menggunakan bagian plugin hal-hal bekerja. Terima kasih ~
hamx0r
16

Untuk pengguna linux baru ini bisa menjadi tugas yang menakutkan. Biarkan saya memperbarui ini dengan mysql 8 (versi terbaru yang tersedia saat ini adalah 8.0.12 pada 12-Sep-2018)

  1. Buka file konfigurasi "mysqld.cnf" di "/etc/mysql/mysql.conf.d/".
  2. Tambahkan skip-grant-tables ke baris teks [mysql] berikutnya dan simpan.
  3. Mulai ulang layanan mysql sebagai "sudo service mysql restart". Sekarang mysql Anda bebas dari otentikasi apa pun.
  4. Terhubung ke klien mysql (juga dikenal sebagai mysql-shell) sebagai mysql -u root -p . Tidak ada kata sandi yang harus dimasukkan pada saat ini.
  5. jalankan perintah sql flush privilege;
  6. Setel ulang kata sandi sekarang sebagai ALTER USER 'root' @ 'localhost' DIIDENTIFIKASI OLEH 'MyNewPassword';
  7. Sekarang mari kita kembali ke keadaan normal; hapus baris "skip-grant-tables" dari "mysqld.cnf" dan restart layanan.

Itu dia.

Amit Kr
sumber
5

Di meja kerja MySQL Anda, Anda dapat pergi ke bilah sisi kiri, di bawah Manajemen pilih "Pengguna dan Hak Istimewa", klik root di bawah Akun Pengguna, di bagian kanan klik tab "Batas Akun" untuk menambah kueri maks, pembaruan, dll, dan lalu klik tab "Peran Administratif" dan centang kotak untuk memberikan akses akun. Semoga itu bisa membantu!

Colleen Purcell
sumber
4

Saya melakukan ini untuk mengatur kata sandi root saya pada pengaturan awal MySQL di OSx. Buka terminal.

sudo sh -c 'echo /usr/local/mysql/bin > /etc/paths.d/mysql'

Tutup terminal dan buka terminal baru. Dan berikut ini bekerja di Linux, untuk mengatur kata sandi root.

sudo /usr/local/mysql/support-files/mysql.server stop
sudo mysqld_safe --skip-grant-tables

(sudo mysqld_safe --skip-grant-tables: Ini tidak berhasil untuk saya pertama kali. Tapi percobaan kedua, sukses adalah sukses.)

Kemudian login ke MySQL

mysql -u root

FLUSH PRIVILEGES;

Sekarang ubah kata sandi:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

Mulai ulang MySQL:

sudo /usr/local/mysql/support-files/mysql.server stop
sudo /usr/local/mysql/support-files/mysql.server start
Sadee
sumber
3

Dalam kasus saya di bawah Debian 10, kesalahannya

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

dipecahkan oleh (CARA BAIK)

sudo mysql -u root -p mysql

JALAN YANG BURUK:

mysql -u root -p mysql
klor
sumber
3

Ugh- tidak ada yang berhasil untuk saya! Saya memiliki mesin CentOS 7.4 yang menjalankan mariadb 5.5.64.

Apa yang harus saya lakukan adalah ini, tepat setelah pemasangan mariadb dari yum;

# systemctl restart mariadb
# mysql_secure_installation

Ini mysql_secure_installationakan membawa Anda melalui sejumlah langkah, termasuk "Setel kata sandi root? [Y / n]". Katakan saja "y" dan berikan kata sandi. Jawab pertanyaan lain sesuai keinginan.

Kemudian Anda bisa masuk dengan kata sandi, menggunakan

# mysql -u root -p

Itu akan bertahan

# systemctl restart mariadb

Kunci

Kemudian, saya memeriksa /bin/mysql_secure_installationkode sumber untuk mengetahui bagaimana secara ajaib dapat mengubah kata sandi root dan tidak ada jawaban lain di sini yang bisa. Bit impor adalah:

do_query "UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root';"

... Dikatakan SET Password=...dan tidak SET authentication_string = PASSWORD.... Jadi, prosedur yang tepat untuk versi ini (5.5.64) adalah:

login using mysql -u root -p , using the password you already set.
Or, stop the database and start it with:
mysql_safe --skip-grant-tables --skip-networking &

Dari prompt mysql>:

use mysql;
select host,user,password from user where user = 'root';
(observe your existing passwords for root).
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root' AND host = 'localhost';
select host,user,password from user where user = 'root';
flush privileges;
quit;

bunuh menjalankan mysqld_safe. restart mariadb. Login sebagai root: mysql -u -p. Gunakan kata sandi baru Anda.

Jika mau, Anda dapat mengatur semua kata sandi root sekaligus. Saya pikir ini bijaksana:

mysql -u root -p
(login)
use mysql;
select host,user,password from user where user = 'root';
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root';
select host,user,password from user where user = 'root';
flush privileges;
quit;

Ini akan melakukan pembaruan pada semua kata sandi root: yaitu, untuk "localhost", "127.0.0.1", dan ":: 1"

Di masa mendatang, ketika saya pergi ke RHEL8 atau apa pun yang Anda miliki, saya akan mencoba untuk mengingat untuk memeriksa / bin / mysql_secure_installation dan melihat bagaimana orang-orang melakukannya, siapa yang mengkonfigurasi mariadb untuk OS ini.

Mike S
sumber
2

Jika Anda seperti saya dan semua saran di atas gagal, lanjutkan untuk mencopot semua versi mysql di mesin Anda, cari semua file mysql yang tersisa menggunakan perintah ini sudo find / -name "mysql"dan rm -rfsetiap file atau direktori dengan nama mysql terlampir (Anda harus melewati file terkait ke perpustakaan bahasa pemrograman). Sekarang instal versi baru MySQL dan selamat menikmati. NB: Anda akan kehilangan semua data Anda jadi pertimbangkan dulu pilihan Anda.

Michael Ogala
sumber
1

Itu bisa terjadi jika Anda tidak memiliki cukup hak istimewa. Ketik su, masukkan kata sandi root dan coba lagi.

goji vitaly
sumber
1

Oke, saya tahu ini adalah utas lama tetapi jika Anda mencapai halaman ini melalui Google seperti yang saya lakukan dan tidak ada solusi di atas yang berfungsi, ternyata kesalahannya adalah 100% kebodohan di pihak saya. Saya tidak terhubung ke server. Setelah terhubung semuanya lancar.

Dalam hal ini membantu untuk mengetahui pengaturan saya, saya menggunakan Sequel Pro dan mencoba untuk menghubungkannya dengan Node menggunakan paket NPM, mysql. Saya tidak berpikir saya harus benar-benar terhubung (selain menjalankan Sequel Pro) karena saya sudah melakukannya dari aplikasi saya.

masukkan deskripsi gambar di sini

Campur Tuan Mike
sumber
0

Solusi: Menyerah!

Dengarkan saya, saya menghabiskan sekitar dua hari penuh untuk mencoba membuat MySQL tidak berhasil, selalu terjebak dengan kesalahan izin, tidak ada yang diperbaiki oleh jawaban di utas ini. Sampai pada titik yang saya pikir jika saya melanjutkan saya akan menjadi gila.

Karena kesabaran untuk membuatnya berfungsi, saya mengirim perintah untuk menginstal SQLite, hanya menggunakan 450KB, dan itu bekerja dengan baik sejak kata go.

Jika Anda tidak memiliki kesabaran seorang suci, gunakan SQLite dan hemat banyak waktu, tenaga, rasa sakit, dan ruang penyimpanan ..!

ArraysStartAt1
sumber