Akses ditolak untuk 'root' @ 'localhost' pengguna saat mencoba untuk memberikan hak istimewa. Bagaimana cara saya memberikan hak istimewa?

166

Saya telah melihat sejumlah pertanyaan serupa dan saya menunjukkan bahwa saya telah memeriksa dasar-dasarnya. Meskipun tentu saja, itu tidak berarti saya tidak melewatkan sesuatu yang sangat jelas. :-)

Pertanyaan saya adalah: mengapa saya menolak akses pada pengguna dengan hak istimewa untuk melakukan apa yang saya coba lakukan dan di mana saya sudah mengetik kata sandi dan diberi akses? (Demi kelengkapan, saya mencoba mengetik kata sandi yang salah hanya untuk memastikan bahwa klien MySQL akan menolak saya akses saat program dimulai.)

Latar Belakang:

Masuk ke cangkang mesin yang menjalankan server MySQL melalui ssh, saya masuk sebagai root:

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

Luar biasa. Pembacaan saya atas jawaban untuk pertanyaan serupa menunjukkan bahwa saya harus memastikan hak istimewa terkini dengan apa yang ada di tabel hibah

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

mysql> 

Selanjutnya pastikan aku adalah siapa yang aku pikirkan:

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

... dan benar- benar memastikan:

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

mysql> 

Sejauh ini baik. Sekarang hak istimewa apa yang saya miliki?

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)

Nah, itu agak sulit dibaca, jadi mari kita coba cara ini (Anda juga akan melihat bahwa ada pengguna 'root' non-localhost):

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)

Luar biasa! MySQL berpikir bahwa saya root @ localhost dan root @ localhost memiliki semua hak istimewa itu. Itu berarti saya harus dapat melakukan apa yang saya inginkan, bukan?

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)

Bagaimana saya bisa mengacaukan sesuatu yang mendasar ini?

Catatan: untuk siapa saja yang ingin menyarankan bahwa saya tidak memiliki pengguna yang bernama root dengan semua hak istimewa, itu bagus dan sesuatu yang akan saya pertimbangkan untuk dilakukan setelah saya dapat memberi pengguna lain hak istimewa.

Terima kasih!

Steven Scotten
sumber
2
Saya mengalami hal yang sama dari jarak jauh (dan pilih * FROM mysql.user di mana user = 'root' dan host = '%' menunjukkan hak istimewa yang sama dengan Anda). NAMUN, ITU BEKERJA PADA LOCALHOST walaupun baris di mysql.user dengan host = '%' identik dengan baris dengan host = 'localhost' selain dari bidang itu. Saya menjalankan 5.0.45 pada Windows Server 2003. Semua jawaban diterima dengan rasa terima kasih!
Richard Fawcett
3
+1 untuk pertanyaan terorganisir seperti itu!
Dewsworld
1
pastikan Anda memiliki opend cmd dengan menjalankannya sebagai administrator
Lijo
1
Saya hanya punya spasi di antara -pdan kata sandi. Saya tahu ini konyol tapi mungkin bisa membantu seseorang.
Vinay W

Jawaban:

57

Perhatikan bagaimana output dari

SHOW GRANTS FOR 'root'@'localhost';

tidak mengatakan 'SEMUA HAK ISTIMEWA' tetapi harus menjelaskan apa yang dimiliki root @ localhost.

PEMBERI SEMUA HAK ISTIMEWA akan gagal, karena pengguna tidak dapat memberikan apa yang tidak ia miliki, dan server tampaknya berpikir ada sesuatu yang tidak ada di sini ...

Sekarang, apa yang hilang?

Di sistem saya, saya mendapatkan ini:

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)

Ada juga tabel baru di 5.5, seperti mysql.proxies_user: pastikan Anda memilikinya.

Saat memasang instance server mysql baru, skrip instal akan membuat semua tabel mysql. * Dengan struktur yang tepat.

Saat memutakhirkan dari versi lama, pastikan prosedur pemutakhiran yang tepat (mysql_upgrade) digunakan, yang akan menambah tabel / kolom yang hilang.

Ini hanya dugaan, tetapi sepertinya mysql_upgrade tidak dilakukan untuk contoh ini, menyebabkan perilaku terlihat.

Marc Alff
sumber
7
Ini adalah informasi yang berguna, tetapi bagaimana cara saya memperbaiki masalahnya?
augurar
2
@ augurar, Jalankan mysql_upgrade
Marc Alff
Atau, periksa apakah Anda memiliki pengguna lain dengan 'SEMUA HAK ISTIMEWA' dan beralih ke yang itu dan ubah hak istimewa untuk localhost. Sebagai contoh, saya memiliki semua hak istimewa di [email protected] dan root @ localhost tidak.
Carabus Manuel
72

