MySQL ERROR 1045 (28000): Akses ditolak untuk 'tagihan' @ 'localhost' pengguna (menggunakan kata sandi: YES)

430

Pertama izinkan saya menyebutkan bahwa saya telah melalui banyak pertanyaan yang disarankan dan tidak menemukan jawaban yang relevan. Inilah yang saya lakukan.

Saya terhubung ke instance Amazon EC2 saya. Saya bisa masuk dengan root MySQL dengan perintah ini:

mysql -u root -p

Lalu saya membuat tagihan pengguna baru dengan host%

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

Memberikan semua hak istimewa untuk tagihan pengguna:

grant all privileges on *.* to 'bill'@'%' with grant option;

Lalu saya keluar dari pengguna root dan mencoba masuk dengan tagihan:

mysql -u bill -p

memasukkan kata sandi yang benar dan mendapatkan kesalahan ini:

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

Ali
sumber
34
Benarkah FLUSH PRIVILEGES?
eggyal
6
Oke, saya mencoba ini tanpa hasil. Mohon saran lain.
Ali
1
Versi server apa yang Anda jalankan? Saya telah melihat 5.1 berperilaku aneh tentang ini.
Poodlehat
2
Ini terjadi pada saya ketika menginstal Magento dan saya membuat kesalahan yang jauh lebih konyol. Memasukkan 'mysql -u magento -p magento' mendorong saya untuk memasukkan kata sandi dan bukannya kata sandi default yang saya masukkan kata sandinya.
AmirHd
2
@authentictech sayangnya, tidak ada solusi yang disarankan yang berfungsi untuk saya saat pertanyaan ini diposting. Silakan lihat jawaban saya sendiri yang membantu saya keluar dari situasi ini. Itulah alasan saya tidak menandai mereka sebagai jawabannya. Mungkin saya bisa menandai respons peringkat tertinggi sebagai jawaban.
Ali

Jawaban:

442

Anda mungkin memiliki pengguna anonim ''@'localhost'atau ''@'127.0.0.1'.

Sesuai manual :

Ketika beberapa pertandingan dimungkinkan, server harus menentukan yang mana yang akan digunakan. Ini mengatasi masalah ini sebagai berikut: (...)

  • Ketika klien mencoba untuk terhubung, server melihat melalui baris [dari tabel mysql.user] dalam urutan diurutkan.
  • Server menggunakan baris pertama yang cocok dengan nama host klien dan nama pengguna.

(...) Server menggunakan aturan penyortiran yang memesan baris dengan nilai Host paling spesifik terlebih dahulu . Nama host literal [seperti 'localhost'] dan alamat IP adalah yang paling spesifik.

Karenanya, pengguna anonim seperti itu akan "menutupi" pengguna lain seperti '[any_username]'@'%'saat menyambung dari localhost.

'bill'@'localhost'tidak cocok 'bill'@'%', tetapi akan cocok (misalnya) ''@'localhost'sebelum tangan.

Solusi yang disarankan adalah menghapus pengguna anonim ini (ini biasanya hal yang baik untuk dilakukan).


Hasil edit di bawah ini sebagian besar tidak relevan dengan pertanyaan utama. Ini hanya dimaksudkan untuk menjawab beberapa pertanyaan yang diajukan dalam komentar lain dalam utas ini.

Edit 1

Mengotentikasi 'bill'@'%'melalui soket.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
    Selamat datang di monitor MySQL (...)

    mysql> SELECT pengguna, host dari FROM mysql.user;
    + ------ + ----------- +
    | pengguna | tuan rumah |
    + ------ + ----------- +
    | tagihan | % |
    | root | 127.0.0.1 |
    | root | :: 1 |
    | root | localhost |
    + ------ + ----------- +
    4 baris dalam set (0,00 dtk)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | USER () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | tagihan @% |
    + ---------------- + ---------------- +
    1 baris dalam set (0,02 dtk)

    mysql> TAMPILKAN VARIABEL SEPERTI 'skip_networking';
    + ----------------- + ------- +
    | Variable_name | Nilai |
    + ----------------- + ------- +
    | skip_networking | ON |
    + ----------------- + ------- +
    1 baris dalam set (0,00 dtk)

Edit 2

Pengaturan yang sama persis, kecuali saya mengaktifkan kembali jaringan, dan sekarang saya membuat pengguna anonim ''@'localhost'.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    Selamat datang di monitor MySQL (...)

    mysql> CREATE USER '' @ 'localhost' DIIDENTIFIKASI OLEH 'anotherpass';
    Kueri OK, 0 baris terpengaruh (0,00 dtk)

    mysql> Sampai jumpa

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket = / tmp / mysql-5.5.sock
    GALAT 1045 (28000): Akses ditolak untuk 'tagihan' @ 'localhost' pengguna (menggunakan kata sandi: YES)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protocol = TCP
    GALAT 1045 (28000): Akses ditolak untuk 'tagihan' @ 'localhost' pengguna (menggunakan kata sandi: YES)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol = TCP
    GALAT 1045 (28000): Akses ditolak untuk 'tagihan' @ 'localhost' pengguna (menggunakan kata sandi: YES)

