mysql用户和权限管理


mysql用户管理

 

MYSQL是一个多用户的数据库,MYSQL的用户可以分为两大类:

1.超级管理员用户(root),拥有全部权限。

2.普通用户,由root创建,普通用户只拥有root所分配的权限。

 

创建数据库用户

1.CREATE USER创建用户

  使用CREATE USER语句创建用户,必须要拥有CREATE USER权限。其格式如下

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

 

其中,user参数表示新建用户的账户,user由用户名(User)和主机名(Host)构成;IDENTIFIED BY关键字用来设置用户的密码;password参数表示用户的密码;如果密码是一个普通的字符串,就不需要使用PASSWORD关键字。可以没有初始密码。

mysql> CREATE USER 'paul'@'%' IDENTIFIED BY 'paul';

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

 

2INSERT语句创建用户

可以使用INSERT语句直接将用户的信息添加到mysql.user表。但必须拥有mysql.user表的INSERT权限。

mysql>INSERT INTO mysql.user  (Host,User,Password) VALUES  

 ('%','Cherry',PASSWORD('123456'));

mysql> FLUSH PRIVILEGES;

执行INSERT之后,要使用命令:FLUSH PRIVILEGES;命令来使用户生效。

 

3. GRANT语句创建用户

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

  语法如下:

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

  priv_type:参数表示新用户的权限;

  databse.table:参数表示新用户的权限范围; 

user:参数新用户的账户,由用户名和主机构成; 

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

password:新用户密码; 

 

4.删除用户

4.1.DROP USER 删除用户

  DROP USER语句删除普通用户,需要拥有DROP USER权限。 删除完成后,一样要FLUSH PRIVILEGES才生效。 

  语法如下:

   DROP USER user[,user]...

mysql> drop user Cherry;

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

 

4.2 DELETE 语句删除普通用户

可以使用DELETE语句直接将用户的信息从mysql.user表中删除。但必须拥有对mysql.user表的DELETE权限。DELETE FROM mysql.user WHERE Host = ‘%’ AND User = ‘admin’; 删除完成后,一样要FLUSH PRIVILEGES才生效。

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

mysql> FLUSH PRIVILEGES;

 

修改用户密码

 1. mysqladmin 修改root用户密码

   语法:mysqladmin -u用户名 -p旧的密码 password 新密码

   [root@paul ~]# mysqladmin -uroot -p123 password 123456

 2. SET语句修改密码

   使用root用户登录到MySQL服务器后,可以使用SET语句来修改密码:

   修改自己的密码,不需要用户名

 格式:

 mysql>SET PASSWORD FOR ‘USERNAME’@’HOST’=PASSWORD(‘new_pass’);

   SET PASSWORD = PASSWORD("123");

   mysql> SET PASSWORD=PASSWORD('redhat');

   修改其他用户密码:

   SET PASSWORD FOR 'myuser'@'%'=PASSWORD("123456") FOR 用户名@主机名

 3. 修改user

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

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

   mysql> FLUSH PRIVILEGES; 刷新后生效。

 

 忘记用户密码解决办法

  普通用户,直接用root超级管理员登录进去修改密码就可以了,但是如果root密码丢失了,怎么办呢?

  方法一:

  1.mysqld_safe方式找回密码

   [root@paul ~]# service mysqld stop;              停止mysql

   [root@paul ~]# mysqld_safe --skip-grant-tables&   安全模式启动

   [root@paul ~]# mysql -uroot –p                  无密码回车键登录

   重置密码:

   mysql> use mysql;

   mysql>update user set password=password("123456") where user='root' and host='localhost';

   mysql> flush privileges;

   正常启动:

   [root@paul ~]# service mysqld restart   

 

 方法二:

  1、在配置文件/etc/my.cnf添加skip-grant-tables一行,跳过密码验证。

2、重启mysql数据库主进程# /etc/init.d/mysqld restart(也可以直接先停掉MySQL进程后使用  skip-grant-tables参数重启MySQL

3、登录数据库修改密码。mysql> update user set authentication_string=password('') where user='root' and host='localhost'; 
 mysql> flush privileges;
这里需要修改的字段是authentication_string,这点和之前的旧版本不同。

   4、将my.cnfmysqld节点的skip-grant-tables配置删除,然后重新启动服务即可。

  mysql权限管理

        安装MySQL时会自动安装一个名为mysql的数据库。mysql数据库里面存储的都是权限表。与权限相关的数据表:user,db,host,tables_priv,columns_privprocs_priv

