ホームページ  >  記事  >  データベース  >  MySQL はどのように権限管理を実行しますか?

MySQL はどのように権限管理を実行しますか?

青灯夜游
青灯夜游転載
2019-02-26 11:00:234166ブラウズ

この記事の内容は、MySQL がアクセス許可管理をどのように実行するかを紹介することです。困っている友人は参考にしていただければ幸いです。

MySQL の権限テーブルは、データベースの起動時にメモリにロードされ、ユーザーが ID 認証に合格すると、メモリ内の対応する権限にアクセスします。このようにして、ユーザーはデータベース内の権限範囲を設定できます。 . 内部のさまざまな操作。 [ビデオチュートリアルの推奨: MySQL チュートリアル]

1. 権限テーブルへのアクセス

権限アクセスの 2 つのプロセスで、システムは「mysql」を使用します。データベース内の重要な権限テーブル (MySQL のインストール時に作成され、データベース名は「mysql」) は user、host、db です。

これら 3 つのテーブルの中で最も重要なものは user テーブルで、次に db テーブルはほとんどの場合使用されません。

user の列は主に、ユーザー列、権限列、セキュリティ列、リソース制御列の 4 つの部分に分かれています。

通常、最もよく使用される列はユーザ​​ー列と権限列で、このうち権限列は通常権限と管理権限に分かれています。 select_privsuper_priv などの通常の権限はデータベース操作に使用されます。

ユーザーが接続すると、権限テーブルのアクセスプロセスには次の 2 つのプロセスがあります。

  • まず、ユーザー テーブルのホスト、ユーザー、パスワードの 3 つから開始します。フィールドは、接続された IP、ユーザー名、およびパスワードがテーブルに存在するかどうかを判断するために使用されます。存在する場合は認証が通過し、存在しない場合は接続が拒否されます。

  • ID 認証に合格すると、データベース権限は、user -> db -> tables_priv -> の順序で取得されます。

これらの権限テーブルでは、権限の範囲が順番に減少し、グローバル権限がローカル権限をカバーします。上記の第 1 段階は理解しやすいですが、例を使用して第 2 段階を詳しく説明します。
テストを容易にするために、変数 sql_mode

// sql_mode 默认值中有 NO_AUTO_CREATE_USER (防止GRANT自动创建新用户,除非还指定了密码)
SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

1 を変更する必要があります。ユーザー zj@localhost を作成し、すべてのデータベースのすべてのテーブルに選択権限を付与します。

MySQL [mysql]> grant select on *.* to zj@localhost;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

MySQL [mysql]> select * from user where user="zj" and host='localhost' \G;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: Y
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
...

2. db テーブル

MySQL [mysql]> select * from db where user='zj' \G ;
Empty set (0.00 sec)

を確認すると、user テーブルの select_priv 列が「Y」であることがわかりますが、db テーブルにはレコードがありません。すべてのデータベースに対する同じ権限は、db テーブルに記録する必要はなく、user テーブルの select_priv を "Y" に変更するだけで済みます。つまり、ユーザー テーブル内のすべての権限は、すべてのデータベースに対する権限を表します。

3. zj@localhost の権限を変更して、t2 データベース上のすべてのテーブルの権限のみを選択します。

MySQL [mysql]> revoke select on *.* from zj@localhost;
Query OK, 0 rows affected, 1 warning (0.02 sec)

MySQL [mysql]> grant select on t2.* to zj@localhost;
Query OK, 0 rows affected, 1 warning (0.04 sec)

MySQL [mysql]> select * from user where user='zj' \G;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
...

MySQL [mysql]> select * from db where user='zj' \G;
*************************** 1. row ***************************
                 Host: localhost
                   Db: t2
                 User: zj
          Select_priv: Y
          Insert_priv: N
          Update_priv: N
          Delete_priv: N
          Create_priv: N
            Drop_priv: N
           Grant_priv: N

このとき、userテーブルのselect_privが「N」に変更され、dbテーブルにdb t2のレコードが追加されていることが分かりました。つまり、特定の権限がデータベースの一部にのみ付与されている場合、user テーブルの対応する権限列は「N」のままで、特定のデータベース権限が db テーブルに書き込まれます。テーブルとカラムの権限メカニズムは db の権限メカニズムと似ています。

