วิธีให้สิทธิ์ทั้งหมดแก่ผู้ใช้รูทใน MySQL 8.0


139

พยายามแล้ว

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

การเดินทาง

ข้อผิดพลาด 1064 (42000): คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชันเซิร์ฟเวอร์ MySQL ของคุณสำหรับไวยากรณ์ที่ถูกต้องเพื่อใช้ใกล้ 'ระบุโดย' รูท 'พร้อมตัวเลือก GRANT' ที่บรรทัดที่ 1

หมายเหตุ: การทำงานเช่นเดียวกันเมื่อลองในเวอร์ชันก่อนหน้า

ยังพยายาม

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

การเดินทาง

ข้อผิดพลาด 1410 (42000): คุณไม่ได้รับอนุญาตให้สร้างผู้ใช้ด้วย GRANT

MySQL (8.0.11.0) ชื่อผู้ใช้ / รหัสผ่านคือ root / root


คุณเชื่อมต่อโดยตรงกับ mysql หรือคุณใช้ ssh?
Harald

โดยตรงจากพรอมต์คำสั่งในฐานะผู้ใช้รูท
Praveen

1
เห็นความแตกต่างระหว่าง13.7.1.6 GRANT ไวยากรณ์และ13.7.1.4 GRANT ไวยากรณ์
wchiquito

7
ฉันติดอยู่กับปัญหาเดียวกันเกินไป ฉันกำลังเปิดตัว mysql shell โดยใช้mysql -u root -pจากนั้นป้อนรหัสผ่านรูท จากนั้นฉันลองGRANT GRANT OPTION ON *.* TO 'root'@'%';และได้รับข้อผิดพลาดERROR 1410 (42000): You are not allowed to create a user with GRANT
Aiman

@ พราวีนคุณจะยอมรับคำตอบที่นี่หรือไม่?
Mike Lischke

คำตอบ:


231

เริ่มต้นด้วย MySQL 8 คุณไม่สามารถ (โดยปริยาย) สร้างผู้ใช้โดยใช้GRANTคำสั่งได้อีกต่อไป ใช้CREATE USERแทนตามด้วยคำสั่งGRANT :

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

ข้อควรระวังเกี่ยวกับความเสี่ยงด้านความปลอดภัยWITH GRANT OPTIONโปรดดู:


3
คำสั่งนี้จะสร้างผู้ใช้ใหม่ แต่ฉันต้องการให้สิทธิ์แก่ผู้ใช้รูทที่มีอยู่ mysql> สร้างผู้ใช้ 'root' @ '%' ระบุโดย 'root'; Query OK, 0 rows ผลกระทบ (0.31 วินาที) MySQL> ให้สิทธิ์ทั้งหมดบน ถึง 'root' @ '%' ด้วย GRANT OPTION; แบบสอบถามตกลง 0 แถวที่ได้รับผลกระทบ (0.16 วินาที) mysql> เลือกผู้ใช้จาก mysql.user; + ------------------ + | ผู้ใช้ | + ------------------ + | ราก | | mysql.infoschema | | mysql.session | | mysql.sys | | ราก | + ------------------ + 5 แถวในชุด (0.00 วินาที)
Praveen

ตอนนี้ผู้ใช้สองคนที่มีชื่อ root อยู่ในตารางผู้ใช้ !! นอกจากนี้ฉันไม่สามารถเชื่อมต่อจากระยะไกล (ผู้ใช้รูท) ------------- รายละเอียด: Type: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException SQL State: 08001
Praveen

แปลก. ข้อความแสดงข้อผิดพลาดในคำถามของคุณบ่งชี้ว่าไม่มีผู้ใช้รายนี้ นี่เป็นเหตุผลเดียวว่าทำไมฉันถึงแนะนำให้สร้างก่อน และเป็นไปไม่ได้ที่จะมีผู้ใช้คนเดียวกันสองครั้งในอินสแตนซ์ MySQL เดียว พวกเขาแตกต่างกันในชื่อหรือในส่วนของโฮสต์
Mike Lischke

2
ผู้ใช้ 2 คนนี้เชื่อมต่อจากโฮสต์ที่แตกต่างกัน เรียกใช้SELECT User, Host FROM mysql.user;แทน
Mike Lischke

3
รับข้อผิดพลาดนั้น:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
adi

47

ฉันเห็นคำตอบ (ผิด) มากมายมันง่ายเหมือนนี้:

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

หมายเหตุ: แทนที่จะสร้างขึ้นเองuserคุณสามารถใช้rootเพื่อเชื่อมต่อกับฐานข้อมูล อย่างไรก็ตามการใช้บัญชีรูทเริ่มต้นเพื่อให้แอปพลิเคชันเชื่อมต่อกับฐานข้อมูลไม่ใช่วิธีที่ต้องการ

