Cara memberikan semua hak istimewa ke pengguna root di MySQL 8.0

116

Mencoba

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

Mendapatkan

ERROR 1064 (42000): Anda mengalami kesalahan dalam sintaks SQL; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang benar untuk digunakan di dekat 'IDENTIFIED BY' root 'WITH GRANT OPTION' di baris 1.

Catatan: Hal yang sama berfungsi saat dicoba di versi sebelumnya.

Juga mencoba

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

Mendapatkan

ERROR 1410 (42000): Anda tidak diizinkan untuk membuat pengguna dengan GRANT

Nama pengguna / kata sandi MySQL (8.0.11.0) adalah root / root.

Praveen
sumber
apakah Anda terhubung langsung dengan mysql atau apakah Anda menggunakan ssh?
Harald
langsung dari command prompt sebagai pengguna root
Praveen
1
Lihat perbedaan antara Sintaks 13.7.1.6 GRANT dan Sintaks 13.7.1.4 GRANT .
wchiquito
7
Saya terlalu terjebak dengan masalah yang sama. Saya meluncurkan shell mysql menggunakan mysql -u root -p, lalu memasukkan kata sandi root. Kemudian saya mencoba GRANT GRANT OPTION ON *.* TO 'root'@'%';dan saya mendapatkan kesalahanERROR 1410 (42000): You are not allowed to create a user with GRANT
aiman

Jawaban:

204

Dimulai dengan MySQL 8 Anda tidak lagi dapat (secara implisit) membuat pengguna menggunakan GRANTperintah. Gunakan CREATE USER sebagai gantinya, diikuti dengan pernyataan GRANT :

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

Perhatian tentang risiko keamanan tentang WITH GRANT OPTION, lihat:

Mike Lischke
sumber
3
Perintah ini akan membuat pengguna baru. Tetapi saya ingin memberikan hak istimewa kepada pengguna root yang ada. mysql> BUAT PENGGUNA 'root' @ '%' DIIDENTIFIKASI OLEH 'root'; Kueri OK, 0 baris terpengaruh (0,31 dtk) mysql> GRANT ALL PRIVILEGES ON . UNTUK 'root' @ '%' DENGAN OPSI GRANT; Permintaan OK, 0 baris terpengaruh (0,16 detik) mysql> PILIH Pengguna DARI mysql.user; + ------------------ + | Pengguna | + ------------------ + | root | | mysql.infoschema | | mysql.session | | mysql.sys | | root | + ------------------ + 5 baris dalam set (0,00 dtk)
Praveen
Sekarang dua pengguna dengan root nama hadir di tabel pengguna !! Juga saya tidak dapat terhubung dari jarak jauh (pengguna root). ------------- Detail: Ketik: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException Status SQL: 08001
Praveen
Aneh. Pesan kesalahan dalam pertanyaan Anda menunjukkan bahwa pengguna ini tidak ada. Ini satu-satunya alasan mengapa saya menyarankan untuk membuatnya terlebih dahulu. Dan tidak mungkin memiliki pengguna yang sama dua kali dalam satu instance MySQL. Mereka berbeda baik dalam nama atau di bagian host.
Mike Lischke
2
2 pengguna ini terhubung dari host yang berbeda. Jalankan SELECT User, Host FROM mysql.user;sebagai gantinya.
Mike Lischke
3
Mendapat kesalahan itu:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
adi
32

1) Ini berhasil untuk saya. Pertama, buat pengguna baru. Contoh: Pengguna foodengan kata sandibar

> mysql> CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';

2) Ganti kode di bawah ini dengan nama pengguna dengan 'foo'.

> mysql> GRANT ALL PRIVILEGES ON database_name.* TO'foo'@'localhost';

Catatan: database_name adalah database yang Anda ingin memiliki hak istimewa , . berarti semuanya

3) Login sebagai pengguna foo

mysql> mysql -u foo -p

Kata sandi: bar

4) Pastikan koneksi awal Anda dari Sequelize diatur ke foo dengan pw bar.

J. Doe
sumber
5
Ini sejauh ini tidak menjawab pertanyaan itu. Ini tentang izin global, dan bukan izin khusus database.
tmuecksch
31

Saya melihat banyak jawaban (salah), sesederhana ini:

USE mysql;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'pass';
GRANT ALL ON *.* TO 'user'@'localhost';
FLUSH PRIVILEGES;

Catatan: alih-alih dibuat sendiri, userAnda bisa menggunakan rootuntuk menyambungkan ke database. Namun, menggunakan akun root default untuk membiarkan aplikasi terhubung ke database bukanlah cara yang disukai.

Hak istimewa alternatif (hati-hati dan ingat prinsip hak istimewa paling rendah):

-- Grant user permissions to all tables in my_database from localhost --
GRANT ALL ON my_database.* TO 'user'@'localhost';

-- Grant user permissions to my_table in my_database from localhost --
GRANT ALL ON my_database.my_table TO 'user'@'localhost';

