Cách cấp tất cả các đặc quyền cho người dùng root trong MySQL 8.0


110

Đã thử

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

Bắt

LỖI 1064 (42000): Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn sử dụng tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp phù hợp để sử dụng gần 'IDENTIFIED BY' root 'WITH GRANT OPTION' tại dòng 1.

Lưu ý: Điều tương tự cũng hoạt động khi thử trong các phiên bản trước.

Cũng đã thử

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

Bắt

LỖI 1410 (42000): Bạn không được phép tạo người dùng với GRANT

Tên người dùng / mật khẩu MySQL (8.0.11.0) là root / root.


bạn đang kết nối trực tiếp với mysql hay bạn sử dụng ssh?
Harald

trực tiếp từ dấu nhắc lệnh với tư cách là người dùng root
Praveen

1
Xem sự khác biệt giữa Cú pháp 13.7.1.6 GRANTCú pháp 13.7.1.4 GRANT .
wchiquito

7
Tôi quá mắc kẹt với cùng một vấn đề. Tôi đang khởi chạy trình bao mysql bằng cách sử dụng mysql -u root -p, sau đó nhập mật khẩu gốc. Sau đó, tôi đã thử GRANT GRANT OPTION ON *.* TO 'root'@'%';và gặp lỗiERROR 1410 (42000): You are not allowed to create a user with GRANT
aiman

Câu trả lời:


196

Bắt đầu với MySQL 8, bạn không còn có thể (mặc nhiên) tạo người dùng bằng GRANTlệnh. Thay vào đó, hãy sử dụng CREATE USER , theo sau là câu lệnh GRANT :

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

Thận trọng về các rủi ro bảo mật WITH GRANT OPTION, hãy xem:


3
Lệnh này sẽ tạo một người dùng mới. Nhưng tôi muốn cấp đặc quyền cho người dùng root hiện tại. mysql> TẠO NGƯỜI DÙNG 'root' @ '%' ĐƯỢC XÁC ĐỊNH BỞI 'root'; Truy vấn OK, 0 hàng bị ảnh hưởng (0,31 giây) mysql> BẬT TẤT CẢ CÁC QUYỀN RIÊNG TƯ . ĐỂ 'root' @ '%' VỚI TÙY CHỌN CẤP; Truy vấn OK, 0 hàng bị ảnh hưởng (0,16 giây) mysql> CHỌN Người dùng TỪ mysql.user; + ------------------ + | Người dùng | + ------------------ + | gốc | | mysql.infoschema | | mysql.session | | mysql.sys | | gốc | + ------------------ + 5 hàng trong bộ (0,00 giây)
Praveen

Bây giờ hai người dùng có tên root có mặt trong bảng người dùng !! Ngoài ra, tôi không thể kết nối từ xa (người dùng gốc). ------------- Chi tiết: Loại: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException Trạng thái SQL: 08001
Praveen

Kỳ dị. Thông báo lỗi trong câu hỏi của bạn cho biết người dùng này không tồn tại. Đây là lý do duy nhất tại sao tôi đề nghị tạo nó trước. Và không thể có cùng một người dùng hai lần trong một phiên bản MySQL. Chúng khác nhau về tên hoặc ở phần máy chủ.
Mike Lischke

2
2 người dùng này kết nối từ các máy chủ khác nhau. Chạy SELECT User, Host FROM mysql.user;thay thế.
Mike Lischke

3
Gặp lỗi đó:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
adi

31

1) Điều này đã làm việc cho tôi. Đầu tiên, tạo một người dùng mới. Ví dụ: Người dùng foocó mật khẩubar

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

2) Thay thế mã dưới đây bằng tên người dùng bằng 'foo'.

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

Lưu ý: database_name là cơ sở dữ liệu mà bạn muốn có các đặc quyền , . có nghĩa là tất cả trên tất cả

3) Đăng nhập với tư cách người dùng foo

mysql> mysql -u foo -p

Mật khẩu: thanh

4) Đảm bảo kết nối ban đầu của bạn từ Sequelize được đặt thành foo với thanh pw.


5
Điều này cho đến nay không trả lời câu hỏi. Đó là về các quyền toàn cầu chứ không phải các quyền dành riêng cho cơ sở dữ liệu.
tmuecksch

29

Tôi thấy rất nhiều câu trả lời (sai), nó chỉ đơn giản như sau:

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

Lưu ý: thay vì tự tạo, userbạn có thể sử dụng rootđể kết nối với cơ sở dữ liệu. Tuy nhiên, sử dụng tài khoản gốc mặc định để cho phép ứng dụng kết nối với cơ sở dữ liệu không phải là cách ưa thích.

Các đặc quyền thay thế (hãy cẩn thận và nhớ nguyên tắc đặc quyền ít nhất):

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