สิทธิพิเศษทางเลือก (ระวังและจำหลักการสิทธิพิเศษน้อยที่สุด):

-- 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'@'*';

หากคุณพบข้อผิดพลาดต่อไปนี้:

ข้อผิดพลาด 1130 (HY000): โฮสต์ '1.2.3.4' ไม่ได้รับอนุญาตให้เชื่อมต่อกับเซิร์ฟเวอร์ MySQL นี้

คุณต้องเพิ่ม / เปลี่ยนสองบรรทัดต่อไปนี้ใน/etc/mysql/my.cnfและรีสตาร์ท mysql:

bind-address           = 0.0.0.0
skip-networking

คุณช่วยอธิบายให้ละเอียดได้ไหมว่าทำไมมันถึงใช้ไม่ได้แทนที่จะบ่น ด้วยวิธีนี้ฉันสามารถช่วยคุณได้หรือโพสต์ข้อมูลเพิ่มเติม
Nebulastic

คำตอบนี้ไม่ได้จัดเรียงคำถามเกี่ยวกับสิทธิ์ของผู้ใช้รู
แซฟ 8

อัปเดตคำตอบตามนั้น
Nebulastic

1
คำตอบที่ดีที่สุดตอนนี้GRANT ALL ONสำหรับ MySQL 8.0 นอกจากนี้ฉันเชื่อว่าแทนที่จะปิดการใช้งานbind-addressคุณสามารถผูก127.0.0.1และรวม--protocol=tcpไว้ในคำสั่งใด ๆ localhostผลการดำเนินงานในระยะยาวนอกจากนี้ยังดีกว่าด้วย
Jesse Nickles

คำตอบทั้งหมดที่อยู่นอกเหนือจากที่ฉันพลาดคือ OP สงสัยว่าเหตุใดจึงไม่สามารถสร้างผู้ใช้ด้วยคำสั่ง GRANT ได้อีกต่อไป ไม่เคยมีการถามวิธีใช้GRANTเพื่อให้สิทธิ์ แต่อย่างใดผู้คนปฏิเสธที่จะอ่านสิ่งที่ถามและตอบมาก่อน
Mike Lischke

34

1) สิ่งนี้ใช้ได้ผลสำหรับฉัน ขั้นแรกให้สร้างผู้ใช้ใหม่ ตัวอย่าง: ผู้ใช้ที่fooมีรหัสผ่านbar

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

2) แทนที่รหัสด้านล่างด้วยชื่อผู้ใช้ด้วย 'foo'

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

หมายเหตุ: database_name เป็นฐานข้อมูลที่คุณต้องการที่จะมีสิทธิ์ หมายถึงทั้งหมด

3) เข้าสู่ระบบเป็นผู้ใช้ foo

mysql> mysql -u foo -p

รหัสผ่าน: bar

4) ตรวจสอบให้แน่ใจว่าการเชื่อมต่อเริ่มต้นของคุณจาก Sequelize ถูกตั้งค่าเป็น foo ด้วยแถบ pw


6
สิ่งนี้ไม่สามารถตอบคำถามได้ มันเกี่ยวกับสิทธิ์ทั่วโลกไม่ใช่สิทธิ์เฉพาะฐานข้อมูล
tmuecksch

6

รายละเอียดของฉัน:

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

อะไรที่เหมาะกับฉัน:

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

การตอบกลับในแบบสอบถามทั้งสอง:

Query OK, O rows affected (0.10 sec*)

หมายเหตุ: ฉันสร้างฐานข้อมูล (db_name) ก่อนหน้านี้และกำลังสร้างข้อมูลรับรองผู้ใช้พร้อมสิทธิ์ทั้งหมดที่มอบให้กับตารางทั้งหมดในฐานข้อมูลแทนการใช้ผู้ใช้รูทเริ่มต้นซึ่งฉันอ่านที่ไหนสักแห่งเป็นแนวทางปฏิบัติที่ดีที่สุด


4

ผู้ใช้ที่ระบุไม่มีอยู่ใน MySQL ของคุณ (ดังนั้น MySQL จึงพยายามสร้างด้วย GRANT เหมือนที่เคยทำมาก่อนเวอร์ชัน 8 แต่ล้มเหลวด้วยข้อ จำกัด ที่แนะนำในเวอร์ชันนี้)

MySQL ค่อนข้างโง่ในจุดนี้ดังนั้นหากคุณมี 'root' @ 'localhost' และพยายามให้สิทธิ์ 'root' @ '%' มันจะถือว่าพวกเขาเป็นผู้ใช้ที่แตกต่างกันแทนที่จะเป็นแนวคิดทั่วไปสำหรับผู้ใช้ root บนโฮสต์ใด ๆ รวมถึง localhost.