Saya juga punya masalah yang sama dengan ini tetapi pada Windows setelah upgrade ke MySQL 5.5 dari MySQL 5.1. Saya sudah mencoba mengubah, menciptakan, dan mengatur ulang kata sandi yang disebutkan di sini , di sini , di sini , dan di sini , tidak tahu. Saya tetap mengalami masalah yang sama:

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

Saya dapat terhubung secara normal, menunjukkan semua basis data, memilih dan memasukkan, membuat dan menambah pengguna, tetapi ketika menyangkut GRANT, saya gagal. Akses ditolak kesalahan itu muncul lagi.

Saya berhasil memecahkan masalah ini dengan memperbaiki hak istimewa dengan perintah berikut pada direktori / direktori server MySQL seperti yang disebutkan di sini :

C:\MySQL Server 5.5\bin> mysql_upgrade

Lalu, masalahnya hilang. Saya harap solusi ini bekerja di Linux juga karena biasanya MySQL memberikan perintah yang sama baik di Linux maupun Windows.

Aryo
sumber
2
thanx .. di mac OS dengan mysql diinstal melalui homebrew jalankan perintah berikutcd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
zoras
30
Jika Anda menggunakan CentOs atau telah menginstal MySQL melalui manajer paket, ini kemungkinan perintah yang harus Anda jalankan: /usr/bin/mysql_upgrade -u root -pmasukkan kata sandi dan Bob's Your Uncle!
Zjoia
Setelah bertarung di sana-sini dengan banyak komentar, yang satu ini membantu saya. Terima kasih banyak
siddhusingh
Saya tahu ini lebih tua tetapi ini banyak membantu saya dan saya ingin menambahkan satu lagi komentar untuk pengunjung masa depan: jika Anda mendapatkan ACCESS DENIED mencoba menjalankan mysql_upgrade, coba jalankan seperti ini sebagai gantinya: mysql_upgrade -p
blizz
2
Apa yang saya temukan adalah bahwa jika Anda mengekspor database dari MySQL <= 5.1 via mysqldump ... --all-databasesdan kemudian mengimpornya ke MySQL> = 5.5, pengguna Anda akan diganti (tentu saja), tetapi Anda rootakan memiliki masalah yang sama dengan OP. Dan mysql_upgradetidak akan berfungsi - Anda harus menambahkan --forcetanda, yaitu mysql_upgrade -u root -p --force. Semoga itu bisa membantu seseorang di sini.
gregoltsov
62

Ini mungkin terjadi ketika Anda mencoba untuk memberikan semua hak istimewa di semua tabel kepada pengguna lain, karena tabel mysql.users dianggap terlarang untuk pengguna selain dari root.

Namun berikut ini, harus berfungsi:

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

Perhatikan bahwa kita menggunakan `%`. * Daripada *. *

