Ayrıcalık tanımaya çalışırken 'root' @ 'localhost' kullanıcısı için erişim reddedildi. Nasıl ayrıcalık tanıyabilirim?


166

Bir dizi benzer soruya baktım ve bu yüzden temelleri kontrol ettiğimi gösteriyorum. Tabii ki, bu tamamen açık bir şeyi özlemediğim anlamına gelmiyor. :-)

Sorum şu: Neden yapmaya çalıştığım şeyi yapma ayrıcalığına sahip bir kullanıcıya erişimim reddedildi ve şifreyi nereye yazdım ve erişim verildi? (Tamlık uğruna, MySQL istemcisinin program başlangıcında erişime izin vermemesini sağlamak için yanlış şifreyi yazmaya çalıştım.)

Arka fon:

MySQL sunucusunu ssh üzerinden çalıştıran makinenin kabuğuna giriş yaptım, root olarak giriş yapıyorum:

[myname@host ~]$ mysql -u root -p -hlocalhost
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 62396
Server version: 5.5.18-log MySQL Community Server (GPL)

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

mysql> 

Muhteşem. Benzer soruların cevaplarını okuduğumda, imtiyazların hibe tablolarında bulunanlarla güncel olduğundan emin olmam gerektiğini gösteriyor

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> 

Sonra kim olduğumu düşündüğüm emin olun:

mysql> SELECT user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

... ve gerçekten gerçekten emin olun:

mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> 

Çok uzak çok iyi. Şimdi ne gibi ayrıcalıklara sahibim?

mysql> SHOW GRANTS FOR 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                                                                                                                                                                                                                                                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '[OBSCURED]' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Şimdi bunu okumak biraz zor, bu yüzden bu şekilde deneyelim (localhost olmayan bir 'root' kullanıcısı olduğunu da göreceksiniz):

mysql> SELECT * FROM mysql.user WHERE User='root'\G
*************************** 1. row ***************************
                 Host: localhost
                 User: root
             Password: *[OBSCURED]
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Reload_priv: Y
        Shutdown_priv: Y
         Process_priv: Y
            File_priv: Y
           Grant_priv: Y
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
         Show_db_priv: Y
           Super_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
         Execute_priv: Y
      Repl_slave_priv: Y
     Repl_client_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: Y
     Create_user_priv: Y
           Event_priv: Y
         Trigger_priv: Y
             ssl_type: 
           ssl_cipher: 
          x509_issuer: 
         x509_subject: 
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
*************************** 2. row ***************************
                 Host: [HOSTNAME].com
                 User: root
             Password: *[OBSCURED]
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Reload_priv: Y
        Shutdown_priv: Y
         Process_priv: Y
            File_priv: Y
           Grant_priv: Y
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
         Show_db_priv: Y
           Super_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
         Execute_priv: Y
      Repl_slave_priv: Y
     Repl_client_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: Y
     Create_user_priv: Y
           Event_priv: Y
         Trigger_priv: Y
             ssl_type: 
           ssl_cipher: 
          x509_issuer: 
         x509_subject: 
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
 2 rows in set (0.00 sec)

Müthiş! MySQL root @ localhost olduğumu düşünüyor ve root @ localhost tüm bu ayrıcalıklara sahip. Bu, istediğimi yapabilmem gerektiği anlamına geliyor, değil mi?

mysql> GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Bu temel bir şeyi nasıl berbat edebilirdim?

Yan not: Tüm ayrıcalıklara sahip root adında bir kullanıcı olmadığımı önermek isteyen herkes için, bu harika ve başka bir kullanıcıya bazı ayrıcalıklar verebildiğimde yapmayı düşündüğüm bir şey.

Teşekkür ederim!


2
Aynı uzaktan yaşıyorum (ve kullanıcı = 'root' ve host = '%' seninle aynı ayrıcalıkları gösterir * FROM mysql.user seçin). ANCAK, host = '%' ile mysql.user içindeki satır bu alanın dışında host = 'localhost' ile aynı olsa bile LOCALHOST üzerinde çalışır. Windows Server 2003'te 5.0.45 çalıştırıyorum. Yanıtlar minnetle kabul edildi!
Richard Fawcett