Edit 3

Situasi yang sama seperti pada edit 2, sekarang memberikan kata sandi pengguna anonim.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    Selamat datang di monitor MySQL (...)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | USER () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | @localhost |
    + ---------------- + ---------------- +
    1 baris dalam set (0,01 dtk)

Kesimpulan 1, dari edit 1: Seseorang dapat mengotentikasi 'bill'@'%'melalui soket.

Kesimpulan 2, dari edit 2: Apakah seseorang terhubung melalui TCP atau melalui soket tidak berdampak pada proses otentikasi (kecuali seseorang tidak dapat terhubung seperti orang lain kecuali 'something'@'localhost'melalui soket, jelas).

Kesimpulan 3, dari edit 3: Meskipun saya tentukan -ubill, saya telah diberi akses sebagai pengguna anonim. Ini karena "aturan penyortiran" yang disarankan di atas. Perhatikan bahwa di sebagian besar instalasi default, ada kata sandi, pengguna anonim (dan harus diamankan / dihapus).

RandomSeed
sumber
9
Bagi siapa pun yang penasaran mengapa 'tagihan' @ 'localhost' cocok dengan '' @ 'localhost' seperti saya, string kosong secara efektif bertindak sebagai wild card dalam algoritma otentikasi MySQL.
Dean Or
2
@ Sanja Berhati-hatilah dengan solusi ini. Anda mungkin mengizinkan akses anonim ke database Anda dari lokasi mana pun. Jika ragu, saya lebih suka menghapus pengguna.
RandomSeed
7
@RandomSeed Terima kasih atas komentar ini! Mungkin saya harus menghapus pengguna anonim. PS saya temukan dev.mysql.com/doc/refman/5.1/en/default-privileges.html yang mengatakan bahwa pengguna pasti bisa dihapus: DROP USER ''@'localhost';. Mereka tidak diperlukan untuk tujuan khusus.
Alex
1
Saya menjatuhkan pengguna anonim, tetapi hal-hal masih tidak berfungsi. Kemudian saya menemukan bahwa saya perlu mengeluarkan juga "HAK ISTIMEWA". Akan sangat membantu untuk menyebutkannya juga.
Neeme Praks
2
Ini jawabannya! Mengapa ini tidak ditulis dengan huruf kapital tebal di setiap manual mysql. HAPUS PENGGUNA BESAR ATAU ITU AKAN MEMBUNUH SEMUA PERMINTAAN ANDA UNTUK LOGIN DARI LOCALHOST!
Sergei
140

Mencoba:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
Edgar Aviles
sumber
10
Ini agak berbahaya, jika seseorang meretas akun mysql @ localhost tagihan Anda, ia akan memiliki akses tak terbatas ke semua database server mysql Anda.
Adonis K. Kakoulidis
2
Whehey Saya harus memberi penawaran di sekitar pengguna saya 'myusername'@'myhost.static.myip.com' lalu berhasil.
bendecko
Itu bekerja untuk saya tetapi saya khawatir saya memberi terlalu banyak hak istimewa untuk pengguna
Csaba Toth
1
@CsabaToth Anda lakukan, kurangi hak istimewa lagi sampai pengguna Anda memiliki apa yang dia butuhkan dan tidak lebih.
jwenting
... dan apa yang Anda lakukan jika ini memberi Anda "Akses ditolak untuk 'root' @ 'localhost' pengguna (menggunakan kata sandi: YES)"?
Grunion Shaftoe
75

Ketika kamu berlari

mysql -u bill -p

dan mendapat kesalahan ini

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

mysqld mengharapkan Anda terhubung dengan bill@localhost

Coba buat bill@localhost

CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;

Jika Anda ingin terhubung dari jarak jauh, Anda harus menentukan nama DNS, IP publik, atau 127.0.0.1 menggunakan TCP / IP:

mysql -u bill -p -hmydb@mydomain.com
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP

Setelah Anda masuk, jalankan ini

SELECT USER(),CURRENT_USER();

USER () melaporkan bagaimana Anda mencoba mengotentikasi di MySQL

CURRENT_USER () melaporkan bagaimana Anda diizinkan untuk mengautentikasi di MySQL dari tabel mysql.user

Ini akan memberi Anda pandangan yang lebih baik tentang bagaimana dan mengapa Anda diizinkan masuk ke mysql. Mengapa pandangan ini penting untuk diketahui? Ini ada hubungannya dengan protokol pemesanan otentikasi pengguna.

Berikut ini sebuah contoh: Saya akan membuat pengguna anonim di desktop MySQL saya

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)

mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| x       | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
|         | %         |
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql>

OK, perhatikan saya masuk sebagai pengguna anonim:

C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> select user(),current_user();
+---------------+----------------+
| user()        | current_user() |
+---------------+----------------+
| rol@localhost | @%             |
+---------------+----------------+
1 row in set (0.00 sec)

mysql>

Pemesanan otentikasi sangat ketat. Ini memeriksa dari yang paling spesifik ke yang paling sedikit. Saya menulis tentang gaya autentasi ini di DBA StackExchange .