上記の例からわかるように、ユーザーが権限認証に合格し、権限が割り当てられると、権限は user -> db -> columns_priv の順に割り当てられます。つまり、テーブル ユーザーの対応する権限が「Y」の場合、すべてのデータベースに対するこのユーザーの権限が「Y」になり、db、tables_priv、および columns_priv がチェックされなくなります。が「N」の場合、このユーザーの権限はユーザーに対応するデータベースでチェックされ、データベース内の対応する権限が「N」の場合はデータベース内の「Y」の権限を取得します。 tables_priv、columns_privの権限を順に取得し、すべて「N」の場合は権限なしと判断します。

2. アカウント管理

主にアカウントの作成、権限の変更、アカウントの削除が含まれます。

1. アカウントを作成します

grant 構文を使用して作成します。例:

(1) すべてのデータベースに対するすべての権限を実行できる権限を持つユーザー zj を作成します。ローカル接続からのみ実行できます。
MySQL [mysql]> grant all privileges on *.* to zj@localhost;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

MySQL [mysql]> select * from user where user="zj" and host="localhost" \G;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y

ユーザー テーブルでは、grant_priv 権限を除くすべての権限が「Y」であることがわかります。

(2) (1)に基づいて、zj
MySQL [(none)]> grant all privileges on *.* to zj@localhost with grant option;
Query OK, 0 rows affected, 1 warning (0.01 sec)

MySQL [mysql]> select * from user where user="zj" and host='localhost' \G ;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
...
(3) (2)に基づいて、パスワードを「123」
MySQL [mysql]> grant all  privileges on *.* to zj@localhost identified by '123' with grant option;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

MySQL [mysql]> select * from user where user="zj" and host="localhost" \G ;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
......  
 authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
      password_expired: N
 password_last_changed: 2017-09-25 20:29:42
     password_lifetime: NULL

パスワードが暗号化された文字列の塊になっていることがわかります。

(4) 任意の IP から接続できる新しいユーザー zj2 を作成します。権限は、t2 データベース内のすべてのテーブルに対して選択、更新、挿入、削除の操作を実行することです。初期パスワードは「123」です。
MySQL [mysql]> grant select ,insert, update,delete on t2.* to 'zj2'@'%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

MySQL [mysql]> select * from user where user='zj2' and host="%" \G;
*************************** 1. row ***************************
                  Host: %
                  User: zj2
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
......
 authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
      password_expired: N
 password_last_changed: 2017-09-25 20:37:49
     password_lifetime: NULL

MySQL [mysql]> select * from db where user="zj2" and host='%' \G;
*************************** 1. row ***************************
                 Host: %
                   Db: t2
                 User: zj2
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: N
            Drop_priv: N
......

user テーブルの権限はすべて「N」、db テーブルに追加されたレコードの権限はすべて「Y」です。一般に、過剰な権限を付与せず、適切な権限のみをユーザーに付与します。

この例の IP 制限は、すべての IP が接続できるため、「*」に設定されています。mysql データベースでは、ユーザー テーブルのホスト フィールドによって制御されます。割り当ての種類。

  • Host 値にはホスト名または IP 番号を指定するか、「localhost」はローカル ホストを示します。

  • ホスト列の値にはワイルドカード文字「%」と「_」を使用できます。

  • ホスト値「%」は任意のホスト名と一致します。 、空の Host 値は「%」に相当し、その意味は like 演算子のパターン マッチング操作と同じです。

注意: mysql 数据库的 user 表中 host 的值为 “*” 或者空,表示所有外部 IP 都可以连接,但是不包括本地服务器 localhost,因此,如果要包括本地服务器,必须单独为 localhost 赋予权限。

(5) 授予 super、process、file 权限给用户 zj3@%
MySQL [mysql]> grant super,process,file on *.* to 'zj3'@'%';
Query OK, 0 rows affected, 1 warning (0.00 sec)

