中级数据库课程
8k - 25k 15k - 16k
线上 15-16 全天
线上 18 -20 全天
mysql的介绍和安装
mysql 体系介绍和基础管理
mysql SQL开发基础
mysql 索引原理以及应用规范
mysql 存储引擎
mysql 日志管理
mysql 备份恢复和容灾
mysql 主从复制
mysql 高可用以及读写分离
mysql 分布式架构
mysql 全面优化
nosql 缓存数据库Redis
nosql 文档数据库MongoDB
中级数据库复习以及就业指导
彩蛋:
1、数据库运维工具
2、数据库故障案例
思维导图:
简述博客笔记
bilibili视频
郭加磊 北京邮电大学毕业
8:50上线
预习、复习要做好
每天作业都要做好
及时发问、当天问题当天解决
第一代数据库架构: 关系型数据库时代 RDBMS :Oracle、MSSQL、mysql
可以用一个产品去满足整个数据库业务需求
第二代数据库架构: RDBMS + NOSQL
PS:NOSQL 是一个时代
代表产品:memcache(内存数据库)、Redis(内存数据库)、MongoDB、ES、HBASE、Hadoop等
第三代数据库架构: newSQL 新型数据库架构时代
代表产品:阿里系列 RDS 、OB、polarDB
pincap :tidb
Google:spanner
定期参加数据库大会
统计搜索引擎的排名
https://db-engines.com/en/ranking
大咖说—前沿技术风向
http://www.itdks.com/
Oracle mysql: C版、E版、cluster集群版
percona mysql:最接近Oracle mysql
mariadb :从5.5版本以后形成了自己的一套架构
云数据库:RDS for mysql
5.7 GA 一般选择最新的GA版
5.6
5.5
8.0 一般选择最新的GA版 即将成为主流版本(8017版本以上的)
5.6版本 2020年 10月 常规、扩展服务全部停止
5.7版本 2021年 1月份 常规服务停止
https://downloads.mysql.com/archives/
校验MD5值
注意是使用二进制包的方式(解压即用)进行安装,不是编译安装
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/*
RDBMS:mysql 、Oracle、PG、MSSQL
nosql:Redis、MongoDB、ES、memcache
云数据库:RDS
热爱
看官方文档、看书、视频、参加一些数据库大会。
技能:(就是数据库的学习模块)
mysql的介绍和安装
mysql 体系介绍和基础管理
mysql SQL开发基础
mysql 索引原理以及应用规范
mysql 存储引擎
mysql 日志管理
mysql 备份恢复和容灾
mysql 主从复制
mysql 高可用以及读写分离
mysql 分布式架构
mysql 全面优化
nosql 缓存数据库Redis
nosql 文档数据库MongoDB
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]#
(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
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版本
client:
自带命令
第三方工具
API
server:
TCP/IP
UNIX Socket
实例:mysqld进程 +master thread +work thread(IO、SQL、purge)+预分配的内存结构
公司:boos 经理 员工 工作区域
3.1 server层
3.1.1连接器 负责连接处理
3.1.2SQL层 负责SQL语句的处理
3.2 engine引擎层 和磁盘交互
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语句处理流程
不同线程处理是并行处理,同一个线程是串行处理
实例的组成: 进程 线程 内存块
内存的使用分配