1 创建用户
1.1 create user
格式如下:
- CREATE USER 'username'@'hostname' IDENTIFIED BY 'password';
其中,username为用户名;hostname为主机,localhost指本地用户,通配符%指可以从远程主机登陆用户,如果不指定host,则默认为%;password为密码,可以为空。
例如,创建用户名为user、密码为123456的用户,主机为本地,则
- CREATE USER 'user'@'localhost' IDENTIFIED BY '123456';
创建用户名为user、密码为123456的用户,主机为192.168.1.1,则
- CREATE USER 'user'@'192.168.1.1' IDENTIFIED BY '123456';
创建用户名为user、密码为123456的用户,则
- CREATE USER 'user' IDENTIFIED BY '123456';
创建用户名为user,则
- CREATE USER user;
注:这种方式需要登录mysql控制台,且登录用户需要CREATE USER权限。
1.2 insert into mysql.user
格式如下:
- INSERT INTO mysql.user(host, user, password) VALUES(hostname, username, PASSWORD(password));
- FLUSH PRIVILEGES;
其中,mysql.user是在mysql库中存储用户信息的user表,hostname表示主机名(localhost指本地用户,通配符%指可以从远程主机登陆用户),第二个password是密码(第一个password是字段)。
例如,创建用户名为user、密码为123456的用户,则
- INSERT INTO mysql.user(host, user, password) VALUES('localhost', 'user', PASSWORD('123456'));
- FLUSH PRIVILEGES;
注:因为这种方式是手动修改数据库,如果想要这种修改立马生效,还需执行FLUSH PRIVILEGES命令刷新用户权限列表,所以需要登录的用户有SELECT、UPDATE、RELOAD三种权限。
2 修改用户权限
2.1 为用户赋予权限
在MySQL中使用GRANT命令给用户授权,如果用户不存在,GRANT会自动创建用户,并进行授权。
格式如下:
- GRANT privileges ON databases.tablename TO 'username'@'hostname' [INDENTIFIED BY ‘password’];
其中,privileges表示具体的权限名称,多个权限间通过逗号隔开;databases表示数据库,使用*表示所有数据库;tablename表示表名,使用*表示所有表;username表示用户名;hostname表示主机名;password表示密码,[]中用于创建用户时为用户添加密码。
2.2 常用权限
- 表数据: select, update, delete, insert
- 表结构: create, alert, drop
- 外键: references
- 创建临时表: create temporary tables
- 操作索引: index
- 视图: create view, show view
- 存储过程: create routine, alert routine, execute
- 所有权限: all
2.3 权限表
- 存储过程权限表: mysql.procs_priv
- 列权限表: mysql.columns_priv
- 表格权限表: mysql.tables_priv
- 用户权限表: informationschema.userprivileges(字段grantee为授权者, 字段privilege_type为权限名称)
- 用户信息及权限: mysql.user(后缀为priv的字段的值与userprivileges的privilege_type一一对应)
2.4 查看用户权限
查看用户权限可以通过查询上面的权限表的数据进行查询,或者通过show grants命令进行查询,格式如下:
- SHOW GRANTS [FOR username@hostname]
其中,username表示用户名,hostname表示主机名,[]中的内容可以省略,是查询当前登录用户的权限。
2.5 撤销权限
可以通过命令撤销某用户的某种权限,格式如下:
- REVOKE privileges ON databease.table FROM username@hostname
撤销权限与赋予权限命令相似,区别在于将TO改为FROM。
3 修改用户密码
3.1 mysqladmin命令
格式如下:
- mysqladmin -u USER -p password NEW_PASSWORD
其中,USER为用户名,NEW_PASSWORD为新密码。
该命令直接在命令行中执行,回车之后会提示输入原密码,输入正确后即可修改。
例如,设置用户user的密码为123456,原密码为654321,则
- mysqladmin -u user -p password 123456
- Enter password:******
注:上面的******是自己输入的654321。
3.2 SET PASSWORD 语句
格式如下:
- SET PASSWORD FOR username@hostname=PASSWORD('password');
其中,username为用户名,hostname为指定的主机,password为新密码。
这种方式需要先登入mysql控制台,即通过正确用户名、密码登入。
例如:设置在localhost上的用户user的密码为123456,则
- SET PASSWORD FOR user@localhost=PASSWORD('123456');
注:通过这种方式修改自己的密码,可以只有基本的USAGE权限;如果修改其他人的密码,需要对mysql数据库存在UPDATE权限。
3.3 UPDATE user 语句
格式如下:
- UPDATE mysql.user SET password=PASSWORD('password') WHERE user='username' and host='hostname';
- FLUSH PRIVILEGES;
其中,mysql.user表示mysql库中的user表,user表示字段为user,username为用户名,password为新密码,hostname为指定的主机。
这种方式需要先登入mysql控制台,即通过正确用户名、密码登入。
例如:设置用户user的密码为123456,则
- UPDATE mysql.user SET password=PASSWORD('123456') WHERE user='user' and host='localhost';
- FLUSH PRIVILEGES;
注:因为这种方式是手动修改数据库,如果想要这种修改立马生效,还需执行FLUSH PRIVILEGES命令刷新用户权限列表,所以需要登录的用户有SELECT、UPDATE、RELOAD三种权限。
4 删除用户
在mysql中,可以通过直接删除mysql.user表中的数据删除用户,也可以通过drop命令删除用户,与创建用户的操作类似。
4.1 DELETE FROM mysql.user
格式如下:
- DELETE FROM mysql.user WHERE user='username' and host='hostname'
其中,mysql.user表示mysql库中的user表,user表示字段为user,username为用户名,hostname为指定的主机。
4.2 DROP USER username
格式如下:
- DROP USER 'username'@'hostname'
其中,username为用户名,hostname为指定的主机。
一、MySQL权限简介
关于mysql的权限简单的理解就是mysql允许你做你全力以内的事情,不可以越界。比如只允许你执行select操作,那么你就不能执行update操作。只允许你从某台机器上连接mysql,那么你就不能从除那台机器以外的其他机器连接mysql。
那么Mysql的权限是如何实现的呢?这就要说到mysql的两阶段验证,下面详细介绍:第一阶段:服务器首先会检查你是否允许连接。因为创建用户的时候会加上主机限制,可以限制成本地、某个IP、某个IP段、以及任何地方等,只允许你从配置的指定地方登陆。第二阶段:如果你能连接,Mysql会检查你发出的每个请求,看你是否有足够的权限实施它。比如你要更新某个表、或者查询某个表,Mysql会查看你对哪个表或者某个列是否有权限。再比如,你要运行某个存储过程,Mysql会检查你对存储过程是否有执行权限等。
MYSQL到底都有哪些权限呢?从官网复制一个表来看看:
权限 |
权限级别 |
权限说明 |
CREATE |
数据库、表或索引 |
创建数据库、表或索引权限 |
DROP |
数据库或表 |
删除数据库或表权限 |
GRANT OPTION |
数据库、表或保存的程序 |
赋予权限选项 |
REFERENCES |
数据库或表 |
|
ALTER |
表 |
更改表,比如添加字段、索引等 |
DELETE |
表 |
删除数据权限 |
INDEX |
表 |
索引权限 |
INSERT |
表 |
插入权限 |
SELECT |
表 |
查询权限 |
UPDATE |
表 |
更新权限 |
CREATE VIEW |
视图 |
创建视图权限 |
SHOW VIEW |
视图 |
查看视图权限 |
ALTER ROUTINE |
存储过程 |
更改存储过程权限 |
CREATE ROUTINE |
存储过程 |
创建存储过程权限 |
EXECUTE |
存储过程 |
执行存储过程权限 |
FILE |
服务器主机上的文件访问 |
文件访问权限 |
CREATE TEMPORARY TABLES |
服务器管理 |
创建临时表权限 |
LOCK TABLES |
服务器管理 |
锁表权限 |
CREATE USER |
服务器管理 |
创建用户权限 |
PROCESS |
服务器管理 |
查看进程权限 |
RELOAD |
服务器管理 |
执行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的权限 |
REPLICATION CLIENT |
服务器管理 |
复制权限 |
REPLICATION SLAVE |
服务器管理 |
复制权限 |
SHOW DATABASES |
服务器管理 |
查看数据库权限 |
SHUTDOWN |
服务器管理 |
关闭数据库权限 |
SUPER |
服务器管理 |
执行kill线程权限 |
MYSQL的权限如何分布,就是针对表可以设置什么权限,针对列可以设置什么权限等等,这个可以从官方文档中的一个表来说明:
权限分布 |
可能的设置的权限 |
表权限 |
'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter' |
列权限 |
'Select', 'Insert', 'Update', 'References' |
过程权限 |
'Execute', 'Alter Routine', 'Grant' |
二、MySQL权限经验原则:
权限控制主要是出于安全因素,因此需要遵循一下几个经验原则:
1、只授予能满足需要的最小权限,防止用户干坏事。比如用户只是需要查询,那就只给select权限就可以了,不要给用户赋予update、insert或者delete权限。
2、创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段。
3、初始化数据库的时候删除没有密码的用户。安装完数据库的时候会自动创建一些用户,这些用户默认没有密码。
4、为每个用户设置满足密码复杂度的密码。
5、定期清理不需要的用户。回收权限或者删除用户。
三、MySQL权限实战:
1、GRANT命令使用说明:
先来看一个例子,创建一个只允许从本地登录的超级用户jack,并允许将权限赋予别的用户,密码为:jack.
mysql> grant all privileges on *.* to jack@'localhost' identified by "jack" with grant option; Query OK, 0 rows affected (0.01 sec)
GRANT命令说明:
ALL PRIVILEGES 是表示所有权限,你也可以使用select、update等权限。
ON 用来指定权限针对哪些库和表。
*.* 中前面的*号用来指定数据库名,后面的*号用来指定表名。
TO 表示将权限赋予某个用户。
jack@'localhost' 表示jack用户,@后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%允许任何地方登录,但是在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了。
IDENTIFIED BY 指定用户的登录密码。
WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。
备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个select权限,然后又给用户添加一个insert权限,那么该用户就同时拥有了select和insert权限。
2、刷新权限
使用这个命令使权限生效,尤其是你对那些权限表user、db、host等做了update或者delete更新的时候。以前遇到过使用grant后权限没有更新的情况,只要对权限做了更改就使用FLUSH PRIVILEGES命令来刷新权限。
mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)
3、查看权限
查看当前用户的权限: mysql> show grants; +---------------------------------------------------------------------+ | Grants for root@localhost | +---------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | | GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION | +---------------------------------------------------------------------+ 2 rows in set (0.00 sec) 查看某个用户的权限: mysql> show grants for 'jack'@'%'; +-----------------------------------------------------------------------------------------------------+ | Grants for jack@% | +-----------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'jack'@'%' IDENTIFIED BY PASSWORD '*9BCDC990E611B8D852EFAF1E3919AB6AC8C8A9F0' | +-----------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
4、回收权限
mysql> revoke delete on *.* from 'jack'@'localhost'; Query OK, 0 rows affected (0.01 sec)
5、删除用户
mysql> select host,user,password from user; +-----------+------+-------------------------------------------+ | host | user | password | +-----------+------+-------------------------------------------+ | localhost | root | | | rhel5.4 | root | | | 127.0.0.1 | root | | | ::1 | root | | | localhost | | | | rhel5.4 | | | | localhost | jack | *9BCDC990E611B8D852EFAF1E3919AB6AC8C8A9F0 | +-----------+------+-------------------------------------------+ 7 rows in set (0.00 sec) mysql> drop user 'jack'@'localhost'; Query OK, 0 rows affected (0.01 sec)
6、对账户重命名
mysql> rename user 'jack'@'%' to 'jim'@'%'; Query OK, 0 rows affected (0.00 sec)
7、修改密码
1、用set password命令 mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456'); Query OK, 0 rows affected (0.00 sec) 2、用mysqladmin [root@rhel5 ~]# mysqladmin -uroot -p123456 password 1234abcd 备注: 格式:mysqladmin -u用户名 -p旧密码 password 新密码 3、用update直接编辑user表 mysql> use mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> update user set PASSWORD = PASSWORD('1234abcd') where user = 'root'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 4、在丢失root密码的时候: [root@rhel5 ~]# mysqld_safe --skip-grant-tables & [1] 15953 [root@rhel5 ~]# 130911 09:35:33 mysqld_safe Logging to '/mysql/mysql5.5/data/rhel5.4.err'. 130911 09:35:33 mysqld_safe Starting mysqld daemon with databases from /mysql/mysql5.5/data [root@rhel5 ~]# mysql -u root Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 2 Server version: 5.5.22 Source distribution Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> s -------------- mysql Ver 14.14 Distrib 5.5.22, for Linux (i686) using EditLine wrapper Connection id: 2 Current database: Current user: root@ SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.5.22 Source distribution Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /tmp/mysql.sock Uptime: 36 sec Threads: 1 Questions: 5 Slow queries: 0 Opens: 23 Flush tables: 1 Open tables: 18 Queries per second avg: 0.138 -------------- mysql> use mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> update user set password = PASSWORD('123456') where user = 'root'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)