21、MySQL数据库账户及授权
1、登录账户管理
(1)查看用户信息
用户信息存放在 mysql
数据库下的 user
表( MySQL
服务下存在一个系统自带的 mysql
数据库)。
use mysql ;
show tables;
(2)查看一下 user
表结构
desc user;
或者
describe user;
(3)查看密码信息
密码信息: 经过加密后的密码信息
select user,host,authentication_string from user;
2、新建登录账户
注意: MySQL8版本中新增了一个 system_user
帐户类型,由于 root
用户没有 SYSTEM_USER
权限,然后对其他账户进行操作时,有可能会出现如下错误。
给root账户添加 system_user
权限即可:
grant system_user on *.* to 'root';
新建登录账户:
语法: CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
参数说明:
username: 创建的用户名
localhost: 指定该用户在哪个主机上可以登陆,如果是本地用户可用 localhost
,如果想让该用户可以从任意远程主机登陆,可以使用通配符 %
。
password: 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器。
# 新建test账户,密码为test.允许登录的主机localhost
CREATE USER 'test'@'localhost' IDENTIFIED BY 'test';
3、登录用户用户名的更改
语法: RENAME USER '旧的用户名'@'旧的主机地址' TO '新的用户名'@'新的主机地址';
RENAME USER 'yangwenhao'@'%' TO 'mayan'@'%';
4、删除登录账户
语法:
drop user '用户名'@'登录主机地址';
5、查看当前登录账户
语法:
select user();
6、修改账户密码
(1)普通账户修改自身
MySQL8版本相对于旧版本有些不同之处。普通账户修改自身登录密码的时候用到 REPLACE
关键字,进行旧密码验证。
语法:
ALTER USER USER() IDENTIFIED BY '新密码' REPLACE '旧密码';
(2)root账户修改自身及其他账户
语法:
ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';
从上面的图片可以看出, root
修改其他账户密码的时候不需要 REPLACE
关键字校验旧密码。REPLACE
关键字只适用于普通账户修改自身密码 的时候。
拓展:
MySQL 8.0中是可以指定密码的加密方式(默认:caching_sha2_password)。
旧版本的加密方式: mysql_native_password
新版本的加密方式: caching_sha2_password
ALTER USER 'mayan'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
7、root账户密码忘记
(1)关闭mysql服务
systemctl stop mysqld.service
(2)启动mysql服务
mysqld --user=root --skip-grant-tables
(3)查看mysql服务状态
systemctl status mysqld
(4)登录MySQL数据库
mysql -hlocalhost -P3306 -uroot -p
(5)登录以后查看mysql.user表
SELECT host, user, plugin, authentication_string FROM user;
(6)删除root用户
delete from mysql.user where user=’root’;
flush privileges;
commit;
(7)新建root用户
create user root;
(8)给root用户设置密码
alter user 'root'@'%' identified by '新密码';
(9)给root用户赋权
grant all on *.* to 'root'@'%';
(10)更新root用户的给其他用户赋权的权限
此时,给其他用户进行赋权操作,会报错,显示root用户没有授权权限。 mysql.user
表里面的 Grant_priv
字段的值为 N ,接下来要把这个字段的值更新为 Y 。
update mysql.user set Grant_priv='Y' where user='root';
8、账户授权
语法:
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'来源地址' [IDENTIFIED BY '密码'];
GRANT privileges ON databasename.tablename TO 'username'@'localhost'
GRANT ALL ON *.*TO 'test'@'host';
参数说明:
privileges: 用户的操作权限,如 SELECT
, INSERT
, UPDATE
,CREATE
等,如果要授予所有的权限则使用 ALL
。
databasename: 数据库名,如果 *
代表所有数据库。
tablename: 表名,如果 *
代表所有数据表。
localhost: 指定该用户在哪个主机上可以登陆,如果是本地用户可用 localhost
,如果想让该用户可以从任意远程主机登陆,可以使用通配符 %
。
拓展:
常见的用户权限
权限 | 权限说明 | 权限级别 |
---|---|---|
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 | 创建用户的权限 | 服务器管理 |
RELOAD | 执行 flush privileges, refresh, reload 等刷新命令的权限 | 服务器管理 |
PROCESS | 查看进程的权限 | 服务器管理 |
REPLICATION CLIENT | 查看主从服务器状态的权限 | 服务器管理 |
REPLICATION SLAVE | 主从复制的权限 | 服务器管理 |
SHOW DATABASES | 查看数据库的权限 | 服务器管理 |
SHUTDOWN | 关闭数据库的权限 | 服务器管理 |
SUPER | 超级权限 | 服务器管理 |
ALL [PRIVILEGES] | 所有权限 | |
USAGE | 没有任何权限 |
9、查看账户权限
(1)查看当前登录账户
SHOW GRANTS;
(2)查看其他账户
语法:
SHOW GRANTS FOR 'username'@'登录主机';
10、撤销权限
语法:
revoke 权限列表/ALL on 库名.表名 from '用户名'@'来源地址';
例子:
revoke ALL on *.* from 'mayan'@'%';
11、远程登录MySQL
语法:
mysql -u 用户名 -p[密码] -h 目标IP/主机名 -P 端口号
例子:
mysql -h192.168.85.131 -P3306 -umayan -p
12、刷新权限信息
FLUSH PRIVILEGES;
刷新权限信息,使其立即生效。