Nếu bạn bằng cách nào đó gặp phải lỗi sau:

LỖI 1130 (HY000): Máy chủ '1.2.3.4' không được phép kết nối với máy chủ MySQL này

Bạn cần thêm / thay đổi hai dòng sau vào /etc/mysql/my.cnfvà khởi động lại mysql:

bind-address           = 0.0.0.0
skip-networking

Bạn có thể giải thích tại sao nó không hoạt động thay vì chỉ phàn nàn? Bằng cách đó, tôi có thể giúp bạn hoặc đăng thông tin bổ sung.
Nebulastic

Câu trả lời này thậm chí không giải quyết được câu hỏi về đặc quyền của người dùng root .
Joseph8th

Đã cập nhật câu trả lời cho phù hợp.
Nebulastic

1
Câu trả lời hay nhất, bây giờ là GRANT ALL ONdành cho MySQL 8.0. Ngoài ra, tôi tin rằng thay vì vô hiệu hóa, bind-addressbạn có thể liên kết 127.0.0.1và đưa --protocol=tcpvào bất kỳ lệnh nào. Hiệu suất lâu dài cũng tốt hơn với localhost.
Jesse Nickles

3

Thông số kỹ thuật của tôi:

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

Điều gì đã làm việc cho tôi:

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

Phản hồi trong cả hai truy vấn:

Query OK, O rows affected (0.10 sec*)

NB: Tôi đã tạo cơ sở dữ liệu (db_name) trước đó và đang tạo thông tin xác thực người dùng với tất cả các đặc quyền được cấp cho tất cả các bảng trong DB thay vì sử dụng người dùng gốc mặc định mà tôi đã đọc ở đâu đó là một phương pháp hay nhất.


3

Người dùng được chỉ định không tồn tại trên MySQL của bạn (vì vậy, MySQL đang cố gắng tạo nó với GRANT như đã làm trước phiên bản 8, nhưng không thành công với các hạn chế, được giới thiệu trong phiên bản này).

MySQL khá ngu ngốc vào thời điểm này, vì vậy nếu bạn có 'root' @ 'localhost' và cố gắng cấp đặc quyền cho 'root' @ '%', nó sẽ coi họ như những người dùng khác nhau, thay vì khái niệm chung chung cho người dùng root trên bất kỳ máy chủ nào, bao gồm localhost.

Thông báo lỗi cũng gây hiểu lầm.

Vì vậy, nếu bạn nhận được thông báo lỗi, hãy kiểm tra những người dùng hiện tại của bạn bằng một cái gì đó như thế này

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

và sau đó tạo người dùng bị thiếu (như Mike đã khuyên) hoặc điều chỉnh lệnh GRANT của bạn thành phiên bản cụ thể của người dùng hiện tại.


Đây là một giải pháp hợp lệ cho tôi! Đơn giản là tôi đã không thể nhập chính xác dòng user @. Hãy chắc chắn kiểm tra điều này trước khi thử các giải pháp khác được đề xuất. Đối với tôi, đó là: TẠO NGƯỜI DÙNG 'user'@'%domain.com' và sau đó khi tôi đưa ra câu lệnh GRANT không thành công, cú pháp của tôi đã bị tắt bởi một '.'. Nó trông giống như thế này GRANT .... TO 'user'@'%.domain.com'. Tôi quên đặt dấu '.' trong tuyên bố tạo của tôi và nó đã tạo ra tất cả sự khác biệt trong việc khắc phục sự cố này.
wallisds

2

Chỉ 2 xu của tôi về chủ đề này. Tôi đã gặp vấn đề chính xác khi cố gắng kết nối từ MySQL Workbench. Tôi đang chạy một máy ảo bitnami-mysql để thiết lập một hộp cát cục bộ để phát triển.

Hướng dẫn của Bitnami được cho là chạy lệnh 'Grant All Privileges':

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

Điều này rõ ràng đã không hoạt động, cuối cùng tôi đã làm cho nó hoạt động bằng cách sử dụng câu trả lời của Mike Lischke.

Điều tôi nghĩ đã xảy ra là người dùng root @% có thông tin đăng nhập sai được liên kết với nó. Vì vậy, nếu bạn đã cố gắng sửa đổi các đặc quyền của người dùng mà không gặp may, hãy thử:

  1. Đánh rơi người dùng.
  2. Tạo lại người dùng.
  3. Đảm bảo rằng bạn có liên kết chính xác trên tệp cấu hình my.cnf của mình. Trong trường hợp của tôi, tôi đã nhận xét dòng này vì nó chỉ dành cho môi trường hộp cát.

Từ Bảng điều khiển Mysql:

Liệt kê người dùng (hữu ích khi xem tất cả người dùng của bạn):

