对于学习建站或正在学习MySQL语法知识的小伙伴,这波MySQL知识掌握是必不可少的。
一、创建用户
命令:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
命令说明:
- username:你将创建的用户名
- host:指定该用户在哪个主机上可以登陆,如果是本地用户可用
localhost
,如果想让该用户可以从任意远程主机登陆,可以使用通配符%
- password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
举例:
CREATE USER 'abc'@'localhost' IDENTIFIED BY '123456';
//创建用户:abc,密码:123456,仅本地用户可用
CREATE USER 'abc'@'192.168.17.135' IDENTIFIED BY '123456';
//创建用户:abc,密码:123456,指定192.168.17.135地址可登录(多个ip可使用英文逗号分隔)
CREATE USER 'abc'@'%' IDENTIFIED BY '123456';
//创建用户:abc,密码:123456,可任意主机远程登录
CREATE USER 'abc'@'%' IDENTIFIED BY '';
//创建用户:abc,无密码,可任意主机远程登录
CREATE USER 'abc'@'%';
//创建用户:abc,无密码,可任意主机远程登录
二、授权
命令
GRANT privileges ON databasename.tablename TO 'username'@'host'
命令说明:
- privileges:用户的操作权限,如
SELECT
,INSERT
,UPDATE
,CREATE
,DROP
,DELETE
等,如果要授予所的权限则使用ALL
- database name:数据库名
- table name:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用
*
表示,如*.*
举例:
GRANT SELECT, INSERT PRIVILEGES ON test.user TO 'abc'@'%';
//可任意主机登录的用户abc对test数据库中的user表授予SELECT和INSERT权限
GRANT ALL PRIVILEGES ON test.* TO 'abc'@'%';
//可任意主机登录的用户abc对test数据库授予所有操作权限
GRANT ALL PRIVILEGES ON *.* TO 'abc'@'%';
//可任意主机登录的用户abc对所有数据库和表授予所有操作权限
注:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,可用以下命令(若无特定需求可无需此命令授予权限):
GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;
若您需要自定义创建数据库,则创建数据库命令:
CREATE DATABASE 数据库名;
三、修改用户密码
命令:
SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
如果是当前登录用户修改密码:
SET PASSWORD = PASSWORD('newpassword');
举例:
SET PASSWORD FOR 'abc'@'%' = PASSWORD('123456');
四、撤销用户权限
命令:
REVOKE privilege ON databasename.tablename FROM 'username'@'host';
其中privilege
, database name
, table name
同授权部分说明
举例:
REVOKE SELECT ON *.* FROM 'abc'@'%';
//可任意主机登录的用户abc撤销对任意数据库和表的`SELECT`权限
注意:
假如你在给用户'abc'@'%'
授权的时候是这样的(或类似的):GRANT SELECT ON test.user TO 'abc'@'%'
,则在使用REVOKE SELECT ON *.* FROM 'abc'@'%';
命令并不能撤销该用户对test数据库中user表的SELECT
操作。相反,如果授权使用的是GRANT SELECT ON *.* TO 'abc'@'%';
则REVOKE SELECT ON test.user FROM 'abc'@'%';
命令也不能撤销该用户对test数据库中user表的Select
权限。
查看数据库中具体某个用户的权限:
SHOW GRANTS FOR 'abc'@'%';
查看所有用户命令:
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
五、删除用户
命令:
DROP USER 'username'@'host';
六、可能遇到的问题
1、在操作 mysql
库做用户的增删修改的时候,操作完毕的时候最好使用 flush privilege
命令刷新一下权限。否则可能会修改不生效
flush privilege;
2、如果在上述添加了用户%
可任意主机登录的权限,且已经开放防火墙,在使用Navicat远程连接数据库可能会报10038
等错误解决办法。
2.1、若您使用的是MySQL 8.0以上版本,在MySQL 8.0以上版本中,caching_sha2_password是默认的身份验证插件,而不是以往的mysql_native_password
。故可修改插件为mysql_native_password
如果是现有用户:
use mysql;
ALTER USER '用户名'@'host' IDENTIFIED WITH mysql_native_password BY 'password';
flush privilege;
如果是新建用户:
use mysql;
CREATE USER '用户名'@'host' IDENTIFIED WITH mysql_native_password BY 'password';
flush privilege;
其中,用户名
为你需要远程账户的用户名,host
是你要登录的主机,password
为你的用户密码。
又或者使用默认加密方式,在配置文件中添加以下内容:
default_authentication_plugin=mysql_native_password
2.2、上述操作若仍无法登陆,可能是MySQL Server绑定了本地地址127.0.0.1
,打开MySQL配置文件(可能不同方式的安装配置文件的位置也不同),此处博主的数据库配置文件为/etc/mysql/mysql.conf.d/mysql.cnf
将其中的
bind-address = 127.0.0.1
修改为
bind-address = 0.0.0.0
重启数据库,即可使用Navicat连接数据库,相比于该操作,较为推荐使用PhpmyAdmin管理工具。