簡體   English   中英

MySQL 8.0如何給root用戶所有權限

[英]How to grant all privileges to root user in MySQL 8.0

嘗試過

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

獲得

ERROR 1064 (42000): 你的 SQL 語法有錯誤; 檢查與您的 MySQL 服務器版本對應的手冊,了解在第 1 行的“IDENTIFIED BY 'root' WITH GRANT OPTION'附近使用的正確語法。

注意:在以前的版本中嘗試時同樣有效。

也試過

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

獲得

ERROR 1410 (42000):不允許您使用 GRANT 創建用戶

MySQL (8.0.11.0) 用戶名/密碼是root/root。

從 MySQL 8 開始,您不再可以(隱式)使用GRANT命令創建用戶。 使用CREATE USER代替,后跟GRANT語句:

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

關於WITH GRANT OPTION的安全風險注意事項,請參見:

我看到很多(錯誤的)答案,就這么簡單:

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

注意:您可以使用root連接到數據庫,而不是使用自創建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'@'*';

如果您以某種方式遇到以下錯誤:

ERROR 1130 (HY000): Host '1.2.3.4' is not allowed to connect to this MySQL server

您需要在/etc/mysql/my.cnf添加/更改以下兩行並重新啟動 mysql:

bind-address           = 0.0.0.0
skip-networking

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 bar。

對於那些在服務器計算機上已經有 root 帳戶的情況下對CREATE USER 'root'@'localhost'感到困惑的人,請記住,您的'root'@'localhost''root'@'your_remote_ip'是mysql 服務器中的兩個不同用戶(相同的用戶名,但范圍不同)。 因此,使用your_remote_ip后綴創建新用戶實際上將創建一個新的有效root用戶,您可以使用該用戶從遠程機器訪問 mysql 服務器。

例如,如果您使用root從 IP 為10.154.10.241的遠程機器連接到您的 mysql 服務器,並且您想為遠程 root 帳戶設置密碼'Abcdef123!@#' ,這里是您的步驟想遵循:

  1. 在你的 mysql 服務器機器上,執行mysql -u root -p ,然后輸入你的密碼讓root登錄。

  2. 進入mysql>會話后,執行此操作為遠程范圍創建 root 用戶:

     mysql> CREATE USER 'root'@'10.154.10.241' IDENTIFIED BY 'Abcdef123!@#';
  3. Query OK消息之后,執行此操作以授予新創建的 root 用戶所有權限:

     mysql> GRANT ALL ON *.* TO 'root'@'10.154.10.241';
  4. 進而:

     FLUSH PRIVILEGES;
  5. 重啟mysqld服務:

     sudo service mysqld restart
  6. 確認服務器已成功重啟:

     sudo service mysqld status

如果執行上述步驟沒有任何錯誤,您現在可以使用root從遠程機器訪問 mysql 服務器。

我的規格:

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),並創建了一個用戶憑據,該憑據具有授予數據庫中所有表的所有權限,而不是使用我在某處讀取的默認 root 用戶,這是最佳做法。

指定的用戶在您的 MySQL 中不存在(因此,MySQL 嘗試使用 GRANT 創建它,就像它在版本 8 之前所做的那樣,但由於此版本中引入的限制而失敗)。

MySQL 在這一點上非常愚蠢,所以如果你有 'root'@'localhost' 並試圖授予 'root'@'%' 權限,它會將它們視為不同的用戶,而不是任何主機上的 root 用戶的通用概念,包括本地主機。

錯誤消息也具有誤導性。

因此,如果您收到錯誤消息,請使用以下內容檢查現有用戶

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

然后創建缺少的用戶(如 Mike 建議的那樣)或將您的 GRANT 命令調整為實際存在的用戶規范。

只是我在這個主題上的 2 美分。 我在嘗試從 MySQL Workbench 連接時遇到了完全相同的問題。 我正在運行一個 bitnami-mysql 虛擬機來設置一個本地沙箱進行開發。

Bitnami 的教程說要運行“授予所有權限”命令:

/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. 確保您的 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;

找到您的 mysql 配置文件“my.cnf”並查找如下所示的行:

bind-address=127.0.0.1

並使用“#”對其進行評論:

#bind-address=127.0.0.1

