MySQL ERROR 1045 (28000): 'bill' @ 'localhost' kullanıcısı için erişim reddedildi (şifre kullanarak: EVET)


430

İlk olarak, birçok önerilen sorudan geçtiğimi ve ilgili bir cevap bulamadığımı belirtmeme izin verin. İşte yaptığım şey.

Amazon EC2 örneğime bağlıyım. Bu komutla MySQL root ile giriş yapabilirim:

mysql -u root -p

Sonra% host ile yeni bir kullanıcı faturası oluşturdum

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

Kullanıcı faturasına tüm ayrıcalıkları verildi:

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

Sonra kök kullanıcıdan çıkmak ve bill ile giriş yapmaya çalışın:

mysql -u bill -p

doğru şifreyi girip şu hatayı aldı:

HATA 1045 (28000): 'bill' @ 'localhost' kullanıcısı için erişim reddedildi (şifre kullanarak: EVET)


34
Öyle mi FLUSH PRIVILEGES?
eggyal

6
Tamam, bunu hiç denemeden denedim. Başka bir öneri lütfen.
Ali

1
Sunucunun hangi sürümünü kullanıyorsunuz? 5.1'in bu konuda garip davrandığını gördüm.
Poodlehat

2
Bu Magento'yu kurarken başıma geldi ve ben çok daha aptalca bir hata yaptım. 'Mysql -u magento -p magento' koymak bana bir şifre
soruyordu

2
@authentictech maalesef, bu sorunun gönderildiği sırada önerilen çözümlerin hiçbiri benim için çalışmadı. Lütfen bu durumdan kurtulmama yardımcı olan kendi cevabımı gör. Bu yüzden hiçbirini cevap olarak işaretlemedim. Muhtemelen en üst sıradaki yanıtı cevap olarak işaretleyebilirim.
Ali

Yanıtlar:


442

Büyük olasılıkla anonim bir kullanıcınız var ''@'localhost'veya ''@'127.0.0.1'.

Gereğince kılavuzda :

Birden fazla eşleşme mümkün olduğunda, sunucu hangisinin kullanılacağını belirlemelidir. Bu sorunu şu şekilde çözer: (...)

  • Bir istemci bağlanmaya çalıştığında, sunucu [tablo mysql.user] satırlarını sıralı olarak arar .
  • Sunucu, istemci ana bilgisayar adıyla ve kullanıcı adıyla eşleşen ilk satırı kullanır.

(...) Sunucu, önce en belirgin Ana Makine değerlerine sahip satırları sıralayan sıralama kurallarını kullanır . Değişmez ana bilgisayar adları ['localhost' gibi] ve IP adresleri en belirgindir.

Bu nedenle, böyle bir anonim kullanıcı '[any_username]'@'%', bağlanırken olduğu gibi herhangi bir kullanıcıyı "maskeler" localhost.

'bill'@'localhost'eşleşir 'bill'@'%', ancak ''@'localhost'önceden eşleşir (ör.) .

Önerilen çözüm bu anonim kullanıcıyı bırakmaktır (bu genellikle her durumda yapmak için iyi bir şeydir).


Aşağıdaki düzenlemeler çoğunlukla ana soru ile ilgisizdir. Bunlar yalnızca bu konudaki diğer yorumlarda sorulan bazı soruları cevaplamak içindir.

Düzenle 1