ข้อความแสดงข้อผิดพลาดยังทำให้เข้าใจผิด

ดังนั้นหากคุณได้รับข้อความแสดงข้อผิดพลาดให้ตรวจสอบผู้ใช้ที่มีอยู่ของคุณด้วยสิ่งนี้

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

จากนั้นสร้างผู้ใช้ที่หายไป (ตามที่ Mike แนะนำ) หรือปรับคำสั่ง GRANT ของคุณให้เป็นข้อมูลจำเพาะของผู้ใช้ที่มีอยู่จริง


นี่เป็นวิธีแก้ปัญหาที่ถูกต้องสำหรับฉัน! ฉันไม่สามารถพิมพ์ user @ line ได้อย่างแม่นยำ อย่าลืมตรวจสอบสิ่งนี้ก่อนลองใช้วิธีแก้ไขปัญหาอื่น ๆ ที่แนะนำ สำหรับฉันมันคือ: CREATE USER 'user'@'%domain.com' จากนั้นเมื่อฉันออกคำสั่ง GRANT ที่ล้มเหลวไวยากรณ์ของฉันจะถูกปิดทีละรายการ '.' ดูเหมือนว่า GRANT นี้ .... ถึง 'user'@'%.domain.com' ฉันลืมใส่ "." ในคำสั่งสร้างของฉันและมันสร้างความแตกต่างในการแก้ไขปัญหานี้
wallisds

3

แค่ 2 เซ็นต์ของฉันในเรื่อง ฉันมีปัญหาเดียวกันกับการพยายามเชื่อมต่อจาก MySQL Workbench ฉันใช้เครื่องเสมือน bitnami-mysql เพื่อตั้งค่าแซนด์บ็อกซ์ในเครื่องสำหรับการพัฒนา

บทช่วยสอนของ Bitnami กล่าวว่าให้เรียกใช้คำสั่ง 'Grant All Privileges':

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

สิ่งนี้ไม่ได้ผลอย่างชัดเจนในที่สุดฉันก็ใช้งานได้โดยใช้คำตอบของ Mike Lischke

สิ่งที่ฉันคิดว่าเกิดขึ้นคือผู้ใช้ root @% มีข้อมูลประจำตัวที่เชื่อมโยงไม่ถูกต้อง ดังนั้นหากคุณได้พยายามแก้ไขสิทธิ์ของผู้ใช้และไม่ต้องเสี่ยงโชคลอง:

  1. การทิ้งผู้ใช้
  2. สร้างผู้ใช้อีกครั้ง
  3. ตรวจสอบให้แน่ใจว่าคุณมีการผูกที่ถูกต้องในไฟล์ config my.cnf ของคุณ ในกรณีของฉันฉันได้แสดงความคิดเห็นในบรรทัดเนื่องจากเป็นเพียงสำหรับสภาพแวดล้อมแซนด์บ็อกซ์

จากคอนโซล Mysql:

รายชื่อผู้ใช้ (มีประโยชน์ในการดูผู้ใช้ทั้งหมดของคุณ):

select user, host from mysql.user;

วางผู้ใช้ที่ต้องการ:

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

สร้างผู้ใช้และให้สิทธิ์:

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

เรียกใช้คำสั่งนี้:

FLUSH PRIVILEGES;

ค้นหาไฟล์ config mysql 'my.cnf' และมองหาบรรทัดที่มีลักษณะดังนี้:

bind-address=127.0.0.1

และแสดงความคิดเห็นโดยใช้ "#":

#bind-address=127.0.0.1

จากนั้นเริ่มบริการ mysql ของคุณใหม่

หวังว่านี่จะช่วยคนที่มีปัญหาเดียวกัน!


2

ตรวจสอบชื่อผู้ใช้และโดเมนของคุณเหมือนกับที่สร้างไว้ก่อนหน้านี้ Mysql เลือกบัญชีโดยสองคอลัมน์ในตารางผู้ใช้หากแตกต่างกัน mysql อาจคิดว่าคุณต้องการสร้างบัญชีใหม่โดยให้สิทธิ์ซึ่งไม่รองรับหลังจากเวอร์ชัน 8.0


ฉันพิมพ์ผิดในผู้ใช้และนี่คือสิ่งที่เกิดขึ้น!
Cerveser

1

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

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

1

รายละเอียดของฉัน:

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

อะไรที่เหมาะกับฉัน:

mysql> USE mysql;
mysql> UPDATE User SET Host='%' WHERE User='root' AND Host='localhost';

