MySQL权限管理

权限系统的工作原理    

MySQL权限系统通过下面两个阶段进行认证:
    (1)对连接的用户进行身份认证,合法的用户通过认证、不合法的用户拒绝连接。
    (2)对通过认证的合法用户赋予相应的权限,用户可以在这些权限范围内对数据库做相应的操作。
    对于身份,MySQL是通过IP地址和用户名联合进行确认的,例如MySQL安装默认创建的用户root@localhost表示用户root只能从本地(localhost)进行连接才可以通过认证,此用户从其他任何主机对数据库进行的连接都将被拒绝。也就是说,同样的一个用户名,如果来自不同的IP地址,则MySQL将其视为不同的用户。
    MySQL的权限表在数据库启动地时候就载入内存,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限范围内的各种操作了。
 

权限表的存取

    在权限存取的两个过程中,系统会用到“mysql”数据库(安装MySQL时被创建,数据库名字叫“mysql”)中user、host和db这3个最重要的权限表
    
表名 user db host
用户列  User                     Host                   Host                 
   Password                 Db                     Db                   
权限列  Select_priv              User                   Select_priv          
   Insert_priv              Select_priv            Insert_priv          
   Update_priv              Insert_priv            Update_priv          
   Delete_priv              Update_priv            Delete_priv          
   Create_priv              Delete_priv            Create_priv          
   Drop_priv                Create_priv            Drop_priv            
   Reload_priv              Drop_priv              Grant_priv           
   Shutdown_priv            Grant_priv             References_priv      
   Process_priv             References_priv        Index_priv           
   File_priv                Index_priv             Alter_priv           
   Grant_priv               Alter_priv             Create_tmp_table_priv
   References_priv          Create_tmp_table_priv  Lock_tables_priv     
   Index_priv               Lock_tables_priv       Create_view_priv     
   Alter_priv               Create_view_priv       Show_view_priv       
   Show_db_priv             Show_view_priv         Create_routine_priv  
   Super_priv               Create_routine_priv    Alter_routine_priv   
   Create_tmp_table_priv    Alter_routine_priv     Execute_priv         
   Lock_tables_priv         Execute_priv           Trigger_priv         
   Execute_priv             Event_priv              
   Repl_slave_priv          Trigger_priv            
   Repl_client_priv           
   Create_view_priv           
   Show_view_priv             
   Create_routine_priv        
   Alter_routine_priv         
   Create_user_priv           
   Event_priv                 
   Trigger_priv               
   Create_tablespace_priv     
