MySQL 权限系统保证所有的用户只执行允许做的事情。当连接 MySQL 服务器时,用户的身份由用户从那儿连接的主机和用户指定的用户名来决定。连接后发出请求后,系统根据用户的身份和用户想做什么来授予权限。MySQL 中采用用户名 + 主机名来识别用户的身份。例如,从 abc.com 连接的用户 root 不一定和从 bcd.com 连接的 root 是同一个人。MySQL 通过允许你区分在不同的主机上碰巧有同样名字的用户来处理它,可以对 root 从 abc.com 进行的连接授与一个权限集,而为 root 从 bcd.com 的连接授予一个不同的权限集。MySQL存取控制包含2个阶段: ♞ 阶段1:服务器检查是否允许你连接。 ♞ 阶段2:假定能连接,服务器检查你发出的每个请求。看你是否有足够的权限实施它。
当 MySQL 启动时,所有授权表的内容被读进内存并且从此时生效。当服务器注意到授权表被改变了时,对于现存的客户端连接有如下影响:
♞ 表和列权限在客户端的下一次请求时生效。
♞ 数据库权限改变在下一个 use db_name命 令生效。
♞ 全局权限的改变和密码改变在下一次客户端连接时生效。
如果用 GRANT、REVOKE 或 SET PASSWORD 对授权表进行修改,服务器会立即重新将授权表载入内存。如果手动地修改授权表(使用 INSERT、UPDATE 或 DELETE 等等),应该重启 MySQL 或者执行 flush privileges;
告诉服务器重新装载授权表,否则更改将不会生效。
# 位于 mysql 数据库 user 表中
mysql> select user as 用户名, host as 主机 from mysql.user;
+---------------+-----------+
| 用户名 | 主机 |
+---------------+-----------+
| root | % |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
4 rows in set (0.14 sec)
☞ 语法
# 主机名和密码可以省略
create user username[@host] [identified by 'password'];
☞ 注意
① 主机名默认值为 %,表示这个用户可以从任何主机连接 mysql 服务器 ② 密码可以省略,表示无密码登录
☞ 示例
# 用户 test 可以从 47.103.4 网段登录 MySQL 服务
mysql> create user 'test'@'47.103.4.%' identified by '123456';
Query OK, 0 rows affected (21.86 sec)
mysql> select user as 用户名, host as 主机 from mysql.user;
+---------------+------------+
| 用户名 | 主机 |
+---------------+------------+
| root | % |
| test | 47.103.4.% |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+------------+
5 rows in set (0.12 sec)
☞ 语法
# 通过管理员修改密码
set password for username@host = password(password);
# 修改当前用户密码
set password = password(password);
# 修改用户表数据,此方式需要刷新才能生效,注意:新版本 authentication_string 字段表示密码
update mysql.user set password = password('password') where user = 'username' and host = 'host';
flush privileges;
☞ 示例
mysql> set password for 'test'@'47.103.4.%' = password('654321');
Query OK, 0 rows affected (1.41 sec)
☞ 语法
# 直接删除用户
drop user username@host;
# 删除用户表数据从而删除用户
delete from mysql.user where user='username' and host='host';
☞ 示例
mysql> delete from mysql.user where user='test' and host='47.103.4.%';
Query OK, 1 row affected (0.08 sec)
☞ 语法
grant privileges on database.table to 'username'@'host' [with grant option]
☞ 注意
① priveleges (权限列表),可以是 all,表示所有权限,也可以是 select、update 等权限,多个权限之间用逗号分开。
② on 用来指定权限针对哪些库和表,格式为 数据库.表名
,点号前面用来指定数据库名,点号后面用来指定表名,*.*
表示所有数据库所有表。
③ to 表示将权限赋予某个用户, 格式为 username@host,@前面为用户名,@后面接限制的主机。
④ with grant option 这个选项表示该用户可以将自己拥有的权限授权给别人。
⑤ 使用 grant 重复给用户添加权限,权限叠加,比如你先给用户添加一个 select 权限,然后又给用户添加一个 insert 权限,那么该用户就同时拥有了 select 和 insert 权限。
☞ 示例
# test 用户只能查询 mysql.user 表的 user, host 字段
mysql> grant select(user,host) on mysql.user to 'test'@'47.103.4.%';
Query OK, 0 rows affected (0.46 sec)
☞ 语法
# 查看指定用户权限
show grants for 'username'@'host'
# 查看当前用户权限
show grants;
☞ 示例
mysql> show grants for 'test'@'47.103.4.%';
+--------------------------------------------------------------------+
| Grants for test@47.103.4.% |
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'47.103.4.%' |
| GRANT SELECT (host, user) ON `mysql`.`user` TO 'test'@'47.103.4.%' |
+--------------------------------------------------------------------+
2 rows in set (0.12 sec)
mysql> show grants;
+-------------------------------------------------------------+
| Grants for root@% |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
1 row in set (0.10 sec)
☞ 语法
revoke privileges ON database.table FROM 'username'@'host';
☞ 语法
mysql> revoke select(user) on mysql.user from 'test'@'47.103.4.%';
Query OK, 0 rows affected (0.05 sec)
mysql> show grants for 'test'@'47.103.4.%';
+--------------------------------------------------------------+
| Grants for test@47.103.4.% |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'47.103.4.%' |
| GRANT SELECT (host) ON `mysql`.`user` TO 'test'@'47.103.4.%' |
+--------------------------------------------------------------+
2 rows in set (0.10 sec)
① 只授予能满足需要的最小权限,防止用户误操作,比如用户只是需要查询,那就只给 select 权限,不要给用户赋予 update、insert 或者 delete 权限。 ② 创建用户的时候限制用户的登录主机,一般是限制成指定 IP 或者内网 IP 段,为每个用户设置满足密码复杂度的密码,定期清理不需要的用户,回收权限或者删除用户。 ③ 初始化数据库的时候删除没有密码的用户,安装完数据库的时候会自动创建一些用户,这些用户默认没有密码。
① 使用管理员权限进入命令行执行 net stop mysql
停止 MySQL 服务
② 执行 mysql -skip-grant-tables
无验证启动 MySQL 服务
③ 在另一个命令行中执行 mysql
无需用户名和密码直接登录
④ 修改密码 update mysql.user set password = password('password') where user = 'username' and host = 'host';
⑤ 此时还没有完成,需要去任务管理器手动结束 mysqld 进程
⑥ 执行 net start mysql;
正常启动 MySQL 服务
⑦ 密码已经修改完成可以使用新密码登录root账户了
☞ 语法
# 备份
mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
# 还原,要进入需要还原的数据库
source 恢复文件路径