本来这一篇应该放在安装之后说的,但是当时没想起来,直到昨天我安装软件需要用到数据库,我才想起来。今天赶紧补上,话不多说。开干!
MySQL账户管理
MySQL中的账户管理主要是对连接MySQL服务的账户做出管理,判断是否为合法账户。 如果合法,可根据相应权限访问指定的数据库。
1.MySQL中的权限表
- 可以通过以下几条语句来查看权限表
mysql> show databases; mysql> use mysql; mysql> show tables; #具体内容为查看都有哪些数据库,进入mysql数据库,查看都有哪些数据表。
- 以下列举几个与用户和权限相关的表
user表:存储连接MySQL服务的账户信息,全局有效 db表:存储用户对某个具体数据库的操作权限 tables_priv:存储用户对某个数据表的操作权限 columns_priv:存储用户真数据表中某列的操作权限 procs_priv表:存储用户对存储过程和函数的操作权限 password_history:存储用户密码历史更改记录
- 如果还想查看更多信息,请参考官方文档:
https://dev.mysql.com/doc/refman/8.0/en/grant-tables.html
2.创建普通用户
2.1.使用CREATE USER语句创建
注意:创建用户时,当前登录的用户需要有相应的权限
- 创建一个名为张四的MySQL用户,主机名为localhost
mysql> create user 'zhangsi'@'localhost'; Query OK, 0 rows affected (0.05 sec)
- 查看刚创建的用户信息
mysql> select -> host,user,authentication_string -> from mysql.user -> where user = 'zhangsi'; +-----------+---------+-----------------------+ | host | user | authentication_string | +-----------+---------+-----------------------+ | localhost | zhangsi | | +-----------+---------+-----------------------+ 1 row in set (0.00 sec)
注:以上举例只为演示创建用户过程,没有设置密码,没有权限
- 支持创建用户在某个IP段内可连接MySQL数据库
mysql> create user 'lisan'@'192.168.10.%';
- 当想让所有人都可以连接MySQL数据库,语句如下(生产中不要这样)
mysql> create user 'wangliu';
- 创建MySQL用户时,指定密码
mysql> create user 'yyang'@'localhost' identified by '123123'; Query OK, 0 rows affected (0.02 sec)
当然,有密码时查看用户信息的时候看到的密码是一串密文
- MySQL支持使用密文作为密码。这个这个这个。。。
mysql> select host,user,authentication_string from mysql.user where user = 'yyang'; +-----------+-------+------------------------------------------------------------------------+ | host | user | authentication_string | +-----------+-------+------------------------------------------------------------------------+ | localhost | yyang | $A$005$CojF+TUd84E)/K~sJr8lv.a1Yyxottw28XsZc2gUkMa4NyPmEG/uoovIxM/ | +-----------+-------+------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> create user 'yang'@'192.168.10.%' identified by '$A$005$CojF+TUd84E)/K~sJr8lv.a1Yyxottw28XsZc2gUkMa4NyPmEG/uoovIxM/'; Query OK, 0 rows affected (0.01 sec) #看明白没,就是先查看yyang用户的密文密码, #然后创建yang用户时使用密文密码, #当然当使用 yang账户登录MySQL时输入的密码还是‘123123’
- 创建用户指定插件认证方式
mysql> create user 'zhangsan'@'localhost' -> identified with -> mysql_native_password by '123123'; Query OK, 0 rows affected (0.01 sec)
2.2.使用GRANT语句创建用户
注意:MySQL8.0版本不再支持GRANT语句一条命令既创建用户又完成授权 所以下面只简单列举其他版本可以使用的一条例子,详细内容就不在这里写了。 文章最后一部分会对此做出说明。
- 创建一个名为hehe的用户,并赋予所有表查的权限
mysql> grant select on *.* to 'hehe'@'localhost' identified by '123123'; # 其他的使用方法也是围绕这个语句,有兴趣的可以自己找找资料
3.为用户授权
授权使用grant语句,类似与2.2节内容
3.1.权限的层次
- 全局授权,作用与MySQL下所有数据库
GRANT ALL ON *.*
- 数据库级授权,作用与具体某个库
GRANT ALL ON 库名.*
- 数据表级别授权,作用域某个库下具体某个表
GRANT ALL ON 库名.表名
- 字段级别授权,作用于库下某个表中特定的字段
GRANT SELECT(列名称) ON 库名.表名 #以上语句为授予某库中某表的某列查看权限
- 子程序级别,作用于存储过程和函数
权限包括:GRANT ROUTINE;ALTER ROUTINE;EXECUTE;GRANT
3.2.使用grant语句为用户授权
- 授予yyang用户所有数据库执行权限,只能从本地登录
mysql> grant all privileges on *.* to yyang@localhost; Query OK, 0 rows affected (0.01 sec)
- 查看yyang用户所拥有权限
mysql> select * from mysql.user where user = 'yyang' and host = 'localhost' \G # 内容太多,就不贴过来了,发现拥有了除grant外的大部分权限
- 为yyang用户赋予grant权限
mysql> grant all privileges on *.* to yyang@localhost with grant option; Query OK, 0 rows affected (0.03 sec)
- 权限一般越小越好,通常我们会用以下几个常用权限
INSERT DELETE UPDATE SELECT #增、删、改、查
- 数据库管理权限
SUPER PROCESS FILE #注:以上权限不能指定某个数据库,不然会报错 #尽量不要为普通用户授权以上权限
4.查看用户权限
可以使用SHOW GRANT FOR语句查看用户权限
4.1.使用SHOW GRANT FOR语句查看用户权限
- 例,查看yyang用户权限
mysql> show grants for yyang@localhost \G *************************** 1. row *************************** Grants for yyang@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `yyang`@`localhost` WITH GRANT OPTION 。。。 。。。 # 后边内容就不贴了
4.2.通过查询mysql.user表查看用户权限
- 例
mysql> select * from mysql.user where user = 'yyang' and host = 'localhost' \G *************************** 1. row *************************** Host: localhost User: yyang Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y 。。。 。。。
5.修改用户权限
此部分内容与标题4内容类似
6.撤销用户权限
使用REVOKE语句撤销用户权限
- 例:撤销yyang用户对所有数据库及表的删除权限
mysql> revoke delete on *.* from 'yyang'@'localhost'; Query OK, 0 rows affected (0.01 sec)
- REVOKE语句不能撤销用户的USAGE权限,即使语句执行成功,依然无效。
7.修改用户密码
支持使用mysqladmin命令修改密码,也可以使用SET PASSWORD语句修改密码,还有其他方式就不说了
- 使用mysqladmin修改密码
[root@centos7 ~]# mysqladmin -u yyang -h localhost -p password "yyang" Enter password: 输入原密码 [root@centos7 ~]# mysql -uyyang -pyyang mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 396 Server version: 8.0.23 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. 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>
- 使用SET PASSWORD语句修改密码
mysql> set password for 'yyang'@'localhost' = password('123123'); #注:这条命令在8版本中使用失败,网上说是版本太新的原因 #是不是这个原因我也不清楚,有兴趣可以自己找找
- 可以使用下列这条修改
mysql> alter user 'yyang'@'localhost' identified by '123123'; Query OK, 0 rows affected (0.01 sec)
8.忘记root密码怎么办?
- 修改配置文件
- 编辑
my.conf
文件,在[mysqld]
下添加以下配置
skip-grant-tables=1
- 重启MySQL数据库
systemctl restart mysqld
- 登录数据库
[root@centos7 ~]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 7 Server version: 8.0.23 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. 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> #注:密码那里直接回车
- 修改root密码。
#5.7以下修改密码 mysql> update mysql.user set password=password('123456') where user='root' and host='localhost';
#8.0版本修改密码 #首先重新重新加载授权表 mysql> flush privileges; Query OK, 0 rows affected (0.02 sec) #然后修改root密码 mysql> alter user 'root'@'localhost' identified by '123456'; Query OK, 0 rows affected (0.01 sec)
- 退出MySQL,删除
my.cnf
文件中添加的配置,重启
vim /etc/my.cnf systemctl restart mysqld
- 使用新密码登录
[root@centos7 ~]# mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.23 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. 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>
9.删除用户
9.1.使用DROP USER语句删除用户
- 首先查看都有哪些用户
mysql> select user,host from mysql.user; +------------------+--------------+ | user | host | +------------------+--------------+ | yang | 192.168.10.% | | zabbix | 192.168.10.% | | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | | yyang | localhost | | zhangsan | localhost | | zhangsi | localhost | +------------------+--------------+ 9 rows in set (0.00 sec)
- 删除zhangsi用户
mysql> drop user 'zhangsi'@'localhost'; Query OK, 0 rows affected (0.02 sec)
- 再次查看,发现zhangsi用户已删除
mysql> select user,host from mysql.user; +------------------+--------------+ | user | host | +------------------+--------------+ | yang | 192.168.10.% | | zabbix | 192.168.10.% | | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | | yyang | localhost | | zhangsan | localhost | +------------------+--------------+ 8 rows in set (0.00 sec)
9.2.使用DELETE语句删除用户
mysql> delete from mysql.user where user = 'zhangsan' and host = 'localhost'; Query OK, 1 row affected (0.01 sec)
10.MySQL8.0中一些变化
10.1.创建用户与授权
- 8.0中不能使用
grant
语句创建并授权用户 - 只能是先
create user
创建,然后grant
授权
10.2.认证插件更新
- 8.0中默认身份插件为
caching_sha2_password
代替了之前的mysql_native_password
。 - 可通过
show variables like 'default_authentication%';
查看
10.3.密码管理
password_hostory=n
表示新密码不能和近n次使用的密码相同password_reuse_interval=n
按日期,表示新密码不能与n天内使用的密码相同password_require_current=ON
表示修改密码,需要提供当前密码- 查看密码重用策略
show variables like 'password%';
就到这吧,这篇不是一天写完的,有点多,所有中途可以有的地方显得比较乱。见谅~