Jangan lupa untuk secara eksplisit memanggil TCP sebagai protokol untuk klien mysql bila perlu.

RolandoMySQLDBA
sumber
1
'bill'@'localhost'harus cocok 'bill@%', bukan?
RandomSeed
@Yak urutannya tidak hanya didasarkan pada kolom pengguna mysql.user. MySQL tidak melakukan pencocokan karakter apa pun. Saya menulis tentang protokol pemesanan otentikasi pengguna di DBA StackExchange: dba.stackexchange.com/a/10897/877
RolandoMySQLDBA
@YaK Inilah sebabnya saya secara khusus disebutkan SELECT USER(),CURRENT_USER();. Anda hampir tidak pernah melihat pengguna anonim muncul dari dua fungsi ini kecuali dalam pengaturan yang sangat buruk.
RolandoMySQLDBA
1
Saya tidak pernah berasumsi bahwa urutan hanya didasarkan pada mysql.user. Bahkan, jika Anda membaca jawaban saya lagi, Anda akan melihat bahwa saya mengatakan (sebenarnya, manual mengatakan) urutan pengurutan didasarkan pada hostkolom pertama. Anda banyak menulis tentang cara memeriksa kredensial Anda saat ini, tetapi saya melihat sedikit informasi mengapa 'bill'@'localhost'tidak bisa masuk 'bill'@'%', yang merupakan pertanyaan hari ini AFAIK. OP mungkin memiliki pengaturan yang buruk, ini sebabnya ia mendapatkan kesalahan ini.
RandomSeed
2
--protocol=TCPadalah kuncinya. Terima kasih banyak!
lfx
22

Sangat terlambat untuk ini

Saya mencoba semua jawaban lain ini dan menjalankan banyak versi berbeda mysql -u root -ptetapi tidak pernah hanya berlari


mysql -u root -p

Dan hanya menekan [ENTER]kata sandi.


Setelah saya lakukan itu berhasil. Semoga ini bisa membantu seseorang.

garrettmac
sumber
18

Masalah terkait dalam kasus saya mencoba terhubung menggunakan:

mysql -u mike -p mypass

Spasi IS ternyata diperbolehkan antara -u # uname # tetapi BUKAN antara -p dan # password #

Karena itu diperlukan:

mysql -u mike -pmypass

Kalau tidak dengan spasi putih antara -p mypass mysql mengambil 'mypass' sebagai nama db

mstram
sumber
1
atau: mysql -u usrname -p - ini menghentikan siapa pun dari melihat kata sandi karena akan menjatuhkan baris baru dan meminta kata sandi tanpa menampilkannya
jawaban yang bagus @ mstram
Arpit Solanki
1
solusi ini nyaman, namun tidak aman untuk mengetik kata sandi dengan jelas, tetapi tidak perlu mengetikkan hak istimewa dan mendefinisikan hal-hal lain. Jadi jika Anda mac book diamankan - pendekatan ini sangat nyaman, bahkan lebih saya menggunakannya untuk mengimpor data ke aws dari buruh pelabuhan mysql driver.
dimpiax
17

Saat Anda mengetik mysql -u root -p, Anda tersambung ke server mysql melalui soket unix lokal.

Namun hibah yang Anda berikan, 'bill'@'%' hanya cocok dengan koneksi TCP / IP yang cukup aneh.

Jika Anda ingin memberikan akses ke soket unix lokal, Anda perlu memberikan hak istimewa ke 'tagihan' @ 'localhost', yang cukup aneh tidak sama dengan 'bill'@'127.0.0.1'

Anda juga bisa terhubung menggunakan TCP / IP dengan klien baris perintah mysql, agar sesuai dengan hak istimewa yang sudah Anda berikan, misalnya menjalankan mysql -u root -p -h 192.168.1.123atau alamat IP lokal mana pun yang dimiliki kotak Anda.

tidak
sumber
"'bill' @ '%' hanya cocok dengan koneksi TCP / IP" Ini salah. Cobalah pada contoh bersih (perawan, out-of-the-box) denganskip-networking
RandomSeed
@YaK Saya tidak bisa membuat 'pengguna' @ '%' berfungsi dalam pengaturan seperti itu, apa maksud Anda yang seharusnya terjadi?
no
Saya dapat terhubung sebagai 'tagihan' @ '%' pada v5.0 tanpa jaringan (karenanya, melalui soket). Versi apa yang Anda gunakan? Saya akan mencobanya pada v5.5.
RandomSeed
Silakan lihat jawaban saya yang diperbarui. Saya bisa masuk 'bill'@'%'melalui soket pada v5.5.
RandomSeed
17

Jika Anda lupa kata sandi atau ingin mengubah kata sandi. Anda dapat mengikuti langkah-langkah ini:

1: hentikan mysql Anda

[root @ maomao ~] # service mysqld stop
Menghentikan MySQL: [OK]

2: gunakan “--skip-grant-tables” untuk me-restart mysql

