用户介绍
用户包括普通用户和root用户。
root用户是超级管理员,拥有所有的权限。root用户的权限包括创建用户、删除用户、修改普通用户的密码等管理权限。
普通用户只拥有创建该用户时赋予它的权限。
用户管理包括管理用户的帐户、权限等。主要内容有:
- 权限表介绍
- 用户登录和退出MySQL服务器
- 创建和删除普通用户
- 普通用户和root用户的密码管理
- 权限管理
查看当前所有用户
# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
。。。
MariaDB [(none)]> use mysql;
MariaDB [mysql]> select user,host from user;
+--------+-----------+
| user | host |
+--------+-----------+
| Admin | % |
//注意,后面的代码都默认省去MariaDB [mysql]> ,但是都默认在数据库shell中操作
所谓用户就是存在mysql.user表格中的一行数据,创建用户就是在这个表格添加一行,删除用户就是在这表格里删除某一行数据。
创建新用户
- 谁可以创建新用户:
拥有对mysql数据库进行插入权限或者拥有创建全局用户权限的用户能够创建新用户。 - 怎么创建,目前我整理的就四种方式,1、2为常用方法
- CREATE USER语句
- GRANT语句
- INSERT语句
- 直接在mysql.user表中添加
CREATE USER Admin@'%' IDENTIFIED BY 'Password.*-';
//创建用户Admin,密码为Password.*-,登录主机为任意IP
CREATE USER Admin@'localhost' IDENTIFIED BY '.*-Password' with GRANT OPTION;
//创建用户Admin,密码为.*-Password,登录主机为本地登录,并且赋予它赋予其它用户相同权限的权利
CREATE USER Admin2@'localhost' IDENTIFIED BY PASSWORD '*54958E764CE10E50764C2EECBB71D01F08549980';
//创建用户Admin2,密码哈希值为***省略***,登录主机为本地登录
CREATE USER safe@'%' IDENTIFIED VIA pam USING PASSWORD('secret');
//创建用户safe,密码为secret,登录主机为任意IP或者通过认证插件pam
CREATE USER 'monty'@'localhost' PASSWORD EXPIRE INTERVAL 120 DAY;
//创建本地用户monty,密码过期时间为120天。
-
说明
可以为一个用户在不同的host配置不同的密码, -
@
在@前面的是用户名,后面的是登录主机名,可以只当具体的某个IP,如101.203.125.126
,也可以指定为任意IP都可以远程登录,如%
,还可以指定为只能从服务器本地登录,如localhost
需要注意的是,%并不包含localhost,即使是IP指定为127.0.0.1,IP登录是通过TCP/IP协议进行传输,而localhost是通过Unix Socket进行更为安全的传输。 -
使用
使用创建用户命令时只需要把用户名,主机名和密码替换即可。 -
IDENTIFIED BY '.-Password’;
指定密码为.-Password -
IDENTIFIED BY PASSWORD '54958E764CE10E50764C2EECBB71D01F08549980’;
指定密码的哈希值为54958E764CE10E50764C2EECBB71D01F08549980,一般人不会这么做的。。。。 -
VIA
** 其它登录认证方式不太懂!!!!!!!!!!!!!!!!!!! ** -
WITH
用户权限限定
CREATE USER 'someone'@'localhost' WITH
MAX_USER_CONNECTIONS 10
//该账号最多允许十个机子同时登陆
MAX_QUERIES_PER_HOUR 200;
//该账户每小时最大查询次数为200
错误ERROR 1396 (HY000) || IF EXISTS
当创建用户、删除用户失败的时候都会报这个错误,原因可能是该用户已经存在了。此时可以用IF EXISTS
CREATE USER IF NOT EXISTS Admin@'%' IDENTIFIED BY 'Password.*-';
修改密码
- root密码
- 使用mysqladmin命令来修改root用户的密码
- 修改mysql数据库下的user表
- 使用SET语句来修改root用户的密码
- 普通用户的密码
普通用户的密码可以被root管理员修改或者自己修改
2.1 root管理员修改普通用户密码
-
使用SET语句来修改普通用户的密码
-
修改mysql数据库下的user表
-
用GRANT语句来修改普通用户的密码
2.2 普通用户修改自己的密码
-
SET PASSWORD=PASSWORD(‘new_password’);
SET PASSWORD FOR Admin@'%' = PASSWORD('123.456.321');
SET PASSWORD FOR Admin@'localhost' = PASSWORD('123.789.321');
修改用户Admin的远程密码为123.456.321,修改用户Admin的本地登录密码为123.789.321.
root忘记了密码怎么办??
- 使用–skip-grant-tables选项启动MySQL服务
- 登录root用户,并且设置新的密码
- 加载权限表
删除用户
- DROP USER。。
- 直接在mysql.usr表中删除用户
删除用户Admin示例,使用时替换Admin为需要删除的账户即可
DROP USER IF EXISTS Admin;
//删除Admin用户,也可以写成下面这个样子,二选一,差别上面已经说过了
DROP USER Admin; //不加主机名默认删除@'%'
DROP USER Admin@'localhost';
替代用户
很少使用的命令,存在该用户就替换,不存在就创建。可能用户多了就需要这种神操作吧
CREATE OR REPLACE USER Admin@'%' IDENTIFIED BY 'Password.*-';
可以替代为
DROP USER IF EXISTS Admin;
CREATE USER Admin@'%' IDENTIFIED BY 'Password.*-';
权限
权限表
安装MySQL时会自动安装一个名为mysql的数据库。mysql数据库下面存储的都是权限表,其中最重要的是user表、db表和host表,除此之外,还有tables_priv表、columns_priv表、proc_priv表等。
- user表
user表有39个字段。这些字段大致可以分为四类:
- 用户列
- 权限列
- 安全列
- 资源控制列
- db,host表
db表中存储了某个用户对一个数据库的权限。
db表和host表的字段大致可以分为两类:
- 用户列
- 权限列
- tables_priv表和columns_priv表
-
tables_priv表可以对单个表进行权限设置。columns_priv表可以对单个数据列进行权限设置。可以使用DESC语句来查看这两个表的基本结构
-
tables_priv表包含8个字段,分别是Host、Db、User、Table_name、Table_priv、Column_priv、Timestamp和Grantor。前四个字段分别表示主机名、数据库名、用户名和表名。Table_priv表示对表进行操作的权限。这些权限包括Select、Insert、Update、Delete、Create、Drop、Grant、References、Index和Alter。
-
Column_priv表示对表中的数据列进行操作的权限。这些权限包括Select、Insert、Update和References。Timestamp表示修改权限的时间。Grantor表示权限是谁设置的。
- procs_priv表
procs_priv表可以存储过程和存储函数进行权限设置。
查看权限
show gratns; //查看当前用户的本地权限
show grants for Admin2; //查看用户Admin2的本地权限
show grants for Admin2@'%'; //查看用户Admin2的远程权限
常见权限:insert,update,delete,select,call,create,alter,drop,file,process,shutdown,super
赋予权限
只用拥有GRANT权限的用户才可以执行GRANT语句。
查看当前用户可以赋予哪些权限
show privileges;
赋予特定用户特定权限
GRANT 权限 ON 数据库名.表名 to '用户名'@'主机名';
GRANT SELECT,DELETE ON test.t2 to 'joffrey'@'%'; //赋予joffery对数据库test的t2表格拥有远程查询、删除的权限
GRANT SELECT,DELETE,UPDATE ON test.* to 'jojj'@'%'; //赋予jojjry对数据库test的所有表格拥有远程查询、删除、更新的权限
GRANT SELECT,DELETE,UPDATE ON *.* to 'jokk'@'%'; //赋予jokk对所有数据库的所有表格拥有远程查询、删除、更新的权限
FLUSH PRIVILEGES; //加权或者减权之后都要刷新权限
删除权限
REVOKE 权限 ON 数据库名.表名 FROM '用户名'@'主机名';
revoke update on test.* from 'jojj'@'%'; //删除jojj对数据库test的所有表格拥有远程更新的权限
参考
- https://mariadb.com/kb/en/create-user/
- https://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html