Bagaimana cara memulihkan hak penuh pengguna root MySQL?


108

Saya tidak sengaja menghapus beberapa hak istimewa dari pengguna root MySQL saya, termasuk kemampuan untuk mengubah tabel. Adakah cara agar saya dapat memulihkan pengguna ini ke keadaan semula (dengan semua hak istimewa)?

UPDATE mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root';
# MySQL returned an empty result set (i.e. zero rows).
FLUSH PRIVILEGES ;
# MySQL returned an empty result set (i.e. zero rows).


#1045 - Access denied for user 'root'@'localhost' (using password: YES)
GRANT ALL ON *.* TO 'root'@'localhost'

1
Kesalahan kedua sepertinya masalah kata sandi. Mungkin kesalahan saya karena menganggap Anda sudah memiliki akun 'root' @ 'localhost'. Jalankan ulang mysqld dengan --skip-grant-tables, dan: "DROP USER 'root' @ 'localhost'; GRANT ALL PRIVILEGES ON . TO 'root' @ '%';" sebagai gantinya? Cara terbaik untuk mengetahui akun mana yang harus Anda beri akses adalah dengan menjalankan "PILIH Pengguna, Host DARI mysql.user WHERE User = 'root';" ... yang akan memberi Anda nama host yang harus digunakan setelah @ simbol dalam perintah GRANT.
DMI

1
Ini merupakan bentuk yang buruk bagi mod untuk menandai topik sebagai di luar topik jika bukan di luar topik, kecuali bahwa mungkin ada situs Stack Exchange lain yang lebih cocok untuk topik yang harus diidentifikasi. (Malu pada mod.) Di sinilah ini mungkin pergi: dba.stackexchange.com
Jon Davis

^ setuju, saya memilih untuk membuka kembali. kalau ditutup karena ada situs DBA, setidaknya harus disebutkan dan OP diarahkan kesana. (Atau berpotensi ditutup sebagai duplikat dari pertanyaan lain di sini)
tak terpisahkan

Jawaban:


148

Jika GRANT ALLtidak berhasil, coba:

  1. Hentikan mysqlddan mulai ulang dengan --skip-grant-tablesopsi.
  2. Hubungkan ke mysqldserver hanya dengan: mysql(yaitu tidak ada -popsi, dan nama pengguna mungkin tidak diperlukan).
  3. Keluarkan perintah berikut di klien mysql:

    UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

    FLUSH PRIVILEGES;

Setelah itu, Anda harus bisa menjalankan GRANT ALL ON *.* TO 'root'@'localhost';dan menjalankannya .


7
1.Cara terhubung ke server mysqld hanya dengan: mysql 2. Ketika saya mengeluarkan UPDATE mysql.user SET Grant_priv = '1' WHERE User = 'root'; HAK ISTIMEWA FLUSH; Kueri baik-baik saja, 0 baris terpengaruh (0,00 dtk) baris cocok: 2 diubah: 0 peringatan: 0 Kueri oke, 0 baris terpengaruh (0,00 dtk). Ketika saya masuk ke phpMyAdmin sebagai pengguna root, saya masih melihat "Tidak ada hak istimewa".
Steven

Maaf, setelah langkah-langkah di atas Anda seharusnya sudah bisa menjalankan perintah GRANT ALL. Untuk terhubung ke mysqld, maksud saya Anda tidak memerlukan kata sandi - saya tidak ingat apakah nama pengguna akan berfungsi, atau apakah itu harus "root".
DMI

2
Ini tidak bekerja. Seperti yang dikatakan Steven, pembaruan pada tabel pengguna mempengaruhi 0 record. Pengguna root tetap tidak dapat memberikan.
Cerin

1
Ya, itu berhasil. Dan jika Anda menggunakan windows, cukup tambahkan sementara skip-grant-tableske [mysqld]bagian file konfigurasi mysql Anda untuk mengakses mysql pada baris perintah tanpa kata sandi.
markus