因为这几个权限都是属于管理权限,因此不能够指定某个数据库,on 后面必须跟 “.”,下面语法将提示错误

MySQL [mysql]> grant super,process,file on t2.* to 'zj3'@'%';
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
(6) 只授予登录权限给 zj4@localhost
MySQL [mysql]> grant usage on *.* to 'zj4'@'localhost';
Query OK, 0 rows affected, 2 warnings (0.01 sec)

MySQL [mysql]> exit
Bye

zj@bogon:~$ mysql -uzj4 -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 78
Server version: 5.7.18-log Source distribution

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.02 sec)

usage 权限只能用于数据库登录,不能执行任何操作

2. 查看账号权限

账号创建好后,可以通过如下命令查看权限:

show grants for user@host;

示例:

MySQL [(none)]> show grants for zj@localhost;
+-------------------------------------------------------------------+
| Grants for zj@localhost                                           |
+-------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'zj'@'localhost' WITH GRANT OPTION |
+-------------------------------------------------------------------+
1 row in set (0.01 sec)

3. 更改账号权限

可以进行权限的新增和回收。和创建账号一样,权限变更也有两种方法:使用 grant(新增) 和 revoke (回收) 语句,或者更改权限表。

示例:
(1) zj4@localhost 目前只有登录权限
MySQL [(none)]> show grants for zj4@localhost;
+-----------------------------------------+
| Grants for zj4@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'zj4'@'localhost' |
+-----------------------------------------+
1 row in set (0.00 sec)
(2) 赋予 zj4@localhost 所有数据库上的所有表的 select 权限
MySQL [(none)]> grant select on *.* to 'zj4'@'localhost';
Query OK, 0 rows affected, 1 warning (0.00 sec)

MySQL [(none)]> show grants for zj4@localhost;
+------------------------------------------+
| Grants for zj4@localhost                 |
+------------------------------------------+
| GRANT SELECT ON *.* TO 'zj4'@'localhost' |
+------------------------------------------+
1 row in set (0.00 sec)
(3) 继续给 zj4@localhost 赋予 select 和 insert 权限,和已有的 select 权限进行合并
MySQL [(none)]> show grants for 'zj4'@'localhost';
+--------------------------------------------------+
| Grants for zj4@localhost                         |
+--------------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO 'zj4'@'localhost' |
+--------------------------------------------------+
1 row in set (0.00 sec)

revoke 语句可以回收已经赋予的权限,对于上面的例子,这里决定要收回 zj4@localhost 上的 insert 和 select 权限:

MySQL [(none)]> revoke select,insert on *.* from zj4@localhost;
Query OK, 0 rows affected, 1 warning (0.00 sec)

MySQL [(none)]> show grants for zj4@localhost;
+-----------------------------------------+
| Grants for zj4@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'zj4'@'localhost' |
+-----------------------------------------+
1 row in set (0.00 sec)

usage 权限不能被回收,也就是说,revoke 用户并不能删除用户。

4. 修改账号密码

(1) 可以用 mysqladmin 命令在命令行指定密码。
shell> mysqladmin -u user_name -h host_name password "123456"
(2) 执行 set password 语句。
mysql> set password for 'username'@'%' = password('pwd');

如果是更改自己的密码,可以省略 for 语句

mysql> set password=password('pwd');
(3) 可以在全局级别使用 grant usage 语句(在“.”)来指定某个账户的密码而不影响账户当前的权限。
mysql> grant usage on *.* to 'username'@'%' identified by 'pwd';

5. 删除账号

要彻底的删除账号,可以使用 drop user :

drop user zj@localhost;

6. 账号资源限制

创建 MySQL 账号时,还有一类选项称为账号资源限制,这类选项的作用是限制每个账号实际具有的资源限制,这里的“资源”主要包括:

  • max_queries_per_hour count : 单个账号每小时执行的查询次数

  • max_upodates_per_hour count : 单个账号每小时执行的更新次数

  • max_connections_per_hour count : 单个账号每小时连接服务器的次数

  • max_user_connections count : 单个账号并发连接服务器的次数







