Mysql学习总结(1):用户管理

MySQL分为普通用户与root用户。这两种用户的权限不一样。

安装MySQL时会自动安装一个名为mysql的数据库。mysql数据库里面存储的都是权限表。

========

一、权限表说明

1、User表

user表有39个字段。这些字段可以分为4类:

  • 用户列;
  • 权限列;
  • 安全列;
  • 资源控制列;

1.1、用户列

  • 用户列包括Host、User、Password,分别表示主机名、用户名和密码。登录用的就是这个用户名与密码;

1.2、权限列

  • user表包括Select_priv、Insert_priv等以priv结尾的字段。这些字段的值只有Y和N。Y表示该权限可以用到所有数据库上;N表示该权限不能用到所有数据库上;
  • 通常,可以使用GRANT语句为用户赋予一些权限,也可以通过Update语句更新user表的方式来设置权限;
  • 注意,修改user表之后,一定要执行一下FLUSH PRIVILEGES,从新加载权限表。否则可能会报错。

权限列说明
说明
Select_priv                       SELECT权限
Insert_priv INSERT权限
Update_priv UPDATE权限
Delete_priv  DELETE权限
Create_priv 新建表权限
Drop_priv 删除库和表权限
Reload_priv 确定用户是否可以执行刷新和重新加载MySQL所用各种内部缓存的特定命令,包括日志、权限、主机、查询和表
Shutdown_priv 确定用户是否可以关闭MySQL服务器。在将此权限提供给root账户之外的任何用户时,都应当非常谨慎
Process_priv      确定用户是否可以通过SHOW PROCESSLIST命令查看其他用户的进程
File_priv  确定用户是否可以执行SELECTINTO OUTFILE和LOAD DATA INFILE命令
Grant_priv       确定用户是否可以将已经授予给该用户自己的权限再授予其他用户
References_priv       目前只是某些未来功能的占位符;现在没有作用
Index_priv       确定用户是否可以创建和删除表索引
Alter_priv        确定用户是否可以重命名和修改表结构
Show_db_priv 确定用户是否可以查看服务器上所有数据库的名字,包括用户拥有足够访问权限的数据库
Super_priv      确定用户是否可以执行某些强大的管理功能,例如通过KILL命令删除用户进程,使用SET GLOBAL修改全局MySQL变量,执行关于复制和日志的各种命令
Create_tmp_table_priv   确定用户是否可以创建临时表
Lock_tables_priv     确定用户是否可以使用LOCK TABLES命令阻止对表的访问/修改
Execute_priv    确定用户是否可以执行存储过程

Repl_slave_priv      

确定用户是否可以读取用于维护复制数据库环境的二进制日志文件。此用户位于主系统中,有利于主机和客户机之间的通信
Repl_client_priv      确定用户是否可以确定复制从服务器和主服务器的位置
Create_view_priv    确定用户是否可以创建视图
Show_view_priv      确定用户是否可以查看视图或了解视图如何执行
Create_routine_priv        确定用户是否可以更改或放弃存储过程和函数
Alter_routine_priv  确定用户是否可以修改或删除存储函数及函数
Create_user_priv     确定用户是否可以执行CREATE USER命令,这个命令用于创建新的MySQL账户
Event_priv       确定用户能否创建、修改和删除事件
Trigger_priv     确定用户能否创建和删除触发器
  • Update修改权限:

       mysql> UPDATE user SET Select_priv = 'N' WHERE user= 'admin';


1.3、安全列

   user表的安全列有4个字段:

  • ssl_type;
  • ssl_cipher;
  • x509_issuer;
  • x509_subject;

  ssl用于加密;x509标准可以用来标识用户。普通的发行版都没有加密功能。可以使用SHOW VARIABLES LIKE 'have_openssl'语句来查看是否具有ssl功能。如果取值为DISABLED,那么则没有ssl加密功能。

 

1.4、资源控制列

  user表的4个资源控制列是:

  • max_questions:每小时可以允许执行多少次查询;
  • max_updates:每小时可以允许执行多少次更新;
  • max_connections:每小时可以建立多少连接;
  • max_user_connections:单个用户可以同时具有的连接数。

  默认值为0,表示无限制。


 --------

