入门MySQL——用户与权限
前言:
前面几篇文章为大家介绍了各种SQL语法的使用,本篇文章将主要介绍MySQL用户及权限相关知识,如果你不是DBA的话可能平时用的不多,但是了解下也是好处多多。
1.创建用户
官方推荐创建语法为:
CREATE USER [IF NOT EXISTS]
user [auth_option] [, user [auth_option]] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH resource_option [resource_option] ...]
[password_option | lock_option] ...
user:
(see Section 6.2.4, “Specifying Account Names”)
auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin AS 'auth_string'
| IDENTIFIED BY PASSWORD 'auth_string'
}
tls_option: {
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
}
resource_option: {
MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
}
password_option: {
PASSWORD EXPIRE
| PASSWORD EXPIRE DEFAULT
| PASSWORD EXPIRE NEVER
| PASSWORD EXPIRE INTERVAL N DAY
}
lock_option: {
ACCOUNT LOCK
| ACCOUNT UNLOCK
}
通常我们常用的创建语法为:
CREATE USER <用户名> [ IDENTIFIED ] BY [ PASSWORD ] <口令>
语法说明如下:
1) <用户名>
指定创建用户账号,格式为 'user_name'@'host_name'。这里user_name
是用户名,host_name
为主机名,即用户连接 MySQL 时所在主机的名字。若在创建的过程中,只给出了账户的用户名,而没指定主机名,则主机名默认为“%”,表示一组主机。
2) PASSWORD
可选项,用于指定散列口令,即若使用明文设置口令,则需忽略PASSWORD
关键字;若不想以明文设置口令,且知道 PASSWORD() 函数返回给密码的散列值,则可以在口令设置语句中指定此散列值,但需要加上关键字PASSWORD
。
3) IDENTIFIED BY子句
用于指定用户账号对应的口令,若该用户账号无口令,则可省略此子句。
4) <口令>
指定用户账号的口令,在IDENTIFIED BY
关键字或PASSWOED
关键字之后。给定的口令值可以是只由字母和数字组成的明文,也可以是通过 PASSWORD() 函数得到的散列值。
使用 CREATE USER 语句应该注意以下几点:
- 如果使用 CREATE USER 语句时没有为用户指定口令,那么 MySQL 允许该用户可以不使用口令登录系统,然而从安全的角度而言,不推荐这种做法。
- 使用 CREATE USER 语句必须拥有 MySQL 中 mysql 数据库的 INSERT 权限或全局 CREATE USER 权限。
- 使用 CREATE USER 语句创建一个用户账号后,会在系统自身的 MySQL 数据库的 user 表中添加一条新记录。若创建的账户已经存在,则语句执行时会出现错误。
- 新创建的用户拥有的权限很少。他们可以登录 MySQL,只允许进行不需要权限的操作,如使用 SHOW 语句查询所有存储引擎和字符集的列表等。
- 如果两个用户具有相同的用户名和不同的主机名,MySQL 会将他们视为不同的用户,并允许为这两个用户分配不同的权限集合。
示例:
#注意:test_user@'%' 和 test_user@'localhost' 是两个不同的用户
CREATE USER 'test_user'@'%' identified by '123456';
CREATE USER 'test_user'@'localhost' identified by '123456789';
2.更改用户
更改用户信息主要包括重命名,改密码,锁定或解锁用户。下面将通过案例为大家展示这些用法:
#重命名用户
RENAME USER 'test_user'@'%' to 'test'@'%';
#修改密码
ALTER USER 'test'@'%' identified by '123456789';
#锁定或解锁用户
ALTER USER 'test'@'%' ACCOUNT LOCK;
ALTER USER 'test'@'%' ACCOUNT UNLOCK;
3.删除用户
MySQL 数据库中可以使用 DROP USER 语句来删除一个或多个用户账号以及相关的权限。
官方推荐语法格式:
DROP USER [IF EXISTS] user [, user] ...
使用 DROP USER 语句应该注意以下几点:
- DROP USER 语句可用于删除一个或多个 MySQL 账户,并撤销其原有权限。
- 使用 DROP USER 语句必须拥有 MySQL 中的 mysql 数据库的 DELETE 权限或全局 CREATE USER 权限。
- 在 DROP USER 语句的使用中,若没有明确地给出账户的主机名,则该主机名默认为“%”。
4.用户授权
当成功创建用户后,还不能执行任何操作,需要为该用户分配适当的访问权限。可以使用 SHOW GRANT FOR 语句来查询用户的权限。
注意:新创建的用户只有登录 MySQL 服务器的权限,没有任何其他权限,不能进行其他操作。
USAGE ON . 表示该用户对任何数据库和任何表都没有权限。
对于新建的 MySQL 用户,必须给它授权,可以用 GRANT 语句来实现对新建用户的授权。官方推荐语法格式:
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user [auth_option] [, user [auth_option]] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH {GRANT OPTION | resource_option} ...]
GRANT PROXY ON user
TO user [, user] ...
[WITH GRANT OPTION]
object_type: {
TABLE
| FUNCTION
| PROCEDURE
}
priv_level: {
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
}
user:
(see Section 6.2.4, “Specifying Account Names”)
auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin AS 'auth_string'
| IDENTIFIED BY PASSWORD 'auth_string'
}
tls_option: {
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
}
resource_option: {
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
}
首先大家要知道,权限是分级别的。可以授予的权限有如下几组:
- 列级别,和表中的一个具体列相关。例如,可以使用 UPDATE 语句更新表 students 中 student_name 列的值的权限。
- 表级别,和一个具体表中的所有数据相关。例如,可以使用 SELECT 语句查询表 students 的所有数据的权限。
- 数据库级别,和一个具体的数据库中的所有表相关。例如,可以在已有的数据库 mytest 中创建新表的权限。
- 全局,和 MySQL 中所有的数据库相关。例如,可以删除已有的数据库或者创建一个新的数据库的权限。
下表是所有可授予的权限及其意义:
权限 | 意义和可授予级别 |
---|---|
ALL [PRIVILEGES] |
授予在指定的访问级别的所有权限,除了 GRANT OPTION 和 PROXY 。 |
ALTER |
启用ALTER TABLE 。级别:全局,数据库,表。 |
ALTER ROUTINE |
允许更改或删除存储过程。级别:全局,数据库。 |
CREATE |
启用数据库和表创建。级别:全局,数据库,表。 |
CREATE ROUTINE |
启用存储过程创建。级别:全局,数据库。 |
CREATE TABLESPACE |
启用要创建,更改或删除的表空间和日志文件组。等级:全局。 |
CREATE TEMPORARY TABLES |
启用CREATE TEMPORARY TABLE 。级别:全局,数据库。 |
CREATE USER |
允许使用CREATE USER , DROP USER , RENAME USER ,和 REVOKE ALL PRIVILEGES 。等级:全球。 |
CREATE VIEW |
启用要创建或更改视图。级别:全局,数据库,表。 |
DELETE |
启用DELETE 。级别:全局,数据库,表。 |
DROP |
启用要删除数据库,表和视图。级别:全局,数据库,表。 |
EVENT |
启用事件使用。级别:全局,数据库。 |
EXECUTE |
使用户能够执行存储过程。级别:全局,数据库。 |
FILE |
使用户能够使服务器读取或写入文件。等级:全局。 |
GRANT OPTION |
启用授予其他帐户或从其他帐户中删除的权限。级别:全局,数据库,表,代理。 |
INDEX |
启用要创建或删除索引。级别:全局,数据库,表。 |
INSERT |
启用INSERT 。级别:全局,数据库,表,列。 |
LOCK TABLES |
允许使用LOCK TABLES 您拥有该SELECT 权限的表。级别:全局,数据库。 |
PROCESS |
使用户能够查看所有进程SHOW PROCESSLIST 。等级:全局。 |
PROXY |
启用用户代理。级别:从用户到用户。 |
REFERENCES |
启用外键创建。级别:全局,数据库,表,列。 |
RELOAD |
启用FLUSH 操作。等级:全局。 |
REPLICATION CLIENT |
使用户可以询问主服务器或从服务器的位置。等级:全局。 |
REPLICATION SLAVE |
启用复制从属以从主服务器读取二进制日志。等级:全局。 |
SELECT |
启用SELECT 。级别:全局,数据库,表,列。 |
SHOW DATABASES |
启用SHOW DATABASES 以显示所有数据库。等级:全局。 |
SHOW VIEW |
启用SHOW CREATE VIEW 。级别:全局,数据库,表。 |
SHUTDOWN |
启用mysqladmin shutdown。等级:全局。 |
SUPER |
能够使用如其他命令 CHANGE MASTER TO , KILL , PURGE BINARY LOGS , SET GLOBAL ,和中mysqladmin的调试命令。等级:全局。 |
TRIGGER |
启用触发操作。级别:全局,数据库,表。 |
UPDATE |
启用UPDATE 。级别:全局,数据库,表,列。 |
USAGE |
“ no privileges ”的同义词 |
其实grant语句可以直接创建用户并授权,这里建议大家先用create user语句创建好用户之后再单独进行授权。下面我将用示例为大家展示如何授权:
#全局权限
GRANT super,select on *.* to 'test_user'@'%';
#库权限
GRANT select,insert,update,delete,create,alter,execute on `testdb`.* to 'test_user'@'%';
#表权限
GRANT select,insert on `testdb`.tb to 'test_user'@'%';
#列权限
GRANT select (col1), insert (col1, col2) ON `testdb`.mytbl to 'test_user'@'%';
5.回收权限
在MySQL中,可以使用 REVOKE 语句回收一个用户的权限,此用户不会被删除。
REVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user [, user] ...
REVOKE ALL [PRIVILEGES], GRANT OPTION
FROM user [, user] ...
语法说明如下:
- REVOKE 语法和 GRANT 语句的语法格式相似,但具有相反的效果。
- 第一种语法格式用于回收某些特定的权限。
- 第二种语法格式用于回收特定用户的所有权限。
- 要使用 REVOKE 语句,必须拥有 MySQL 数据库的全局 CREATE USER 权限或 UPDATE 权限。
一般情况下我们先会使用show grants语法查询该用户的权限,如果发现权限过大,会用revoke语法回收权限。示例如下:
#查看用户权限
mysql> show grants for 'test_user'@'%';
+-----------------------------------------------------------------------------------------------------+
| Grants for test_user@% |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test_user'@'%' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, EXECUTE ON `testdb`.* TO 'test_user'@'%' |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
#发现权限过大,想回收drop,alter权限 则可以这样回收:
REVOKE drop,alter on `testdb`.* from 'test_user'@'%';
总结:
本篇文章为大家介绍了如何创建,更改,删除用户以及如何授于和回收权限。希望大家能对MySQL中用户管理这一块能有更深的认识。入门MySQL系列文章写了好几篇了,一开始并没有想好写多少篇的准备,可能逻辑也不太合理,还是感谢大家的阅读。最后一篇打算写备份与恢复相关内容,大家期待一下哦!
入门MySQL——用户与权限的更多相关文章
- Mysql 用户,权限管理的几点理解。
前两天项目数据库要移植到mysql,为此临时抓了几天很久没用的mysql. 公司的数据库比较简单,从oracle迁移到mysql很简单,但是,中间的权限管理让我感觉既简单又复杂..简单是因为网上关于m ...
- mysql 用户及权限管理 小结
MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL 命令行模式下输入如下命 ...
- MySQL Study之--MySQL用户及权限管理
MySQL Study之--MySQL用户及权限管理 MySQLserver通过MySQL权限表来控制用户对数据库的訪问.MySQL权限表存放在mysql数据库里.由mysql_install ...
- 如何给mysql用户分配权限+增、删、改、查mysql用户
在mysql中用户权限是一个很重析 参数,因为台mysql服务器中会有大量的用户,每个用户的权限需要不一样的,下面我来介绍如何给mysql用户分配权限吧,有需要了解的朋友可参考. 1,Mysql下创建 ...
- MySQL用户与权限管理
执行mysql select 查询报错: SELECT command denied to user 'root'@'localhost' for table "xxx" 问题原因 ...
- MySql 用户 及权限操作
bin/msyql -h host -u user -p bin/mysql -u mysql -p 本地登录 如无密码按回车直接进入mySql bin/mysqladmin -u roo ...
- mysql用户管理,权限管理
mysql权限 相关操作: 授予的权限分为四组: 列权限:和表中的一个具体列相关,例如:使用update 语句更新test表中name 列的值 表权限:和一个具体的表的所有数据相关,例如:使用 sel ...
- mysql用户和权限管理
用户和权限管理 Information about account privileges is stored in the user, db, host, tables_priv, columns_p ...
- mysql 用户管理 权限控制
添加用户 insert into mysql.user(Host,User,Password) values("%","shenen",password(&qu ...
随机推荐
- python 2.7 - 3.5 升级之路 (一) : 准备阶段开发环境 -- pip3, vitualEnv, pycharm
背景 由于之前项目采用的版本是Python2.7, 考虑到Python 2.7 到明年(2020年后将会停止更新),以及为了更好的适应中文和拥抱新的特性.我们决定将其从python 2 升级到最新的 ...
- Error:(949) Multiple substitutions specified in non-positional format; Android格式化string.xml
string.xml问题代码 <string name="msg">书名:%s\n价格:%d</string> 异常信息 Error:(949) Multi ...
- [剑指offer] 1. 二维数组中的的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- vue.js带复选框表单的增删改查
近段时间由于公司项目要求,前端开始使用VUE框架进行开发,最近刚开始学习,做了一个表单的增删改查,和大家分享一下. 页面模型代码设计如下 <template> <div id=&qu ...
- 手撸PHP数据库连接
最近这个月过得确实有点狼狈....不停地复习,看书..终于到今天为止考完了2科了.能让我好好地写写博客了..前段时间的PHP课设我多学了点东西,在我们一般老师讲的php连接数据库方面做了一些优化.前段 ...
- Linux 文件系统相关的基本概念
本文介绍 Linux 文件系统相关的基本概念. 硬盘的物理组成 盘片硬盘其实是由单个或多个圆形的盘片组成的,按照盘片能够容纳的数据量,分为单盘(一个硬盘里面只有一个盘片)或多盘(一个硬盘里面有多个盘片 ...
- 前端笔记之React(五)Redux深入浅出
一.Redux整体感知 Redux是JavaScript状态管理容器,提供了可被预测状态的状态管理容器.来自于Flux思想,Facebook基于Flux思想,在2015年推出Redux库. 中文网站: ...
- 使用request获取访问者的真实IP
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
- .net开源生态,WTM与NCC
天下大势,分久必合,合久必分.改朝换代都如花开花谢,过眼云烟,更别提开发语言的更迭了. 我们所坚持的,只是那最初的感动,那“只是在人群中多看了你一眼”的惊艳.三十年河东,三十年河西,不忘初心,方得始终 ...
- 用CSS来定义<p>标签,要求实现以下效果:字体颜色再IE6下为黑色,IE7下为红色,IE8下为绿色,其他浏览器下为黄色。
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name=&qu ...