MySQL数据库-简介、安装、体系结构及原理

哔哩哔哩DBA课程视频 https://www.bilibili.com/video/av53865503?from=search&seid=9747436813733100017
数据库全球排行

image

MySQL简介及安装升级

详细的简介及安装链接←

MySQL工具网盘链接 提取码: 87w4

image

什么是数据

图片、文字、表格、附件、视频、软件、用户账户信息、订单

数据库管理系统 DBMS

RDBMS:关系型
NoSQL:非关系型
NewSQL:分布式型

试题:请你列举熟悉的数据库产品?

RDBMS: Oracle ,MySQL ,MSSQL(微软),PG
NoSQL:Redis,Mongo,ES
NewSQL:TiDB(一套系统 pinCap公司),Spanner(Google),OceanBase(阿里巴巴),PolarDB(阿里云)
什么是POLARDB

试题:你们公司用了哪些数据库产品或者你熟悉哪些?

只说擅长的,主要负责的部分 以最擅长的地方碾压面试官
MySQL,Redis,MongoDB,ES

面试的结果是好或不好,回来后都要把内容捋一捋,最好将此家公司的架构整理出来。

MySQL 软件分支

Oracle MySQL
MariaDB
PerconaDB
云数据库
RDS MySQL
腾讯DB等

MySQL企业版本选择
企业主流版本

5.6版本: 5.6.34 5.6.36 5.6.38 5.6.40
5.7版本: 5.7.18 5.7.19 5.7.20 5.7.24√ 5.7.26
MySQL RC apl beta 不要选择,一定要选择GA版
官网 https://downloads.mysql.com/archives/community

image

关于版本GA时间,尽量记两个版本的准确GA时间,以免面试出错
5.6.38和5.7.20 # 时间 2017年09月13日
5.7.24 # 2018年10月4日
5.6.40 # 2018年2月26日

企业版本新环境介绍
5.7版本 GA 6-12个月的版本(偶数版)


MySQL 5.7.26 二进制版规划和部署

规划
硬件环境DELL R720 ,CPU28,128G内存 ,RAID108600G(SAS)
OS系统版本CentOS 7.6.1810 db01 3.10.0-957.el7.x86_64
网络规划eth0 10.0.0.51/24 eth1 172.16.1.51 主机名: db01
存储/dev/sdb 20G
实施
# 创建目录
[root@db01 ~]# mkdir /application
[root@db01 ~]# mkdir -p /data/3306

创建mysql用户
[root@db01 ~]# useradd -s /sbin/nologin -M mysql
[root@db01 ~]# id mysql 
uid=1001(mysql) gid=1001(mysql) groups=1001(mysql)

上传软件并解压处理
[root@db01 /application]# tar xf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
[root@db01 /application]# mv mysql-5.7.26-linux-glibc2.12-x86_64 mysql
[root@db01 /application]# ls
mysql  mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz

卸载mariadb和配置环境变量
# 卸载原有的mairadb
[root@db01 ~]# rpm -qa |grep mariadb
mariadb-libs-5.5.60-1.el7_5.x86_64
[root@db01 ~]# yum remove mariadb-libs.x86_64

[root@db01 ~]# vim /etc/profile
export PATH=/application/mysql/bin:$PATH
[root@db01 ~]# source /etc/profile
[root@db01 ~]# mysql -V
mysql  Ver 14.14 Distrib 5.7.26, for linux-glibc2.12 (x86_64) using  EditLine wrapper

数据初始化
[root@db01 ~]# yum install -y libaio-devel
[root@db01 ~]# mysqld --initialize-insecure --user=mysql --basedir=/application/mysql --datadir=/data/3306/data

参数说明

  • –initialize-insecure # 启用非安全模式进行数据初始化
  • –initialize # 启用安全模式进行数据初始化
    5.7版本以后,加强了用户密码安全管理的功能
    (1) 密码长度
    (2) 密码复杂度
    (3) 初始化时自动生成密码

image

