是mysql最重要的权限表,记录了允许连接到服务器的账户信息,里面的权限为全局级别。字段可以分为四类。
用户列:
uesr,host,password,其中uesr和host为联合主键。
权限列
字段决定了用户的权限,描述了在全局范围内允许对数据和数据库进行的操作,包括查看权限,修改权限等普通权限,还包括关闭服务器,超级用户,和加载用户等高级权限。
安全列
只有两个是与ssl有关的,2个是与x509有关的,另外两个是授权插件相关的。
x509用于标识用户,ssl用于加密。
资源控制列
包含四个字段:
max_questions:用户每小时允许执行的查询操作次数
max_updates:用户每小时允许执行更新的操作次数
max_connections:用户每小时允许执行的连接操作次数
max_user_connections: 用户允许同时建立连接的次数
db表存储了用户对某个数据库的操作权限,决定了用户从哪个主机存取哪个数据库。host表中存储了某个主机对数据库的操作权限,配合db表对操作权限做进一步的控制。
列的分类为用户列和权限列
用户列中db表包含了host,user,db,主键为三个字段的联合。host表中没有user列,只有host和db列为联合主键。
权限列:
db表与host表的权限列大致相同,表中cretive_routine和alter_routine_priv这两个字段表明用户是否有创建和修改存储过程的权限。
table_priv表来设置对表的操作权限,columns_priv表来对表的某一列设置权限。
对存储过程和存储函数设置操作权限。
mysql 登陆命令参数
-h 主机名或者ip 默认localhost
-u 用户名
-p 密码
-P 端口号 默认3306
-esql 如果指令了该参数,将会在登陆执行-e后面的命令或者sql语句并退出
无参数数据库名 在最后指定数据库名
例如
mysql -h localhost -u root -p test
登陆本地的test数据库
mysql -u root -p -e "desc student;" stu
使用create user语句创建用户时,必须拥有全局的GREATE USER 权限或者mysql数据库的插入权限,新创建的用户没有任何权限。
例如:
create user 'xiaoming'@'localhost' identified by 'pass';
mysql -u xiaoming -p
mysql> create database xiaoming1;
ERROR 1044 (42000): Access denied for user 'xiaoming'@'localhost' to database 'xiaoming1'
可见创建的用户基本没有任何权限
当不使用identified by 参数时,用户登陆时不需要密码
顾名思义,需要有grant权限才可以,grant可以对用户赋予权限,其中的with grant option 参数为可选参数,该用户被赋予权限后可以对其他的用户赋予权限。
例如:
grant select ,update on *.* to 'xiaoxue'@'localhost'
identified by 'pass';
登陆后查询
show datebases;
stu |
stu2 |
supermarket |
sys |
test |
但是不具有插入数据的权限
insert into sc values('10001876','c1','98');
ERROR 1142 (42000): INSERT command denied to user 'xiaoxue'@'localhost' for table 'sc'
mysql> insert into mysql.user (host,user,authentication_string) values('localhost','xiaohua',password('pass'));
ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
mysql> show warnings;
| Warning | 1681 | 'PASSWORD' is deprecated and will be removed in a future release. |
| Error | 1364 | Field 'ssl_cipher' doesn't have a default value |
| Error | 1364 | Field 'x509_issuer' doesn't have a default value |
| Error | 1364 | Field 'x509_subject' doesn't have a default value |
+---------+------+-------------------------------------------------------------------+
查看警告发现了ssl_cipher,x509_issuer,x509_subject没有设置默认值
可见这种直接插入user表的方式不可行。
drop USER user [,user];
例如
drop user 'xiaoming'@'localhost';
DROP USER 不会自动关闭任何正在打开的对话,也就是命令虽然生效,执行成功需要被删除的用户对话结束后再次登陆时才会出现用户不存在。
delete from mysql.user where host='hostname' and user='username'
例如
delete from mysql.user where host='localhost' and user='xiaoxue';
mysqladmin -u username -h localhost -p password 'newpwd'
例如:
mysqladmin -u root -p password 'pass'
运行结果为
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version
for the right syntax to use near ‘mysqladmin -u root -h localhost -p password “pass”’ at line 1
版本MySQL(8.0以上)不支持使用mysqladmin -uroot -p123456 password 654321;或“set password for root@localhost = password(‘654321’);”来修改密码。
所以换成如下语句:
alter user 'root'@'localhost' identified by 'pass';
例如:
update mysql.user set authentication_string=password('123456') where user='root' and host='localhost';
设置完成后,使用flush privileges;
语句重新加载权限。root密码修改完成,前提是root用户登陆的状态。
set password=password("pass");
更改成功,也可以使用如下:
alter user 'root'@'localhost' identified with mysql_native_password by '新密码';
`set password for ‘user’@‘localhost’=password(‘newpassword’);
set password for 'yu'@'localhost'=password('pass');
遇到错误
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versio
for the right syntax to use near ‘for ‘yu’@‘localhost’=password(‘pass’)’ at line 1
查了好几次,确实存在用户yu,刷新权限也好几次,都没效果
` update mysql.user set authentication_string=password(‘pass’) where user=‘username’ and host=‘hostname’;
例如
update mysql.user set authentication_string=password('pass') where user='yu' and host='localhost';
成功执行
grant usage on *.* to 'username' @ '%' identified by 'newpassword‘
需要有grant权限
例如:
grant usage on *.* to 'yu'@'localhost' identified by '123456';
执行成功。推荐使用grant。
set password =password('pass');
第一步:
在mysql的bin目录下打开命令框,输入特殊的命令启动服务器
mysqld --skip-grant-tables
或者
mysqld-nt --skip-grant-tables
在linux的系统下,可以使用如下两种方式启动服务器
mysql_safe --skip-grant-tables
或者
/etc/init.d/mysql start-mysqld --skip-grant-tables
第二步:
直接登陆,命令如下:
mysql -u root
可以看到,已经登陆成功。
第三步:
参考上面的root用户修改密码步骤修改root密码
update mysql.user set authentication_string=password('pass') where user='root' and host='localhost';
不可用set password方式,会出现错误
The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
测试结果如下:
除了update语句可以执行成功外,其他的直接设置密码的方式均不可以。
第四步:
加载权限表
flush privileges;
权限 | 权限拥有者适用的命令 |
---|---|
reload | flush-host,flush-log,flush-privileges,flush-status,flush-tables,flush-threads,refresh,rleoad |
shutdown | shutdown |
process | processlist |
super | kill |
全局层级
全局权限适用于一个给定服务器中所有的数据库,这些权限存储在mysql.user表中,grant all on *.*和revoke all on *.*只授予和撤销全局权限。
数据库层级
数据库权限适用于一个给定数据库中的所有目标,这些权限在mysql.db和Mysql.host中。grant all on db_name和revoke all on db_name 只授予和撤销数据库权限。
表层级
表层级适用于给定列表的所有列,这些权限存储在mysql.tables_priv表中。grant all on db_name.table_name 和 grant all on db_name.table_name 只授予和撤销表权限。
列层级
权限限适用一个给定表中的单一列,权限存储在mysql.columns_priv表中。
子程序层级
create,routine,alter,routine,execute和grant权限适用于已存储的子程序,并存储在mysql.proces_priv表中。
使用grant或者revoke的option取值
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 ,insert on *.* to 'asd'@'localhost'
identified by '123456' with grant option;
select host,user,select_priv,insert_priv,grant_priv from mysql.user where user='asd';
+-----------+------+-------------+-------------+------------+
| host | user | select_priv | insert_priv | grant_priv |
+-----------+------+-------------+-------------+------------+
| localhost | asd | Y | Y | Y |
+-----------+------+-------------+-------------+------------+
查看权限
show grants for 'user'@'host'
例如:
show grants for asd@localhost;
+--------------------------------------------------------------------+
| Grants for asd@localhost |
+--------------------------------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO 'asd'@'localhost' WITH GRANT OPTION |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)
通过查看user表的各个权限字段值也可以查看是否拥有某个权限
select privileges_list from user where user='username' ,host='hostname;'
收回权限
收回所有权限
revoke all privileges,grant option from 'user'@'host'
收回指定的权限
revoke priv_type [(columns)] [,priv_type [(columns) ]]...on table1,table2...,tablen from 'user'@'host'[,'user'@'host'......]
例如:
从testuser用户中撤回更新权限
revoke update on *.* from 'testuser'@'localhost';