2、db表和host表

  db表存储了某个用户对一个数据库的权限。

  host表中存储了某个主机对数据库的操作权限,配合db表对给定主机上数据库级操作权限做更细致的控制;但是很少用,新版本已经取消了host表;

2.1、用户列

 db表的用户列有3个字段:

  •  Host:主机名;
  •  Db:数据库名;
  •  User:用户名;

2.2、权限列

  • Create_routine_priv:是否具有创建存储过程权限;
  • Alter_routine_priv:是否具有修改存储过程权限;

  user表中的权限是针对所有数据库的,如果user表中的Select_priv字段取值为Y,那么该用户可以查询所有数据库中的表;

  如果为某个用户设置了查询test表的权限,那么user表的Select_priv字段的取值为N。而这个SELECT权限则记录在db表中。db表中的Select_priv字段的取值将会是Y。

  用户先根据user表的内容获取权限,然后再根据db表的内容获取权限。


---------

3、tables_priv表和columns_priv表

3.1 、tables_priv表

   可以对单个表进行权限设置,包含8个字段:

  • Host:主机名;
  • DB:数据库名;
  • User:用户名;
  • Table_name:表名
  • Table_priv:对表进行操作的权限(Select,Insert,Update,Delete,Create,Drop,Grant,References,Index,Alter)
  •  Column_priv:对表中的数据列进行操作的权限(Select,Insert,Update,Rederences);
  • Timestamp:修改权限的时间
  • Grantor:权限的设置者

3.2、columns_priv表

  • 可以对单个数据列进行权限设置,有7个列,作用同上:

   Host、Db、User、Table_name、Column_name、Column_priv、Timestamp。

MySQL权限分配是按照user表-> db表 -> table_priv表 -> columns_priv表的顺序进行分配的。

在数据库系统中,先判断user表中的值是否为'Y',如果user表中的值是'Y',就不需要检查后面的表。如果user表为N,则一次检查后面的表。


-----------

4、procs_priv表

   procs_priv表可以对存储过程和存储函数进行权限设置。包含8个字段,分别是:

  •  Host:主机名;
  •  Db:数据库名;
  •  User:用户名;
  • Routine_name:存储过程或函数名称;
  •  Routine_type:类型(取值有:FUNCTION或PROCEDURE);
  •  Proc_priv:拥有的权限(Execute:执行;Alter Routine:修改;Grant:权限赋予);
  •  Timestamp:字段存储更新的时间;
  • Grantor:字段设置者;


============

二、账户管理

  账户管理是MySQL用户管理最基本的内容。包括登录,退出MySQL服务器、创建用户、删除用户、密码管理和权限管理等内容。

 1、登录

    格式: mysql -h主机地址 -u用户名 -p用户密码

  • 连接到本机上(localhost)的MYSQL
    首先打开DOS窗口,键入命令:
    > mysql -u root -p  回车后提示你输密码
    > mysql -u root -proot  回车后直接连接

  • 连接到远程主机上的MYSQL
    假设远程主机的IP为:110.110.110.110,用户名为root,密码为root。则键入以下命令:
    > mysql -h110.110.110.110 -uroot -proot;

  • 退出MYSQL
    键入命令 exit 回车即可退出
    或者 ctrl + c 退出

说明:

  1. 用户名前可以有空格也可以没有空格,如果同时输入密码,则-p后面紧跟着的输入没有空格。
  2. 连接成功后,提示符是: mysql>,这时候就可以使用sql语句了。


--------

2、新建普通用户

 在MySQL数据库中,建立用户有3种方式:

  • 使用CREATE USER语句来创建新的用户;
  • 直接在mysql.user表中INSERT用户;
  • 使用GRANT语句来新建用户;

 2.1、CREATE USER

  • 使用CREATE USER语句创建用户,必须要拥有CREATE USER权限。

    格式:    

    CREATE USER user[IDENTIFIED BY [PASSWORD]'password'],

    [user[IDENTIFIED BY [PASSWORD]'password']]...

    user 参数表示新建用户的账户,user由用户名(User)和主机名(Host)构成;

    IDENTIFIED BY 关键字用来设置用户的密码;

    password 参数表示用户的密码;如果密码是一个普通的字符串,就不需要使用PASSWORD关键字。使用    PASSWORD('root123456')是给密码加密的。可以没有初始密码。

    示例:

    mysql> CREATE USER 'admin'@'localhost' IDENTIFIED BY'admin';

    执行之后user表会增加一行记录,但权限暂时全部为‘N’。

 