แม้ว่ามันจะใช้ได้ในสถานการณ์เฉพาะของคุณ ไวยากรณ์ sql ชิ้นนี้อัปเดตผู้ใช้และไม่ได้ตั้งค่าบัญชีผู้ใช้ นอกจากนี้ยังไม่ให้สิทธิ์
Nebulastic

0

ฉันเพิ่งมีปัญหาเดียวกัน แม้ว่าเส้นทางจะมี "%" ก็ไม่สามารถเชื่อมต่อจากระยะไกลได้ ตอนนี้ดูmy.iniไฟล์ (ไฟล์ config ใน windows) bind-addressก็พลาดคำสั่ง

ดังนั้น ... ฉันวางสิ่งนี้ไว้bind-address = *หลังจากนั้น[mysqld]และเริ่มบริการใหม่ ตอนนี้ใช้งานได้แล้ว!


นี่เป็นคำตอบที่ใกล้เคียงที่สุดจริงๆ
แซฟ 8

0

1. ให้สิทธิ์

mysql> มอบสิทธิพิเศษทั้งหมดบน ถึง 'root' @ '%' ด้วย GRANT OPTION;

mysql> สิทธิ์ในการล้าง

2. ตรวจสอบตารางผู้ใช้:

mysql> ใช้ mysql

mysql> เลือกโฮสต์ผู้ใช้จากผู้ใช้ ป้อนคำอธิบายภาพที่นี่

3. แก้ไขไฟล์คอนฟิกูเรชัน

mysql default bind ip: 127.0.0.1 หากเราต้องการบริการเยี่ยมชมระยะไกลเพียงแค่ลบ 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. เริ่มบริการใหม่ในที่สุด

บริการชงเริ่มต้น mysql


แม้ว่าจะได้ผล แต่ฉันจะไม่รีสตาร์ทอินสแตนซ์ mysql ในการใช้งานจริงเมื่อให้สิทธิ์บางอย่าง ลองใช้สิทธิพิเศษแทน
Nebulastic

-1

สิ่งนี้อาจใช้ได้:

grant all on dbtest.* to 'dbuser'@'%' identified by 'mysql_password';

1
แทนที่จะโยนรหัสให้อธิบายด้วยว่าเหตุใดจึงเป็นทางออกที่เหมาะสม เป้าหมายคือการให้ความรู้เพื่อให้ OP รู้ว่าต้องทำอะไรในครั้งต่อไปไม่ใช่แค่แก้ปัญหาเฉพาะหน้า
คนดีบุก

-1

ฉันมีปัญหาเดียวกันนี้ซึ่งทำให้ฉันมาที่นี่ โดยเฉพาะอย่างยิ่งสำหรับการพัฒนาท้องถิ่นฉันต้องการที่จะสามารถที่จะทำโดยไม่ต้องmysql -u root -p sudoฉันไม่ต้องการสร้างผู้ใช้ใหม่ ฉันต้องการใช้rootจากเว็บแอป PHP ในพื้นที่

ข้อความแสดงข้อผิดพลาดทำให้เข้าใจผิดเนื่องจากค่าเริ่มต้นไม่มีอะไรผิดปกติ'root'@'%'สิทธิ์ของผู้ใช้

ในขณะที่หลายคนกล่าวถึงในคำตอบอื่น ๆ วิธีแก้ปัญหาก็คือการตั้งค่าbind-address=0.0.0.0แทนที่จะเป็นbind-address=127.0.0.1ใน/etc/mysql/mysql.conf.d/mysqld.cnfconfig ของฉัน ไม่จำเป็นต้องมีการเปลี่ยนแปลงใด ๆ


สิ่งนี้ไม่ได้ตอบคำถามทั้งหมด
Nebulastic

-2

ฉันมีปัญหาเดียวกันกับ CentOS และสิ่งนี้ใช้ได้กับฉัน (เวอร์ชัน: 8.0.11):

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

ข้อผิดพลาด 1064 (42000): คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชันเซิร์ฟเวอร์ MySQL ของคุณสำหรับไวยากรณ์ที่เหมาะสมที่จะใช้ใกล้ ' ถึง 'root' @ '%' 'ที่บรรทัดที่ 1
GDefender

mysql> มอบสิทธิพิเศษทั้งหมดบน ไปยังราก'@'%'; ข้อผิดพลาด 1064 (42000): คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชันเซิร์ฟเวอร์ MySQL ของคุณสำหรับไวยากรณ์ที่เหมาะสมที่จะใช้ใกล้ ' ถึง 'root' @ '%' 'ที่บรรทัด 1 mysql>
PGOEL
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.