MySQL 程序结构(体系结构)与基础管理


文章目录

  • MySQL 程序结构(体系结构)与基础管理
  • 一、MySQL两种连接模式
  • 二、MySQL实例的组成
  • 三、MySQL的体系结构
  • MySQL结构
  • 逻辑结构
  • 四、基础管理
  • 用户及权限管理
  • 连接管理
  • MySQL常用参数以及初始化配置


一、MySQL两种连接模式

1、tcp/ip连接
这种方式可以进行本地连接、远程连接。相较于socket连接多了一个远程连接的方式。
连接方式:

mysql -uroot -p123 -h 192.168.xx.xx -P3306

2、socket方式连接
这种方式支持本地连接,即在本地操作的时候进行使用,一般多用于多实例,多实例的概念后面会讲解到。
连接方式:

mysql -uroot -p123 -S /tmp/mysql.sock

二、MySQL实例的组成

实例的组成:
实例				=	公司
mysqld			=	董事长
master thread	=	总经理
干活的  thread	=	N多个干活的员工
预分配内存		=	办公区
so
实例= mysqld + master thread + 干活的 thread + 预分配内存

1、一个公司有董事长、总经理、N多个干活的员工、办公区组成,一个实例就相当于是一个公司,缺一不可。
2、mysqld也是一个后台守护进程,如果没有了这个进程,MySQL就没有启动,需要用mysqld去启动。

三、MySQL的体系结构

MySQL结构

mysql管理终端_数据库

1、连接层作用
(1)提供连接协议:tcp/ip以及socket连接
(2)提供验证:验证用户名、密码、socket
(3)提供专用线程:接收用户SQL以及返回结果(show processlist;可以查看用户线程情况)

2、SQL层作用
(1)接收上层传送的SQL语句

(2)语法验证模块:验证语句语法,是否满足SQL_MODE

(3)语义检查:判断SQL语句的类型

DDL(definition):数据定义语言		例:create/drop/alter/
DCL(controlled):数据控制语言		例:grant/revoke/commit
DML(manipulation):数据操作语言	例:insert/delete/update/select
DQL(query):数据查询语言			例:select

(4)权限检查:用户对库,表是否有权限

(5)解析器:进行SQL语句的预处理,生成解析树(explain desc),生成多种执行方案

(6)优化器:根据解析器得出的多种执行方案,进行判断,选出最优的执行计划

代价模型:以前MySQL是按时间去衡量SQL语句的优劣,现在呢按资源(CPU/IO/MEM)的耗损评估性能的好坏

(7)执行器:选择最优的执行计划去执行SQL语句,产生执行的结果

执行结果:会提供给存储引擎层一个结果说明这个查询的结果在磁盘的哪个位置

(8)提供查询缓存(默认不开):会用redis这些nosql去代替

(9)提供日志记录(binlog):记录二进制日志,默认不开启

3、存储引擎层作用(磁盘、内存、网络)(类似linux文件系统)
(1)负责根据SQL执行的执行结果,到磁盘相应的位置拿取数据。

(2)将16进制的磁盘数据,交由SQL结构化化成表,由连接层的专用线程返回用户。

逻辑结构

MySQL库和表的逻辑结构说明以及库表之间的关系

mysql管理终端_mysql_02


1、库相关

每一个库都有库名、库属性组成,库属性包括字符集、校对规则等等。

2、表相关(二维表)
每一张表都有表名、属性、列(列名)、列属性(数据类型、约束等等)、数据行(record)、元数据组成。

3、每一个库的物理存储结构都是由文件系统的目录来存储的,一个库就是一个目录。

mysql [(none)]>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
[root@hdfeng mysql-data]# pwd
/opt/mysql-data
[root@hdfeng mysql-data]# ll -h
total 409M
drwxr-x---. 2 mysql mysql 4.0K Feb  4 22:23 mysql
drwxr-x---. 2 mysql mysql 8.0K Feb  4 22:23 performance_schema
drwxr-x---. 2 mysql mysql 8.0K Feb  4 22:23 sys

一般每个库都有对应的文件系统目录文件。