用户权限管理主要有以下作用:

1. 可以限制用户访问哪些库、哪些表

2. 可以限制用户对哪些表执行SELECTCREATEDELETEDELETEALTER等操作

3. 可以限制用户登录的IP或域名

4. 可以限制用户自己的权限是否可以授权给别的用户

 

mysql 的权限体系大致分为5个层级:

全局层级全局权限

适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。GRANT ALL ON *.*REVOKE ALL ON *.*只授予和撤销全局权限。

数据库层级

数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.dbmysql.host表中。GRANT ALL ON db_name.*REVOKE ALL ON db_name.*只授予和撤销数据库权限。

表层级

表权限适用于一个给定表中的所有列。这些权限存储在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_nameREVOKE ALL ON db_name.tbl_name只授予和撤销表权限。

列层级

列权限适用于一个给定表中的单一列。这些权限存储在mysql.columns_priv表中。当使用REVOKE时,您必须指定与被授权列相同的列。

子程序层级

CREATE ROUTINE, ALTER ROUTINE, EXECUTEGRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了CREATE ROUTINE外,这些权限可以被授予为子程序层级,并存储在mysql.procs_priv表中。

这些权限信息存储在下面的系统表中:

mysql.user

mysql.db

mysql.host

mysql.table_priv

mysql.column_priv

当用户连接进来,mysqld会通过上面的这些表对用户权限进行验证!  

 

我们可以用 CREATE USER GRANT 创建用户,后者还同时分配相关权限。而 REVOKE 则用于删除用户权限,DROP USER 删除账户。MySQL 赋予用户权限命令语法为:

grant 权限 on 数据库对象 to 用户;

grant 权限 on 数据库对象 to 用户 identified by "密码";

grant 权限 on 数据库对象 to 用户@"ip" identified by "密码"

GRANT 语法:

GRANT privileges (columns)

  ON what

  TO user IDENTIFIED BY "password"

  WITH GRANT OPTION;

privileges 列表:

       * ALTER: 修改表和索引。

       * CREATE: 创建数据库和表。

       * DELETE: 删除表中已有的记录。

       * DROP: 抛弃(删除)数据库和表。

       * INDEX: 创建或抛弃索引。

       * INSERT: 向表中插入新行。

       * REFERENCE:未使用。

       * SELECT: 检索表中的记录。

       * UPDATE: 修改现存表记录。

       * FILE: 读或写服务器上的文件。

       * PROCESS: 查看服务器中执行的线程信息或杀死线程。

       * RELOAD: 重载授权表或清空日志、主机缓存或表缓存。

       * SHUTDOWN: 关闭服务器。

       * ALL: 所有权限,ALL PRIVILEGES同义词。

       * USAGE: 特殊的 "无权限" 权限。

  

下面创建一个test用户,密码为test,并且只能对studb数据库进行操作的命令

语法:

GRANT UPDATE(cid,cname) ON mysqlpart2.custom TO 'user3'@'localhost';

mysql> GRANT ALL ON studb.* TO test IDENTIFIED BY "test";

GRANT语句的语法看上去像这样:

GRANT privileges (columns) ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION 

mysql> flush privileges;

 

 

 

撤销所有权限

语法:

REVOKE 权限 ON 数据库. FROM  '用户名'@'登录主机;

mysql> REVOKE ALL ON studb.* FROM test IDENTIFIED BY "test";

mysql> flush privileges;

 

注:说明:赋权与撤销权限的区别,就是REVOKE是将to改为from

查看权限

show grants;//自己

show grants for dba@localhost;//指定用户指定host

 

设置权限时必须给出一下信息

1,要授予的权限

2,被授予访问权限的数据库或表

3,用户名

grantrevoke可以在几个层次上控制访问权限

1,整个服务器,使用 grant ALL  revoke  ALL

2,整个数据库,使用on  database.*

3,特点表,使用on  database.table

4,特定的列

5,特定的存储过程

user表中host列的值的意义

%              匹配所有主机

localhost    localhost不会被解析成IP地址,直接通过UNIXsocket连接

127.0.0.1      会通过TCP/IP协议连接,并且只能在本机访问;

::1                 ::1就是兼容支持ipv6的,表示同ipv4127.0.0.1

 

 

 

 

 


猜你喜欢

转载自blog.51cto.com/437549/2107411