2.2、用INSERT语句新建普通用户

  • 可以使用INSERT语句直接将用户的信息添加到mysql.user表。但必须拥有mysql.user表的INSERT权限。
  • 另外,ssl_cipher、x509_issuer、x509_subject没有值,必须要设置值,否则INSERT语句无法执行。

    示例:

    mysql> INSERT INTO mysql.user (Host,User,Password,ssl_cipher,x509_issuer,x509_subject)

    VALUES('%','newuser1',PASSWORD('123456'),'','','');

    执行INSERT之后,要使用命令:

     mysql> FLUSH PRIVILEGES  命令来使用户生效。


2.3、用GRANT语句来新建普通用户

  • 用GRANT来创建新的用户时,能够在创建用户时为用户授权。但需要拥有GRANT权限。

    格式:

    GRANT priv_type ON database.table

    TO user[IDENTIFIED BY [PASSWORD]'password']

    [,user [IDENTIFIED BY [PASSWORD]'password']...]

  • priv_type:参数表示新yoghurt的权限;
  • databse.table:参数表示新用户的权限范围;
  • user:参数新用户的账户,由用户名和主机构成;
  • IDENTIFIED BY关键字用来设置密码;
  • password:新用户密码;
例: mysql> GRANT SELECT ON *.* TO netUser1@'%' IDENTIFIED BY "123456";


    *.*  与 db(数据库).* 的区别在于:

    *.* 对所有数据库生效,所以user表的SELECT会变为Y。

    而 db.*对执行的数据库有效。user表SELECT为'N',更改的是Db表。


------------

3、删除普通用户

3.1、DROP USER语句删除普通用户

  • 需要拥有DROP USER权限。

    格式:DROP USER user[,user]...

  • user是需要删除的用户,由用户名(User)和主机名(Host)构成。

    例: mysql> DROP USER 'newuser1'@'%';

 

3.2、DELETE语句删除普通用户

  • 可以使用DELETE语句直接将用户的信息从mysql.user表中删除。但必须拥有对mysql.user表的DELETE权限。

    mysql>DELETE FROM mysql.user WHERE Host = '%' AND User = 'admin';

    删除完成后,一样要FLUSH PRIVILEGES才生效。


 ------------

4、修改密码

4.1、使用mysqladmin命令来修改root用户的密码

    格式:mysqladmin -u用户名 -p旧密码 password 新密码

  • 给root加个密码root
    > mysqladmin -u root -password root
    注:这种情况是开始时root没有密码,所以-p旧密码一项就可以省略了。
  • 再将root的密码改为root123
    > mysqladmin -u root -proot password root123
    说明:
    -u后面可空格可以不用,-p后面不能有空格,password 后面必须有空格

4.2、修改user表

  • UPDATE user表的passwor字段的值,也可以达到修改密码的目的;

     例:

    mysql>UPDATE user SET Password = PASSWORD('123')WHERE USER = 'myuser';

    mysql>FLUSH PRIVILEGES

 注:修改表的时候,密码项必须使用PASSWORD()函数对密码进行加密。

4.3、使用SET语句来修改密码

  • 使用root用户登录到MySQL服务器后,可以使用SET语句来修改密码;
  • 修改自己的密码,不需要用户名:

    SET PASSWORD = PASSWORD("123");

  • 修改其他用户密码:

    SET PASSWORD FOR 'myuser'@'%' = PASSWORD("123456");


4.4、GRANT语句来修改普通用户的密码

  • 使用GRANT语句修改普通用户的密码,必须拥有GRANT权限

 格式:

    GRANT priv_type ON database.table TO user[IDENTIFIED BY [PASSWORD] 'password']

    例:GRANT SELECT ON *.* TO 'test3'@'%'IDENTIFIED BY '123'

-------------

5、忘记密码的解决方案

  如果root用户密码丢失了,会给用户造成很大的麻烦。但是,可以通过某种特殊方法登录到root用户下,然后修改密码。

