MySQLで新しいユーザーを作成し、1つのデータベースへのフルアクセスを付与します


628

MySQLで新しいユーザーを作成し、1つのデータベースのみにフルアクセスを付与したいとします。たとえばdbTest、のようなコマンドで作成しcreate database dbTest;ます。それを行うためのMySQLコマンドは何でしょうか?

回答:


829

これを試してユーザーを作成します。

CREATE USER 'user'@'hostname';

これを試して、データベースへのアクセスを許可しますdbTest

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

同じマシンでMySQLにアクセスするコード/サイトを実行している場合、ホスト名はlocalhostになります。

さて、故障。

GRANT -これは、ユーザーを作成し、データベース、テーブルなどへの権限を付与するために使用されるコマンドです。

ALL PRIVILEGES-これは、ユーザーがすべての標準権限を持っていることを示しています。ただし、GRANTコマンドを使用する権限は含まれません。

dbtest.*-この説明MySQLは、dbtestデータベース全体で使用するためにこれらの権利を適用します。必要に応じて、*を特定のテーブル名またはストアルーチンに置き換えることができます。

TO 'user'@'hostname'-'user'は、作成するユーザーアカウントのユーザー名です。注:単一引用符が必要です。'hostname'は、ユーザーが接続できるホストをMySQLに通知します。同じマシンからのみ必要な場合は、localhost

IDENTIFIED BY 'password' -ご想像のとおり、これによりそのユーザーのパスワードが設定されます。


82
ネットワークアクセスを許可していて、任意のホストからの接続が必要な場合は、「ホスト名」を「%」に変更できます。たとえば、... TO 'dbuser' @ '%' IDENTIFIED ... '%'はホストワイルドカードです。
physicsmichael 2009年

17
ユーザーとテーブルで作業しているときは、特権をフラッシュすることを忘れないでください!:-)
corsiKa 2012

31
これは私にとってうまくいきました:CREATE USER 'user1' @ 'localhost' IDENTIFIED BY 'password'; db_database1。*のすべての権限を付与する 'user1' @ 'localhost'に 'password'で識別されます。FLUSH PRIVILEGES;
Mohamad Fakih 2014年

4
@DanMcGrath:ユーザーが既に存在し、パスワードを持っている場合、IDENTIFIED BY 'password'句は必須ですか?
nanosoft 2015年

8
GRANTを使用して新しいユーザーを作成することは、MySQLの将来のリリースで削除される予定です(これを書いている時点では非推奨です)。将来的には、CREATE USERとGRANTの2つの呼び出しで行う必要があります。
Darren Felton 2016年

325

構文

MySQL / MariaDB 5.7.6以降でユーザーを作成するには、CREATE USER構文を使用します

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'new_password';

その後、データベース(例えばへのすべてのアクセス権を付与するためにmy_db使用し、)GRANT構文を、例えば

GRANT ALL ON my_db.* TO 'new_user'@'localhost';

ここで、ALLpriv_typeには)特定の権限などに置き換えることができSELECTINSERTUPDATEALTER、等

次に、新しく割り当てられた権限を再ロードするには、次のコマンドを実行します。

FLUSH PRIVILEGES;

実行中

上記のコマンドを実行するには、コマンドを実行mysqlしてプロンプトに入力し、quitコマンドまたはCtrl-でログアウトする必要がありますD

シェルから実行するには、-eパラメーターを使用します(SELECT 1上記のコマンドのいずれかに置き換えます)。

$ mysql -e "SELECT 1"

または標準入力からステートメントを出力します。

$ echo "FOO STATEMENT" | mysql

あなたが持っている場合はアクセスが拒否された指定し、上記で-u(ユーザー用)および-pパラメータ(パスワードの場合)、または長期的なアクセスのために資格情報を設定する~/.my.cnfなど、

[client]
user=root
password=root

シェル統合

MySQL構文に不慣れな人のために、覚えやすく使いやすい便利なシェル関数を次に示します(これらを使用するには、さらに含まれているシェル関数をロードする必要があります)。

次に例を示します。

$ mysql-create-user admin mypass
| CREATE USER 'admin'@'localhost' IDENTIFIED BY 'mypass'

$ mysql-create-db foo
| CREATE DATABASE IF NOT EXISTS foo

$ mysql-grant-db admin foo
| GRANT ALL ON foo.* TO 'admin'@'localhost'
| FLUSH PRIVILEGES

$ mysql-show-grants admin
| SHOW GRANTS FOR 'admin'@'localhost'
| Grants for admin@localhost                                                                                   
| GRANT USAGE ON *.* TO 'admin'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4' |
| GRANT ALL PRIVILEGES ON `foo`.* TO 'admin'@'localhost'

$ mysql-drop-user admin
| DROP USER 'admin'@'localhost'

$ mysql-drop-db foo
| DROP DATABASE IF EXISTS foo

上記のコマンドを使用するには、以下の関数をrcファイル(例:)にコピーして貼り付け、.bash_profileシェルをリロードするか、ファイルをソースする必要があります。この場合は、次のように入力しsource .bash_profileます。

# Create user in MySQL/MariaDB.
mysql-create-user() {
  [ -z "$2" ] && { echo "Usage: mysql-create-user (user) (password)"; return; }
  mysql -ve "CREATE USER '$1'@'localhost' IDENTIFIED BY '$2'"
}