3
Böyle organize bir soru için +1!
Dewsworld

1
cmd'yi yönetici olarak çalıştırarak açtığınızdan emin olun
Lijo

1
-pParola arasında sadece bir boşluk vardı . Aptal olduğunu biliyorum ama birine yardım edebilirim.
Vinay K

Yanıtlar:


57

Çıktının nasıl olduğuna dikkat edin

SHOW GRANTS FOR 'root'@'localhost';

'TÜM AYRICALIKLAR' demedi ama root @ localhost'un ne olduğunu açıklamak zorunda kaldı.

TÜM AYRICALIKLARI VERİN başarısız olur, çünkü bir kullanıcı sahip olmadığı şeyi veremez ve sunucu burada bir şey olmadığını düşünür ...

Şimdi, eksik olan ne?

Sistemimde şunu alıyorum:

mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.21-log |
+------------+
1 row in set (0.00 sec)

mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM mysql.user WHERE User='root' and Host='localhost'\G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
              Password: 
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y <----------------------------- new column in 5.5
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: <------------------------------- new column in 5.5
 authentication_string: <------------------------------- new column in 5.5
1 row in set (0.00 sec)

5.5'te mysql.proxies_user gibi yeni tablolar da vardır: bunlara sahip olduğunuzdan emin olun.

Yepyeni bir mysql sunucusu örneği yüklerken, yükleme komut dosyası tüm mysql. * Tablolarını uygun yapıda oluşturur.

Eski bir sürümden yükseltme yaparken, eksik tabloları / sütunları ekleyecek uygun yükseltme prosedürünün (mysql_upgrade) kullanıldığından emin olun.

Bu sadece bir tahmindir, ancak bu örnek için mysql_upgrade yapılmadı ve görülen davranışa neden oldu.


7
Bu yararlı bilgiler, ancak sorunu nasıl düzeltebilirim?
augurar

2
@augurar, Run mysql_upgrade
Marc Alff

Ya da, 'TÜM AYRICALIKLAR' olan başka bir kullanıcınız olup olmadığını kontrol edin ve buna geçin ve localhost'un ayrıcalıklarını değiştirin. Örneğin, root@127.0.0.1 üzerinde tüm ayrıcalıklara sahiptim ve root @ localhost yoktu.
Carabus Manuel

72

Ben de aynı sorun vardı ama MySQL 5.1 MySQL 5.5'e yükselttikten sonra Windows. Burada , burada , burada ve burada bahsettiğim şifreyi değiştirmeyi, oluşturmayı ve sıfırlamayı denedim , hiçbir ipucu yok. Ben hala aynı hatayı alıyorum:

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

Normal olarak bağlanabiliyorum, tüm veritabanlarını gösterebiliyorum, seçimler ve ekler yapabiliyorum, kullanıcı oluşturabiliyorum ve ekleyebiliyorum, ancak GRANT söz konusu olduğunda berbatım. Bu erişim reddedildi hatası yeniden görünüyor.

Burada belirtildiği gibi MySQL sunucu bin / dizinindeki aşağıdaki komutla ayrıcalıkları düzelterek bu sorunu çözmeyi başardım :

C:\MySQL Server 5.5\bin> mysql_upgrade

Sonra sorun ortadan kalktı. Umarım bu çözüm Linux'ta da çalışır, çünkü genellikle MySQL hem Linux hem de Windows'da aynı komutu sağlar.


2
thanx .. homebrew aracılığıyla yüklü mysql ile mac OS'de aşağıdaki komutu çalıştırıncd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
zoras

30
Bir CentO'daysanız veya MySQL'i bir paket yöneticisi aracılığıyla yüklediyseniz, muhtemelen çalıştırmanız gereken komut budur: /usr/bin/mysql_upgrade -u root -pşifre girin ve Bob Amcanız!
Zjoia