5.1、使用--skip-grant-tables选项启动MySQL服务

  • 该选项将使MySQL服务器停止权限判断,任何用户都能够访问数据库。
  • DOS命令启动服务:

  mysqld命令:mysqld --skip-grant-tables

  mysqld-nt命令:mysqld-nt --skip-grant-tables

  net start mysql命令:net start mysql --skip-grant-tables

5.2、登录root用户,并且设置新密码

  mysql -u root

  必须使用UPDATE语句更新mysql数据库下的user表,而不能使用SET语句,因为--skip-grant-tables不能使用SET语句。

  修改完密码以后,FLUSH PRIVILEGES语句加载权限表,新密码即生效。


===========

三、权限管理

1、MySQL的各种权限

权限名称  对应user表中的列 权限的范围
CREATE    Create_priv      数据库、表或索引
DROP     Drop_priv        数据库或表
GRANT OPTION Grant_priv       数据库、表、存储过程或函数
REFERENCES References_priv 数据库或表
ALTER Alter_priv 修改表
DELETE    Delete_priv      删除表
INDEX      Index_priv       用索引查询表
INSERT     Insert_priv       插入表
SELECT     Select_priv      查询表
UPDATE   Update_priv    更新表
CREATE VIEW Create_view_priv    创建视图
SHOW VIEW  Show_view_priv      查看视图
ALTER ROUTINE Alter_routine   修改存储过程或存储函数
CREATE ROUTINE Create_routine_priv        创建存储过程或存储函数
EXECUTE  Execute_priv    执行存储过程或存储函数
FILE  File_priv  加载服务器主机上的文件
CREATE TEMPORARY TABLES Create_temp_table_priv 创建临时表
LOCK TABLES Lock_tables_priv     锁定表
CREATE USER  Create_user_priv     创建用户
PROCESS Process_priv    服务器管理
RELOAD   Reload_priv     重新加载权限表
REPLICATION CLIENT Repl_client_priv      服务器管理
REPLICATION SLAVE Repl_slave_priv       服务器管理
SHOW DATABASES Show_db_priv 查看数据库
SHUTDOWN    Shutdown_priv        关闭服务器
SUPER      Super_priv       超级权限


--------

2、授权

    格式:

    GRANT priv_type [(column_list)]  ON database.table

    TO user [IDENTIFIED BY [PASSWORD]'password']

    [,user [IDENTIFIED BY [PASSWORD]'password']]...

    WITH with_option[with_option]

 

  •  priv_type参数表示权限类型;
  •  column_list:参数表示权限作用于哪些列上,没设置则位于整个表上;
  • user参数由用户名和主机名构成;形式是"'username'@'hostname'";
  • IDENTIFIED BY参数用于为用户设置密码;
  • password:用户新密码;
  • WITH关键字后面带有一个或多个with_option参数。有5个选项:

       - GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户;

       - MAX_QUERIES_PER_HOUR count:设置没消失可以允许执行count次查询;

      -  MAX_UPDATES_PER_HOUR count:设置每个消失可以允许执行count次更新;

       - MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立count个连接;

      -  MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的count个连接数;

  示例:

GRANT SELECT,UPDATE ON *.*  TO 'myuser'@'%'  WITH GRANT OPTION;


--------

3、收回权限

  •  收回权限,就是取消某个用户的某些权限。MySQL中使用REVOKE关键字来收回权限。

    格式:

    REVOKE priv_type[(column_list)]  ON database.table FROM user[,user];

    收回全部权限的REVOKE语句的基本格式如下:

    REVOKE ALL PRIVILEGES,GRANT OPTION FROMuser[,user]...

    示例:

  • 回收用户myuser的SELECT权限

    REVOKE SELECT ON *.*FROM 'myuser'@'%';

  • 收回myuser的所有权限:

    REVOKE ALL PRIVILEGES,GRANT OPTION FROM'myuser'@'%';


---------

4、查看权限

  • SHOW GRANTS语句用于查看权限。同时mysql数据库下的user表中存储着用户的基本权限。

    使用:

    SELECT * FROM mysql.user

    或者:

    SHOW GRANTS

 

  

 

 





你可能感兴趣的:(mysql)