1
Saya terjebak di bagian Grant (yang tidak berhasil) selama lebih dari 9 jam dan jawaban Anda menyelamatkan saya ... Anda adalah penyelamat. terima kasih banyak
Ali SH

91

Jika Anda tidak rootsengaja menghapus pengguna, Anda dapat melakukan satu hal:

  1. Hentikan layanan MySQL
  2. Lari mysqld_safe --skip-grant-tables &
  3. Tipe mysql -u root -p dan tekan enter.
  4. Masukkan kata sandi Anda
  5. Pada baris perintah mysql masukkan: use mysql;

Kemudian jalankan kueri ini:

insert into `user` (`Host`, `User`, `Password`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

kemudian restart mysqld

EDIT: 6 Oktober 2018

Jika ada orang lain yang membutuhkan jawaban ini, saya mencobanya hari ini menggunakan innodb_version 5.6.36-82.0 dan 10.1.24-MariaDB dan berfungsi jika Anda MENGHAPUS BACKTICKS (tidak ada tanda kutip tunggal juga, hapus saja):

insert into user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

1
@Bipin, Aneh hanya ada mysqld.exedi binfoldernya, tidak mysqld_safe.exe. Apa yang Anda maksud dengan "mysqld_safe"?
Pacerier

4
Untuk MySQL 5.5, Anda memerlukan dua privs lagi, Event_priv dan Trigger_priv.
Greg Bell

Saya membayangkan ini pecah di 5.6.5
Otheus

1
@Pacerier - menurut posting ini Anda tidak terlalu membutuhkan mysqld_safe, jalankan saja biner mysqld normal:mysqld.exe --skip-grant-tables
bkwdesign

2
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jamie Hutber

24

saya juga menghapus hak akses root dan database yang tidak muncul di konsol mysql ketika saya adalah pengguna root, jadi mengubah pengguna dengan mysql>mysql -u 'userName' -p;dan kata sandi;

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

FLUSH PRIVILEGES;

setelah perintah ini semuanya menampilkan database di root.

Terima kasih


1
Saya harus melakukan kombinasi beberapa hal. Saya harus menghentikan layanan mysqld, lalu menjalankan mysqld_safe --skip-crant-tables &, lalu perintah UPDATE di atas, lalu restart mysql, lalu jalankan GRANT ALL ON . UNTUK 'pengguna' @ 'localhost';
Nick Woodhams

5

Saya telah menolak hak menyisipkan dan memuat ulang ke root. Jadi setelah memperbarui izin, FLUSH PRIVILEGES tidak berfungsi (karena kurangnya hak muat ulang). Jadi saya menggunakan pengguna debian-sys-maint di Ubuntu 16.04 untuk memulihkan hak istimewa user.root. Anda dapat menemukan kata sandi user.debian-sys-maint dari file ini

sudo cat /etc/mysql/debian.cnf

Kamu menyelamatkan aku! GRANT tidak berfungsi baik dalam mode --skip-grant-tables sehingga masuk sebagai ubuntu-system memungkinkan saya untuk membuat pengguna root saya lagi, dan daripada saya dapat memperbarui semua hak istimewa
lunix15

4
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

Cukup masuk dari root menggunakan kata sandi masing-masing jika ada dan cukup jalankan perintah di atas untuk siapa pun penggunanya.

Sebagai contoh:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;

3
tetapi jika pengguna 'root' telah kehilangan hak istimewa, lalu bagaimana cara kerjanya, apakah pengguna root tidak memerlukan hak istimewa yang lebih tinggi untuk melakukan ini? ini tidak berhasil untuk saya.
Terungwa


2

Jika Anda menggunakan WAMP di komputer lokal Anda (mysql versi 5.7.14) Langkah 1: buka file my.ini Langkah 2: hapus komentar baris ini 'lewati-hibah-tabel' dengan menghapus titik koma langkah 3: mulai ulang mysql langkah server 4: luncurkan konsol mySQL langkah 5:

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;

Langkah 6: Masalah terpecahkan !!!!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.