# Delete user from MySQL/MariaDB
mysql-drop-user() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-user (user)"; return; }
  mysql -ve "DROP USER '$1'@'localhost';"
}

# Create new database in MySQL/MariaDB.
mysql-create-db() {
  [ -z "$1" ] && { echo "Usage: mysql-create-db (db_name)"; return; }
  mysql -ve "CREATE DATABASE IF NOT EXISTS $1"
}

# Drop database in MySQL/MariaDB.
mysql-drop-db() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-db (db_name)"; return; }
  mysql -ve "DROP DATABASE IF EXISTS $1"
}

# Grant all permissions for user for given database.
mysql-grant-db() {
  [ -z "$2" ] && { echo "Usage: mysql-grand-db (user) (database)"; return; }
  mysql -ve "GRANT ALL ON $2.* TO '$1'@'localhost'"
  mysql -ve "FLUSH PRIVILEGES"
}

# Show current user permissions.
mysql-show-grants() {
  [ -z "$1" ] && { echo "Usage: mysql-show-grants (user)"; return; }
  mysql -ve "SHOW GRANTS FOR '$1'@'localhost'"
}

注:Bashの履歴にトレースなど(パスワードなど)を残したくない場合は、次の項目を確認してください。bashの履歴にコマンドが表示されないようにする方法


1
ユーザーを作成して特権を個別に付与する必要がありますか?私は、grantコマンドがユーザー自身を作成し​​ているように見えることを発見しました。少なくともmysql.userテーブルを見ると、そのように見えます。
Tim

@CreativityKills ~/.my.cnf上記のようにパスワードを追加すると、パスワードで機能します。
ケノーブ2017

シェルの履歴にパスワードの痕跡を残すことは良い考えではありません
dmirkitanov

@dmirkitanovスペースを追加することでこれを防ぐことができます。「bashの履歴にコマンドが表示されないようにする方法」を
ケノーブ

58

ユーザーを作成し、データベースに対するすべての権限を付与します。

MySQLにログインします。

mysql -u root

作成して付与する

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

匿名ユーザー(ローカルテストのみ)

あるいは、データベースへの完全な無制限のアクセスを許可したいだけの場合(たとえば、テストインスタンス用のローカルマシン上)、次のように匿名ユーザーにアクセスを許可できます。

GRANT ALL PRIVILEGES ON dbTest.* To ''@'hostname'

注意してください

これは、開発中のジャンクデータには問題ありません。気になることをこれで行わないでください。


3
このような匿名ユーザーを作成できますが、作成しないでください。完全な特権とパスワードを持たないユーザーがいることには正当な理由はありませんが、あるべきではないサーバーに誰かがアクセスした場合、1日/年/ビジネス/仕事が1日台無しになる可能性があります。なぜ他のものをもっと簡単にするのですか?
Luke Cousins

2
誰かが私のmacbookへのリモートアクセスを取得した場合、開発データベースの内容よりも心配すべきことが多くあります。繰り返しますが、これはローカルテスト専用です。実際のデータでこれを実行しないでください。
超照明

4
正確に、他のすべてのことを心配する必要があるので、開発データベースの内容も同様に心配しないでください。開発データベースには(おそらくバグを複製するために)ライブデータベースデータのスニペットが含まれている可能性があります(おそらくそうするでしょう)。パスワードなしでデータベースにアクセスする必要はありません。時間の節約にもなりません。潜在的な面倒の価値はありません。
Luke Cousins 14

1
たぶん。私の場合、それはジャンクデータです。私はリスクに耐えます。

17
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"

mysqlユーザーにパスワードがない場合、または単に[Enter]ボタンを押してバイパスする場合は、-pオプションを無視します。中括弧で囲まれた文字列は、実際の値に置き換える必要があります。



6

私にはこれがうまくいきました。

CREATE USER 'spowner'@'localhost' IDENTIFIED BY '1234'; 
GRANT ALL PRIVILEGES ON test.* To 'spowner'@'localhost'; 
FLUSH PRIVILEGES;

どこ

  • spowner:ユーザー名
  • 1234:spownerのパスワード
  • test:データベース 'spowner'は、

2

以下のコマンドは、新しいユーザーを作成して、ローカルホスト上の特定のデータベース(Mysqlのすべてのデータベースではない)へのすべてのアクセス権をユーザーに付与する場合に機能します。

GRANT ALL PRIVILEGES ON test_database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

これにより、1つのデータベースtest_database(あなたの場合dbTest)に対するすべての権限がlocalhost上のそのユーザーに付与されます。

以下のコマンドを実行して、上記のコマンドがそのユーザーに発行した権限を確認します。

SHOW GRANTS FOR 'user'@'localhost'

念のため、ユーザーアクセスを1つのテーブルのみに制限する場合

GRANT ALL ON mydb.table_name TO 'someuser'@'host';

最初の行の構文エラーとタイプミス、 "PRIVILEGES ON 'test_datase'"には引用符を付けず、後に "。*"を付けます(例:test_datase。*)。タイプミスであり、 "test_database 「。
Brettins 2016

0

host一部が省略されている場合、デフォルトでワイルドカード記号%になり、すべてのホストが許可されます。

CREATE USER 'service-api';

GRANT ALL PRIVILEGES ON the_db.* TO 'service-api' IDENTIFIED BY 'the_password'

SELECT * FROM mysql.user;
SHOW GRANTS FOR 'service-api'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.