书写配置文件
cat >/etc/my.cnf <<EOF
[mysqld]  #数据库启动时所应用的
user=mysql
basedir=/application/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
[mysql]  #数据库登录时所应用的
socket=/tmp/mysql.sock
prompt=3306 [\\d]>
EOF

准备启动脚本
# 修改权限
chown -R mysql.mysql /data/* /application/mysql/*

[root@db01 ~]# cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@db01 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/3306/data/db01.err'.
. SUCCESS! 

启动方式说明
systemd (centos7)

sys-V (centos6)
service xxx start/restart/status

使用systemd管理mysql
cat > /etc/systemd/system/mysqld.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/application/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
EOF

# 先关闭sys-V的方式再用systemd启动
[root@db01 /application]# /etc/init.d/mysqld stop
[root@db01 /application]# systemctl start mysqld.service 

进入数据库
[root@db01 ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.26 MySQL Community Server (GPL)
....
mysql> select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
3 rows in set (0.00 sec)

mysql> 


同主机版本升级

先拍摄快照并备份

测试的空环境可忽略备份

安装8.0版本软件到新位置
# 上传mysql8.0版本并解压

[root@db01 /application]# ls
mysql
mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz  
[root@db01 /application]# tar xf mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz 
[root@db01 /application]# mv mysql-8.0.16-linux-glibc2.12-x86_64 mysql8
[root@db01 /application]# ls
mysql
mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
mysql8
mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz

停掉原库
[root@db01 /application]# systemctl stop mysqld.service

修改已有配置
[root@db01 /application]# vim /etc/profile
#export PATH=/application/mysql/bin:$PATH
export PATH=/application/mysql8/bin:$PATH
[root@db01 /application]# source /etc/profile
[root@db01 /application]# mysql -V  #查看软件版本是否成功替换
mysql  Ver 8.0.16 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL)

[root@db01 /application]# vim /etc/my.cnf 
[mysqld]
user=mysql
basedir=/application/mysql8
datadir=/data/3306/data
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
prompt=MySQL [\\d]>

[root@db01 /application]# vim /etc/systemd/system/mysqld.service 
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/application/mysql8/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

启动mysql8.0
# 查看版本
[root@db01 /application]# cd /data/3306/data/
[root@db01 /data/3306/data]# cat mysql_upgrade_info 
8.0.16[root@db01 /data/3306/data]# 

# 启动
[root@db01 /application]# systemctl restart mysqld.service
[root@db01 /application]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.16 MySQL Community Server - GPL
...

mysql 8.0以前版本,需要进行数据升级

mysql_upgrade

image

image


学习完成后再次恢复到mysql5.7.26版本,恢复快照或修改配置文件

简单的管理操作
#设定密码
mysqladmin -uroot -p password 123456
mysql -uroot -p  #输入密码回车
#进入用户   
use mysql
#查看用户   
select user,host from mysql.user;
#查询密码方法
mysql5.7以前
select user,host,password from mysql.user;
mysql5.7以后
select user,host ,authentication_string from mysql.user;

小结

1.版本选择(熟悉)
2.安装方式(熟悉)
3.规划和部署(重点掌握)
4.升级(了解)
5.简易管理(熟悉)


MySQL体系结构和管理

image

MySQL C/S模型

Server:mysqld
Client:
  socket 仅本地连接使用
  tcp/ip 应用连接使用

TCP/IP方式(远程、本地):
mysql -uroot -p123456 -h 10.0.0.51 -P3306

Socket方式(仅本地):
mysql -uroot -p123456 -S /tmp/mysql.sock

实例

mysqld主进程 ----> master thread主线程 ----> 干活的线程 + 预分配的内存结构

Boss ----> 经理 ----> 员工 + 办公室


mysqld服务器程序结构

MySQL的专用管理和操作命令SQL

DDL 数据定义语言
DCL 数据控制语言
DML 数据操作语言
DQL 数据查询语言

SQL语句的执行过程
连接层
提供连接协议:sokcet TCP/IP
验证 user password host port
提供连接线程 
show processlist;
how full processlist;    #功能:接收SQL语句,返回结果

image

SQL层
语法检查和SQL_MODE检查 (约束规定)
语义检查和权限检查
解析预处理,生成解析树(执行计划树)
优化会根据自带算法,选择最优的方案(代价模型)
代价? CPU io mem
选择最优的方案进行执行SQL

存储引擎层
负责根据SQL层执行的结果,从磁盘上拿数据。
将16进制的磁盘数据,交由SQL结构转化成表,
连接层的专用线程返回给用户。
(相当于文件系统,将数据取出,再交给SQL层结构换成表,返回给用户)

忘记密码怎么办

image

MySQL的逻辑结构

库(database schema)
    相当于linux的目录
    库名字
    库的属性
表(tabale segment)
    相当于linux文件
    表名
    表属性
    表的数据行 row,记录(类似于excle表格)
    列(字段)
用户(user)
    用户名
    白名单(主机范围)
其他
    权限(user privileges)

MySQL基础物理结构


物理存储就是Linux中的目录,以目录存储


元数据 表名 表属性 表列
数据行

MyISAM
user.myi
    索引相关信息
user.myd
    存储数据行
user.frm
    列的信息

image

InnoDB
time_zone.frm
    列的信息
time_zone.ibd
    数据行和索引 (IOT)

image


InnoDB表底层存储结构引入

此知识点为面试题☆☆☆☆☆

段 segment

  • 一个非分区表就是一个段

区 extent

  • 连续的64个页,固定大小为1M

页 page

  • MySQL最小的 IO 单元,默认16KB

MySQL基础管理

用户管理

用户的作用
登录MySQL
管理MySQL的对象

用户的定义
用户名
白名单(主机列表) 可被允许的主机 IP

用户定义的几种方式
    oldboy@'10.0.0.1'
    oldboy@'localhost'
    oldboy@'10.0.0.%'
        netmask:255.255.255.0
    oldboy@'10.0.0.5%'
    oldboy@'10.0.0.0/255.255.254.0'
    oldboy@'oldboy.com'
    oldboy@'db01'
    oldboy@'%'

用户的管理操作
    #创建用户
        create user oldli@'10.0.0.%';
    #删除用户
        rop user oldli@'10.0.0.%';
    #修改用户
        alter user oldli@'10.0.0.%' identified by '123';
    #查询用户
        select user,host from mysql.user;
        select concat(user,"@","'",host,"'") from mysql.user;
    #设定密码
        create user oldli@'10.0.0.%' identified by '123';

注:
8.0以前,以上命令可以忽略,grant可以自动创建用户并授权
8.0以后必须先建用户后授权,grant只做授权功能

权限

作用
开启用户的管理对象的能力
mysql -uoldli -p -h10.0.0.51 -P 3306

权限的定义(8.0以前)

按命令进行定义,例如 select update insert drop create …

授权的范围
*.*  库级别授权
wordpress.*  单库级别授权
wordpress.t1  单表级别授权

授权管理命令
grant all on *.* to oldli@'10.0.0.%' identified by '123'
注意:
ALL 普通管理员
ALL+with grant option   超级管理员

image

权限解释说明

ALL或ALL PRIVILEGES  代表指定权限等级的所有权限。
ALTER   允许使用ALTER TABLE来改变表的结构,ALTER TABLE同时也需要CREATE和INSERT权限。重命名一个表需要对旧表具有ALTER和DROP权限,对新表具有CREATE和INSERT权限。
ALTER ROUTINE   允许改变和删除存储过程和函数
CREATE  允许创建新的数据库和表
CREATE ROUTINE  允许创建存储过程和包
CREATE TABLESPACE   允许创建、更改和删除表空间和日志文件组
CREATE TEMPORARY TABLES 允许创建临时表
CREATE USER 允许更改、创建、删除、重命名用户和收回所有权限
CREATE VIEW     允许创建视图
DELETE  允许从数据库的表中删除行
DROP    允许删除数据库、表和视图
EVENT   允许在事件调度里面创建、更改、删除和查看事件
EXECUETE    允许执行存储过程和包
FILE        允许在服务器的主机上通过LOAD DATA INFILE、SELECT ... INTO OUTFILE和LOAD_FILE()函数读写文件
GRANT OPTION    允许向其他用户授予或移除权限
INDEX   允许创建和删除索引
INSERT  允许向数据库的表中插入行
LOCK TABLE  允许执行LOCK TABLES语句来锁定表
PROCESS 允许显示在服务器上执行的线程信息,即被会话所执行的语句信息。这个权限允许你执行SHOW PROCESSLIST和mysqladmin processlist命令来查看线程,同时这个权限也允许你执行SHOW ENGINE命令
PROXY   允许用户冒充成为另外一个用户
REFERENCES  允许创建外键
RELOAD  允许使用FLUSH语句
REPLICATION CLIENT  允许执行SHOW MASTER STATUS,SHOW SLAVE STATUS和SHOW BINARY LOGS命令
REPLICATION SLAVE   允许SLAVE服务器连接到当前服务器来作为他们的主服务器
SELECT  允许从数据库中查询表
SHOW DATABASES  允许账户执行SHOW DATABASE语句来查看数据库。没有这个权限的账户只能看到他们具有权限的数据库。
SHOW VIEW   允许执行SHOW CREATE VIEW语句
SHUTDOWN    允许执行SHUTDOWN语句和mysqladmin shutdown已经mysql_shutdown() C API函数
SUPER   允许用户执行CHANGE MASTER TO,KILL或mysqladmin kill命令来杀掉其他用户的线程,允许执行PURGE BINARY LOGS命令,通过SET GLOBAL来设置系统参数,执行mysqladmin debug命令,开启和关闭日志,即使read_only参数开启也可以执行update语句,打开和关闭从服务器上面的复制,允许在连接数达到max_connections的情况下连接到服务器。
TRIGGER 允许操作触发器
UPDATE  允许更新数据库中的表
USAGE   代表没有任何权限,只能登陆

授权管理生产需求(试题)

1.授权一个管理员用户admin ,密码admin,能够通过10网段管理数据库

grant all on *.* to admin@'10.0.0.%' identified by 'admin';

2.开放一个wordpress应用的用户,密码123,nginx服务器的网段为172.16.1.%,应用用户需要哪些权限?

grant select,insert,update,delete on wordpress.* to wordpress@'172.16.1.%' identified by '123';

3.中小公司(没有专业DBA人员),开发人员或leader,需要开发用户dev通过10网段对哦wordpress进行开发和管理

grant SELECT,INSERT, UPDATE, DELETE,CREATE,ALTER,CREATE VIEW,SHOW VIEW,CREATE ROUTINE, ALTER ROUTINE,EVENT, TRIGGER on  wordpress.* to dev@'10.0.0.%' identified by '123';

权限回收
#查询用户权限
show grants for dev@'10.0.0.%';

#收回delete权限
revoke delete on wordpress.* from dev@'10.0.0.%';

面试问题(授权用户的规范)

image

本地管理员用户密码忘记如何解决
#关闭数据库
/etc/init.d/mysqld stop

#将数据库启动到无验证模式
mysqld_safe --skip-grant-tables --skip-networking &

#修改密码
flush privileges;
alter user root@'localhost' identified by '123';

#重启数据库为正常模式
/etc/init.d/mysqld restart 

#测试新密码是否可以登录
mysql -uroot -p123


MySQL连接管理

MySQL自带命令
-u -p -h -P -S -e -V < --help

socket连接
mysql -uroot -p123 -S /tmp/mysql.sock

本地登录的用户,需要提前授权localhost相关用户
    grant all on *.* to oldli@'localhost' identified by '123';
    mysql -uoldli -p123 -S /tmp/mysql.sock 

TCP/IP连接
mysql -uoldli -p123 -h10.0.0.51 -P3306

image

免交互执行命令 mysql -e
# mysql -e
mysql -uroot -p123456 -e "show databases"

导入数据
[root@db01 ~]# ls
world.sql

mysql -uroot -p123456 <world.sql


使用SQLyog客户端软件登录mysql
#授权root用户远程登录
grant all on *.* to root@'10.0.0.%' identified by '123';

image

image

image


第二种连接方法 Navicat客户端软件

功能更强大一些

image

image

image

启动和关闭方式

1.sys-V
    mysql.server

2.systemd
    mysqld

3.mysqld &

4.mysqld_safe &
    mysqld_safe --skip-grant-tables --skip-networking &

5.万能关闭方法: 可以关闭任何方式
    mysqladmin -uroot -p123456 shutdown

MySQL的初始化配置

提供的方法

1.预编译☆☆
2.初始化配置文件☆☆☆☆☆
3.命令行☆☆☆

注意:优先级 3>2>1

初始化配置文件的管理

image

[root@db01 ~]# mysqld --help --verbose |grep my.cnf
/etc/my.cnf           ------> /tmp/mysql.sock
/etc/mysql/my.cnf 
/usr/local/mysql/etc/my.cnf 
~/.my.cnf             ------> /tmp/a.sock

注意:一旦使用 --defaults-file,以上的默认配置就不会生效了

[root@db01 ~]# mysqld_safe --defaults-file=/opt/oldguo.cnf &

image

初始化配置文件作用

数据库的启动
客户端的登录

初始化配文件格式
[标签1]
xxxx=yyyy
[标签2]
xxxx=yyyy
[标签3]
xxxx=yyyy

标签:

image

服务端
  [mysqld]
  [myslq_safe]
  [server]
客户端:
  [mysql]
  [mysqldump]
  [mysqladmin]
  [client]

配置文件模板
<-----------------------------------------
[mysqld]
user=mysql
server_id=6 
port=3306
basedir=/application/mysql
datadir=/data/3306/data
log_error=/data/3306/data/3306.log
socket=/data/3306/mysql.sock
[mysql]
socket=/data/3306/mysql.sock

mysqld_safe --defaults-file=<配置文件的路径> &

MySQL的多实例管理

准备多个目录
mkdir -p /data/330{7,8,9}/data

准备配置文件
cat > /data/3307/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
log_error=/data/3307/mysql.log
port=3307
server_id=7
log_bin=/data/3307/mysql-bin
EOF

cat > /data/3308/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/3308/data
socket=/data/3308/mysql.sock
log_error=/data/3308/mysql.log
port=3308
server_id=8
log_bin=/data/3308/mysql-bin
EOF

cat > /data/3309/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/3309/data
socket=/data/3309/mysql.sock
log_error=/data/3309/mysql.log
port=3309
server_id=9
log_bin=/data/3309/mysql-bin
EOF

初始化三套数据
mv /etc/my.cnf /etc/my.cnf.bak
mysqld --initialize-insecure  --user=mysql --datadir=/data/3307/data --basedir=/application/mysql
mysqld --initialize-insecure  --user=mysql --datadir=/data/3308/data --basedir=/application/mysql
mysqld --initialize-insecure  --user=mysql --datadir=/data/3309/data --basedir=/application/mysql

systemd管理多实例
cd /etc/systemd/system
cp mysqld.service mysqld3307.service
cp mysqld.service mysqld3308.service
cp mysqld.service mysqld3309.service

vim mysqld3307.service
ExecStart=/application/mysql/bin/mysqld  --defaults-file=/data/3307/my.cnf

vim mysqld3308.service
ExecStart=/application/mysql/bin/mysqld  --defaults-file=/data/3308/my.cnf

vim mysqld3309.service
ExecStart=/application/mysql/bin/mysqld  --defaults-file=/data/3309/my.cnf

授权
chown -R mysql.mysql /data/*

启动
systemctl restart mysqld3307.service
systemctl restart mysqld3308.service
systemctl restart mysqld3309.service

验证多实例
netstat -lnp|grep 330
mysql -S /data/3307/mysql.sock -e "select @@server_id"
mysql -S /data/3308/mysql.sock -e "select @@server_id"
mysql -S /data/3309/mysql.sock -e "select @@server_id"

image

image

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值