然后重啟你的mysql服務。

希望這可以幫助有同樣問題的人!

復制並立即使用它:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON *.* TO 'username'@'localhost';
FLUSH PRIVILEGES;

而不是使用單行代碼,例如:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

然后:

GRANT ALL ON *.* TO 'username'@'localhost';

然后:

FLUSH PRIVILEGES;

檢查您的用戶名和域是否與之前創建的相同。 Mysql通過user表中的兩列選擇賬號,如果不同,mysql可能認為你想通過grant創建一個新賬號,8.0版本以后不支持了。

在 select 語句中,將 'user'@'%' 更改為 'user'@'localhost' 解決了我的問題

這對我有用:

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

我的規格:

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

你會得到這個錯誤

ERROR 1410 (42000): 不允許您創建具有 GRANT 的用戶

如果您嘗試對不存在的用戶運行GRANT

因此,首先運行它以確保您在GRANT中使用的用戶與您擁有的完全匹配:

select User, Host from user;

特別注意您創建的用戶是否在localhost而您嘗試授予的用戶是%

這個命令對我有用:

1-登錄mysql並查看所有用戶

sudo mysql -u root

 select user, host from mysql.user;

2-刪除老用戶

drop user root@localhost;

3-創建新用戶

CREATE USER 'root'@'localhost' IDENTIFIED BY 'mypassword'

4-為其添加所有權限:

GRANT ALL ON *.* TO 'root'@'localhost'

 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypassword';

5-finally 刷新權限

FLUSH PRIVILEGES;

好吧,我只是遇到了同樣的問題。 即使路由有 '%' 也無法遠程連接。 現在,查看my.ini文件(Windows 中的配置文件), bind-address語句被遺漏了。

所以...我把這個bind-address = *放在[mysqld]並重新啟動了服務。 現在它起作用了!

1. 授予權限

mysql> 授予所有權限。 'root'@'%'with GRANT OPTION;

mysql> 刷新特權

2.查看用戶表:

mysql> 使用 mysql

mysql> 從用戶中選擇主機、用戶在此處輸入圖片說明

3.修改配置文件

mysql默認綁定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.最后重啟服務

brew 服務重啟 mysql

試試這個,我遇到了同樣的問題,我嘗試了幾個選項,但下面的方法有效。

全力以赴 TO 'root'@'%';

使用的參考 - https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-20-04#step-6-%E2% 80%94-testing-database-connection-from-php-optional

非常感謝@ Nebulastic如果您只想使用以下命令允許遠程 IP

CREATE USER 'user_test'@'113.yy.xx.94' IDENTIFIED BY 'YOUR_PWD';
GRANT ALL ON *.* TO 'user_test'@'113.yy.xx.94';
FLUSH PRIVILEGES;

就我而言,我想做類似的事情,我從這里開始執行一些步驟,但最好的方法是 @nebulasic 提到的:

USE mysql;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'P@ssW0rd';
GRANT ALL ON *.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
  • ubuntu 22.04.1
  • Mysql 版本 8.0.31-0

我的 root 沒有 GRANT 權限,所以我不能授予新用戶任何特權。 解決方案是刪除當前 root 用戶並使用“mysql_native_password”創建新用戶。

命令如下 以root身份登錄mysql

mysql> DROP USER 'root'@'localhost' IDENTIFIED BY 'PASSWORD' FROM mysql.user;
mysql> CREATE USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'locahost' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

這可能有效:

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

我有同樣的問題,這導致我來到這里。 特別是對於本地開發,我希望能夠在沒有sudo情況下執行mysql -u root -p 我不想創建新用戶。 我想從本地 PHP Web 應用程序使用root

該錯誤消息具有誤導性,因為默認的'root'@'%'用戶權限沒有任何問題

相反,正如其他答案中提到的幾個人,解決方案只是在我的/etc/mysql/mysql.conf.d/mysqld.cnf配置中設置bind-address=0.0.0.0而不是bind-address=127.0.0.1 . 其他方面無需更改。

帶有 sudo 的 Stary mysql

sudo mysql

我在 CentOS 上遇到了同樣的問題,這對我有用(版本:8.0.11):

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

這對我有用

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'password';

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM