数据库核心工作程序【周二】0421 day01

中级数据库课程

1、课程介绍

1、课程定位

8k - 25k 15k - 16k

2、课程周期:

线上 15-16 全天

线上 18 -20 全天

3、课程模块

mysql的介绍和安装

mysql 体系介绍和基础管理

mysql SQL开发基础

mysql 索引原理以及应用规范

mysql 存储引擎

mysql 日志管理

mysql 备份恢复和容灾

mysql 主从复制

mysql 高可用以及读写分离

mysql 分布式架构

mysql 全面优化

nosql 缓存数据库Redis

nosql 文档数据库MongoDB

中级数据库复习以及就业指导

彩蛋:

1、数据库运维工具

2、数据库故障案例

思维导图:

数据库核心工作程序【周二】0421 day01_第1张图片

4、预习资料

简述博客笔记

bilibili视频

5、讲师介绍

郭加磊 北京邮电大学毕业

6、要求

8:50上线

预习、复习要做好

每天作业都要做好

及时发问、当天问题当天解决

2、正式课程

第一章节mysql的介绍以及规划实施
1、数据库产品时代演变

第一代数据库架构: 关系型数据库时代 RDBMS :Oracle、MSSQL、mysql

可以用一个产品去满足整个数据库业务需求

第二代数据库架构: RDBMS + NOSQL

PS:NOSQL 是一个时代

代表产品:memcache(内存数据库)、Redis(内存数据库)、MongoDB、ES、HBASE、Hadoop等

第三代数据库架构: newSQL 新型数据库架构时代

代表产品:阿里系列 RDS 、OB、polarDB

pincap :tidb

Google:spanner

2、熟悉数据库行业

定期参加数据库大会

统计搜索引擎的排名

https://db-engines.com/en/ranking

大咖说—前沿技术风向

http://www.itdks.com/

3、mysql的产品分支

Oracle mysql: C版、E版、cluster集群版

percona mysql:最接近Oracle mysql

mariadb :从5.5版本以后形成了自己的一套架构

云数据库:RDS for mysql

4、mysql企业版本选择

5.7 GA 一般选择最新的GA版

5.6

5.5

8.0 一般选择最新的GA版 即将成为主流版本(8017版本以上的)

5.6版本 2020年 10月 常规、扩展服务全部停止

5.7版本 2021年 1月份 常规服务停止

5、软件获取

https://downloads.mysql.com/archives/
数据库核心工作程序【周二】0421 day01_第2张图片
数据库核心工作程序【周二】0421 day01_第3张图片
数据库核心工作程序【周二】0421 day01_第4张图片

校验MD5值

数据库核心工作程序【周二】0421 day01_第5张图片

6、手撕mysql 5728 二进制版本规划和实施、

注意是使用二进制包的方式(解压即用)进行安装,不是编译安装

  1. 6. 手撕 MySQL 5728 二进制版本规划和实施
    
    6.1 准备Linux服务器 
    
    克隆:Centos 7.6  1核  2G  100G 虚拟机环境
    IP: 10.0.0.51/24 
    hostname : db01 
    防火墙: 关闭 
    selinux : 关闭 
    
    6.2 上传软件到指定目录
    6.2.1 创建指定目录
    mkdir -p  /data/app 
    
    6.2.2 上传软件
    mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
    
    6.2.3 解压
    并生成软连接
     ln -s  mysql-5.7.28-linux-glibc2.12-x86_64  mysql
    
    6.2.4 修改环境变量
    vim /etc/profile 
    # 添加PATH配置 
    export PATH=/data/app/mysql/bin:$PATH
    
    # 生效配置 
    source /etc/profile  
    
    mysql -V
    验证
    [root@db-01 app 23:51:52]# mysql -V
    mysql  Ver 14.14 Distrib 5.7.28, for linux-glibc2.12 (x86_64) using  EditLine wrapper
    6.2.5 清理遗留的环境 
    # 检查是否有mariadb相关软件
    [root@db01 ~]# rpm -qa|grep mariadb
    # 如果有,清理掉 
    yum remove mariadb-libs -y
    # 删掉/etc/my.cnf 已有的配置文件 
    rm -rf /etc/my.cnf
    6.2.6 安装依赖包 
    [root@db01 ~]# yum install -y libaio-devel
    6.2.7 创建相关目录、用户,并做授权
    [root@db01 ~]# mkdir -p /data/3306/data 
    [root@db01 ~]# useradd mysql 
    [root@db01 ~]# chown -R mysql.mysql /data
    6.2.8 初始化数据
    # 5.7+ 版本初始化 :
    mysqld       --initialize-insecure      --user=mysql      --basedir=/data/app/mysql        --datadir=/data/3306/data
    6.2.9 准备配置文件 
    vim /etc/my.cnf 
    
    [mysqld]
    user=mysql
    basedir=/data/app/mysql
    datadir=/data/3306/data
    socket=/tmp/mysql.sock
    [mysql]
    socket=/tmp/mysql.sock
    
    6.2.10 准备启动脚本,启动数据库
    [root@db01 data]# cp /data/app/mysql/support-files/mysql.server  /etc/init.d/mysqld 
    [root@db01 data]# chkconfig --add mysqld
    [root@db01 data]# systemctl start mysqld
    

    mysql初始化命令解释

