MySQL的用户管理和权限管理,都体现在如下的六张表中
mysql.user
mysql.db
mysql.host
mysql.tables_priv
mysql.columns_priv
mysql.procs_priv
各种权限表
(1)user表
user表是MySQL中最重要的一个权限表,记录允许连接到服务器的账号信息,里面的权限是全局级的。user表的信息有用户列、权限列、安全列和资源控制列。这个表中有Host、User、Password三个字段,如下:
Host表示远程主机,即MySQL客户端的ip,表示从该Host上用指定的User和Password才可以登录数据库
User表示用户名
Password表示用户密码
备注:在不同的Host上使用同一个User来登录数据库,对应的登录密码可以是不一样的。因此,可以认为Host+User唯一对应一个用户哦。
(2)db表
db表中存储了用户对某个数据库的操作权限,决定用户能从哪个主机存取哪个数据库。主要反映的是用户对Mysql中哪些db有操作权限。
(3)host表
host表中存储了某个主机对某个数据库有什么操作权限。
备注:通过权限表user/db/host的控制,决定了一个用户登录到MySQL中,看到的db不同,看到的table不同,以及对table的操作权限不同等。
创建mysql新用户
前提声明,如下命令中,10.12.21.23代表的mysql客户端所在的机器,wahaha是用户名,guest123是用户密码。
新增mysql用户有如下几种方法:
(1)直接在mysql库中user表中添加记录来创建新用户并授权
1 | insert into user(host, user, password, select_priv, insert_priv, update_priv) VALUES('10.12.21.23', 'wahaha', PASSWORD('guest123'), 'Y', 'Y', 'Y'); |
(2)使用grant命令创建新用户并授权
1 | grant all privileges on *.* to 'wahaha'@'10.12.21.23' identified by 'guest123'; |
或如下授予部分权限:
1 | grant select, insert, update, delete, create, drop on *.* to 'wahaha'@'10.12.21.23' identified by 'guest123'; |
(3)使用create user命令
1 | create user wahaha identified by 'guest123'; |
备注:使用create user命令创建用户后,还需要对用户进行授权。
修改MySQL中用户名密码
mysql安装后,root账户的密码默认是空,即不需要密码就可以登录。我们可以通过如下几种方法来修改指定用户的登录密码(前提申明,如下命令中,10.12.21.23代表的mysql客户端所在的机器,wahaha是用户名,guest123是用户密码):
(1)使用mysqladmin工具(不会用这个)
1 | mysqladmin -u root password "guest123"; |
上述命令表示将root的密码修改成guest123。
(2)直接修改MySQL中系统db mysql中user表
1 | # mysql -uroot -p |
备注:其中PASSWORD()是mysql的一个内置函数,用来将明文密码转换成暗文。
(3)使用set命令(这个很赞哦)
1 | set password for 'wahaha'@'10.12.21.23' = PASSWORD('guest123'); |
mysql中常见问题处理
(1)客户端授权问题
如果远程主机上client连接MySQL提示“ #1130 - Host ‘localhost’ is not allowed to connect to this MySQL server”表示不允许从当前机器上连接mysql服务器,需要使用GRANT授权,命令如下:
1 | grant all privileges on . to 'wahaha'@'%'; --该句中的%表示允许从所有主机上用wahaha用户去连接mysql服务器 |
备注:
A)使用grant语句后,记得使用flush privileges命令让其生效
B)当使用上面的语句授权时,发现wahaha账号的密码被重置了。是不是从不同机器上客户端用同一个账号连接Mysql服务器,使用的密码是不一样的。
C)部署phpMyAdmin时,需要为部署phpMyAdmin的服务器授权客户端来源权限。
备注:当修改完mysql的用户及授权信息后,一般需要执行flush privileges命令。执行后mysql会重新载入授权表,从而使最新的权限变更生效。