# Day02 MySQL 体系与用户管理

# 本节关键词

  • Server 三层抽象
  • 用户管理(创建、修改、锁定与删除)

# 体系

# 实例

mysqld + Master Thread + Worker Thead + MEM

# 处理流程

连接层 -> SQL层 -> Engine层

  • 连接层 mysql -uroot -p123456
1. 连接的协议:两种方式
    TCP/IP
    Socket文件
2. 用户验证功能:加载授权表,进行验证
    mysql.user
    mysql.db
    mysql.tables_priv
    mysql.columns_priv
3. 提供连接线程:为客户端提供连接
    查看前台连接    show processlist;
    查后后台线程    select * from performance_schema.threads\G;
  • SQL层 select * from t1;
1. 预处理:语法、语义、权限
2. 解析:生成解析树,AST抽象语法树
3. 优化:
    逻辑优化 -> 优化器算法,关系代数的等价转换
    物理优化 
        参考统计信息
        优化器算法
        Cost代价评估
4. 执行 执行计划 explain
  • Engine层 与磁盘交互,组织存储数据
InnoDB
1. In-Memory Structures
2. On-Disk Structures

ls -al /data/3306/data
cd aaa  # 目录
ibd2sdi stu.ibd # 文件,8.0.26自带工具可以查看,元数据+数据行

8.0 表存储方式:每张表的数据都存储在ibd
5.7 表存储方式:
    数据行 ibd
    元数据 frm + ibdata1

所以 8.0 DDL原子性、Online DDL更快速

问答:一条SQL语句,昨天执行好好的(0.01s),突然遍慢了(2min)为什么呢

统计信息不准确,不走索引造成的

统计信息记录的是,表的状态,比如表名、数据行、数据分布、索引状态信息
统计信息是MySQL定期收集的,通过一些参数指标控制,不是实时收集

# 存在相关库表
mysql.innodb_index_stats
mysql.innodb_tables_stats

# 经过命令优化
mysql> analyze table world.city;
mysql> optimize table world.city;
mysql> alter table world.city engine=innodb;

# 用户管理

# 用户功能
登录数据库
管理数据库对象

# 用户组成 包含两部分
用户名@'白名单'

白名单组成:
    %
    10.0.0.10
    10.0.0.%
    10.0.0.5%
    10.0.0.0/255.255.255.254.0
    ni-ning.com
    127.0.0.1
    db01 --> 别名
    localhost --> socket

# 用户管理
## 8.0 密码插件 with caching_sha2_password
## 5.7 密码插件 with mysql_native_password 简单的会暴力破解
select user, host, authentication_string, plugin from mysql.user;   

# 创建用户 附带密码以及密码插件
create user nining@localhost identified by '123456';
create user admin@localhost identified with mysql_native_password by '123';

# 修改用户
alter user admin@localhost identified with mysql_native_password by '123456';

# 锁定用户
alter user user1@localhost account lock;
select user, host, account_locked from mysql.user; 
alter user user1@localhost account unlock;

# 删除用户,推荐先锁定用户
drop user user1

# 忘记root密码 原理:关闭连接层验证功能
1. 关闭数据库
2. 安全方式启动数据库 mysqld_safe --skip-grant-tables --skip-networking &
3. 登录数据库 mysql
4. 刷新授权表 flush privileges;
5. 修改密码 alter user root@localhost identified with mysql_native_password by '123456';
6. 恢复正常数据库服务

# 8.0 新特性

1. 密码插件,在8.0为sha2模式,可还原为 mysql_native_password
    vim /etc/my.cfg
    default_authentication_plugin=mysql_native_password
2.8.0需要先创建user,在grant
上次更新: 10/31/2022, 5:19:53 PM