4、MyISAM表和InnoDB表也有不同的区别。

MyISAM的表:
-rw-r-----. 1 mysql mysql   10816 1月   1 18:09 user.frm      	列的相关信息
-rw-r-----. 1 mysql mysql     396 1月   1 19:37 user.MYD	    数据行
-rw-r-----. 1 mysql mysql    4096 1月   1 19:37 user.MYI	    索引信息
InnoDB的表:
-rw-r-----. 1 mysql mysql    8636 1月   1 18:09 time_zone.frm   存储列相关信息
-rw-r-----. 1 mysql mysql   98304 1月   1 18:09 time_zone.ibd   数据行+索引
time_zone.frm:存储列相关信息
time_zone.ibd:记录和索引

在MyISAM下的表数据行和索引信息被分开了,在InnoDB表的话数据行和索引是都被放在了ibd下。

5、表结构里面的关系(16KB)

段:由一个区或者多个区组成(一个表就是一个段,一个ibd就是一个段)

区:由一个页或者多个连续页组成,连续的64个页共1M

页:16kb表示一个页(最小的io单元)

四、基础管理

用户及权限管理

用户在数据库中起到的作用就是登录,以及管理数据库的逻辑对象。

1、数据库层面的定义:‘用户名’@‘白名单’

2、白名单定义:可以允许哪些网段的IP登录数据库(localhost表示本地,%表示除了本地,所有地方都可用这个帐号登录)

3、支持的方式:

root@'%'						允许所有地址、域名
root@'192.0.0.%'	 			允许192.0.0.0/24
root@'192..0.0.200'  			只允许这个用记在200地址的这台机器上登录
root@'localhost'     			只能本地连接
root@'db01'	        			只能这个域名
root@'192.0.0.5%'     			只能50-59ip的用户登录
root@'192.0.0.0/255.255.254.0'  只允许这个网段的子网掩码是254的用户登录

4、增删改查
以下4种分别是创建、删除、修改、查询的操作。

create user fhd@'192.0.0.%' identified by '123';
drop user fhd@'192.0.0.%';
alter user fhd@'192.0.0.%' identified by 'fhd123';
select user,host from mysql.user;

5、权限
相对于用户而言,用户所能访问只是权限的一部分功能,MySQL能精确针对用户修改用户对哪一个库或者哪一张表进行查询、修改、删除、创建权限,超级管理员还具备给别的用户进行用户授权的权限。
注:5.6版本——5.7版本的话创建用户和赋予权限能一起操作,在8.0版本以后把创建用户以及赋予用户的功能分开了,需要先创建用户再进行赋予权限。

ALL:
SELECT,INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS,
FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, 
LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,
SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, 
CREATE TABLESPACE
ALL : 以上所有权限,一般是普通管理员拥有的
with grant option:超级管理员才具备的,给别的用户授权的功能

演示:

grant all on test.* to root@'localhost' identified by '123';
grant命令 | all表示所有权限 | on表示在哪个表或者库上附给这个用户权限 | test.*权限赋予的范围 
root用户 | localhost用户所能访问的区域 | identified by '123' 设置密码

完整用户创建以及赋予权限:

create user fhd123@'%' identified by '123';		创建用户以及设置访问区域及密码
grant all on test.*  to  fhd123@'%';			赋予用户fhd123所有区域进行访问库test的权限
show grants for fhd123@'%';						查看用户所被赋予的权限
mysql [(none)]>show grants for fhd123@'%';
+--------------------------------------------------+
| Grants for fhd123@%                              |
+--------------------------------------------------+
| GRANT USAGE ON *.* TO 'fhd123'@'%'               |
| GRANT ALL PRIVILEGES ON `test`.* TO 'fhd123'@'%' |
+--------------------------------------------------+
2 rows in set (0.01 sec)
revoke delete on test.* from 'fhd123'@'%';		删除用户的delete权限

到时候为止用户管理这块的话就到这里了,那是不是会有小伙伴会问到,万一密码忘记了怎么办,应该怎么解决呢?

