MySQL 的帐号管理对我来说是不常用的操作,一般只在搭建线上服务器环境时会做这方面的事情。用的少,导致一些操作语句记不牢,一旦需要的时候又到处查资料。所以这篇文章算是一份总结记录。
开始之前提醒一下,本文内容以 MySQL 5.7 为操作对象,并使用 root
帐号和 mysql
命令工具。如果参阅本文内容,请注意与本文所用的版本跨度不要太大,使用的操作帐号要有帐号管理的权限,以及操作软件能正常连接到 MySQL 数据库。
一切准备妥当,先登录到 MySQL。
查询帐号信息
在操作帐号前,了解当前数据库有哪些帐号是个好习惯。查询所有可用帐号的 SQL 语句如下:
SELECT Host, User FROM mysql.user;
这个查询语句会返回以下格式的结果:
+-----------+---------------+
| Host | User |
+-----------+---------------+
| % | root |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+---------------+
Host
代表了允许帐号连接的来源地址。localhost
表示只允许本地登陆。%
表示可以从任何来源地址登陆。User
是帐号名称。
把 SELECT
后面的 Host, User
改成 *
可以查询帐号更多权限方面的信息。不过更简单,也更直观的查询方式如下:
SHOW GRANTS FOR root;
root
是用户名,查询哪个帐号就输入对应的帐号名。
创建帐号
创建帐号最简单的语句格式如下:
CREATE USER username;
username
就是要创建的帐号名。比如我要创建一个以 zzxworld
为用户名的帐号,语句就是这样的:
CREATE USER zzxworld;
使用这个语句创建的帐号 Host 为 %
,密码为空。如果要在创建帐号的同时就指定可以连接的 Host,并设置指定密码,完整的语句格式如下:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
username
是要创建的帐号名,host
是允许连接的地址,password
是要设置的明文密码。
帐号授权
上面创建好的帐号没有指定任何数据库权限,所以啥也做不了。为帐号授予数据库权限的语句格式如下:
GRANT privileges ON dbname.tablename TO 'username'@'host';
这条语句中的关键点有点多,分别说明一下:
privileges
是要赋予帐号的操作权限。它有很多个预定义的可选值,比如允许查询操作的SELECT
,或是允许插入操作的INSERT
,或是更新奥做UPDATE
等。具体可以通过查询官方文档 Summary of Available Privileges 来了解。比较省事的选择是使用ALL
,代表所有操作权限。dbname.tablename
是允许帐号操作的数据库和表。可以使用*
范围符号,代表所有数据库或数据表,比如*.*
。针对单独创建的帐号,一般是使用dbname.*
的方式,让帐号可以操作指定数据库的所有表。'username'@'host'
是帐号名称和主机名。这里主要要注意host
,与上面创建帐号的步骤有关。否则可能会提示找不到匹配的用户。
修改帐号密码
修改指定帐号的密码:
SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
'username'@'host'
注意 host,newpassword
为明文密码。
省略 FOR
语句后的帐号信息就可以修改当前登录用户的:
SET PASSWORD = PASSWORD("newpassword");
创建授权一条龙
以上是分步操作步骤,如果图简便,使用 GRANT
授权语句可以实现帐号创建授权一条龙操作:
GRANT privileges ON dbname.tablename TO 'username'@'host' IDENTIFIED BY 'password';
语句中的参数请参照上面授权解释部分。唯一的不同就是后面多出来的 IDENTIFIED BY 'password'
语句。
如果帐号已存在,执行这条语句的效果就是修改用户密码。所以这条语句也可以理解为创建、授权、密码修改一条龙操作。
撤销帐号权限
撤销帐号权限的语句格式:
REVOKE privilege ON dbname.tablename FROM 'username'@'host';
这条语句中的取值关键点和上面授权语句相似,这里就不再赘述。我个人觉得这个语句比较有价值的操作是配合授权语句来搭配实现一些精细化的权限操作。
比如在授权语句中,给帐号的权限是 ALL
,在这里再单独撤销 DELETE
的权限。这样可以实现防止帐号删除数据,但又保留其他正常操作权限的功能。
删除帐号
删除帐号的语句格式:
DROP USER 'username'@'host';
刷新授权
FLUSH PRIVILEGES;
刷新授权是个看起来很重要,但其实没必要用的语句。前提是只通过上面列举的语句来操作帐号,而不是直接使用 SQL 修改 mysql.user 表。