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!
sumber
-p
dan kata sandi. Saya tahu ini konyol tapi mungkin bisa membantu seseorang.Jawaban:
Perhatikan bagaimana output dari
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:
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.
sumber
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:
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 :
Lalu, masalahnya hilang. Saya harap solusi ini bekerja di Linux juga karena biasanya MySQL memberikan perintah yang sama baik di Linux maupun Windows.
sumber
cd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
/usr/bin/mysql_upgrade -u root -p
masukkan kata sandi dan Bob's Your Uncle!mysqldump ... --all-databases
dan kemudian mengimpornya ke MySQL> = 5.5, pengguna Anda akan diganti (tentu saja), tetapi Andaroot
akan memiliki masalah yang sama dengan OP. Danmysql_upgrade
tidak akan berfungsi - Anda harus menambahkan--force
tanda, yaitumysql_upgrade -u root -p --force
. Semoga itu bisa membantu seseorang di sini.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:
Perhatikan bahwa kita menggunakan `%`. * Daripada *. *
sumber
'%'.*
berhasil tapi tidak*.*
?'%'.*
bukannya`%`.*
tidak bekerja. Anda HARUS menggunakan`%`.*
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:
Kemudian atur kata sandi root (/ usr / bin / mysqladmin -u root password), dan semua berfungsi seperti yang diharapkan dengan perintah GRANT ...
sumber
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.sumber
Saya memiliki masalah yang sama, yaitu semua hak istimewa yang diberikan untuk root:
... tetapi masih tidak diizinkan untuk membuat tabel:
Yah, itu disebabkan oleh kesalahan pengguna yang mengganggu, yaitu saya tidak memilih database. Setelah mengeluarkan USE dbname, itu bekerja dengan baik.
sumber
Pada Debian ( Wheezy , 7.8) dengan MySQL 5.5.40, saya menemukan
SELECT * FROM mysql.user WHERE User='root'\G
menunjukkanEvent_priv
dan '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.
sumber
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:
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:
Tentu saja, jika Anda mau, Anda juga dapat memberikan sejumlah hak istimewa (bukan
GRANT ALL PRIVILEGES
), misalnyaGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER
sumber
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 (menggunakanroot
sebagai nama pengguna dan kata sandi yang sesuai) dan mengetikGRANT 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;
sumber
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).
sumber
Saya memiliki masalah yang sama dan butuh banyak membaca posting SO dan dokumentasi Google. Saya akhirnya menemukan ini dari FAQ Cloud SQL :
sumber
Bagi mereka yang masih menemukan ini seperti yang saya lakukan, ada baiknya memeriksa untuk memastikan upaya
GRANT
belum ada:Dalam kasus saya, kesalahan itu sebenarnya bukan karena ada kesalahan izin, tetapi karena
GRANT
sudah ada.sumber
Salah satu solusi sederhana yang selalu bekerja untuk saya ketika dihadapkan dengan kesalahan "akses ditolak" mysql: gunakan
sudo
.Kemudian ada izin yang diperlukan untuk
GRANT
perintah.sumber