Çok fazla yorum ile burada ve orada kavga ettikten sonra bu bana yardımcı oldu. Çok teşekkürler
siddhusingh

Bunun daha eski olduğunu biliyorum ama bu bana çok yardımcı oldu ve gelecekteki ziyaretçiler için bir yorum daha eklemek istedim: ACCESS DENIED'i mysql_upgrade çalıştırmaya çalışıyorsanız, bunun gibi çalıştırmayı deneyin: mysql_upgrade -p
blizz

2
Bulduğum şey, MySQL <= 5.1'den veritabanlarını dışa aktarıp mysqldump ... --all-databasesdaha sonra bunu MySQL> = 5.5'e aktardıysanız, kullanıcılarınızın değiştirileceği (elbette), ancak rootOP ile aynı soruna sahip olacaksınız. Ve mysql_upgradeişe yaramayacak - --forcebayrak eklemelisiniz , yani mysql_upgrade -u root -p --force. Umarım burada birine yardım eder.
gregoltsov

62

Bu, mysql.users tablosu kök dışında bir kullanıcı için sınır dışı olarak değerlendirildiğinden, tüm tablolardaki tüm ayrıcalıkları başka bir kullanıcıya vermeye çalıştığınızda oluşabilir.

Ancak aşağıdakiler işe yaramalıdır:

GRANT ALL PRIVILEGES ON `%`.* TO '[user]'@'[hostname]' IDENTIFIED BY '[password]' WITH GRANT OPTION;

*. * Yerine `%%. * Kullandığımızı unutmayın.


28
Lütfen bunu açıklayın. Neden '%'.*çalışıyor ama çalışmıyor *.*?
Pacerier

Bunu yapmanın doğru yolu budur. MySQL'e root olarak giriş yapmalı ve daha sonra ayrıcalıklar vermeye çalışmalısınız.
Nav

Hata 1044 erişimine
izin verilmiyor

Teşekkürler, pymysql kullanarak bir python uygulamasından mysql erişmeye çalışıyordu. "Ana bilgisayarın bu MariaDB sunucusuna bağlanmasına izin verilmiyor" hatası alıp [burada] verilen yeni bir kullanıcı ekleyerek ( stackoverflow.com/questions/19101243/… ), "kullanıcı için erişim reddedildi" diyen başka bir hata aldığını çözdüm. ve yönteminizle çözüldü.
Balraj Bains

1
'%'.*Bunun yerine kullanırsanız `%`.*çalışmaz. Sen GEREKİR kullanmak`%`.*
Rosario Russo

7

Dağıtımla birlikte gelenlerden daha yüksek bir MySQL sürümü yüklemeye çalıştığımda bu bana oldu.

Eski sürümü sildikten sonra yenisini yükledim (rpm -e ... sonra rpm -i MySQL-server *) Ancak / var / lib / mysql içindeki dosyaların hala eski sürümden (farklarla birlikte) olduğunu fark etmedim Marc Alff açıkladı - teşekkürler!)

Ben bir mysql_upgrade yapmış olabilir, ama sıfırdan başlamak istedim gibi yaptım:

# su - mysql
$ rm -rf /var/lib/mysql/*
$ mysql_install_db
# /etc/init.d/mysql start

Sonra root şifresini ayarlayın (/ usr / bin / mysqladmin -u root şifresi) ve hepsi GRANT komutlarıyla beklendiği gibi çalıştı ...


Teşekkürler, bu bana yardımcı oldu. Neyse ki, tüm
DB'leri

5

Temel olarak bu hata, bir şifre belirtmediğinizde gelir, bu, bazı seçenek dosyalarında listelenen yanlış bir şifrenizin olduğu anlamına gelir.

Hesaplara nasıl Parola atayacağınızı ve yöneteceğinizi anlamak için bu DOC'u okuyun .

Ayrıca, klasördeki iznin /var/lib/mysql/mysql 711 olup olmadığını kontrol edin .


Bu benim için çalıştı. Görünüşe göre mysql 'user' @ 'localhost' için bir izin oluşturmuyor. Bu yüzden bu kullanıcıyı oluşturmak ve bir şifre olduğundan emin olmak zorunda kaldım.
Jerinaw

İzinler yanlıştı! Şaşırdım. Gönderdiğiniz için çok teşekkürler.
Adam

5

Ben de aynı sorun vardı, yani kök için verilen tüm ayrıcalıklar:

SHOW GRANTS FOR 'root'@'localhost'\G
*************************** 1. row ***************************
Grants for root@localhost: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*[blabla]' WITH GRANT OPTION

... ancak yine de tablo oluşturmasına izin verilmiyor:

 create table t3(id int, txt varchar(50), primary key(id));
ERROR 1142 (42000): CREATE command denied to user 'root'@'localhost' for table 't3'

Eh, sinir bozucu bir kullanıcı hatası neden oldu, yani bir veritabanı seçmedim. KULLANIM dbname verdikten sonra iyi çalıştı.


5

Debian (Açık Hırıltılı MySQL 5.5.40 ile, 7.8), ben bulunamadı SELECT * FROM mysql.user WHERE User='root'\Ggösterdi Event_privve 'Trigger_priv` alanlar vardı mevcut ama değil , Y ayarlanmış