在这里插入图片描述

有可能的报错:

1、libaio-devel 

2、[ERROR] --initialize specified but the data directory has files in it. Aborting.
rm -rf /data/3306/data/*

彩蛋面试题:

1、请你介绍你熟悉的数据库产品? 你们公司用了哪些数据库产品?

RDBMS:mysql 、Oracle、PG、MSSQL

nosql:Redis、MongoDB、ES、memcache

云数据库:RDS

2、你喜欢mysql数据库吗? 平时如何学习的?mysql需要具备哪些技能?

热爱

看官方文档、看书、视频、参加一些数据库大会。

技能:(就是数据库的学习模块)

mysql的介绍和安装

mysql 体系介绍和基础管理

mysql SQL开发基础

mysql 索引原理以及应用规范

mysql 存储引擎

mysql 日志管理

mysql 备份恢复和容灾

mysql 主从复制

mysql 高可用以及读写分离

mysql 分布式架构

mysql 全面优化

nosql 缓存数据库Redis

nosql 文档数据库MongoDB

3、 5.6 和 5.7 在初始化方面的不同?

5.6 版本:

/data/app/mysql56/scripts/mysql_install_db   --user=mysql --basedir=/data/app/mysql --datadir=/data/3306/data 

​ 初始化完成之后,启动数据库,无密码登陆

5.7 版本:

mysqld   --initialize-insecure   --user=mysql   --basedir=/data/app/mysql  --datadir=/data/3306/data

​ 初始化完成之后,启动数据库,无密码登陆

无密码时设置管理员初始密码

[root@db-01 data 02:58:23]# mysqladmin -uroot -p password 000000
Enter password:  此处回车,什么都不用写
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
[root@db-01 data 02:58:50]#
4、5.7+ 两种初始化方式

(1) --initialize-insecure (不安全)

结果: 初始化完成之后,启动数据库,无密码登陆

 mysqld   --initialize-insecure   --user=mysql   --basedir=/data/app/mysql  --datadir=/data/3306/data

结果: 初始化完成之后,启动数据库,无密码登陆

(2) --initialize (安全)

 mysqld   --initialize    --user=mysql   --basedir=/data/app/mysql  --datadir=/data/3306/data

​ 结果: 初始化完成之后,生成临时密码(4种复杂度、12位),不能用作管理数据库,需要第一次使用之前改掉这个密码。

 mysql -uroot -p
	 Enter password: 此处填写临时密码:
	 2020-04-21T06:49:15.881987Z 1 [Note] A temporary password is generated for root@localhost: +fCQiY1x:rH-
	 mysql> alter user root@'localhost' identified by '123';
	[root@db01 data]# mysql -uroot -p123

数据库核心工作程序【周二】0421 day01_第6张图片

5、什么时候使用编译安装:源码包

cmake

make

make install

测试、调试

二次开发 ----->编译安装

定制mysql------>源码包或者二进制包

定制rpm包 ------>源码包

作业:

1、部署5.6版本

上传压缩包到指定目录

mkdir  -p  /data/app
cd /data/app

检查是否已经安装过数据库服务

rpm -qa  mariadb

解压数据包

 mv mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz   /data/app/
 cd /data/app/
 tar  xf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz

创建软连接

ln -s  mysql-5.6.46-linux-glibc2.12-x86_64  mysql

修改环境变量

 vim  /etc/profile

export PATH=/data/app/mysql/bin:$PATH

生效环境变量

source /etc/profile

检验

 mysql -V

下载软件包

yum install -y  libaio-devel

创建用户

useradd mysql -M -s /sbin/nologin

创建初始化的目录

 mkdir -p  /data/3306/data

属主属组设为mysql

 chown -R  mysql.mysql  /data

编写配置文件

  vim /etc/my.cnf

[mysqld]
user=mysql
basedir=/data/app/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock

安装初始化软件

  yum -y install autoconf

初始化设置
/data/app/mysql-5.6.46-linux-glibc2.12-x86_64/scripts/mysql_install_db --user=mysql --basedir=/data/app/mysql --datadir=/data/3306/data
设置数据库为systemctl方式管理

   cp /data/app/mysql/support-files/mysql.server  /etc/init.d/mysqld
   chkconfig --add mysqld

启动数据库

systemctl start mysqld

进入数据库

mysql

2、部署8.0版本

第二章 mysql体系结构以及基础管理
1、mysql的C\S模型工作结构

数据库核心工作程序【周二】0421 day01_第7张图片

client:

自带命令

第三方工具

API

server:

TCP/IP

UNIX Socket

2、mysql的实例结构

实例:mysqld进程 +master thread +work thread(IO、SQL、purge)+预分配的内存结构

公司:boos 经理 员工 工作区域

数据库核心工作程序【周二】0421 day01_第8张图片

3、mysqld 核心程序工作

3.1 server层

3.1.1连接器 负责连接处理

3.1.2SQL层 负责SQL语句的处理

3.2 engine引擎层 和磁盘交互

数据库核心工作程序【周二】0421 day01_第9张图片
数据库核心工作程序【周二】0421 day01_第10张图片
数据库核心工作程序【周二】0421 day01_第11张图片
数据库核心工作程序【周二】0421 day01_第12张图片
数据库核心工作程序【周二】0421 day01_第13张图片

mysql核心程序工作原理

连接层:类似于linux的操作系统
作用:
1、连接协议 tcp/ip和Unix套接字socket 要开启服务才能连接
2、加载授权表 (mysql.user;mysql.db/tables_priv;mysql.cloumns_priv)用户密码验证
3、通过密码验证后生成连接线程

SQL层:负责SQL语句的处理, 类似于shell解释器 (SQL线程)
过程:
1、SQL语句语法检查,语义检查(这句话SQL到底是要查什么)
DDL: 数据库定义语言
其实就是我们在创建表时用到的一些SQL,比如说create alter drop等 DDL主要用于定义或者改变表的结构,数据类型,表之间的链接和约束等初始化工作上。
DCL:数据库控制语言
是用来设置或更改数据库用户或者角色权限的语句,包括grant deny revoke等 语句 这个比较少用到
DML: 数据操作语言
就是我们最经常用到的select update insert delete 。主要用来对数据库的数据进行一些操作
2、对象存在性 权限检查(查找对象在不在,有没有权限查看)

3、SQL语句预处理
SQL语句解析 预处理 ---->生成解析树,并统计执行代价---->统计信息存放在mysql.innodb_index-stats;mysql.innondb_table_stata中
4、优化器进行优化
根据(每种执行计划的代价评估;SQL语句的执行顺序;查询方式的选择)---->查看资源消耗情况i/o cpu 内存 ------->选择出 SQL线程认为代价最低的执行计划
5、按照执行计划执行SQL语句
得出需要的数据的具体位置(那个磁盘那个位置)----->告知个给engine层

engine层:类似于linux的文件系统 和磁盘进行交互

engine层获取的是16进制的数据,要是直接返还给用户,用户看不懂的,所有engine层会把数据返回给SQL语句层,SQL层会生成表格的形式返还给用户,显示到界面上。

PS:那个线程接受了用户发来的SQL语句,到时候返回的时候也是由该线程返回给用户

不同线程处理是并行处理 同一个线程是串行处理
实例组成(三部分):进程 线程 内存块

内存的使用分配

在这里插入图片描述

总结:

其实客户端发送一条查询语句到mysql服务器,服务器会先检查查询缓存,如果命中了缓存,则立刻返回给存储在缓存中的结果。否则,服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划,按照执行计划执行SQL语句,告知engine层,engine层与磁盘做交互,获取数据交给SQL层,SQL生成表格格式返回给用户

查询mysql用户的密码

mysql> select  user,host,authentication_string  from  mysql.user;
+---------------+-----------+-------------------------------------------+
| user          | host      | authentication_string                     |
+---------------+-----------+-------------------------------------------+
| root          | localhost | *032197AE5731D4664921A6CCAC7CFCE6A0698693 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+---------------+-----------+-------------------------------------------+
3 rows in set (0.00 sec)

数据库是十六进制的方式存储到磁盘的

查询数据的角度查分析SQL语句处理流程

不同线程处理是并行处理,同一个线程是串行处理

实例的组成: 进程 线程 内存块

内存的使用分配

数据库核心工作程序【周二】0421 day01_第14张图片

数据库核心工作程序【周二】0421 day01_第15张图片

你可能感兴趣的:(小型服务)