'bill'@'%'Soket üzerinden kimlik doğrulaması .

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
    MySQL monitörüne hoş geldiniz (...)

    mysql> SELECT kullanıcı, ana bilgisayar FROM mysql.user;
    + ------ + ----------- +
    | kullanıcı | sunucu |
    + ------ + ----------- +
    | fatura | % |
    | kök | 127.0.0.1 |
    | kök | :: 1 |
    | kök | localhost |
    + ------ + ----------- +
    Sette 4 sıra (0.00 saniye)

    mysql> KULLANICI SEÇ (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | KULLANICI () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | fatura @% |
    + ---------------- + ---------------- +
    Sette 1 satır (0,02 sn)

    mysql> 'skip_networking' GİBİ DEĞİŞKENLERİ GÖSTER;
    + ----------------- + ------- +
    | Değişken_adı | Değer |
    + ----------------- + ------- +
    | skip_networking | AÇIK |
    + ----------------- + ------- +
    Sette 1 satır (0.00 sn)

Düzenle 2

Tam olarak aynı kurulumu yaptım, ancak ağı yeniden etkinleştirdim ve şimdi anonim bir kullanıcı oluşturuyorum ''@'localhost'.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    MySQL monitörüne hoş geldiniz (...)

    mysql> KULLANICI OLUŞTUR '' @ 'localhost' 'anotherpass' İLE TANIMLANMIŞ;
    Sorgu tamam, 0 satır etkilendi (0.00 sn)

    mysql> Hoşça kal

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket = / tmp / MySQL-5.5.sock
    HATA 1045 (28000): 'bill' @ 'localhost' kullanıcısı için erişim reddedildi (şifre kullanarak: EVET)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protokol = TCP
    HATA 1045 (28000): 'bill' @ 'localhost' kullanıcısı için erişim reddedildi (şifre kullanarak: EVET)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol = TCP
    HATA 1045 (28000): 'bill' @ 'localhost' kullanıcısı için erişim reddedildi (şifre kullanarak: EVET)

Düzenle 3

Düzenleme 2'deki durumla aynı, şimdi anonim kullanıcının şifresini sağlıyor.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    MySQL monitörüne hoş geldiniz (...)

    mysql> KULLANICI SEÇ (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | KULLANICI () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | @localhost |
    + ---------------- + ---------------- +
    Sette 1 satır (0.01 sn)

Sonuç 1, düzenleme 1'den: Bir tanesi 'bill'@'%'bir soket aracılığıyla olduğu gibi doğrulanabilir .

Sonuç 2, düzenleme 2'den: Birinin TCP üzerinden mi yoksa bir yuvadan mı bağlanacağı, kimlik doğrulama işlemi üzerinde herhangi bir etkiye sahip değildir (biri başka biri olarak değil 'something'@'localhost', bir soket aracılığıyla bağlanamaz ).

Sonuç 3, düzenleme 3'ten: Belirtmeme rağmen -ubill, bana anonim kullanıcı olarak erişim izni verildi. Bunun nedeni yukarıda tavsiye edilen "sıralama kuralları" dır. Çoğu varsayılan kurulumda, parola olmayan, anonim bir kullanıcının bulunduğuna (ve güvenli / güvenli bir şekilde kaldırılması gerektiğine) dikkat edin.


9
'Bill' @ 'localhost' un benim gibi neden '@' localhost 'ile eşleştiğini merak eden herkes için, boş bir dize MySQL'in kimlik doğrulama algoritmasında etkili bir şekilde joker karakter görevi görür.
Dean Or

2
@Sanja Bu geçici çözümde çok dikkatli olun. Herhangi bir konumdan veritabanınıza anonim erişime izin veriyor olabilirsiniz. Şüphe durumunda kullanıcıyı silmeyi tercih ederim.
RandomSeed

7
@RandomSeed Bu yorum için teşekkür ederiz! Muhtemelen anonim kullanıcıyı silmeliyim. PS buldum dev.mysql.com/doc/refman/5.1/en/default-privileges.html bu kullanıcılar mutlaka silinebilir olduğunu söylüyor: DROP USER ''@'localhost';. Özel bir amaç için gerekli değildir.
Alex

1
Anonim kullanıcıyı bıraktım, ancak işler hala işe yaramadı. Sonra da "FLUSH PRIVILEGES" yayınlamam gerektiğini öğrendim. Bunu da belirtmekte fayda var.
Neeme Praks

2
Cevap bu! Bu neden her MySQL kılavuzunda kalın harflerle gelmiyor. ANONİM KULLANICI SİLİN VEYA LOCALHOST'TAN GİRİŞ YAPMAK İÇİN TÜM GİRİŞLERİNİZİ ÖLECEKTİR
Sergei

140

Deneyin:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;

10
Birisi bill @ localhost mysql hesabınızı hack ederse, bu oldukça tehlikelidir, mysql sunucunuzun tüm veritabanlarına sonsuz erişime sahip olacaktır.
Adonis K. Kakoulidis

2
Whehey. Kullanıcının 'myusername'@'myhost.static.myip.com' etrafına alıntı yapmak zorunda kaldım.
bendecko

Bu benim için çalışıyor ama korkarım kullanıcı için çok fazla ayrıcalık verdim
Csaba Toth

1
@CsabaToth, kullanıcı ihtiyaç duyduğu ve daha fazla yok olana kadar ayrıcalıkları tekrar azaltın.
jwenting

... ve bu size "root '@' localhost 'kullanıcısı için erişim reddedildi (şifre: YES)" verirse ne yaparsınız?
Grunion Shaftoe

75

Koştuğunda

mysql -u bill -p

ve bu hatayı aldı

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

mysqld sizden bağlanmanızı bekliyor bill@localhost

Oluşturmayı deneyin bill@localhost

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

Uzaktan bağlanmak istiyorsanız, TCP / IP kullanarak DNS adını, genel IP'yi veya 127.0.0.1'i belirtmeniz gerekir:

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

Giriş yaptıktan sonra lütfen bunu çalıştırın

SELECT USER(),CURRENT_USER();

USER (), MySQL'de nasıl kimlik doğrulaması yapmaya çalıştığınızı bildirir

CURRENT_USER () , mysql.user tablosundan MySQL'de nasıl kimlik doğrulamanıza izin verildiğini bildirir

Bu, mysql'ye nasıl ve neden oturum açmanıza izin verildiğini daha iyi görmenizi sağlayacaktır. Bu görüşün bilinmesi neden önemlidir? Kullanıcı kimlik doğrulama sipariş protokolü ile ilgilidir.

İşte bir örnek: Masaüstümde MySQL adsız bir kullanıcı oluşturacağım

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>

Tamam beni anonim kullanıcı olarak giriş izle:

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>

Kimlik doğrulama sırası çok katı. En spesifikinden en azına doğru kontrol eder. Bu kimlik doğrulama stili hakkında DBA StackExchange yazdım .

Gerektiğinde mysql istemcisi için protokol olarak TCP'yi açıkça çağırmayı unutmayın.


1
'bill'@'localhost'eşleşmeli 'bill@%', değil mi?
RandomSeed

@ Sıralama düzenini yalnızca mysql.user'ın kullanıcı sütununa dayandırmayın. MySQL kendiliğinden eşleşen bir karakter yapmaz. : Ben DBA Stack Exchange kullanıcı kimlik doğrulama sipariş protokolü hakkında yazdığı dba.stackexchange.com/a/10897/877
RolandoMySQLDBA

@YaK Bu yüzden özellikle bahsetmiştim SELECT USER(),CURRENT_USER();. Gerçekten kötü kurulumlar dışında anonim kullanıcıların bu iki işlevden göründüğünü neredeyse hiç göremezsiniz.
RolandoMySQLDBA

1
Ben sıralama düzeni dayanır farz asla sadece üzerinde mysql.user. Aslında, cevabımı tekrar okursanız, sıralama düzeninin hostilk önce sütuna dayandığını söylediğimi göreceksiniz (aslında el kitabı söylüyor) . Mevcut kimlik bilgilerinizi nasıl kontrol edeceğiniz hakkında çok şey yazdınız, ama neden 'bill'@'localhost'giriş yapamadığım konusunda çok az bilgi görüyorum 'bill'@'%'ki bu bugünün AFAIK sorusu. OP'nin muhtemelen kötü bir kurulumu var, bu yüzden bu hataları alıyor.
RandomSeed

2
--protocol=TCPanahtardı. Çok teşekkür ederim!
lfx

22

Buna çok geç

Tüm diğer cevapları denedim ve birçok farklı versiyonunu mysql -u root -pçalıştırdım ama asla koşmadım


mysql -u root -p

Ve sadece [ENTER]şifre için tuşuna basın .


Bunu yaptığımda işe yaradı. Umarım bu birine yardımcı olur.


18

Benim durumumda ilgili bir sorun kullanarak bağlanmaya çalışıyordu:

mysql -u mike -p mypass

Boşluk görünüşte -u #'uname # ama arasında izin IS DEĞİL arasındaki -p ve # şifre #

Bu nedenle gerekli:

mysql -u mike -pmypass

Aksi takdirde -p mypass mysql arasındaki beyaz boşluk db adı olarak 'mypass' alır


1
veya: mysql -u usrname -p - bu, yeni bir satır bırakacağını ve görüntülenmeden şifreyi soracağı için herkesin şifreyi görmesini durdurur

great answer @mstram
Solanki

1
bu çözüm rahattır, yine de şifreyi açıkça yazmak güvenli değildir, ancak tip izni ayrıcalığına ve diğer şeyleri tanımlamaya gerek yoktur. Yani mac kitap güvenli ise - bu yaklaşım çok rahat, daha da docker mysql sürücüsünden aws veri almak için kullandım.
dimpiax

17

Eğer yazdığınızda mysql -u root -p, yerel unix soket üzerinde MySQL sunucusuna bağlıyoruz.

Ancak verdiğiniz hibe, 'bill'@'%'sadece TCP / IP bağlantılarını yeterince merak uyandırıyor.

Yerel unix soketine erişim izni vermek istiyorsanız, 'bill' @ 'localhost' için ayrıcalık tanımanız gerekir ki bu da merakla 'bill'@'127.0.0.1' ile aynı değildir.

Ayrıca, daha önce vermiş olduğunuz ayrıcalıklarla eşleşmesi için mysql komut satırı istemcisi ile TCP / IP kullanarak da bağlanabilirsiniz. mysql -u root -p -h 192.168.1.123 veya kutunuzdaki yerel IP adresini kullanabilirsiniz.


"'bill' @ '%' yalnızca TCP / IP bağlantılarıyla eşleşiyor" Bu yanlış. Temiz (bakire, kullanıma hazır) bir örnekle skip-networking
deneyin

@YaK Böyle bir kurulumda 'user' @ '%' işlevini kullanamıyorum, ne demek istiyorsun?
nos

Ağ olmadan bir v5.0'da 'bill' @ '%' olarak bağlanabilirim (dolayısıyla bir soket aracılığıyla). Hangi sürümü kullanıyorsunuz? Bir v5.5 üzerinde deneyeceğim.
RandomSeed

Lütfen güncellenmiş cevabıma bakın. 'bill'@'%'Bir v5.5 üzerindeki bir soket üzerinden giriş yapabildim .
RandomSeed

17

Şifrenizi unutursanız veya şifrenizi değiştirmek isterseniz, aşağıdaki adımları uygulayabilirsiniz:

1: MySQL'inizi durdurun

[root @ maomao ~] # service mysqld durdur
MySQL'i Durdurma: [Tamam]

2: mysql'yi yeniden başlatmak için “--skip-grant-tables” kullanın

[root @ mcy400 ~] # mysqld_safe --skip-grant-tables
[root @ cy400 ~] # mysqld arka plan programının / var / lib / mysql'den veritabanlarıyla başlatılması

3: yeni bir pencere açın ve mysql -u kökü girin

[root @ cy400 ~] # mysql -u root
MySQL monitörüne hoş geldiniz. Komutlar; veya \ g.

4: kullanıcı veritabanını değiştirme

mysql> mysql kullan
Tablo ve sütun adlarının tamamlanması için tablo bilgilerini okuma -A Veritabanı değiştiğinde daha hızlı bir başlangıç ​​yapmak için bu özelliği kapatabilirsiniz

5: şifrenizi değiştirin yeni şifreniz "()"

mysql> güncelleme kullanıcı seti şifre = şifre ('root123') burada kullanıcı = 'root';
Sorgu Tamam, etkilenen 3 satır (0.00 sn)
Eşleşen satır sayısı: 3 Değiştirildi: 3 Uyarılar: 0

6: yıkamak

mysql> floş ayrıcalıkları;

7: çık

mysql> çık
güle güle

8: MySQL'i yeniden başlat

[root @ cy400 ~] # hizmet mysqld yeniden başlatma;
MySQL'in Durdurulması: [Tamam]
MySQL'in Başlatılması: [Tamam]

Bingo database Veritabanınızı kullanıcı adınız ve yeni şifrenizle bağlayabilirsiniz:

[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

1
Bu bana yardımcı oldu, ama mac üzerinde homebrew ile yüklerseniz mysql.server stop. Benim durumumda, kullanıcı sütununu güncelleyemedim çünkü biri yok; ayrıca güvenli modda olduğu için bir tane oluşturamadı. Şu anda yaptığım şey için umrumda değil, ancak gösterilen tam giriş ve çıkışlarla bu format cevabını gerçekten takdir ediyorum. Teşekkürler!
szeitlin

Üzgünüm, daha önce hiç mac kullanmadım, bu yüzden size yardım edemem.
Li Yingjun

15

Kendinizi BÜYÜK bir baş ağrısından kurtarın ... Sorununuz parolanın çevresindeki tırnak işaretlerini kaçırıyor olabilirsiniz. En azýndan 3 saat beni mahveten davam buydu.

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

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

"İşte tipik bir kullanıcı seçenek dosyası:" için arama yapın ve burada belirttikleri örneğe bakın. İyi şanslar ve umarım birilerini biraz daha kurtarmayı umuyorum.


1
Bunun için teşekkür ederim. Bu günün yarısını boşa harcadım ve şifre etrafındaki aptalca alıntılar hile yaptı!
guyfromfl

Haha. Başıma geldiğinde hemen hemen aynı şeyi boşa harcadım. Yardım etmekten memnunum.
mimoralea

12

Çözüm anonim (Herhangi) kullanıcıyı silmektir!

Aynı sorunu bir başkası tarafından bir sunucu kurulumunda da yaşadım. Normalde MySQL kurduktan sonra anonim bir kullanıcı oluşturmayı seçmiyorum, bu yüzden bunu fark etmemiştim. Başlangıçta "root" kullanıcısı olarak oturum açtım ve birkaç "normal" kullanıcı (kullanıcı adı sadece önek olarak dbs'de ayrıcalıklara sahip kullanıcılar olarak) oluşturdum, sonra çıkış yaptım, sonra ilk normal kullanıcıyı doğrulamak için devam ettim. Giriş yapamadım. Ne phpMyAdmin ne de kabuk üzerinden. Anlaşılan, suçlu bu "Herhangi" bir kullanıcı.


11

Biraz benzer bir sorunum vardı - MySQL'e ilk girme girişimimde olduğu gibi root , erişim reddedildiğini söylediğim . Görünüşe göre kullanmayı unuttumsudo ...

Bu nedenle, rootilk denemede başarısız olursanız, şunları deneyin:

sudo mysql -u root -p

ve sonra şifrenizi girin, bu işe yarayacak.


6

Kendim için bulduğum en iyi çözüm.

benim kullanıcı sonar ve ne zaman harici veya diğer makineden benim veritabanına bağlanmaya çalışıyorum gibi hata alıyorum

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

Ayrıca başka bir makineden deniyor ve Jenkins iş aracılığıyla erişim için URL

alm-lt-test.xyz.com

uzaktan bağlanmak istiyorsanız, aşağıdaki gibi farklı yollarla belirleyebilirsiniz:

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

Buna URL ile erişmek için aşağıdaki sorguyu yürütmeniz yeterlidir.

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';

4

Tamam, emin değilim ama muhtemelen bu mysql kurulum dizini içindeki my.cnf dosyası suçlu olduğunu. Bu satırı yorumlayın, sorun çözülmüş olabilir.

bind-address = 127.0.0.1

1
Daha fazla ayrıntı için bunu da görüntüleyebilirsiniz wiki.bitnami.org/Components/MySQL
Ali

1
Sorunun bu olmadığından eminim. Öyleyse, MySQL 127.0.0.1 dışındaki herhangi bir ana bilgisayardan bağlantıları reddeder ve bir SQL 'Erişim Reddedildi' hatası almazsınız.
Pellmeister

3

Sadece aynı hatayı aldığım alışılmadık bir durumu bildirmek istedim. Belki de bu gelecekte birine yardımcı olur.

Birkaç temel görüş geliştirdim, geliştirme alanında oluşturdum ve bunları üretim alanına aktardım. O haftanın ilerleyen saatlerinde bir PHP betiği değiştirdim ve Access'in 'local-web-user' @ 'localhost' için erişiminin reddedildiği ani hatalar ortaya çıktı. Veri kaynağı nesnesi değişmemişti, bu yüzden MySQL'de veritabanı kullanıcısına yoğunlaştım, bu arada birisi web sitemi hackledi. Neyse ki sitenin geri kalanı zarar görmemiş gibi görünüyordu.

Daha sonra görüşlerin suçlu (lar) olduğu ortaya çıktı. Nesne aktarımlarımız, yerel web sitesi kullanıcısından başka bir (ve uzak: admin @ ip-adresi) kullanıcısı kullanılarak yapılır. Böylece görünümler tanımlayıcı olarak 'admin' @ 'ip-adresi' ile oluşturuldu. Görünüm oluşturma GÜVENLİĞİ varsayılanı

SQL SECURITY DEFINER

Yerel web kullanıcısı görünümü kullanmaya çalıştığında, tabloları kullanmak için tanımlayıcının eksik ayrıcalıklarına rastlar. Güvenlik bir kez değiştirildiği zaman:

SQL SECURITY INVOKER

sorun çözüldü. Gerçek sorun, hata mesajına göre beklenenden tamamen farklıydı.


1
Bu da benim sorunumun kaynağı oldu - eksik bir "tanımlayıcı" ile bir görünüm. Bunun olup olmadığını öğrenmenin hızlı bir yolu, aynı tabloyu veya görünümü kök olarak sorgulamayı denemektir - eğer yaparsanız, hata mesajı çok daha açıklayıcı "HATA 1449 (HY000) olarak değişir: msgstr "tanımlayıcı mevcut değil".
Joshua Davies

3

Arasındaki fark:

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

ve

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

Kontrol et:

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
+---------------+----------------------------+

Komuta

mysql -u bill -p

erişim 'bill' @ 'localhost' ve 'bill' @ '%' için örtülü DEĞİLDİR.

'Bill' @ 'localhost' için izin yok

hatayı alıyorsunuz:

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

Sorunu çözmek:

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

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

Hibe beyanı bir hata döndürdü. Ben böyle bir veritabanı belirtmek gerekiyordu: newdb. *
To

3

Bu, şifreniz @, $ vb. Gibi bazı özel karakterler içerdiğinde de olur. Bu durumu önlemek için şifreyi tek tırnak içine alabilirsiniz:

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

Ya da girerken şifre kullanmayın. Boş bırakın ve terminal sorduğunda yazın. Önerilen yol budur.

$ 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>

3
Bu gerçekten bir sorun olabilir (benim için olduğu gibi). Herhangi bir hesabıma ait tüm şifreleri kullanarak oluşturulur pwgen. Bugün MySQL veritabanı ve kullanıcısı için yeni bir tane oluşturdum. Ne yazık ki parola hata kökeni olarak tanımlamamış bir ters eğik çizgi "\" içeriyordu (bunu bile düşünmedim). Bu yüzden saatlerce bir çözüm aradım. Umutsuzlukta şifre "123" olarak ayarlandıktan sonra giriş nihayet çalıştı. … Kullanıcılar, MySQL'in "daiy4ha4in7chooshuiphie \ Th * aew" gibi parolaların kullanımıyla ilgili herhangi bir uyarı göstermediği için bazı özel karakterlerin sorunlara neden olabileceğini bilmelidir.
Arvid

1
Henüz görünmemiş olsaydı bunu bir cevap olarak göndermek üzereydim, fark etmem için listede çok aşağı inmişti (bu yüzden +1 kadar çarpıyorum)
Assimilater

3

Benim için bu sorun MySQL 5.7.2 bir yeni özellik neden oldu: usergirişleri vardır gözardı onların eğer pluginalanı boş.

Örneğin mysql_native_password, yeniden etkinleştirmek için şu şekilde ayarlayın :

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

«Kimlik Doğrulama Notları» altındaki MySQL 5.7.2 sürüm notlarına bakın .

Herhangi bir nedenle (belki de 4.1 öncesi şifre karmalarım kaldırıldığı için), mysql_upgradekomut dosyası varsayılan bir eklenti değeri belirlemedi.

Aşağıdaki uyarı mesajını fark ederek öğrendim /var/log/mysql/error.log:

[Uyarı] 'foo' @ '%' kullanıcı girişinde boş bir eklenti değeri var. Kullanıcı yok sayılır ve artık kimse bu kullanıcıyla giriş yapamaz.

Bu yanıtı, birisinin benim yaptığımla aynı saçma zamanı kullanmasını önlemek için buraya gönderiyorum.


2

Başka kimse bu yararlı bulacağından emin değilim, ama aynı hatayla karşılaştım ve herhangi bir anonim kullanıcı aradım ... ve hiç yoktu. Sorun, kullanıcı hesabına gidip kullanıcı için Ayrıcalıkları Düzenle'yi tıklatarak PHPMyAdmin'de bulduğum kullanıcı hesabının "SSL İste" olarak ayarlanmasıyla sonuçlandı. Bu seçeneğin işaretini kaldırır kaldırmaz, her şey beklendiği gibi çalıştı!


2

Hata Ayıklama Özeti

  • Yazım hatası hatası olup olmadığını kontrol edin: kullanıcı adı veya şifre.
  • Ana bilgisayar adını kontrol edin ve mysql.user tablosu ana bilgisayar adıyla karşılaştırın.
  • Kullanıcının var olup olmadığını kontrol edin.
  • Ana bilgisayarın IP adresi veya ana bilgisayar adı içerip içermediğini kontrol edin.

İşinizde bu sorunla birkaç kez karşılaşmış olabilirsiniz. Bu sorun çoğunlukla yanlış girilen kullanıcı adı veya şifre nedeniyle bana geldi. Bunun nedenlerinden biri olmasına rağmen, bu sorunu elde etme şansınız çok daha fazla. Bazen çok benzer görünüyor, ancak daha derine indiğinizde, bu hataya katkıda bulunan birden fazla faktör fark edeceksiniz. Bu yazı, genel nedenlerin çoğunu ayrıntılı olarak açıklayacak ve bu sorunu çözmek için geçici olarak çalışacaktır.

Olası nedenler:

  • Durum 1: Yazım hatası: kullanıcı adı veya şifre.

Bu hatanın en yaygın nedeni budur. Kullanıcı adını veya şifreyi yanlış girdiyseniz, kesinlikle bu hatayı alırsınız.

Çözüm:

Bu tür hataların çözümü çok basittir. Doğru kullanıcı adını ve şifreyi girmeniz yeterlidir. Bu hata çözülecek. Parolayı unutursanız, kullanıcı adını / parolayı sıfırlayabilirsiniz. Yönetici / kök hesabının parolasını unutursanız, kök parolayı sıfırlamanın / yeniden yakalamanın birçok yolu vardır. Eğer root şifresini unutursanız, root şifresini nasıl sıfırlayacağınıza dair başka bir yazı yayınlayacağım.

  • Durum 2: Yanlış ana bilgisayardan erişim.

MySQL, bir güvenlik özelliği olarak kullanıcı erişimi için ana bilgisayar tabanlı kısıtlama sağlar. Üretim ortamımızda, erişim isteğini yalnızca Uygulama sunucularıyla kısıtlardık. Bu özellik birçok üretim senaryosunda gerçekten yararlıdır.

Çözüm:

Bu tür bir sorunla karşılaştığınızda, önce mysql.user tablosunu kontrol ederek ana makinenize izin verilip verilmediğini kontrol edin. Tanımlanmamışsa, mysql.user tablosuna yeni kayıt güncelleyebilir veya yeni kayıt ekleyebilirsiniz. Genellikle, uzak makineden kök kullanıcı olarak erişim devre dışı bırakılır ve güvenlik endişeleri nedeniyle en iyi uygulama değildir. Sunucunuza birden çok makineden erişme gereksinimleriniz varsa, yalnızca bu makinelere erişim verin. Joker karakterler (%) kullanmamak daha iyidir ve evrensel erişim sağlar. Şimdi demouser herhangi bir ana bilgisayardan MySQL sunucusuna erişebilir, mysql.user tablosunu güncelleyeyim.

  • Durum 3: Kullanıcı sunucuda yok.

Bu tür hata, erişmeye çalıştığınız kullanıcı MySQL sunucusunda bulunmadığında oluşur.

Çözümler:

Bu tür bir sorunla karşılaştığınızda, kullanıcının mysql.user tablosunda olup olmadığını kontrol etmeniz yeterlidir. Kayıt yoksa, kullanıcı erişemez. Bu kullanıcının erişmesi için bir gereksinim varsa, bu kullanıcı adıyla yeni bir kullanıcı oluşturun.

  • Durum 4: Sayısal ve ad tabanlı ana bilgisayarların karışımı.

Önemli noktalar

  • Kullanıcı ana bilgisayarını tanımlarken joker karakterler kullanmanız önerilmez, tam ana bilgisayar adını kullanmaya çalışın.

  • Uzak makineden root girişini devre dışı bırakın.

  • Proxy kullanıcı kavramı kullanın.

Bu konuyla ilgili başka kavramlar da vardır ve bu konuların ayrıntılarına girmek bu makalenin çok farklı bir kapsamıdır. Önümüzdeki makalelerde aşağıdaki ilgili konulara bakacağız.

  • MySQL sunucusunda root şifresini unuttuysanız ne yapmalısınız?
  • MySQL Erişim ayrıcalığı sorunları ve kullanıcıyla ilgili tablolar.
  • En iyi uygulamalarla MySQL güvenlik özellikleri.

Bu yazı MySQL kullanıcı için reddedildi MySQL Hata Kodu 1045 Erişim düzeltmek için yardımcı olacağını umuyoruz.


2

Umarım mysql'deki debian-sys-maint kullanıcısını da silerek daha fazla hasar vermediniz

MySQL Daemon'unuzun normal şekilde çalışmasını sağlayın. MySQL istemcinizi aşağıda gösterildiği gibi başlatın

mysql -u debian-sys-maint -p

Başka bir terminalde, catdosya/etc/mysql/debian.cnf . Bu dosya bir şifre içeriyor; istendiğinde bu şifreyi yapıştırın.

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


2

Yüzeyde bir kenar kasası gibi görünen başka bir kasayı keşfettim; Ben dosya sistemine, SELECT INTO .. ​​OUTFILE üzerinden kök olarak, ancak normal kullanıcı olarak verebilirsiniz. Bu bir izin meselesi olsa da, buna baktım ve özellikle belirgin bir şey görmedim. Söyleyebileceğim tek şey, söz konusu veri tabanında tüm izinlere sahip olan normal bir kullanıcı olarak sorguyu yürütmenin beni bu konuya götüren erişim reddedildi hatasını döndürdüğü. Eski bir projede SELECT INTO… OUTFILE kullanımının başarılı bir kopyasını bulduğumda root olarak giriş yaptığımı fark ettim. Tabii ki, kök olarak giriş yaptığımda, sorgu beklendiği gibi koştu.


1

Güncelleme: v8.0.15 sürümünde (belki bu sürümde) PASSWORD()işlev çalışmaz.

Yapmalısın:

  1. Önce MySQL'i Durdurduğunuzdan emin olun.
  2. Sunucuyu ayrıcalık atlama ile güvenli modda çalıştırın: sudo mysqld_safe --skip-grant-tables
  3. Oturum aç: mysql -u root
  4. mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
  5. mysql> FLUSH PRIVILEGES;
  6. mysql> exit;
  7. Tekrar giriş yap: mysql -u root
  8. mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';

0

Çalıştırdığınızda mysql -u bill -p, varsayılan olarak localhost127.0.0.1 olduğundan ve /etc/hostsdosyanızda olduğundan ip'inize çözümlenir 127.0.0.1 localhost. Yani, mysql sizi bill@localhostverilmeyen olarak yorumlar bill@'%'. Bu nedenle rootkullanıcı için 2 farklı kayıt var .select host, user from mysql.user; sorgu .

Bu sorunu ele almanın iki yolu vardır.

Biri, /etc/hostsoturum açmaya çalıştığınızda dosya tarafından ters çözülmeyen bir ip belirtiyor . Örneğin, sunucunun ip'i 10.0.0.2. Komutu çalıştırdığınızda mysql -u bill -p -h 10.0.0.2oturum açabileceksiniz. Eğer yazarsanız select user();, alırsınız bill@10.0.0.2. Tabii ki, herhangi bir etki alanı adı /etc/hostsdosyanızdaki bu ip için çözülmemelidir .

İkinci olarak, bu belirli alan adı için erişim izni vermeniz gerekir. İçin bill@localhost, komut çağırmalısınız grant all privileges on *.* to bill@localhost identified by 'billpass';. Bu durumda, komut ile oturum açabileceksiniz mysql -u bill -p. Giriş yaptıktan sonra select user();komut geri döner bill@localhost.

Ancak bu sadece aynı ana bilgisayarda bir mysql sunucusunda oturum açmaya çalışmanız içindir. Uzak ana bilgisayarlardan, mysql beklenen şekilde davranır, '%' giriş yapmanızı sağlar.


0

Ben eski buggy kullanıcı 'bill' girişleri (bu önemli bir parçasıdır: hem mysql.user ve mysql.db ) silerek çözdüm , sonra daha önce aynı kullanıcı yarattı:

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

Çalıştı, kullanıcı bağlanıyor. Şimdi bundan bazı previlejileri kaldıracağım :)


0

Aynı hatayla karşılaştım. Çalışmayan kurulum aşağıdaki gibidir:

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

Aşağıdaki düzenlenmiş kurulum, çalışmasını sağlayan kurulumdur. Farkı fark ettiniz mi?

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

Fark çift tırnaktır. PHP'de Java'nın aksine oldukça önemli görünüyorlar ve karakterlerden kaçmak, URL'ler ayarlamak ve şimdi bir işleve parametreler aktarmak söz konusu olduğunda bir etkiye sahipler. Onlar daha güzel (biliyorum) ama her zaman mümkün olduğunca tek tırnak kullanın, sonra gerekirse çift tırnak içine alınabilir.

Bu hata, uygulamanızı bir Windows ortamının aksine bir Linux kutusunda test ettiğimde ortaya çıktı.


0

Şifrem ";" içerdiğinden benzer sorunlar yaşadım char ilk anda oluşturduğumda şifremi kırıyorum. Bu konuda size yardımcı olabilirseniz dikkatli olun.


0

Bu çok az insan için geçerli olabilir, ama işte gidiyor. !Şifrenizde ünlem işareti kullanmayın .

Yaptım ve MariaDB kullanarak yukarıdaki hatayı aldım. Sadece rakamlara ve harflere sadeleştirdiğimde işe yaradı. Gibi diğer karakterler @ve$ çalışır - Bu karakterleri aynı örnekte farklı bir kullanıcıda kullandım.

Bu adresteki beşinci cevap beni düzeltti.


0

Windows'ta şu şekilde çözebilirsiniz:

HATA 1045 (28000): 'root' @ 'localhost' kullanıcısı için erişim reddedildi (şifre kullanarak: HAYIR)

  1. Mysql yazılımını kontrol panelinden kaldırın
  2. MySql klasörünü C:\Program Files,C:\Program Files (x86)veC:\ProgramData
  3. MySQL yükleyin

Tüm diğer cevapları denedim, sonunda bunu denemeye karar verdim ve işe yaradı!
jasonoriordan

0

Bu, MySQL, Windows gibi büyük / küçük harfe duyarlı olmayan bir işletim sisteminde çalışıyorsa da olabilir.

Örneğin, bu kimlik bilgilerini kullanarak bir veritabanına bağlanma girişiminde başarısız olduğunu buldum:

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

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

HATA 1045 (28000): 'specialuser'@'10.0.1.113' kullanıcısı için erişim reddedildi (şifre kullanarak: EVET)

Ancak, bu başarılı oldu:

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

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

Parolanı Gir:



0

Şu günlerde! Çözüm:

MySQL ERROR 1045 (28000): 'user' @ 'localhost' kullanıcısı için erişim reddedildi (şifre kullanarak: YES);

Wampserver 3.2.0 yeni kurulum veya yükseltme

Muhtemelen xampkullanarakmariaDB varsayılan olarak iyidir.

Wampsunucu mariaDBve mysql ile geliyor ve mariaDB3306 bağlantı noktasında varsayılan olarak ve 3307, bazen 3308 bağlantı noktasında mysql kurulumu .

Bağlan mysql!

İnstalation üzerinde kullanmak istiyor mariaDBveya MySql, ama mariadb varsayılan olarak kontrol edilir ve değiştiremezsiniz, mysqlseçeneği kontrol edin ve yükleyin.

kurulum tamamlandığında her ikisi de mariaDBvarsayılan 3306 mysqlnumaralı bağlantı noktasında ve 3307 veya 3308 numaralı başka bir bağlantı noktasında yürütülecektir.

wampserverKoşusunun sağ alt köşede olması gereken simgeye sağ tıklayın, araçlara gidin ve doğru mysqlkoşma portunuzu görün.

Ve folowng ile aynı veritabanı bağlantınıza ekleyin:

$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 : PDO kullanıyorum.

Daha fazla bilgi için buraya bakın: https://sourceforge.net/projects/wampserver/


Lütfen vurgulamak için geri iğne kullanmayın. Yalnızca kod için kullanılmalıdır. MySQL veya Wampserver gibi kelimeler kod değildir.
Dharman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.