権限制御

  • # 1.5K 読み取り                                                             読むのに 38 分かかります                                                                                                               


                                                                                       

                                                                                                                                                                                                                                                                                                                                                                                      MySQL の権限テーブルは、データベースの起動時にメモリにロードされ、ユーザーが ID 認証に合格すると、メモリ内の対応する権限にアクセスします。このユーザーは、データベースに対する権限の範囲内でさまざまな操作を実行できます。 1. 権限テーブルへのアクセス権限アクセスの 2 つのプロセスでは、システムは「mysql」データベース (MySQL のインストール時に作成され、データベース名は「mysql」) を使用します。 )、最も重要な 3 つの権限テーブルは、user、host、db です。

    user の列は主に、ユーザー列、権限列、セキュリティ列、リソース制御列の 4 つの部分に分かれています。


    通常、最もよく使用される列はユーザ​​ー列と権限列で、このうち権限列は通常権限と管理権限に分かれています。

    select_priv

    super_priv

    などの通常の権限はデータベース操作に使用されます。

    ユーザーが接続すると、権限テーブルのアクセスプロセスには次の 2 つのプロセスがあります。

    まず、ユーザー テーブルのホスト、ユーザー、パスワードの 3 つから開始します。フィールドは、接続された IP、ユーザー名、およびパスワードがテーブルに存在するかどうかを判断するために使用されます。存在する場合は認証が通過し、存在しない場合は接続が拒否されます。

    ID 認証に合格すると、データベース権限は、user -> db -> tables_priv -> の順序で取得されます。

    これらの権限テーブルでは、権限の範囲が順番に減少し、グローバル権限がローカル権限をカバーします。上記の第 1 段階は理解しやすいですが、例を使用して第 2 段階を詳しく説明します。

      テストを容易にするために、変数 sql_mode
    • // sql_mode 默认值中有 NO_AUTO_CREATE_USER (防止GRANT自动创建新用户,除非还指定了密码)
      SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
      1 を変更する必要があります。ユーザー zj@localhost を作成し、すべてのデータベースのすべてのテーブルに選択権限を付与します。
    MySQL [mysql]> grant select on *.* to zj@localhost;
    Query OK, 0 rows affected, 2 warnings (0.00 sec)
    
    MySQL [mysql]> select * from user where user="zj" and host='localhost' \G;
    *************************** 1. row ***************************
                      Host: localhost
                      User: zj
               Select_priv: Y
               Insert_priv: N
               Update_priv: N
               Delete_priv: N
               Create_priv: N
                 Drop_priv: N
               Reload_priv: N
    ...
  • 2. db テーブル

    MySQL [mysql]> select * from db where user='zj' \G ;
    Empty set (0.00 sec)
    を確認すると、user テーブルの select_priv 列が「Y」であることがわかりますが、db テーブルにはレコードがありません。すべてのデータベースに対する同じ権限は、db テーブルに記録する必要はなく、user テーブルの select_priv を "Y" に変更するだけで済みます。つまり、ユーザー テーブル内のすべての権限は、すべてのデータベースに対する権限を表します。
3. zj@localhost の権限を変更して、t2 データベース上のすべてのテーブルの権限のみを選択します。

MySQL [mysql]> revoke select on *.* from zj@localhost;
Query OK, 0 rows affected, 1 warning (0.02 sec)

MySQL [mysql]> grant select on t2.* to zj@localhost;
Query OK, 0 rows affected, 1 warning (0.04 sec)

MySQL [mysql]> select * from user where user='zj' \G;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
...

MySQL [mysql]> select * from db where user='zj' \G;
*************************** 1. row ***************************
                 Host: localhost
                   Db: t2
                 User: zj
          Select_priv: Y
          Insert_priv: N
          Update_priv: N
          Delete_priv: N
          Create_priv: N
            Drop_priv: N
           Grant_priv: N