6、管理员密码忘记处理
能直接跳过当前的用户密码验证,直接进入到数据库,并且还能跳过tcp/ip的远程连接

mysqld_safe --skip-grant-tables  --skip-networking &     关闭用户密码的验证   关闭tcp/ip的远程连接

还有一种方式则是针对的是rpm安装的用户,rpm安装完数据库,会有一个初始密码,直接获取初始密码直接登录修改即可

grep "password" /var/log/mysql.log					这条命令能查看到数据库安装完以后首次登录的密码以及登录的记录
alter user root@'localhost' identified by '123';    这条则是修改密码的操作,按自己的需求进行修改
修改完成以后可能会报这么一句错:
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
则是需要把系统权限相关的表刷到内存里面去,flush完再进行修改即可修改成功
flush privileges;
alter user root@'localhost' identified by '123';

连接管理

1、socket连接(unix套接字连接)

mysql -u root -p -S /tmp/mysql.sock

2、tcp/ip远程连接(tcp/ip远程套接字连接)

mysql -u root -p -h 192.168.xxx.xxx  -P3306
在tcp/ip命令无法登录的情况下,3306未监听情况,则是有--skip-networking 的mysql服务存在
所以这是导致问题的原因,通过ps -ef | grep mysql查看  
mysqld_safe执行后的 --skip-networking服务还存在的话需要kill掉
kill掉重启mysqld就可以监听3306服务,并且使用tcp/ip登录

MySQL常用参数以及初始化配置

1、mysql登录时会常用的参数
-u 用户 -p 密码 -h IP地址 -P 3306 -S socket文件 -e 免交互执行命令 < 导入SQL脚本/备份

2、mysql非交互式情况下直接输出数据库语句(在生产环境下不建议,因为会暴露密码)-e直接通过引号里面的sql命令进行sql语句结果的输出;

[root@hdfeng ~]# mysql -uroot -p123 -e "select user,host from mysql.user;";
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| fhd123        | %         |
| root          | %         |
| fhd123        | localhost |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+

mysql -uroot -p <world.sql < 导入备份文件使用

3、 多种启动方式

mysql管理终端_数据库_03


MySQL下以上三种方式都能单独起动,mysqld_safe和mysqld一般用在临时维护使用

mysql.server启动,在CentOS7里面,能直接调用mysqld直接进行维护

[root@hdfeng ~]# service mysqld start

mysqld_safe启动

[root@hdfeng ~]# mysqld_safe

mysqld

[root@hdfeng ~]# mysqld --verbose --help	具体参数可用这个命令列出所有可用的参数

4、初始化配置

初始化配置的作用:控制MySQL的启动,影响到客户端的连接,也就是直接在linux命令行操作的时候进行参数的添加

初始华配置的方法:
(1)预编译
(2)配置文件(所有启动方式都适用)
(3)命令行参数(仅限于mysql_salfe mysqld)
初始化配置文件的操作(举例):

[root@hdfeng ~]# mysqld --help --verbose | grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
                      my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default
一般mysql的配置文件都是依次引用的(从/etc/my.cnf开始),也可以指定mysql的配置文件

5、配置文件的书写方式

(1)一般情况下,有以下的配置,mysql即可启动

[root@hdfeng ~]# vim /etc/my.cnf
[mysqld]					这个是服务端的标签,也就是服务端里面的配置都在下面这些参数里面,启动走的都是以下参数
user=mysql       			下面这些就是配置项
basedir=/opt/mysql    
datadir=/opt/mysql-data
server_id=6			    
port=3306			    
socket=/tmp/mysql.sock
[mysql]						主个是客户端标签,连接后走的是这个标签下的参数
prompt=mysql[\\d]>			这个配置项会显示你在哪个库下,能易于操作,类似select database();比如说你use到test库下,使用这个命令会显示你在哪个库下,不容易误操作

服务端的标签一共有以下几个:
[mysqld] [mysqld_safe] [server]
客户端的标签(客户端也就是我们访问端):
[mysql] [mysqldump] [client]

本期的话就讲这些内容,如何有错误,或者有不理解的地方,欢迎小伙伴们留言!!谢谢!