-- Grant user permissions to all tables and databases from all hosts --
GRANT ALL ON *.* TO 'user'@'*';

Jika Anda entah bagaimana mengalami kesalahan berikut:

ERROR 1130 (HY000): Host '1.2.3.4' tidak diizinkan untuk terhubung ke server MySQL ini

Anda perlu menambahkan / mengubah dua baris berikut /etc/mysql/my.cnfdan memulai ulang mysql:

bind-address           = 0.0.0.0
skip-networking
Nebulastik
sumber
Bisakah Anda menjelaskan mengapa hal itu tidak berhasil daripada hanya mengeluh? Dengan begitu saya dapat membantu Anda atau memposting informasi tambahan.
Nebulastik
Jawaban ini bahkan tidak menjawab pertanyaan tentang hak istimewa pengguna root .
Yusuf
Memperbarui jawaban yang sesuai.
Nebulastik
1
Jawaban terbaik, sekarang GRANT ALL ONuntuk MySQL 8.0. Juga saya percaya alih-alih menonaktifkan bind-addressAnda dapat mengikat 127.0.0.1dan memasukkan --protocol=tcpdalam perintah apa pun. Performa jangka panjang juga lebih baik daripada dengan localhost.
Jesse Nickles
4

Spesifikasi Saya:

mysql --version
mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)

Apa yang berhasil untuk saya:

mysql> CREATE USER 'username'@'localhost' IDENTIFIED BY 'desired_password';
mysql> GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' WITH GRANT OPTION;

Tanggapan di kedua pertanyaan:

Query OK, O rows affected (0.10 sec*)

NB: Saya membuat database (db_name) sebelumnya dan membuat kredensial pengguna dengan semua hak istimewa yang diberikan ke semua tabel di DB sebagai ganti menggunakan pengguna root default yang saya baca di suatu tempat adalah praktik terbaik.

Nuel Makara
sumber
3

Pengguna yang ditentukan tidak ada di MySQL Anda (jadi, MySQL mencoba membuatnya dengan GRANT seperti yang dilakukan sebelum versi 8, tetapi gagal dengan batasan yang diperkenalkan dalam versi ini).

MySQL cukup bodoh pada saat ini, jadi jika Anda memiliki 'root' @ 'localhost' dan mencoba memberikan hak istimewa ke 'root' @ '%' itu akan memperlakukan mereka sebagai pengguna yang berbeda, daripada gagasan umum untuk pengguna root di semua host, termasuk localhost.

Pesan kesalahan juga menyesatkan.

Jadi, jika Anda mendapatkan pesan kesalahan, periksa pengguna Anda yang sudah ada dengan sesuatu seperti ini

SELECT CONCAT("'", user, "'@'", host, "'") FROM mysql.user;

dan kemudian buat pengguna yang hilang (seperti yang disarankan Mike) atau sesuaikan perintah GRANT Anda dengan spesifikasi pengguna yang ada.

Sergey Podushkin
sumber
Ini adalah solusi yang valid untuk saya! Saya gagal mengetik pengguna @ baris dengan tepat. Pastikan untuk memeriksa ini sebelum mencoba solusi lain yang disarankan. Bagi saya itu adalah: CREATE USER 'user'@'%domain.com' dan kemudian ketika saya mengeluarkan pernyataan GRANT yang gagal, sintaks saya salah satu '.'. Itu tampak seperti ini GRANT .... TO 'user'@'%.domain.com'. Saya lupa meletakkan '.' dalam pernyataan buat saya dan itu membuat semua perbedaan dalam memperbaiki masalah ini.
wallisds
2

Hanya 2 sen saya untuk masalah ini. Saya mengalami masalah yang sama persis dengan mencoba terhubung dari MySQL Workbench. Saya menjalankan mesin virtual bitnami-mysql untuk menyiapkan kotak pasir lokal untuk pengembangan.

Tutorial Bitnami mengatakan untuk menjalankan perintah 'Grant All Privileges':

/opt/bitnami/mysql/bin/mysql -u root -p -e "grant all privileges on *.* to 'root'@'%' identified by 'PASSWORD' with grant option";

Ini jelas tidak berhasil, saya akhirnya berhasil menggunakan jawaban Mike Lischke.

Apa yang saya pikir terjadi adalah bahwa pengguna root @% memiliki kredensial yang salah terkait dengannya. Jadi, jika Anda telah mencoba mengubah hak istimewa pengguna dan tidak berhasil, coba:

  1. Menjatuhkan pengguna.
  2. Buat pengguna lagi.
  3. Pastikan Anda memiliki pengikatan yang benar pada file konfigurasi my.cnf Anda. Dalam kasus saya, saya telah mengomentari baris karena itu hanya untuk lingkungan kotak pasir.

Dari Konsol Mysql:

Daftar Pengguna (berguna untuk melihat semua pengguna Anda):

select user, host from mysql.user;

Jatuhkan Pengguna Yang Diinginkan:

drop user '{{ username }}'@'%';

Buat Pengguna dan Berikan Izin:

CREATE USER '{{ username }}'@'%' IDENTIFIED BY '{{ password }}';
GRANT ALL PRIVILEGES ON *.* TO '{{ username }}'@'%' WITH GRANT OPTION;

Jalankan perintah ini:

FLUSH PRIVILEGES;

Temukan file konfigurasi mysql Anda 'my.cnf' dan cari baris yang terlihat seperti ini:

bind-address=127.0.0.1

dan komentari menggunakan '#':

#bind-address=127.0.0.1

Kemudian restart layanan mysql Anda.

Semoga ini bisa membantu seseorang yang mengalami masalah yang sama!

Armando Juarez
sumber
1

Ini berhasil untuk saya:

mysql> FLUSH PRIVILEGES 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES
NOL
sumber
1

Lihat nama pengguna dan domain Anda sama dengan yang dibuat sebelumnya. Mysql memilih akun dengan dua kolom dalam tabel pengguna. Jika berbeda, mysql mungkin berpikir Anda ingin membuat akun baru dengan hibah, yang tidak didukung setelah versi 8.0.

zenglong chen
sumber
1

Spesifikasi Saya:

mysql --version
mysql  Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)

Apa yang berhasil untuk saya:

mysql> USE mysql;
mysql> UPDATE User SET Host='%' WHERE User='root' AND Host='localhost';
尹劍平
sumber
Meskipun itu akan berhasil dalam situasi spesifik Anda. Potongan sintaks sql ini memperbarui pengguna, dan itu tidak mengatur akun pengguna. Itu juga tidak memberikan hak istimewa.
Nebulastik
0

Nah, saya baru saja mengalami masalah yang sama. Bahkan jika rute memiliki '%' tidak dapat terhubung dari jarak jauh. Sekarang, melihat my.inifile (file config di windows) bind-addresspernyataan itu tidak terjawab.

Jadi ... Saya meletakkan ini bind-address = *setelahnya [mysqld]dan memulai kembali layanan. Sekarang berhasil!

Caos51
sumber
Ini sebenarnya yang paling dekat dengan jawaban yang benar.
Yusuf8
0

1. memberikan hak istimewa

mysql> BERIKAN SEMUA HAK ISTIMEWA. UNTUK 'root' @ '%' DENGAN OPSI GRANT;

mysql> HAK ISTIMEWA FLUSH

2. periksa tabel pengguna:

mysql> gunakan mysql

mysql> pilih host, pengguna dari pengguna masukkan deskripsi gambar di sini

3. Ubah file konfigurasi

mysql default bind ip : 127.0.0.1, jika kita ingin mengunjungi layanan remote, hapus config

#Modify the configuration file
vi /usr/local/etc/my.cnf

#Comment out the ip-address option
[mysqld]
# Only allow connections from localhost
#bind-address = 127.0.0.1

4. akhirnya restart layanan

layanan brew restart mysql

devo chen
sumber
Meskipun ini akan berhasil, saya tidak akan pernah memulai ulang mysql dalam produksi saat memberikan hak istimewa tertentu. Sebagai gantinya, coba hak istimewa flush.
Nebulastik
-1

Ini mungkin berhasil:

grant all on dbtest.* to 'dbuser'@'%' identified by 'mysql_password';
Anup Joshi
sumber
1
Daripada membuang kode, jelaskan juga mengapa itu solusi yang tepat. Tujuannya untuk mendidik agar OP tahu apa yang harus dilakukan lain kali, bukan hanya menyelesaikan masalah langsung.
Tin Man
-1

Saya memiliki masalah yang sama, yang membawa saya ke sini. Secara khusus, untuk pembangunan lokal, saya ingin bisa hidup mysql -u root -ptanpanya sudo. Saya tidak ingin membuat pengguna baru. Saya ingin menggunakan rootdari aplikasi web PHP lokal.

Pesan kesalahan ini menyesatkan, karena tidak ada yang salah dengan 'root'@'%'hak istimewa pengguna default .

Sebaliknya, seperti yang disebutkan beberapa orang dalam jawaban lain, solusinya hanya diatur, bind-address=0.0.0.0bukan bind-address=127.0.0.1di /etc/mysql/mysql.conf.d/mysqld.cnfkonfigurasi saya . Tidak ada perubahan yang diperlukan.

Joseph8th
sumber
Ini bahkan tidak sepenuhnya menjawab pertanyaan itu.
Nebulastik
-2

Saya memiliki masalah yang sama di CentOS dan ini berhasil untuk saya (versi: 8.0.11):

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
pengguna3563950
sumber
ERROR 1064 (42000): Anda mengalami kesalahan dalam sintaks SQL; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan near '. UNTUK 'root' @ '%' 'pada baris 1
GDefender
mysql> BERIKAN SEMUA HAK ISTIMEWA. UNTUK 'root' @ '%'; ERROR 1064 (42000): Anda mengalami kesalahan dalam sintaks SQL; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat '. UNTUK 'root' @ '%' 'pada baris 1 mysql>
PGOEL