安全列  ssl_type                   
   ssl_cipher                 
   x509_issuer                
   x509_subject               
   max_questions              
   max_updates                
   max_connections            
   max_user_connections       
 
    在这个3表中,最重要的表
    其中,通常用得最多的是用户列和权限列,其中权限列在分为普通权限和管理权限。普通权限主要用于数据库的操作,比如select_priv、create_priv等。而管理权限主要用来对数据库进行管理的操作,比如process_priv、super_priv等。
    当用户进行连接的时候,权限表的存取过程有以下现个阶段。
  • 先从user表中的host、user和passwd这3个字段中判断连接的IP、用户名和密码是否存在于表中,如果存在,则通过身份验证,否则拒绝连接。
  • 如果通过身份验证,则按照以下权限表的顺序得到数据库权限:user->db->tables_priv->coloumns_priv。
    在这几个权限表中,权限范围依次递减,全局权限覆盖局部权限。
    上面的第一阶段好理解,下面以一个例子来详细解释一下第二阶段。
    (1)创建用户cqh@localhost,并赋予所有数据库的所有表的select权限。
  1. mysql> grant select on *.* to cqh@localhost;
  2. Query OK, 0 rows affected (0.05 sec)
  3. mysql> select * from user where user='cqh' and host='localhost' \G
  4. *************************** 1. row ***************************
  5. Host: localhost
  6. User: cqh
  7. Password:
  8. Select_priv: Y
  9. Insert_priv: N
  10. Update_priv: N
  11. Delete_priv: N
  12. Create_priv: N
  13. Drop_priv: N
  14. ...
    (2)再来看db表:
  1. mysql> select * from db where user='cqh';
  2. Empty set (0.00 sec)
    可以发现,user表的select_priv列是“Y”,而db表中并没有记录,也就是说,对所有数据库都具有相同的权限的用户记录并不需要记入db表,而仅仅需要将user表中的select_priv改为“Y”即可。换句话,user表中的每个权限都代表了对所有数据库都有的权限。
    (3)将cqh@localhost上的权限改为只对test数据库上所有表的select权限。
  1. mysql> revoke select on *.* from cqh@localhost;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> grant select on test.* to cqh@localhost;
  4. Query OK, 0 rows affected (0.00 sec)
  5. mysql> select * from user where user='cqh' and host='localhost' \G
  6. *************************** 1. row ***************************
  7. Host: localhost
  8. User: cqh
  9. Password:
  10. Select_priv: N
  11. Insert_priv: N
  12. Update_priv: N
  13. Delete_priv: N
  14. Create_priv: N
  15. Drop_priv: N
  16. Reload_priv: N
  17. Shutdown_priv: N
  18. Process_priv: N
  19. File_priv: N
  20. Grant_priv: N
  21. References_priv: N
  22. Index_priv: N
  23. Alter_priv: N
  24. Show_db_priv: N
  25. Super_priv: N
  26. Create_tmp_table_priv: N
  27. Lock_tables_priv: N
  28. Execute_priv: N
  29. Repl_slave_priv: N
  30. Repl_client_priv: N
  31. Create_view_priv: N
  32. Show_view_priv: N
  33. Create_routine_priv: N
  34. Alter_routine_priv: N
  35. Create_user_priv: N
  36. Event_priv: N
  37. Trigger_priv: N
  38. Create_tablespace_priv: N
  39. ssl_type:
  40. ssl_cipher:
  41. x509_issuer:
  42. x509_subject:
  43. max_questions: 0
  44. max_updates: 0
  45. max_connections: 0
  46. max_user_connections: 0
  47. plugin:
  48. authentication_string: NULL
  49. 1 row in set (0.00 sec)
  50. mysql> select * from db where user='cqh'\G
  51. *************************** 1. row ***************************
  52. Host: localhost
  53. Db: test
  54. User: cqh
  55. Select_priv: Y
  56. Insert_priv: N
  57. Update_priv: N
  58. Delete_priv: N
  59. Create_priv: N
  60. Drop_priv: N
  61. Grant_priv: N
  62. References_priv: N
  63. Index_priv: N
  64. Alter_priv: N
  65. Create_tmp_table_priv: N
  66. Lock_tables_priv: N
  67. Create_view_priv: N
  68. Show_view_priv: N
  69. Create_routine_priv: N
  70. Alter_routine_priv: N
  71. Execute_priv: N
  72. Event_priv: N
  73. Trigger_priv: N
  74. 1 row in set (0.00 sec)
    这个时候发现,user表中的select_priv变为“N”,而db表中则增加了db为test的一条记录,也就是说,当只授予数据库某些权限时,user表中的相应权限时,user表中的相应权限列保持“N”,而将具体的数据库权限写入db表。
    table和column的权限机制和db类似,这里就不再赘述了。
    从上面的例子可以看出,当用户通过权限认证,进行权限分配时,将按照user->db->tables_priv->coloumns_priv的顺序进行权限分配,即先检查全局权限表user,如果user中对应权限为“Y”,则此用户对所有数据库的权限都为“Y”,将不再检查db、tables_priv和coloumns_priv;如果为“N”,则到db表中检查此用户对应的具体数据库,并得到db中为“Y”的权限;如果db中相应的权限为“N”,则检查tables_priv中此数据库对应的具体表,取得表中为“Y”的权限;如果tables_priv中相应权限为“N”,则检查columns_priv中此表对应的具体列,取得列中为“Y”的权限。
 

账号管理

    账号管理主要包括账号的创建、权限更改和账号的删除。用户连接数据库的第一步都从账号创建开始。

    有两种方法可以用来创建账号:使用GRANT语法创建或者直接操作授权表,但更推荐使用第一种方法,因为操作简单,出错几率更少。