select user, host from mysql.user;

Thả người dùng mong muốn:

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

Tạo Người dùng và Cấp quyền:

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

Chạy lệnh này:

FLUSH PRIVILEGES;

Tìm tệp cấu hình mysql 'my.cnf' của bạn và tìm một dòng giống như sau:

bind-address=127.0.0.1

và nhận xét nó bằng cách sử dụng '#':

#bind-address=127.0.0.1

Sau đó khởi động lại dịch vụ mysql của bạn.

Hy vọng điều này sẽ giúp ai đó có cùng một vấn đề!


1

Điều này đã làm việc cho tôi:

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

1

Kiểm tra tên người dùng và tên miền của bạn giống như đã tạo trước đó. Mysql chọn tài khoản theo hai cột trong bảng người dùng. Nếu khác, mysql có thể nghĩ rằng bạn muốn tạo một tài khoản mới bằng cách trợ cấp, tài khoản này không được hỗ trợ sau phiên bản 8.0.


1

Thông số kỹ thuật của tôi:

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

Điều gì đã làm việc cho tôi:

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

Mặc dù nó sẽ hoạt động trong tình huống cụ thể của bạn. Phần cú pháp sql này cập nhật người dùng và nó không đặt tài khoản người dùng. Nó cũng không cấp đặc quyền.
Loạn luân

0

Chà, tôi vừa gặp vấn đề tương tự. Ngay cả khi tuyến đường có '%' không thể kết nối từ xa. Bây giờ, khi xem my.initệp (tệp cấu hình trong windows), bind-addresscâu lệnh đã bị bỏ sót.

Vì vậy, ... tôi đã đặt nó bind-address = *sau [mysqld]và khởi động lại dịch vụ. Bây giờ nó hoạt động!


Đây thực sự là câu trả lời gần nhất với câu trả lời chính xác.
Joseph8th

0

1. cấp đặc quyền

mysql> CẤP TẤT CẢ CÁC QUYỀN RIÊNG TƯ. ĐỂ 'root' @ '%' VỚI TÙY CHỌN CẤP;

mysql> QUYỀN RIÊNG TƯ CỦA FLUSH

2. kiểm tra bảng người dùng:

mysql> sử dụng mysql

mysql> chọn máy chủ, người dùng từ người dùng nhập mô tả hình ảnh ở đây

3. sửa đổi tệp cấu hình

mysql bind mặc định ip : 127.0.0.1, nếu chúng ta muốn truy cập các dịch vụ từ xa, chỉ cần xóa cấu hình

#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. cuối cùng khởi động lại các dịch vụ

dịch vụ bia khởi động lại mysql


Mặc dù điều này sẽ hoạt động, tôi sẽ không bao giờ khởi động lại phiên bản mysql trong sản xuất khi cấp một số priviliges nhất định. Thay vào đó hãy thử tuôn ra các đặc quyền.
Nebulastic

-1

Điều này có thể hoạt động:

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

1
Thay vì tung ra mã, cũng giải thích tại sao đó là giải pháp thích hợp. Mục đích là giáo dục để OP biết phải làm gì trong thời gian tới chứ không chỉ đơn thuần là giải quyết vấn đề trước mắt.
Tin Man

-1

Tôi đã gặp vấn đề tương tự, điều này đã dẫn tôi đến đây. Đặc biệt, để phát triển địa phương, tôi muốn có thể làm được mysql -u root -pmà không có sudo. Tôi không muốn tạo một người dùng mới. Tôi muốn sử dụng roottừ một ứng dụng web PHP cục bộ.

Thông báo lỗi gây hiểu lầm, vì không có gì sai với 'root'@'%'đặc quyền người dùng mặc định .

Thay vào đó, như một số người đã đề cập trong các câu trả lời khác, giải pháp đơn giản là đặt bind-address=0.0.0.0thay vì bind-address=127.0.0.1trong /etc/mysql/mysql.conf.d/mysqld.cnfcấu hình của tôi . Không có thay đổi nào được yêu cầu.


Điều này thậm chí không trả lời đầy đủ câu hỏi.
Nebulastic

-2

Tôi gặp sự cố tương tự trên CentOS và điều này đã hiệu quả với tôi (phiên bản: 8.0.11):

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

LỖI 1064 (42000): Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn sử dụng tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp phù hợp để sử dụng gần '. ĐẾN 'root' @ '%' 'tại dòng 1
GDefender

mysql> CẤP TẤT CẢ CÁC QUYỀN RIÊNG TƯ. TO 'root' @ '%'; LỖI 1064 (42000): Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn sử dụng tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp phù hợp để sử dụng gần '. TO 'root' @ '%' 'tại dòng 1 mysql>
PGOEL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.