MySQL 8.0でrootユーザーにすべての権限を付与する方法


110

試しました

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

取得

エラー1064(42000):SQL構文にエラーがあります。1行目の 'IDENTIFIED BY' root 'WITH GRANT OPTION'の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

注:以前のバージョンで試した場合も同様です。

また試しました

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

取得

エラー1410(42000):GRANTでユーザーを作成することはできません

MySQL(8.0.11.0)のユーザー名/パスワードはroot / rootです。


mysqlに直接接続していますか、それともsshを使用していますか?
ハラルド

rootユーザーとしてコマンドプロンプトから直接
Praveen

1
13.7.1.6 GRANT構文13.7.1.4 GRANT構文の違いをご覧ください。
wchiquito 2018年

7
私も同じ問題で立ち往生しています。を使用してmysqlシェルを起動し、mysql -u root -pルートパスワードを入力しています。それから私は試しましたGRANT GRANT OPTION ON *.* TO 'root'@'%';が、エラーが発生しますERROR 1410 (42000): You are not allowed to create a user with GRANT
aiman

回答:


196

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
このコマンドは、新しいユーザーを作成します。しかし、既存のrootユーザーに特権を付与したいと思います。mysql> CREATE USER 'root' @ '%' IDENTIFIED BY 'root'; クエリは正常、0行が影響を受けた(0.31秒)mysql> GRANT ALL PRIVILEGES ON GRANT OPTION付きの「root」@ '%'に。クエリは正常、0行が影響を受けた(0.16秒)mysql> mysql.userからSELECT User FROM mysql.user; + ------------------ + | ユーザー| + ------------------ + | ルート| | mysql.infoschema | | mysql.session | | mysql.sys | | ルート| + ------------------ + 5行のセット(0.00秒)
Praveen

これで、rootという名前の2人のユーザーがユーザーテーブルに存在します。また、リモートで接続できません(rootユーザー)。-------------詳細:タイプ:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException SQL State:08001
Praveen

変だ。質問のエラーメッセージは、このユーザーが存在しないことを示しています。これが私が最初に作成することを提案した唯一の理由です。また、単一のMySQLインスタンスで同じユーザーを2回使用することはできません。名前またはホスト部分が異なります。
Mike Lischke、2018年

2
これらの2人のユーザーは、異なるホストから接続します。SELECT User, Host FROM mysql.user;代わりに実行します。
Mike Lischke、2018年

3
そのエラーを得た:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
adi

31

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からの初期接続がpw barでfooに設定されていることを確認します。


5
これは質問に答えることはできません。これは、グローバルな権限に関するものであり、データベース固有の権限に関するものではありません。
tmuecksch 2018年

29

私はたくさんの(間違った)答えを見つけました、それはこれと同じくらい簡単です:

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

注:自己作成の代わりに、データベースへの接続にuser使用できrootます。ただし、デフォルトの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サーバーへの接続を許可されていません

次の2行を追加/変更し、/etc/mysql/my.cnfmysqlを再起動する必要があります。

bind-address           = 0.0.0.0
skip-networking

文句を言うのではなく、なぜ機能しないのか、詳しく説明していただけませんか?そうすれば、私はあなたを助けたり、追加情報を投稿したりできます。
ネブラスティック

この回答は、rootユーザー権限の問題に対処することすらしていません。
ジョセフ

それに応じて回答を更新しました。
ネブラスティック

1
最良の答えは、GRANT ALL ONMySQL 8.0です。また、無効にbind-addressする代わり127.0.0.1--protocol=tcp、任意のコマンドにバインドして含めることができると思います。長期的なパフォーマンスも、の場合よりも優れていlocalhostます。
Jesse Nickles

3

私のスペック:

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ユーザーを使用する代わりに、DB内のすべてのテーブルに付与されたすべての権限を持つユーザー資格情報を作成していました。


3

指定されたユーザーがMySQLに存在しない(したがって、MySQLはバージョン8以前と同じようにGRANTで作成しようとしているが、このバージョンで導入された制限により失敗する)。

MySQLはこの時点ではかなり馬鹿げているので、 'root' @ 'localhost'があり、 'root' @ '%'に特権を付与しようとすると、それらは異なるホストとして扱われます。 localhost。

エラーメッセージも誤解を招くです。

したがって、エラーメッセージが表示された場合は、次のような方法で既存のユーザーを確認してください。

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

(Mikeがアドバイスしたように)不足しているユーザーを作成するか、GRANTコマンドを実際の既存のユーザー仕様に調整します。


これは私にとって有効な解決策でした!私は単にuser @行を正確に入力できなかっただけです。提案されている他のソリューションを試す前に、必ずこれを確認してください。私にとっては、CREATE USER 'user'@'%domain.com'でしたが、失敗したGRANTステートメントを発行すると、構文が1つ '。'ずれていました。それはこのGRANT .... TO 'user'@'%.domain.com'のように見えました。「。」を付けるのを忘れた 私のcreateステートメントでは、この問題を修正することですべての違いがありました。
wallisds

2

ちょうど私の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. 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サービスを再起動します。

これが同じ問題を抱えている誰かに役立つことを願っています!


1

これは私のために働きました:

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

1

ユーザー名とドメインが前に作成したものと同じであることを確認してください。Mysqlは、ユーザーテーブルの2つの列によってアカウントを選択します。異なる場合、mysqlは新しいバージョンのアカウントを許可で作成したいと考える場合がありますが、8.0バージョン以降はサポートされません。


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構文はユーザーを更新し、ユーザーアカウントを設定しません。また、権限も付与されません。
ネブラスティック

0

さて、私は同じ問題を抱えていました。ルートに「%」があったとしても、リモート接続できませんでした。現在、my.iniファイル(Windowsの構成ファイル)を見ると、bind-addressステートメントがありませんでした。

だから... ...私はこれをパットbind-address = *した後[mysqld]、サービスを再起動します。今ではうまくいきます!


これは実際には正解に最も近いです。
ジョセフ

0

1.権限を付与する

mysql>すべての権限を付与します。'root' @ '%' TO GRANT OPTION;

mysql>フラッシュ特権

2.ユーザーテーブルを確認します。

mysql> mysqlを使用

mysql>ユーザーからホスト、ユーザーを選択 ここに画像の説明を入力してください

3.構成ファイルを変更する

mysqlのデフォルトバインドIP:127.0.0.1、リモートアクセスサービスが必要な場合は、構成を削除

#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 services mysqlを再起動します


これは機能しますが、特定の権限を付与するときに、本番環境でmysqlインスタンスを再起動することはありません。代わりに、特権をフラッシュしてみてください。
ネブラスティック

-1

これはうまくいくかもしれません:

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

1
コードを投げ捨てるのではなく、それが適切な解決策である理由も説明してください。目標は、当面の問題を解決するだけでなく、OPが次に何をすべきかがわかるように教育することです。
ティンマン

-1

私はこれと同じ問題を抱えていて、私をここに導いた。特に、地域の発展のために、mysql -u root -pなしでできることを望んでいましたsudo。新しいユーザーを作成したくありません。使いたいrootローカルのPHP Webアプリからし。

デフォルトでは何も問題なかったため、エラーメッセージは誤解を招くものです'root'@'%'ユーザー権限。

代わりに、他の回答でいくつかの人々が述べたように、解決策は私の設定bind-address=0.0.0.0bind-address=127.0.0.1はなく単に設定することでした/etc/mysql/mysql.conf.d/mysqld.cnf。他に変更は必要ありませんでした。


これでは質問に完全に答えることはできません。
ネブラスティック

-2

CentOSでも同じ問題が発生し、これでうまくいきました(バージョン:8.0.11):

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

エラー1064(42000):SQL構文にエラーがあります。near 'を使用するための正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。TO 'root' @ '%' '(1行目)
GDefender '25

mysql>すべての権限を付与します。TO 'root' @ '%'; エラー1064(42000):SQL構文にエラーがあります。near 'を使用するための正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。TO 'root' @ '%' 'at line 1 mysql>
PGOEL
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.