[root @ mcy400 ~] # mysqld_safe --skip-grant-tables
[root @ cy400 ~] # Memulai daemon mysqld dengan basis data dari / var / lib / mysql

3: buka jendela baru dan masukan root mysql -u

[root @ cy400 ~] # mysql -u root
Selamat datang di monitor MySQL. Perintah diakhiri dengan; atau \ g.

4: ubah database pengguna

mysql> gunakan mysql
Membaca informasi tabel untuk melengkapi nama tabel dan kolom Anda dapat mematikan fitur ini untuk mendapatkan startup yang lebih cepat dengan -A Database berubah

5: ubah kata sandi Anda, kata sandi baru Anda harus dimasukkan dalam "()"

mysql> memperbarui set pengguna kata sandi = kata sandi ('root123') di mana pengguna = 'root';
Kueri OK, 3 baris terpengaruh (0,00 dtk)
Baris cocok: 3 Berubah: 3 Peringatan: 0

6: siram

mysql> hak istimewa flush;

7: berhenti

mysql> berhenti
Bye

8: restart mysql

[root @ cy400 ~] # service mysqld restart;
Menghentikan MySQL: [OK]
Memulai MySQL: [OK]

Bingo! Anda dapat menghubungkan database Anda dengan nama pengguna dan kata sandi baru Anda:

[root@cy400 ~]# mysql -u root -p <br>
Enter password: admin123 <br>
Welcome to the MySQL monitor.  Commands end with ; or \g. <br>
Your MySQL connection id is 2 <br>
Server version: 5.0.77 Source distribution <br>
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. <br>
mysql> quit <br>
Bye
Li Yingjun
sumber
1
Ini membantu saya, tetapi pada mac jika Anda menginstal dengan homebrew itu mysql.server stop. Dalam kasus saya, saya tidak dapat memperbarui kolom pengguna karena tidak ada satu; juga tidak dapat membuat satu karena dalam mode aman. Untuk apa yang saya lakukan saat ini saya tidak peduli, tapi saya sangat menghargai jawaban format ini dengan input & output tepat yang ditampilkan. Terima kasih!
szeitlin
Maaf, saya belum pernah menggunakan mac. Jadi saya tidak bisa membantu Anda.
Li Yingjun
15

Simpan diri Anda dari sakit kepala UTAMA ... Masalah Anda mungkin adalah bahwa Anda melewatkan tanda kutip di sekitar kata sandi. Setidaknya itulah kasus saya yang memutar saya selama 3 jam.

[client]
user = myusername
password = "mypassword"   # <----------------------- VERY IMPORTANT (quotes)
host = localhost

http://dev.mysql.com/doc/refman/5.7/en/option-files.html

Cari "Ini adalah file opsi pengguna yang khas:" dan lihat contoh yang mereka nyatakan di sana. Semoga beruntung, dan saya berharap bisa menyelamatkan orang lain beberapa saat.

mimoralea
sumber
1
Terima kasih untuk ini. Saya sudah menghabiskan setengah hari untuk hal ini dan tipuan bodoh tentang kata sandi berhasil!
guyfromfl
Ha ha. Saya menyia-nyiakan hal yang sama ketika itu terjadi pada saya. Senang bisa membantu.
mimoralea
12

Solusinya adalah menghapus pengguna anonim (Apa saja)!

Saya juga menghadapi masalah yang sama pada pengaturan server oleh orang lain. Saya biasanya tidak memilih untuk membuat pengguna anonim setelah menginstal MySQL, jadi saya tidak memperhatikan ini. Awalnya saya masuk sebagai pengguna "root" dan menciptakan beberapa pengguna "normal" (alias pengguna dengan hak istimewa hanya pada dbs dengan nama pengguna mereka sebagai awalan), kemudian logout, kemudian melanjutkan untuk memverifikasi pengguna normal pertama. Saya tidak bisa masuk. Baik melalui phpMyAdmin, maupun via shell. Ternyata, pelakunya adalah pengguna "Apa saja" ini.

fevangelou
sumber
11

Saya memiliki masalah yang agak mirip - pada upaya pertama saya untuk masuk ke MySQL, karena root, ia memberi tahu saya akses ditolak. Ternyata saya lupa menggunakan sudo...

Jadi, jika Anda gagal pada rootupaya pertama, coba:

sudo mysql -u root -p

dan kemudian masukkan kata sandi Anda, ini harus bekerja.

David Refaeli
sumber
6

Solusi terbaik yang saya temukan untuk diri saya adalah.

pengguna saya adalah sonar dan setiap kali saya mencoba untuk terhubung ke database saya dari eksternal atau mesin lain saya mendapatkan error

ERROR 1045 (28000): Access denied for user 'sonar'@'localhost' (using password: YES)

Juga ketika saya mencoba ini dari komputer lain dan melalui pekerjaan Jenkins URL saya untuk mengakses adalah

alm-lt-test.xyz.com

jika Anda ingin terhubung dari jarak jauh, Anda dapat menentukannya dengan berbagai cara sebagai berikut:

mysql -u sonar -p -halm-lt-test.xyz.com
mysql -u sonar -p -h101.33.65.94
mysql -u sonar -p -h127.0.0.1 --protocol=TCP
mysql -u sonar -p -h172.27.59.54 --protocol=TCP

Untuk mengakses ini dengan URL Anda hanya perlu menjalankan query berikut.

GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'alm-lt-test.xyz.com' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'127.0.0.1' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'172.27.59.54' IDENTIFIED BY 'sonar';
Abhijeet Kamble
sumber
4

Oke, saya tidak yakin tapi mungkin ini file my.cnf di dalam direktori instalasi mysql adalah penyebabnya. Komentari baris ini dan masalahnya mungkin teratasi.

bind-address = 127.0.0.1
Ali
sumber
1
Untuk perincian lebih lanjut, Anda dapat melihatnya juga wiki.bitnami.org/Components/MySQL
Ali
1
Saya cukup yakin bahwa ini bukan masalahnya. Jika ya, MySQL menolak koneksi dari host lain selain 127.0.0.1, dan Anda tidak akan mendapatkan kesalahan SQL 'Akses Ditolak'.
The Pellmeister
3

Hanya ingin memberi tahu Anda keadaan yang tidak biasa saya menerima kesalahan yang sama. Mungkin ini membantu seseorang di masa depan.

Saya telah mengembangkan beberapa pandangan dasar, dibuat di situs pengembangan dan mentransfernya ke lokasi produksi. Kemudian pada minggu itu saya mengubah skrip PHP dan tiba-tiba muncul kesalahan bahwa Access ditolak untuk pengguna 'local-web-user' @ 'localhost'. Objek sumber data tidak berubah, jadi saya berkonsentrasi pada pengguna database di MySQL, khawatir sementara itu seseorang meretas situs web saya. Untungnya sisa situs tampaknya tidak terluka.

Kemudian ternyata bahwa pandangannya adalah pelakunya. Transfer objek kami dilakukan menggunakan pengguna lain (dan jarak jauh: admin @ ip-address) daripada pengguna situs web lokal. Jadi pandangan dibuat dengan 'admin' @ 'ip-address' sebagai definisi. Tampilan pembuatan SECURITY default adalah

SQL SECURITY DEFINER

Ketika pengguna web-lokal mencoba menggunakan tampilan itu tersandung pada hak istimewa yang kurang dari definisi untuk menggunakan tabel. Setelah keamanan diubah menjadi:

SQL SECURITY INVOKER

masalah telah teratasi. Masalah sebenarnya sangat berbeda dari yang diantisipasi berdasarkan pesan kesalahan.

Erik
sumber
1
Ini akhirnya menjadi sumber masalah saya juga - pandangan dengan "definisi" yang hilang. Salah satu cara cepat untuk mengetahui apakah ini yang terjadi pada Anda adalah mencoba menanyakan tabel atau tampilan yang sama dengan root - jika Anda melakukannya, pesan kesalahan berubah menjadi lebih deskriptif "ERROR 1449 (HY000): Pengguna ditentukan sebagai definisi tidak ada ".
Joshua Davies
3

Ini perbedaan antara:

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

dan

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

Periksa:

mysql> select user,host from mysql.user;
+---------------+----------------------------+
| user          | host                       |
+---------------+----------------------------+
| bill          | %                          | <=== created by first
| root          | 127.0.0.1                  |
| root          | ::1                        |
| root          | localhost                  |
| bill          | localhost                  | <=== created by second
+---------------+----------------------------+

Perintah

mysql -u bill -p

akses tersirat ke 'tagihan' @ 'localhost' dan BUKAN ke 'tagihan' @ '%'.

Tidak ada izin untuk 'tagihan' @ 'localhost'

Anda mendapatkan kesalahan:

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

memecahkan masalah:

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

grant all privileges on . to 'bill'@'localhost' with grant option;
Gerd
sumber
Pernyataan hibah mengembalikan kesalahan. Saya perlu menentukan basis data seperti ini: berikan semua hak istimewa pada newdb. *
Ke
3

Ini juga terjadi ketika kata sandi Anda mengandung beberapa karakter khusus seperti @, $, dll. Untuk menghindari situasi ini, Anda dapat membungkus kata sandi dalam tanda kutip tunggal:

$ mysql -usomeuser -p's0mep@$$w0Rd'

Atau sebaliknya jangan gunakan kata sandi saat memasukkan. Biarkan kosong dan ketikkan ketika terminal bertanya. Ini cara yang disarankan.

$ mysql -usomeuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 191
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql>
Pranit Lebih Banyak
sumber
3
Ini memang bisa menjadi masalah (seperti bagi saya). Semua kata sandi saya untuk semua akun saya dibuat menggunakan pwgen. Hari ini saya membuat yang baru untuk database MySQL dan penggunanya. Sayangnya kata sandi tersebut mengandung "backslash" yang tidak saya identifikasi sebagai kesalahan asal (saya bahkan tidak memikirkannya). Jadi, saya mencari solusi selama berjam-jam. Setelah mengatur kata sandi ke "123" dengan putus asa, login akhirnya berhasil. ... Pengguna harus menyadari bahwa beberapa karakter khusus dapat menyebabkan masalah karena MySQL tidak menunjukkan peringatan tentang penggunaan kata sandi seperti "daiy4ha4in7chooshuiphie \ Th * aew", misalnya.
Arvid
1
Akan memposting ini sebagai jawaban jika belum muncul, itu terlalu jauh di bawah daftar untuk saya sadari (jadi saya menabraknya +1)
Assimilater
3

Bagi saya, masalah ini disebabkan oleh fitur baru MySQL 5.7.2: userentri diabaikan jika pluginbidangnya kosong.

Atur untuk eg mysql_native_passworduntuk mengaktifkannya kembali:

UPDATE user SET plugin='mysql_native_password' WHERE user='foo';
FLUSH PRIVILEGES;

Lihat catatan rilis untuk MySQL 5.7.2 , di bawah «Catatan Otentikasi».

Untuk beberapa alasan (mungkin karena hash kata sandi pra-4.1 saya dihapus), mysql_upgradeskrip tidak menetapkan nilai plugin default.

Saya mengetahuinya dengan memperhatikan pesan peringatan berikut di /var/log/mysql/error.log:

[Peringatan] Entri pengguna 'foo' @ '%' memiliki nilai plugin kosong. Pengguna akan diabaikan dan tidak ada yang bisa login dengan pengguna ini lagi.

Saya memposting jawaban ini di sini untuk mungkin menyelamatkan seseorang dari menggunakan jumlah waktu yang sama konyol pada ini seperti yang saya lakukan.

maksimal
sumber
2

Tidak yakin apakah ada orang lain yang akan membantu ini, tetapi saya menemukan kesalahan yang sama dan mencari seluruh pengguna anonim ... dan tidak ada. Masalahnya akhirnya adalah bahwa akun pengguna diatur ke "Memerlukan SSL" - yang saya temukan di PHPMyAdmin dengan masuk ke Akun Pengguna dan mengklik Edit Hak Istimewa untuk pengguna. Segera setelah saya menghapus centang opsi ini, semuanya berjalan seperti yang diharapkan!

Alan
sumber
2

Ringkasan Debugging

  • Periksa kesalahan ketik: nama pengguna atau kata sandi.
  • Periksa nama host dan bandingkan dengan nama host tabel mysql.user.
  • Periksa apakah ada pengguna atau tidak.
  • Periksa apakah host berisi alamat IP atau nama host.

Ada kemungkinan besar, Anda mungkin pernah mengalami masalah ini beberapa kali dalam pekerjaan Anda. Masalah ini sering terjadi pada saya karena kesalahan memasukkan nama pengguna atau kata sandi. Meskipun ini adalah salah satu alasannya, ada banyak peluang lain Anda mungkin mendapatkan masalah ini. Terkadang, tampilannya sangat mirip, tetapi ketika Anda menggali lebih dalam, Anda akan menyadari banyak faktor yang berkontribusi terhadap kesalahan ini. Posting ini akan menjelaskan secara rinci, sebagian besar alasan umum dan mengatasi masalah ini.

Alasan yang mungkin:

  • Kasus 1: Kesalahan ketik: nama pengguna atau kata sandi.

Ini adalah alasan paling umum untuk kesalahan ini. Jika Anda salah memasukkan nama pengguna atau kata sandi, pasti Anda akan mendapatkan kesalahan ini.

Larutan:

Solusi untuk jenis kesalahan ini sangat sederhana. Cukup masukkan nama pengguna dan kata sandi yang benar. Kesalahan ini akan diatasi. Jika Anda lupa kata sandi, Anda dapat mengatur ulang nama pengguna / kata sandi. Jika Anda lupa kata sandi untuk admin / akun root, ada banyak cara untuk mengatur ulang / menangkap kembali kata sandi root. Saya akan menerbitkan posting lain tentang cara mengatur ulang kata sandi root jika Anda lupa kata sandi root.

  • Kasus 2: Mengakses dari host yang salah.

MySQL menyediakan batasan berbasis host untuk akses pengguna sebagai fitur keamanan. Di lingkungan produksi kami, kami biasanya membatasi permintaan akses hanya ke server Aplikasi. Fitur ini sangat membantu dalam banyak skenario produksi.

Larutan:

Saat Anda menghadapi masalah jenis ini, periksa terlebih dahulu apakah host Anda diizinkan atau tidak dengan memeriksa tabel mysql.user. Jika tidak ditentukan, Anda dapat memperbarui atau menyisipkan catatan baru ke tabel mysql.user. Secara umum, mengakses sebagai pengguna root dari mesin jarak jauh dinonaktifkan dan itu bukan praktik terbaik, karena masalah keamanan. Jika Anda memiliki persyaratan untuk mengakses server Anda dari beberapa mesin, berikan akses hanya ke mesin tersebut. Lebih baik tidak menggunakan wildcard (%) dan memberikan akses universal. Biarkan saya memperbarui tabel mysql.user, sekarang demouser dapat mengakses server MySQL dari host apa pun.

  • Kasus 3: Pengguna tidak ada di server.

Jenis kesalahan ini terjadi ketika pengguna, yang Anda coba akses tidak ada di server MySQL.

Solusi:

Saat Anda menghadapi masalah jenis ini, cukup periksa apakah pengguna ada di tabel mysql.user atau tidak. Jika catatan tidak ada, pengguna tidak dapat mengakses. Jika ada persyaratan bagi pengguna untuk mengakses, buat pengguna baru dengan nama pengguna itu.

  • Kasus 4: Campuran host berbasis numerik dan nama.

Poin penting

  • Tidak disarankan untuk menggunakan wildcard saat mendefinisikan host pengguna, cobalah untuk menggunakan nama host yang tepat.

  • Nonaktifkan login root dari mesin jarak jauh.

  • Gunakan konsep pengguna proxy.

Ada beberapa konsep lain yang terkait dengan topik ini dan masuk ke detail dari topik-topik itu sangat berbeda ruang lingkup artikel ini. Kami akan melihat topik terkait berikut di artikel mendatang.

  • Apa yang harus dilakukan, jika Anda lupa root password di server MySQL.
  • Masalah hak akses MySQL dan tabel terkait pengguna.
  • Fitur keamanan MySQL dengan praktik terbaik.

Saya harap postingan ini akan membantu Anda memperbaiki MySQL Error Code 1045 Access yang ditolak untuk pengguna di MySQL.

Abhijit Jagtap
sumber
2

Saya harap Anda tidak melakukan lebih banyak kerusakan dengan juga menghapus pengguna debian-sys-Maint di mysql

Apakah daemon mysql Anda berjalan dengan cara normal. Mulai klien mysql Anda seperti yang ditunjukkan di bawah ini

mysql -u debian-sys-maint -p

Di terminal lain, catfile /etc/mysql/debian.cnf. File itu berisi kata sandi; rekatkan kata sandi itu saat diminta.

http://ubuntuforums.org/showthread.php?t=1836919

ya
sumber
2

Saya menemukan case lain yang muncul di permukaan sebagai case edge; Saya dapat mengekspor ke sistem file, melalui SELECT INTO .. ​​OUTFILE sebagai root, tetapi tidak sebagai pengguna biasa. Meskipun ini mungkin masalah izin, saya sudah melihatnya, dan tidak melihat apa pun yang jelas. Yang bisa saya katakan adalah menjalankan kueri sebagai pengguna biasa yang memiliki semua izin pada basis data yang dipertanyakan mengembalikan kesalahan akses ditolak yang mengarahkan saya ke topik ini. Ketika saya menemukan transkrip sukses menggunakan SELECT INTO ... OUTFILE di proyek lama, saya perhatikan bahwa saya login sebagai root. Benar saja, ketika saya login sebagai root, kueri berjalan seperti yang diharapkan.

David A. Gray
sumber
1

Pembaruan: Pada v8.0.15 (mungkin versi ini) thePASSWORD() fungsi tidak berfungsi.

Kamu harus:

  1. Pastikan Anda telah Menghentikan MySQL terlebih dahulu.
  2. Jalankan server dalam mode aman dengan memotong privilege: sudo mysqld_safe --skip-grant-tables
  3. Gabung: mysql -u root
  4. mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
  5. mysql> FLUSH PRIVILEGES;
  6. mysql> exit;
  7. Login lagi: mysql -u root
  8. mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';
Mohamed Jaleel Nazir
sumber
0

Ketika Anda menjalankan mysql -u bill -p, localhostdiselesaikan ke ip Anda, karena itu adalah 127.0.0.1 dan dalam /etc/hostsfile Anda , sebagai default 127.0.0.1 localhostada. Jadi, mysql menafsirkan Anda sebagai bill@localhostyang tidak diberikan bill@'%'. Inilah sebabnya mengapa ada 2 catatan berbeda untuk rootpengguna dalam hasil select host, user from mysql.user;kueri.

Ada dua cara untuk menangani masalah ini.

Salah satunya adalah menentukan ip yang tidak diselesaikan secara terbalik oleh /etc/hostsfile saat Anda mencoba masuk. Sebagai contoh, ip server adalah 10.0.0.2. Ketika Anda menjalankan perintah mysql -u bill -p -h 10.0.0.2, Anda akan bisa masuk. Jika Anda mengetik select user();, Anda akan mendapatkannya [email protected]. Tentu saja, nama domain apa pun tidak boleh diselesaikan ke ip ini di /etc/hostsfile Anda .

Kedua, Anda perlu memberikan akses untuk nama domain spesifik ini. Sebab bill@localhost, Anda harus memanggil perintah grant all privileges on *.* to bill@localhost identified by 'billpass';. Dalam hal ini, Anda dapat masuk dengan perintah mysql -u bill -p. Setelah masuk, select user();perintah kembali bill@localhost.

Tapi ini hanya untuk itu Anda mencoba masuk server mysql di host yang sama. Dari host jarak jauh, mysql bertindak sesuai yang diharapkan, '%' akan memberi Anda login.

Shnkc
sumber
0