このとき、userテーブルのselect_privが「N」に変更され、dbテーブルにdb t2のレコードが追加されていることが分かりました。つまり、特定の権限がデータベースの一部にのみ付与されている場合、user テーブルの対応する権限列は「N」のままで、特定のデータベース権限が db テーブルに書き込まれます。テーブルとカラムの権限メカニズムは db の権限メカニズムと似ています。 上記の例からわかるように、ユーザーが権限認証に合格し、権限が割り当てられると、権限は user -> db -> columns_priv の順に割り当てられます。つまり、テーブル ユーザーの対応する権限が「Y」の場合、すべてのデータベースに対するこのユーザーの権限が「Y」になり、db、tables_priv、および columns_priv がチェックされなくなります。が「N」の場合、このユーザーの権限はユーザーに対応するデータベースでチェックされ、データベース内の対応する権限が「N」の場合はデータベース内の「Y」の権限を取得します。 tables_priv、columns_privの権限を順に取得し、すべて「N」の場合は権限なしと判断します。

2. アカウント管理

主にアカウントの作成、権限の変更、アカウントの削除が含まれます。

1. アカウントを作成します

grant 構文を使用して作成します。例:

(1) すべてのデータベースに対するすべての権限を実行できる権限を持つユーザー zj を作成します。ローカル接続からのみ実行できます。

MySQL [mysql]> grant all privileges on *.* to zj@localhost;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

MySQL [mysql]> select * from user where user="zj" and host="localhost" \G;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y

ユーザー テーブルでは、grant_priv 権限を除くすべての権限が「Y」であることがわかります。

(2) (1)に基づいて、zj

MySQL [(none)]> grant all privileges on *.* to zj@localhost with grant option;
Query OK, 0 rows affected, 1 warning (0.01 sec)

MySQL [mysql]> select * from user where user="zj" and host='localhost' \G ;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
...

(3) (2)に基づいて、パスワードを「123」

MySQL [mysql]> grant all  privileges on *.* to zj@localhost identified by '123' with grant option;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

MySQL [mysql]> select * from user where user="zj" and host="localhost" \G ;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
......  
 authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
      password_expired: N
 password_last_changed: 2017-09-25 20:29:42
     password_lifetime: NULL

パスワードが暗号化された文字列の塊になっていることがわかります。

(4) 创建新用户 zj2,可以从任何 IP 连接,权限为对 t2 数据库里的所有表进行 select 、update、insert 和 delete 操作,初始密码为“123”
MySQL [mysql]> grant select ,insert, update,delete on t2.* to 'zj2'@'%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

MySQL [mysql]> select * from user where user='zj2' and host="%" \G;
*************************** 1. row ***************************
                  Host: %
                  User: zj2
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
......
 authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
      password_expired: N
 password_last_changed: 2017-09-25 20:37:49
     password_lifetime: NULL

MySQL [mysql]> select * from db where user="zj2" and host='%' \G;
*************************** 1. row ***************************
                 Host: %
                   Db: t2
                 User: zj2
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: N
            Drop_priv: N
......

user 表中的权限都是“N”,db 表中增加的记录权限则都是“Y”。一般的,只授予用户适当的权限,而不会授予过多的权限。

本例中的 IP 限制为所有 IP 都可以连接,因此设置为 “*”,mysql 数据库中是通过 user 表的 host 字段来进行控制,host 可以是以下类型的赋值。

  • Host 值可以是主机名或IP号,或 “localhost” 指出本地主机。

  • 可以在 Host 列值使用通配符字符 “%” 和 “_”

  • Host 值 “%” 匹配任何主机名,空 Host 值等价于 “%”,它们的含义与 like 操作符的模式匹配操作相同。

注意: mysql 数据库的 user 表中 host 的值为 “*” 或者空,表示所有外部 IP 都可以连接,但是不包括本地服务器 localhost,因此,如果要包括本地服务器,必须单独为 localhost 赋予权限。

(5) 授予 super、process、file 权限给用户 zj3@%
MySQL [mysql]> grant super,process,file on *.* to 'zj3'@'%';
Query OK, 0 rows affected, 1 warning (0.00 sec)

因为这几个权限都是属于管理权限,因此不能够指定某个数据库,on 后面必须跟 “.”,下面语法将提示错误

MySQL [mysql]> grant super,process,file on t2.* to 'zj3'@'%';
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
(6) 只授予登录权限给 zj4@localhost
MySQL [mysql]> grant usage on *.* to 'zj4'@'localhost';
Query OK, 0 rows affected, 2 warnings (0.01 sec)

MySQL [mysql]> exit
Bye

zj@bogon:~$ mysql -uzj4 -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 78
Server version: 5.7.18-log Source distribution

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.02 sec)

usage 权限只能用于数据库登录,不能执行任何操作

2. 查看账号权限

账号创建好后,可以通过如下命令查看权限:

show grants for user@host;

示例:

MySQL [(none)]> show grants for zj@localhost;
+-------------------------------------------------------------------+
| Grants for zj@localhost                                           |
+-------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'zj'@'localhost' WITH GRANT OPTION |
+-------------------------------------------------------------------+
1 row in set (0.01 sec)

3. 更改账号权限

可以进行权限的新增和回收。和创建账号一样,权限变更也有两种方法:使用 grant(新增) 和 revoke (回收) 语句,或者更改权限表。

示例:
(1) zj4@localhost 目前只有登录权限
MySQL [(none)]> show grants for zj4@localhost;
+-----------------------------------------+
| Grants for zj4@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'zj4'@'localhost' |
+-----------------------------------------+
1 row in set (0.00 sec)
(2) 赋予 zj4@localhost 所有数据库上的所有表的 select 权限
MySQL [(none)]> grant select on *.* to 'zj4'@'localhost';
Query OK, 0 rows affected, 1 warning (0.00 sec)

MySQL [(none)]> show grants for zj4@localhost;
+------------------------------------------+
| Grants for zj4@localhost                 |
+------------------------------------------+
| GRANT SELECT ON *.* TO 'zj4'@'localhost' |
+------------------------------------------+
1 row in set (0.00 sec)
(3) 继续给 zj4@localhost 赋予 select 和 insert 权限,和已有的 select 权限进行合并
MySQL [(none)]> show grants for 'zj4'@'localhost';
+--------------------------------------------------+
| Grants for zj4@localhost                         |
+--------------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO 'zj4'@'localhost' |
+--------------------------------------------------+
1 row in set (0.00 sec)

revoke 语句可以回收已经赋予的权限,对于上面的例子,这里决定要收回 zj4@localhost 上的 insert 和 select 权限:

MySQL [(none)]> revoke select,insert on *.* from zj4@localhost;
Query OK, 0 rows affected, 1 warning (0.00 sec)

MySQL [(none)]> show grants for zj4@localhost;
+-----------------------------------------+
| Grants for zj4@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'zj4'@'localhost' |
+-----------------------------------------+
1 row in set (0.00 sec)

usage 权限不能被回收,也就是说,revoke 用户并不能删除用户。

4. 修改账号密码

(1) 可以用 mysqladmin 命令在命令行指定密码。
shell> mysqladmin -u user_name -h host_name password "123456"
(2) 执行 set password 语句。
mysql> set password for 'username'@'%' = password('pwd');

如果是更改自己的密码,可以省略 for 语句

mysql> set password=password('pwd');
(3) 可以在全局级别使用 grant usage 语句(在“.”)来指定某个账户的密码而不影响账户当前的权限。
mysql> grant usage on *.* to 'username'@'%' identified by 'pwd';

5. 删除账号

要彻底的删除账号,可以使用 drop user :

drop user zj@localhost;

6. 账号资源限制

创建 MySQL 账号时,还有一类选项称为账号资源限制,这类选项的作用是限制每个账号实际具有的资源限制,这里的“资源”主要包括:

  • max_queries_per_hour count : 单个账号每小时执行的查询次数

  • max_upodates_per_hour count : 单个账号每小时执行的更新次数

  • max_connections_per_hour count : 单个账号每小时连接服务器的次数

  • max_user_connections count : 单个账号并发连接服务器的次数


  • MySQL はどのように権限管理を実行しますか?



你可能感兴趣的



评论                                                    

默认排序                        时间排序



载入中...

显示更多评论



以上がMySQL はどのように権限管理を実行しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。