MYSQL的结构体系

客户端服务器模型

C/S结构的服务

image-20240808095924000

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mysql的客户端

mysqldump
mysqladmin
mysql


1.mysql是一个典型的C/S服务结构
  1.1 mysql自带的客户端程序(/application/mysql/bin)
    mysql
    mysqladmin
    mysqldump
 

1.2 mysqld一个二进制程序,后台的守护进程
  单进程
  多线程
 

MySQL连接方式
  TCP/IP的连接方式
  列如:mysql -uroot -p123 -h172.16.1.51
  Socket连接
  列如:mysql -uroot -p123 -S /tmp/mysql.scoket
 
  \s可以看他是什么连接方式
1
2
3
4
5
6
7
8
mysql -uroot -p123 #Socket连接
mysql -uroot -p123 -h172.16.1.51 #TCP/IP的连接方式
mysql -uroot -p123 -hlocalhost#Socket连接


------错误写法,但也是TCP连接----
mysql -uroot -p123 -h172.16.1.51 -S /tmp/mysql.scoket
mysql -uroot -p123 -S /tmp/mysql.scoket -h172.16.1.51

MYSQL服务器构成

MYSQL服务:守护进程

实例:一个进程+一个线程+一个预分配的内存结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@db03 mysql-5.7.44]# mysqladmin -uroot -p123 variables|grep innodb_buffer_pool_size
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
#得到mysql的内存配置
| innodb_buffer_pool_size | 134217728

MYSQL的内存要占物理机内存的75%~80%

比较大,可以更改一下,修改配置文件
[root@db04 mysql-5.7.44]# vim /etc/my.cnf
[mysqld]
......
innodb_buffer_pool_size=512M #设置mysql启动起来,占用物理机512M

#如果用ansible推送配置文件,内存那里要写变量
innodb_buffer_pool_size = {{ (ansible_memtotal_mb * 0.8)|init }}M
不能有小数点,配置文件里面有带小数点,mysql就起不来

mysql的底层原理

1
底层分为3层  连接层  SQL层  存储引擎层

image-20240808114234093

连接层作用:

1、提供2种连接方式

  • TCP连接
  • Socket连接

2、验证用户的合法性(用户名 密码 IP 权限)

3、提供一个于SQL层交互的线程

SQL层作用:
1、接收连接层传递过来的SQL语句
2、验证语法
3、验证语义:就是验证你是要增删改查 DDL DML DCL DQL DTL
4、命令解释器 :解析输入的SQL语句
5、优化器:简单的优化SQL语句
6、执行器:执行优化器选择的最优一种方式的语句
提供一个和存储引擎层交互的线程
接收存储引擎层返回的结构化成表的数据
7、缓存
8、记录日志(binlog)

存储引擎层作用
1、接收SQL层传递过来的sql语句
2、于磁盘交互取出指定的数据
3、将数据结构化成表返回给SQL层

1
2
3
4
5
6
7
8
9
10
11
[root@db03 mysql-5.7.44]# mysql -uroot -p123 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure. #这行不是标准输出,也不是错误输出,这个输出不是这条命令给的,是去不掉的

+--------------------+
| Database |
+--------------------+
| information_schema |#元数据库,内存库,在磁盘上看不到,他是加载在内存里的
| mysql |
| performance_schema |
| sys |
+--------------------+

MySQL的结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
MySQL的2种结构
逻辑结构(熟悉)
物理结构
 

MySQL的逻辑结构:数据库管理人员或者开发人员可操作的对象
1、库、表(元数据+真实数据行) 元数据是:字段名+字段的描述信息....
字段又分为字段名,数据类型,约束

3、元数据:列+其它属性(行数+占用空间大小+权限)
4、列:列名字+数据类型+其他约束(非空、唯一、主键、非负数、自增长、默认值)

MYSQL的物理结构:最底层的数据文件
1)MySQL的最底层的物理结构是数据文件,也就是说,存储引擎层,打交道的文件,是数据文件。
2)存储引擎分为很多种类(Linux中的FS)
3)不同存储引擎的区别:存储方式、安全性、性能

mysql的单位

1
2
3
4
5
段、区、页(块)

1、段(一张表):理论上一个表就是一个段,由多个区构成,(分区表是一个分区一个段)
2、区:一个区由连续的多个页构成 (1M)
3、页:一个页最小的数据存储单元,默认是16k block没占满的区域叫脏数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1、#有的数据库安装之后,会生成空用户
mysql> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | db02 |
| root | db02 |
| | localhost |
| root | localhost |
+------+-----------+

2、#使用空用户连接,也可以连接,这些是非常危险的存在
[root@db02 ~]# mysql -u'' -hlocalhost

3、把空用户删除
mysql> drop user root@'::1';
mysql> drop user ''@'localhost';

#这条命令虽然也可以删除,但是不能用,他会把root用户也删除,知道有这个命令就行了,不要去执行删除mysql> truncate mysql.user; 川king特
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
在企业中误删除了root用户,怎么解决

1、先停止服务
[root@db01 ~]# /etc/init.d/mysqld stop

2、跳过授权表,忽略网络连接去启动数据库
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking

3、使用下列命令登陆mysql,无需密码
[root@db01 ~]# mysql


4、重新添加root用户
#方法一:重新添加root用户 没有给root用户设置密码
mysql> use mysql;
mysql> insert into user set user='root',ssl_cipher='',x509_issuer='',x509_subject='';update user set Host='localhost',select_priv='y', insert_priv='y',update_priv='y', Alter_priv='y',delete_priv='y',create_priv='y',drop_priv='y',reload_priv='y',shutdown_priv='y',Process_priv='y',file_priv='y',grant_priv='y',References_priv='y',index_priv='y',create_user_priv='y',show_db_priv='y',super_priv='y',create_tmp_table_priv='y',Lock_tables_priv='y',execute_priv='y',repl_slave_priv='y',repl_client_priv='y',create_view_priv='y',show_view_priv='y',create_routine_priv='y',alter_routine_priv='y',create_user_priv='y',event_priv='y',trigger_priv='y',create_tablespace_priv='y' where user='root';

mysql> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | localhost |
+------+-----------+

#方法二:刷新授权表 然后我给root设置的密码是123
mysql> flush privileges;
mysql> grant all on *.* to root@'localhost' identified by '123' with grant option;


5、查看权限
mysql> select * from mysql.user\G;

6、重启
[root@db01 ~]# /etc/init.d/mysqld restart