方式一.创建账号

    GRANT的常用语法如下 :
  1. GRANT
  2. priv_type [(column_list)]
  3. [, priv_type [(column_list)]] ...
  4. ON [object_type] priv_level
  5. TO user_specification [, user_specification] ...
  6. [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
  7. [WITH with_option ...]
  8. GRANT PROXY ON user_specification
  9. TO user_specification [, user_specification] ...
  10. [WITH GRANT OPTION]
  11. object_type:
  12. TABLE
  13. | FUNCTION
  14. | PROCEDURE
    来看下面的几个例子。
    例1:创建用户cqh,权限为可以在所有数据库上执行所有权限,只能从本地进行连接。
  1. mysql> grant all privileges on *.* to cqh@localhost;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> select * from user where user='cqh' and host='localhost' \G
  4. *************************** 1. row ***************************
  5. Host: localhost
  6. User: cqh
  7. Password:
  8. Select_priv: Y
  9. Insert_priv: Y
  10. Update_priv: Y
  11. Delete_priv: Y
  12. Create_priv: Y
  13. Drop_priv: Y
  14. Reload_priv: Y
  15. Shutdown_priv: Y
  16. Process_priv: Y
  17. File_priv: Y
  18. Grant_priv: N
  19. References_priv: Y
  20. Index_priv: Y
  21. Alter_priv: Y
  22. Show_db_priv: Y
  23. Super_priv: Y
  24. Create_tmp_table_priv: Y
  25. Lock_tables_priv: Y
  26. Execute_priv: Y
  27. Repl_slave_priv: Y
  28. Repl_client_priv: Y
  29. Create_view_priv: Y
  30. Show_view_priv: Y
  31. Create_routine_priv: Y
  32. Alter_routine_priv: Y
  33. Create_user_priv: Y
  34. Event_priv: Y
  35. Trigger_priv: Y
  36. Create_tablespace_priv: Y
  37. ssl_type:
  38. ssl_cipher:
  39. x509_issuer:
  40. x509_subject:
  41. max_questions: 0
  42. max_updates: 0
  43. max_connections: 0
  44. max_user_connections: 0
  45. plugin:
  46. authentication_string: NULL
  47. 1 row in set (0.00 sec)
    可以发现,除了Grant_priv权限外,所有权限在user表里都是“Y”。
    例2:在例1基础上,增加对cqh的grant权限
  1. mysql> grant all privileges on *.* to cqh@localhost with grant option;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> select * from user where user='cqh' and host='localhost' \G
  4. *************************** 1. row ***************************
  5. Host: localhost
  6. User: cqh
  7. Password:
  8. Select_priv: Y
  9. Insert_priv: Y
  10. Update_priv: Y
  11. Delete_priv: Y
  12. Create_priv: Y
  13. Drop_priv: Y
  14. Reload_priv: Y
  15. Shutdown_priv: Y
  16. Process_priv: Y
  17. File_priv: Y
  18. Grant_priv: Y
  19. References_priv: Y
  20. Index_priv: Y
  21. Alter_priv: Y
  22. Show_db_priv: Y
  23. Super_priv: Y
  24. Create_tmp_table_priv: Y
  25. Lock_tables_priv: Y
  26. Execute_priv: Y
  27. Repl_slave_priv: Y
  28. Repl_client_priv: Y
  29. Create_view_priv: Y
  30. Show_view_priv: Y
  31. Create_routine_priv: Y
  32. Alter_routine_priv: Y
  33. Create_user_priv: Y
  34. Event_priv: Y
  35. Trigger_priv: Y
  36. Create_tablespace_priv: Y
  37. ssl_type:
  38. ssl_cipher:
  39. x509_issuer:
  40. x509_subject:
  41. max_questions: 0
  42. max_updates: 0
  43. max_connections: 0
  44. max_user_connections: 0
  45. plugin:
  46. authentication_string: NULL
  47. 1 row in set (0.00 sec)
    例3:在例2基础上,设置密码为“123”。
  1. mysql> grant all privileges on *.* to cqh@localhost identified by '123' with grant option;
  2. Query OK, 0 rows affected (0.00 sec)
    从user表中查看修改的密码:
  1. mysql> select * from user where user='cqh' and host='localhost' \G
  2. *************************** 1. row ***************************
  3. Host: localhost
  4. User: cqh
  5. Password: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
  6. Select_priv: Y
  7. Insert_priv: Y
  8. Update_priv: Y
  9. Delete_priv: Y
  10. Create_priv: Y
  11. Drop_priv: Y
  12. Reload_priv: Y
  13. Shutdown_priv: Y
  14. Process_priv: Y
  15. File_priv: Y
  16. Grant_priv: Y
  17. References_priv: Y
  18. Index_priv: Y
  19. Alter_priv: Y
  20. Show_db_priv: Y
  21. Super_priv: Y
  22. Create_tmp_table_priv: Y
  23. Lock_tables_priv: Y
  24. Execute_priv: Y
  25. Repl_slave_priv: Y
  26. Repl_client_priv: Y
  27. Create_view_priv: Y
  28. Show_view_priv: Y
  29. Create_routine_priv: Y
  30. Alter_routine_priv: Y
  31. Create_user_priv: Y
  32. Event_priv: Y
  33. Trigger_priv: Y
  34. Create_tablespace_priv: Y
  35. ssl_type:
  36. ssl_cipher:
  37. x509_issuer:
  38. x509_subject:
  39. max_questions: 0
  40. max_updates: 0
  41. max_connections: 0
  42. max_user_connections: 0
  43. plugin:
  44. authentication_string: NULL
  45. 1 row in set (0.00 sec)
    可以发现,密码变成了一堆加密后的字符串。在MySQL5.0里面,密码的算法是生成一个以*开始的41位的字符串,而MySQL4.0之前是16位,因此安全性大大提高。
    例4:创建新用户chenqionghe,可以从任何IP进行连接,权限为test数据库里的所有表进行SELECT、UPDATE、INSERT和DELETE操作,初始密码为“123”。
  1. mysql> grant select,insert,update,delete on test.* to 'chenqionghe'@'%' identified by '123';
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> select * from user where user='chenqionghe' and host='%' \G
  4. *************************** 1. row ***************************
  5. Host: %
  6. User: chenqionghe
  7. Password: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
  8. Select_priv: N
  9. Insert_priv: N
  10. Update_priv: N
  11. Delete_priv: N
  12. Create_priv: N
  13. Drop_priv: N
  14. Reload_priv: N
  15. Shutdown_priv: N
  16. Process_priv: N
  17. File_priv: N
  18. Grant_priv: N
  19. References_priv: N
  20. Index_priv: N
  21. Alter_priv: N
  22. Show_db_priv: N
  23. Super_priv: N
  24. Create_tmp_table_priv: N
  25. Lock_tables_priv: N
  26. Execute_priv: N
  27. Repl_slave_priv: N
  28. Repl_client_priv: N
  29. Create_view_priv: N
  30. Show_view_priv: N
  31. Create_routine_priv: N
  32. Alter_routine_priv: N
  33. Create_user_priv: N
  34. Event_priv: N
  35. Trigger_priv: N
  36. Create_tablespace_priv: N
  37. ssl_type:
  38. ssl_cipher:
  39. x509_issuer:
  40. x509_subject:
  41. max_questions: 0
  42. max_updates: 0
  43. max_connections: 0
  44. max_user_connections: 0
  45. plugin:
  46. authentication_string: NULL
  47. 1 row in set (0.00 sec)
  48. mysql> select * from db where user='chenqionghe' and host='%' \G
  49. *************************** 1. row ***************************
  50. Host: %
  51. Db: test
  52. User: chenqionghe
  53. Select_priv: Y
  54. Insert_priv: Y
  55. Update_priv: Y
  56. Delete_priv: Y
  57. Create_priv: N
  58. Drop_priv: N
  59. Grant_priv: N
  60. References_priv: N
  61. Index_priv: N
  62. Alter_priv: N
  63. Create_tmp_table_priv: N
  64. Lock_tables_priv: N
  65. Create_view_priv: N
  66. Show_view_priv: N
  67. Create_routine_priv: N
  68. Alter_routine_priv: N
  69. Execute_priv: N
  70. Event_priv: N
  71. Trigger_priv: N
  72. 1 row in set (0.00 sec)
    如上文所述,user表中的权限都是“N”,db表中增加的记录权限则都是“Y”。一般地,我们只授予用户适当的权限,而一般不会授予过多的权限,本例中的权限适合大多数应用账号。
    本例中的IP限制为所有IP都可以连接,因此设置为“*”,mysql数据库中是通过user表的host字段来进行控制,host可以是以下类型的值。
  • Host值可以是主机名或IP号,或“localhost"批出本地主机
  • 可以在Host列值使用通配符字符“%”和“_”。
  • Host值“%”匹配任何主机名,空Host值等价于“%”。它们的含义与LIKE操作符的模式匹配操作相同。例如,“%”的Host值与所有主机名匹配,而“%.mysql.com”匹配mysql.com域的所有主机。
host和user组合进行连接的例子
Host值 User值 被条目匹配的连接
cqh.loc.gov cqh cqh,从cqh.loc.gov连接
cqh.loc.gov   任何用户,从cqh.loc.gov连接
% cqh cqh,从任何主机连接
%   任何用户,从任何主机连接
%.loc.gov cqh cqh,从在loc.gov域的任何主机连接
x.y.% cqh cqh,从x.y.net、x.y.com、x.y.edu等连接
114.115.166.177 cqh cqh,从有114.115.166.177IP地址的主机连接
114.115.166.% cqh cqh,从144.155.166C类子网的任何主机连接
    可能大家会有这样的疑问,如果权限表中的Host既有“cqh.loc.gov”,又有“%”,而此时,连接从主机cqh.loc.gov过来。显然,user表里面这两条记录都符合匹配条件,那系统会选择哪一个呢?
    如果有多个匹配,服务器必须选择使用哪个条目。按照下述原则来解决:
  • 服务器在启动时读入user表后进行排序;
  • 然后当用户试图连接时,以排序的顺序浏览条目;
  • 服务器使用与客户端和用户名匹配的第一行。
    当服务器读取表时,它首先以最具体的Host值排序。主机名和IP号是具体的。“%”意味着“任何主机”并且是最不特定的。有相同Host值的条目首先以最具体的User值排序(空User值意味着“任何用户”并且是最不特定的)。
注意:mysql数据库的user表中host值为%或者空,表示所有外部IP都可以连接,但是不包括本地服务器local,因此,如果要包括本地服务器、必须单独为local赋予权限。
    例5:授予SUPER、PROCESS、FILE权限给用户cqh2@%;
  1. mysql> grant super,process,file on *.* to 'cqh2'@'%';
  2. Query OK, 0 rows affected (0.00 sec)
    因为这几个权限都属于管理权限,因此不能够指定某个数据库,on后面必须跟“*.*”,下面的语法将提示错误:
  1. mysql> grant super,process,file on test.* to 'cqh2'@'%';
  2. ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
    例6:只授予登录权限给cqh3@localhost
  1. mysql> grant usage on *.* to 'cqh3'@'localhost';
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> exit
  4. Bye
  5. [root@iZ28dr6w0qvZ ~]# mysql -ucqh3
  6. Welcome to the MySQL monitor. Commands end with ; or \g.
  7. Your MySQL connection id is 1640
  8. Server version: 5.5.37-log MySQL Community Server (GPL)
  9. Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
  10. Oracle is a registered trademark of Oracle Corporation and/or its
  11. affiliates. Other names may be trademarks of their respective
  12. owners.
  13. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  14. mysql> show databases;
  15. +--------------------+
  16. | Database |
  17. +--------------------+
  18. | information_schema |
  19. +--------------------+
  20. 1 row in set (0.00 sec)
    usage权限只能用于数据库登录,不能执行任何操作。
    直接操作权限表也可以进行权限的创建,其实GRANT操作的本质就是修改权限后进行权限的刷新,因此,GRANT比操作权限表更简单,下面继续以上文的例子来说明一下更新权限的用法。
    创建新用户chenqionghe,可以从任何IP进行连接,权限对test库里的所有表进行SELECT、UPDATE、INSERT和DELETE,初始密码为123
  1. mysql> grant select,insert,update,delete on test.* to 'chenqionghe'@'%' identified by '123';

方式二:直接操作权限表

直接操作权限表如下:

  1. [root@iZ28dr6w0qvZ ~]# mysql -uroot -p
  2. Enter password:
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 1560
  5. Server version: 5.5.37-log MySQL Community Server (GPL)
  6. Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11.  
  12. mysql> use mysql;
  13. Database changed
  14. mysql> insert into db (host,db,user,select_priv,insert_priv,update_priv,delete_priv) values ('%','test','chenqionghe','Y','Y','Y','Y');
  15. Query OK, 1 row affected (0.00 sec)
  16. mysql> flush privileges;
  17.  
  18. mysql> exit;
  19. Bye
  20. [root@iZ28dr6w0qvZ ~]# mysql -ucqh3
  21. ERROR 1045 (28000): Access denied for user 'cqh3'@'localhost' (using password: NO)
  22. [root@iZ28dr6w0qvZ ~]# mysql -ucqh3 -p
  23. Enter password:
  24. Welcome to the MySQL monitor. Commands end with ; or \g.
  25. Your MySQL connection id is 1643
  26. Server version: 5.5.37-log MySQL Community Server (GPL)
  27. Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
  28. Oracle is a registered trademark of Oracle Corporation and/or its
  29. affiliates. Other names may be trademarks of their respective
  30. owners.
  31. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  32. mysql> show databases;
  33. +--------------------+
  34. | Database |
  35. +--------------------+
  36. | information_schema |
  37. | test |
  38. +--------------------+
  39. 2 rows in set (0.00 sec)
    

查看和更改账号的权限

    创建完账号后,时间长了可能就会忘记分配的权限而需要查看账号权限,也在可能会经过一段时间后需要更改以前的账号权限,下面介绍查看和更改这两种操作命令。
  • 查看权限

    账号创建好后,可以通过如下命令查看权限;
  1. show grants for user@host;
    如以下示例
  1. mysql> show grants for cqh@localhost;
  2. +---------------------------------------------------------------------------------------------------------------------------------------+
  3. | Grants for cqh@localhost |
  4. +---------------------------------------------------------------------------------------------------------------------------------------+
  5. | GRANT ALL PRIVILEGES ON *.* TO 'cqh'@'localhost' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' WITH GRANT OPTION |
  6. | GRANT SELECT ON `test`.* TO 'cqh'@'localhost' |
  7. +---------------------------------------------------------------------------------------------------------------------------------------+
  8. 2 rows in set (0.00 sec)
    host可以不写,默认是“%”,如下所示
  1. mysql> show grants for chenqionghe;
  2. +------------------------------------------------------------------------------------------------------------+
  3. | Grants for chenqionghe@% |
  4. +------------------------------------------------------------------------------------------------------------+
  5. | GRANT USAGE ON *.* TO 'chenqionghe'@'%' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' |
  6. +------------------------------------------------------------------------------------------------------------+
  7. 1 row in set (0.00 sec)
    对于MySQL5.0以后的版本,也可以利用新新增的information_schema数据库进行权限的查看;
  1. mysql> select * from SCHEMA_PRIVILEGES where grantee="'cqh'@'localhost'";
  2. +-------------------+---------------+--------------+----------------+--------------+
  3. | GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | PRIVILEGE_TYPE | IS_GRANTABLE |
  4. +-------------------+---------------+--------------+----------------+--------------+
  5. | 'cqh'@'localhost' | def | test | SELECT | NO |
  6. +-------------------+---------------+--------------+----------------+--------------+
  7. 1 row in set (0.00 sec)
  • 更改权限

    可以进行权限的新增和回收。和账号创建一样,权限变更也在两种办法:使用GRANT(新增)和REVOKE(回收)语句,或者更改权限表。
    第二种方法和前面一样,直接对user、db、tables_priv和columns_priv中的权限进行更新即可,这里重点介绍第一种方法。
    和创建账号的语法完全一样,GRANT可以直接用来对账号进行增加。其实GRANT语句在执行的时候,如果权限表中不存在目标账号,则创建账号;如果已经存在,则执行权限的新增。来看下面一个例子。
    (1)cqh3@localhost目前只有登录的权限。
  1. mysql> show grants for cqh3@localhost;
  2. +------------------------------------------+
  3. | Grants for cqh3@localhost |
  4. +------------------------------------------+
  5. | GRANT USAGE ON *.* TO 'cqh3'@'localhost' |
  6. +------------------------------------------+
  7. 1 row in set (0.00 sec)
    (2)赋予cqh3@localhost所有数据库上的所有表的SELECT权限。
  1. mysql> grant select on *.* to 'cqh3'@'localhost';
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> show grants for cqh3@localhost;
  4. +-------------------------------------------+
  5. | Grants for cqh3@localhost |
  6. +-------------------------------------------+
  7. | GRANT SELECT ON *.* TO 'cqh3'@'localhost' |
  8. +-------------------------------------------+
  9. 1 row in set (0.00 sec)
    (3)继续给cqh3@localhost赋予SELECT和INSERT权限,和已胡的SELECT权限进行合并。
  1. mysql> show grants for cqh3@localhost;
  2. +-------------------------------------------+
  3. | Grants for cqh3@localhost |
  4. +-------------------------------------------+
  5. | GRANT SELECT ON *.* TO 'cqh3'@'localhost' |
  6. +-------------------------------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> grant select,insert on *.* to 'cqh3'@'localhost';
  9. Query OK, 0 rows affected (0.00 sec)
  10. mysql> show grants for cqh3@localhost;
  11. +---------------------------------------------------+
  12. | Grants for cqh3@localhost |
  13. +---------------------------------------------------+
  14. | GRANT SELECT, INSERT ON *.* TO 'cqh3'@'localhost' |
  15. +---------------------------------------------------+
  16. 1 row in set (0.00 sec)
    (4)REVOKE语句可以回收已经赋予的权限,语法如下:
  1. REVOKE
  2. priv_type [(column_list)]
  3. [, priv_type [(column_list)]] ...
  4. ON [object_type] priv_level
  5. FROM user [, user] ...
  6. REVOKE ALL PRIVILEGES, GRANT OPTION
  7. FROM user [, user] ...
  8. REVOKE PROXY ON user
  9. FROM user [, user] ...
    对于上面的例子,这里决定要收回cqh3@localhost上的INSERT和SELECT权限:
  1. mysql> revoke select,insert on *.* from cqh3@localhost;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> show grants for cqh3@localhost;
  4. +------------------------------------------+
  5. | Grants for cqh3@localhost |
  6. +------------------------------------------+
  7. | GRANT USAGE ON *.* TO 'cqh3'@'localhost' |
  8. +------------------------------------------+
  9. 1 row in set (0.00 sec)
    usage权限不能被回收,也就是说,REVOKE用户并不能删除用户。
  1. mysql> show grants for cqh3@localhost;
  2. +------------------------------------------+
  3. | Grants for cqh3@localhost |
  4. +------------------------------------------+
  5. | GRANT USAGE ON *.* TO 'cqh3'@'localhost' |
  6. +------------------------------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> revoke usage on *.* from cqh@localhost;
  9. Query OK, 0 rows affected (0.00 sec)
  10. mysql> show grants for cqh3@localhost;
  11. +------------------------------------------+
  12. | Grants for cqh3@localhost |
  13. +------------------------------------------+
  14. | GRANT USAGE ON *.* TO 'cqh3'@'localhost' |
  15. +------------------------------------------+
  16. 1 row in set (0.00 sec)
  • 修改密码

    方法1:可以用mysqladmin命令在命令行指定密码。
  1. shell> mysqladmin -u user_name -h host_name password "newpwd"
    方法2:执行SET PASSWORD语句。下例中将账号'chenqionghe'@'%'的密码改为“cqh123”
  1. SET PASSWORD FOR 'chenqionghe'@'%' = PASSWORD('cqh123');
 如果是更改自己的密码,可以省略for语句:
  1. SET PASSWORD = PASSWORD('cqh123');
    方法3:还可以在全局级别使用GRANT USAGE语句(在*.*)来指定某个账户的密码而不影响账户当前的权限。
  1. GRANT USAGE ON *.* TO 'chenqionghe'@'%' IDENTIFIED BY 'cqh123';
    方法4:直接更改数据库的user表。
  1. mysql> INSERT INTO user (Host,User,Password) VALUES('%','chenqionghe',PASSWORD('333333'));
  2. mysql> FLUSH PRIVILEGES;
  3. mysql> UPDATE user SET Password = PASSWORD('333333') WHERE Host='%' AND User='chenqionghe';
  4. mysql> FLUSH PRIVILEGES;
注意:更改密码的时候一定要使用PASSWORD函数(mysqladmin和GRANT两种方式不用写,会自动加上)。
  • 删除账号

    要彻底删除账号,同样也有两种方法:DROP USER命令和修改权限表。
    DROP USER语法非常简单,具体如下:
  1. DROP USER user [, user] ...
   举一个单的例子,将cqh3@localhost用户删除
  1. mysql> show grants for cqh3@localhost;
  2. +------------------------------------------+
  3. | Grants for cqh3@localhost |
  4. +------------------------------------------+
  5. | GRANT USAGE ON *.* TO 'cqh3'@'localhost' |
  6. +------------------------------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> drop user cqh3@localhost;
  9. Query OK, 0 rows affected (0.00 sec)
  10. mysql> show grants for cqh3@localhost;
  11. ERROR 1141 (42000): There is no such grant defined for user 'cqh3' on host 'localhost'
    修改权限表方法只要把user用户中的用户记录删除即可,这里不再演示
 
 
把衣钵都传给你们了,别忘了点个赞哦~

MySQL中的账号与权限管理的更多相关文章

  1. 在MySql中实现MemberShip的权限管理

    步骤: 1.在MySql种创建一个数据库,名称任意取,我们只是要得到一个空的数据库,我们假设这个数据库的名称为authentication. 2.在VS种创建一个Web应用程序,File——new—— ...

  2. Mysql数据库用户及用户权限管理,Navicat设置用户权限

    Mysql数据库用户及用户权限管理,Navicat设置用户权限 一.Mysql数据库的权限 1.1 mysql数据库用户权限级别 1.2 mysql数据库用户权限 1.3 存放用户权限表的说明 二.用 ...

  3. 练习:python 操作Mysql 实现登录验证 用户权限管理

    python 操作Mysql 实现登录验证 用户权限管理

  4. mysql用户授权、数据库权限管理、sql语法详解

    mysql用户授权.数据库权限管理.sql语法详解 —— NiceCui 某个数据库所有的权限 ALL 后面+ PRIVILEGES SQL 某个数据库 特定的权限SQL mysql 授权语法 SQL ...

  5. Yii框架中使用SRBAC作为权限管理模块时遇到的问题

    Yii框架中使用SRBAC作为权限管理模块时遇到的问题   看到Yii中提供RBAC的插件,SRBAC,就想用用. 结果按照手册上的安装办法,整来整去,安装完了,可就是进不了权限管理界面. 最后想到, ...

  6. HDFS、Yarn、Hive…MRS中使用Ranger实现权限管理全栈式实践

    摘要:Ranger为组件提供基于PBAC的鉴权插件,供组件服务端运行,目前支持Ranger鉴权的组件有HDFS.Yarn.Hive.HBase.Kafka.Storm和Spark2x,后续会支持更多组 ...

  7. MySQL学习笔记二:权限管理

    1. 创建和删除用户,mysql中的用户是由用户名和主机名来确定的 create user "user_name@host_name" identified by passwd; ...

  8. MaxCompute 项目子账号做权限管理

    场景: 一个企业使用多款阿里云产品,MaxCompute是其中一个产品,用的是同个主账号,主账号不是由使用MaxCompute的大数据同学管理,  大数据同学使用的是子账号.大数据同学日常需要给Max ...

  9. ci中简单实用的权限管理

    实用的权限管理 对多数网站来说,使用完整的rbac权限管理杀鸡用牛刀绝对的吃力不讨好,因为我们只是简单分角色然后对角色进行管理行使其相对于的角色赋予的权限; 在实际的开发中用位运算来对权限进行验证是十 ...

随机推荐

  1. SSD在SQLServer中的应用

        一. 首先,回顾一下 SSD 的读写特性 (1)有限次数写:        (2)随机读性能最好:        (3)顺序读性能好:        (4)顺序写性能差:        (5) ...

  2. 解决方案: scp/ssh 的登陆提示很慢 (Linux)

    看着用 windows 的 scp 命令很快很是羡慕. 这个问题让我实实郁闷了好几天. 在 Linux 下不管是用 ssh 还是用 scp, 连接速度都很慢 (登陆提示框的弹出时间). 确切地讲, 每 ...

  3. Java 对文件的操作

    public class ReadFile { /** * 按行读取文件操作 * @throws IOException */ public void readFile(String fileName ...

  4. 从零开始--系统深入学习IOS(使用Swift---带链接)

    这是一篇面向IOS新手的文档.同时提供一些系统知识的链接,让你系统学习IOS.它提供一些信息帮助你采用技术和编程接口来开发苹果软件产品,本人不保证会在将来更新.学习它,需要你掌握一些基本的编程知识 1 ...

  5. mysql in 排序

    SELECT * FROM my_table WHERE id IN (30, 20, 80, 40) ORDER BY FIELD(id, 30, 20, 80, 40);

  6. 每日英语:Success Outside the Dress Code

    Anyone who has felt like the odd duck of the group can take heart from new research from Harvard Bus ...

  7. 用飞信监控GoldenGate进程

    监控GoldenGate进程 1)         在goldengate安装目录下建立文件ogginfo $vim ogginfo  info all 2)         配置飞信报警       ...

  8. leveldb - sstable格式

    整体上,sstable文件分为数据区与索引区,尾部的footer指出了meta index block与data index block的偏移与大小,data index block指出了各data ...

  9. 关于execel单元格中的数字变成文本(左上角带绿色三角形标志)的办法

    对于很多软件,需要将数字变成文本,才能导入到该系统当中.在excel当中,如果数字是以文本的形式存储,在左上角是带有绿色的三角形标志的.如果对于大批量数据,操作方法如下:1将目标列数据copy到记事本 ...

  10. chm格式文件能打开,但看不到内容问题

    是chm格式的能打开文件,也能看到左边的目录信息,但是无法显示右面的具体内容.报错:无法显示网页.错误页面的url是:res://C:WINDOWSsystem32shdoclc.dll/dnserr ...