Saya menyelesaikan ini dengan menghapus entri 'tagihan' pengguna kereta yang lama (ini adalah bagian penting: baik dari mysql.user dan mysql.db ), kemudian membuat pengguna yang sama dengan sedih sebelumnya:

FLUSH PRIVILEGES;
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
FLUSH PRIVILEGES;

Berhasil, pengguna terhubung. Sekarang saya akan menghapus beberapa previlegies dari itu :)

dxvargas
sumber
0

Saya mengalami kesalahan yang sama. Pengaturan yang tidak berfungsi adalah sebagai berikut:

define("HOSTNAME", "localhost");
define("HOSTUSER", "van");
define("HOSTPASS", "helsing");
define("DBNAME", "crossbow");
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

Pengaturan yang diedit di bawah adalah yang membuatnya berfungsi. Perhatikan perbedaannya?

define('HOSTNAME', 'localhost');
define('HOSTUSER', 'van');
define('HOSTPASS', 'helsing');
define('DBNAME', 'crossbow');
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

Perbedaannya adalah tanda kutip ganda. Mereka tampaknya cukup signifikan dalam PHP dibandingkan dengan Jawa dan mereka memiliki dampak ketika datang untuk melarikan diri karakter, mengatur URL dan sekarang, meneruskan parameter ke suatu fungsi. Mereka lebih cantik (saya tahu) tetapi selalu menggunakan tanda kutip tunggal sebanyak mungkin maka tanda kutip ganda dapat bersarang di dalamnya jika perlu.

Kesalahan ini muncul ketika saya menguji aplikasi saya pada kotak Linux yang bertentangan dengan lingkungan Windows.

Raymond Wachaga
sumber
0

Saya memiliki masalah yang sama karena kata sandi saya mengandung ";" char melanggar kata sandi saya ketika saya membuatnya pada saat pertama. Perhatian dengan ini jika dapat membantu Anda.

Genaut
sumber
0

Ini mungkin berlaku untuk sangat sedikit orang, tetapi begini saja. Jangan gunakan tanda seru !di kata sandi Anda.

Saya lakukan dan mendapatkan kesalahan di atas menggunakan MariaDB. Ketika saya menyederhanakannya menjadi hanya angka dan huruf itu berhasil. Karakter lain seperti @dan $berfungsi dengan baik - Saya menggunakan karakter tersebut di pengguna yang berbeda pada contoh yang sama.

Tanggapan kelima di alamat ini membuat saya memperbaiki saya.

Chiwda
sumber
0

Di Windows, berikut ini cara mengatasinya:

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

  1. Hapus instalan mysql dari panel kontrol
  2. Hapus folder MySql dari C:\Program Files,C:\Program Files (x86)danC:\ProgramData
  3. Instal mysql
Sanjay
sumber
Mencoba semua jawaban lain, akhirnya memutuskan untuk mencoba ini dan berhasil!
jasonoriordan
0

Ini juga dapat terjadi jika MySQL berjalan pada OS yang case-insensitive, seperti Windows.

mis. Saya menemukan bahwa upaya menyambung ke database menggunakan kredensial ini gagal:

mysql> grant select on databaseV105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -p's3curepa5wrd' -h10.61.130.89 databaseV105

GALAT 1045 (28000): Akses ditolak untuk pengguna 'specialuser'@'10.0.1.113' (menggunakan kata sandi: YES)

Tetapi, ini berhasil:

mysql> grant select on databasev105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -h10.300.300.400 databaseV105 -p

Masukkan kata kunci:

kguest
sumber
0

Sekarang! Solusi untuk:

MySQL ERROR 1045 (28000): Akses ditolak untuk pengguna 'pengguna' @ 'localhost' (menggunakan kata sandi: YES);

Wampserver 3.2.0 instalasi atau peningkatan baru

Mungkin xampmenggunakan mariaDBsebagai default juga.

WampServer datang dengan mariaDBdan mysql, dan menginstal mariaDBsebagai default pada port 3306 dan mysql pada 3307, port terkadang 3308.

Terhubung ke mysql!

Pada instalasi diminta untuk menggunakan mariaDBatau MySql, Tapi mariaDB diperiksa sebagai default dan Anda tidak dapat mengubahnya, centang mysqlopsi dan instal.

ketika instalasi selesai keduanya akan berjalan mariaDBpada port default 3306 dan mysqlpada port lain 3307 atau 3308.

Klik kanan pada wampserverikon di mana runing-nya harus berada di sudut kanan bawah, goto tools dan lihat mysqlporting runing Anda yang benar .

Dan sertakan dalam koneksi database Anda sama dengan folowng:

$host = 'localhost';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$port = '3308';//Port

$dsn = "mysql:host=$host;dbname=$db;port=$port;charset=$charset"; //Add in connection
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

Note : Saya menggunakan pdo.

Lihat di sini untuk lebih lanjut: https://sourceforge.net/projects/wampserver/

Dlk
sumber
Tolong jangan gunakan backticks untuk penekanan. Mereka seharusnya hanya digunakan untuk kode. Kata-kata seperti MySQL atau Wampserver bukan kode.
Dharman