Çalışmak mysql_upgrade(olsun ya da olmasın --force) hiçbir fark yaratmadı ; Bir kılavuz yapmam gerekiyordu:

update user set Event_priv = 'Y',Trigger_priv = 'Y' where user = 'root'

Sonra nihayet kullanabilirsiniz:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION

… Ve daha sonra tek bir veritabanında / kullanıcı hesabında daha kesin olarak kullanabilirsiniz.


1
Bu da benim için problemi çözdü, ancak ancak AYRICALIKLARI YIKAMANIZ gerektiğini öğrendikten sonra; ardından hibe seçeneğinin ayarlanması için yeniden giriş yapın.
Hendrik

5

Bu soruya MySQL sürüm 8 kurulu (benim gibi) gelmiş ve tatmin edici bir cevap bulamamış olabilirsiniz. Artık sürüm 8'de bunun gibi kullanıcılar oluşturamazsınız:

GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;

Geri almak oldukça kafa karıştırıcı hata mesajı: ERROR 1410 (42000): You are not allowed to create a user with GRANT

Sürüm 8'de kullanıcı oluşturmak için bunu iki adımda yapmanız gerekir:

CREATE USER 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]';
GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' WITH GRANT OPTION;

Elbette, isterseniz sınırlı sayıda ayrıcalık (yerine) sağlayabilirsiniz GRANT ALL PRIVILEGES, örn.GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER


3

Yazma SHOW GRANTS FOR 'root'@'localhost';bana bazı gizli şifre gösterdi, bu yüzden başka bir sistemde ( rootkullanıcı adı ve ilgili şifre olarak kullanarak) HeidiSQL kullanarak o sistemin mysql giriş ve yazdım
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

ve sisteme geri döndüğümde ve
mysql -uroot -pthepassword;



2

Aynı sorunu yaşadım ve SO yazılarını ve Google'ın belgelerini okumak çok şey aldı. Sonunda Cloud SQL SSS'den buldum :

Google Cloud SQL, SUPER ayrıcalıklarını desteklemez; bu, GRANT ALL PRIVILEGESifadelerin çalışmadığı anlamına gelir . Alternatif olarak,GRANT ALL ON `%`.*


1

Hala yaptığım gibi yanılmak olanlar için, denemenin GRANTzaten mevcut olmadığından emin olmak için kontrol etmeye değer :

SHOW GRANTS FOR username;

Benim durumumda, hata aslında bir izin hatası olduğu için değil, GRANTzaten var olduğu için.


1

MySQL "erişim engellendi" hataları ile karşılaştığımda benim için her zaman çalışan basit bir çözüm: kullanın sudo.

sudo mysql -u root

Sonra GRANTkomutlar için gerekli izinler vardır .

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.