Anuj Gupta
sumber
28
Tolong jelaskan ini. Kenapa '%'.*berhasil tapi tidak *.*?
Pacerier
Ini cara yang tepat untuk melakukannya. Anda harus masuk ke MySQL sebagai root dan kemudian mencoba memberikan hak istimewa.
Nav
Saya mendapatkan akses Kesalahan 1044 ditolak :( tolong saya tolong
Bhaumik Thakkar
Terima kasih, sedang mencoba mengakses mysql dari aplikasi python menggunakan pymysql. Terjadi kesalahan dengan mengatakan "Host tidak diizinkan untuk terhubung ke server MariaDB ini", menyelesaikannya dengan menambahkan pengguna baru yang diberikan [di sini] ( stackoverflow.com/questions/19101243/… ), lalu mendapat kesalahan lain yang mengatakan "akses ditolak untuk pengguna" , dan menyelesaikannya dengan metode Anda.
Balraj Bains
1
Jika Anda menggunakan '%'.*bukannya `%`.*tidak bekerja. Anda HARUS menggunakan`%`.*
Rosario Russo
7

Ini terjadi pada saya ketika saya mencoba menginstal versi MySQL yang lebih tinggi daripada yang datang dengan distribusi.

Saya menghapus versi lama lalu menginstal yang baru (rpm -e ... lalu rpm -i MySQL-server *) Tetapi tidak menyadari bahwa file di / var / lib / mysql masih dari versi yang lebih lama (dengan perbedaan sebagai dijelaskan oleh Marc Alff - terima kasih!)

Saya bisa melakukan mysql_upgrade, tetapi karena saya ingin memulai dari awal saya lakukan:

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

Kemudian atur kata sandi root (/ usr / bin / mysqladmin -u root password), dan semua berfungsi seperti yang diharapkan dengan perintah GRANT ...

phil_w
sumber
Terima kasih, ini membantu saya. Untungnya, tidak masalah jika saya melenyapkan semua DB ...
Jarrod Mosen
5

Pada dasarnya kesalahan ini muncul ketika Anda belum menentukan kata sandi, itu berarti Anda memiliki kata sandi yang salah tercantum dalam beberapa file opsi.

Baca DOC ini untuk memahami cara menetapkan dan mengelola Kata Sandi ke akun.

Juga, Periksa apakah izin pada folder /var/lib/mysql/mysql itu 711 atau tidak.

Mithun Sasidharan
sumber
Ini berhasil untuk saya. Sepertinya mysql tidak membuat izin untuk 'pengguna' @ 'localhost'. Jadi saya harus membuat pengguna itu dan memastikannya memiliki kata sandi.
Jerinaw
Izinnya salah! Aku kagum. Terima kasih banyak telah memposting itu.
Adam
5

Saya memiliki masalah yang sama, yaitu semua hak istimewa yang diberikan untuk root:

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

... tetapi masih tidak diizinkan untuk membuat tabel:

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

Yah, itu disebabkan oleh kesalahan pengguna yang mengganggu, yaitu saya tidak memilih database. Setelah mengeluarkan USE dbname, itu bekerja dengan baik.

tzp
sumber
5

Pada Debian ( Wheezy , 7.8) dengan MySQL 5.5.40, saya menemukan SELECT * FROM mysql.user WHERE User='root'\Gmenunjukkan Event_privdan 'bidang Trigger_priv` yang hadir tapi tidak diatur ke Y.

Menjalankan mysql_upgrade(dengan atau tanpa --force) tidak membuat perbedaan; Saya perlu melakukan manual:

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

Lalu akhirnya saya bisa menggunakan:

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

... dan kemudian menggunakannya lebih tepatnya pada basis data / akun pengguna individu.

William Turrell
sumber
1
Ini menyelesaikan masalah bagi saya, juga, tetapi hanya setelah saya mengetahui bahwa Anda perlu MENGGAMBARKAN HAK ISTIMEWA; setelah itu dan login kembali untuk menetapkan opsi hibah.
Hendrik
5

Anda mungkin datang ke pertanyaan ini dengan MySQL versi 8 diinstal (seperti saya) dan tidak menemukan jawaban yang memuaskan. Anda tidak dapat lagi membuat pengguna seperti ini di versi 8:

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

Pesan kesalahan yang agak membingungkan yang Anda dapatkan kembali adalah: ERROR 1410 (42000): You are not allowed to create a user with GRANT

Untuk membuat pengguna di versi 8 Anda harus melakukannya dalam dua langkah:

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

Tentu saja, jika Anda mau, Anda juga dapat memberikan sejumlah hak istimewa (bukan GRANT ALL PRIVILEGES), misalnyaGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER

gloriphobia
sumber
3

Mengetik SHOW GRANTS FOR 'root'@'localhost';menunjukkan kepada saya beberapa kata sandi yang dikaburkan, jadi saya masuk ke mysql dari sistem itu menggunakan HeidiSQL di sistem lain (menggunakan rootsebagai nama pengguna dan kata sandi yang sesuai) dan mengetik
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

dan itu berhasil ketika saya kembali ke sistem dan logon menggunakan
mysql -uroot -pthepassword;

Nav
sumber
2

Saya menjalankan ini ketika saya mencoba untuk menambahkan hak istimewa ke performance_schema, yang merupakan bug mysql http://bugs.mysql.com/bug.php?id=44898 (solusi untuk menambahkan --single-transaksi).

pevik
sumber
2

Saya memiliki masalah yang sama dan butuh banyak membaca posting SO dan dokumentasi Google. Saya akhirnya menemukan ini dari FAQ Cloud SQL :

Google Cloud SQL tidak mendukung hak istimewa SUPER, yang berarti bahwa GRANT ALL PRIVILEGESpernyataan tidak akan berfungsi. Sebagai alternatif, Anda bisa menggunakannyaGRANT ALL ON `%`.*

kurdtpage
sumber
1

Bagi mereka yang masih menemukan ini seperti yang saya lakukan, ada baiknya memeriksa untuk memastikan upaya GRANTbelum ada:

SHOW GRANTS FOR username;

Dalam kasus saya, kesalahan itu sebenarnya bukan karena ada kesalahan izin, tetapi karena GRANTsudah ada.

mopo922
sumber
1

Salah satu solusi sederhana yang selalu bekerja untuk saya ketika dihadapkan dengan kesalahan "akses ditolak" mysql: gunakan sudo.

sudo mysql -u root

Kemudian ada izin yang diperlukan untuk GRANTperintah.

tersangka
sumber