MySQL体系结构
Posted 锦衣admin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL体系结构相关的知识,希望对你有一定的参考价值。
mysql体系结构
MySQL体系结构
软件构成
MySQL 数据库管理软件主要有下图几个层次构成:
存储引擎层(MyISAM与InnoDB引擎)
- MySQL5.5 版本以前默认引擎是MyISAM
- MySQL5.5 版本以后偶默认引擎是InnoDB
存储引擎层介绍:
简单来说,就是数据的存储方式。在MySQL中,我们可以使用show engines查看当前数据库版本支持哪些引擎,常见的数据存储引擎:InnoDB、MyISAM、NDB…
# mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
说明:
Transactions :表示事物处理,InnoDB引擎支持
5.7 版本新增 BLACKHOLE 引擎,类似Linux的/dev/null,所有写入到这个引擎的数据都会消失
MySQL的MyISAM引擎与InnoDB引擎的区别:
- MyISAM引擎:擅长数据的查询,支持全文索引,表级锁(锁定数据表)
- InnoDB引擎:Supports transactions, row-level locking, and foreign keys,支持事务处理、行级锁(锁定数据表的行)、支持外键(分类表的id主键和产品表cid从键)。
存储层
存储层如何保存数据?
MyISAM引擎
创建一个数据库db_man:
- 当创建一个数据库db_man的时候,MySQL的数据目录会生成一个对应的
db_man文件夹
db_man文件夹
里面存在一个.opt文件
(存放内容为数据库的编码格式)
创建一个数据库:
# mysql> create database db_man default charset=utf8;
查看MySQL数据库的数据目录:
[root@mysql_01 ~]# ll /mysql_3307/data/
total 122996
...
drwxr-x---. 2 mysql mysql 20 Jun 13 14:37 db_man => 创建一个数据库会生成一个对应文件夹
...
查看db_man目录下有哪些文件:
[root@mysql_01 ~]# ll /mysql_3307/data/db_man/
total 4
-rw-r-----. 1 mysql mysql 61 Jun 13 14:37 db.opt => 里面有一个.opt文件
查看.opt文件内容:
[root@mysql_01 ~]# cat /mysql_3307/data/db_man/db.opt
default-character-set=utf8
default-collation=utf8_general_ci
创建一个数据表tb_boy:
在db_man库中创建一个数据表tb_boy,db_man文件夹
会生成三个文件(*.frm
、*.MYI
、*.MYD
)
*.frm
:框架文件,定义数据表结构(有哪些字段和字段类型等)*.MYI
:INDEX索引,主要用于存放索引文件*.MYD
:数据文件
创建一个数据表:
# mysql> use db_man;
# mysql> create table tb_boy(id int,name varchar(20),height decimal(5,2)) engine=myisam default charset=utf8;
查看db_man文件夹:
[root@mysql_01 ~]# ll /mysql_3307/data/db_man/
total 20
-rw-r-----. 1 mysql mysql 61 Jun 13 14:37 db.opt
-rw-r-----. 1 mysql mysql 8620 Jun 13 14:54 tb_boy.frm => 创建数据表生成的三个文件
-rw-r-----. 1 mysql mysql 0 Jun 13 14:54 tb_boy.MYD
-rw-r-----. 1 mysql mysql 1024 Jun 13 14:54 tb_boy.MYI
对MyISAM引擎的数据进行备份时,只需要将其创建的数据库文件夹进行拷贝其他服务器上的数据库数据目录,就可以随意在别的服务器上使用
InnoDB引擎
创建一个数据库db_woman:
- 当创建一个数据库db_woman的时候,MySQL的数据目录会生成对应的
db_woman文件夹
db_woman文件夹
里面存在一个.opt文件
(存放内容为数据库的编码格式)
创建一个数据库:
# mysql> create database db_woman default charset=utf8;
查看MySQL数据库的数据目录:
[root@mysql_01 ~]# ll /mysql_3307/data/
total 122996
...
drwxr-x---. 2 mysql mysql 20 Jun 13 15:06 db_woman => 创建一个数据库会生成一个对应文件夹
...
查看db_woman目录下有哪些文件:
[root@mysql_01 ~]# ll /mysql_3307/data/db_woman/
total 4
-rw-r-----. 1 mysql mysql 61 Jun 13 15:06 db.opt => 里面有一个.opt文件
查看.opt文件内容:
[root@mysql_01 ~]# cat /mysql_3307/data/db_woman/db.opt
default-character-set=utf8
default-collation=utf8_general_ci
创建一个数据表tb_girl:
在db_woman数据库下创建一个数据表tb_girl,db_woman文件
夹会生成两个文件(*.frm
、 *.ibd
)
其在外部的数据目录也会生成一个ibdata1文件
(确切来说不能叫做产生文件,而应该叫做共享文件。所有的innodb引擎产生的数据都会存放一部分数据在此文件)
*.frm
:框架文件,定义数据表结构(有哪些字段和字段类型等)*.ibd
:索引文件 + 数据文件ibdata1
:所有innodb引擎产生的数据都会往此文件存放一部分数据
创建一个数据表:
# mysql> use db_woman;
# mysql> create table tb_girl(id int,name varchar(20),height decimal(5,2)) engine=innodb default charset=utf8;
查看db_woman文件夹:
[root@mysql_01 ~]# ll /mysql_3307/data/db_woman/
total 112
-rw-r-----. 1 mysql mysql 61 Jun 13 15:20 db.opt
-rw-r-----. 1 mysql mysql 8620 Jun 13 15:21 tb_girl.frm => 创建数据表生成的两个文件
-rw-r-----. 1 mysql mysql 98304 Jun 13 15:21 tb_girl.ibd
查看MySQL数据目录:
[root@mysql_01 ~]# ll /mysql_3307/data/
total 122996
...
-rw-r-----. 1 mysql mysql 12582912 Jun 13 15:22 ibdata1 => 创建数据表还会在其data目录下生成一个共享文件
...
因为有一个共享文件,所以,InnoDB引擎的数据备份不能简简单单的通过拷贝方式实现,必须使用专业的备份工具。
MySQL数据库物理文件
日志文件
日志类型 | 写入日志的信息 |
---|---|
error 错误日志 | 存放数据库的启动、停止或运行时的错误信息(找ERROR) |
binlog 二进制日志 | 数据库的所有更改操作(DDL/DML/DCL),不包含select或者show这类语句 |
relay log 中继日志 | 记录从(slave)服务器接受来自主(master)服务器的二进制日志 |
一般查询日志 | 建立客户端连接和从客户端收到的语句 |
slow query log 慢查询日志 | long_query_time执行时间超过几秒的查询 |
DDL 日志(元数据日志) | 由DDL语句执行的元数据操作 |
错误日志文件 .err
作用:存放数据库的启动、停止或运行时的错误信息
应用场景:用于数据库启动排错。
- error错误日志的命令规则与存放的目录:/data目录下 + 主机名称.err
更改错误日志的存放位置:修改my.cnf配置文件
默认是开启的,可以通过修改my.cnf文件自定义:
查看错误日志默认存放位置:
[root@mysql_01 ~]# ll /mysql_3307/data/
total 122996
...
-rw-r-----. 1 mysql mysql 42556 Jun 13 14:22 mysql_01.err => 错误日志
...
# vim /mysql_3307/my.cnf => 修改配置文件,增加一行
...
log_error=/mysql_3307/data/mysql_change.err => 增加这样一行,代表更改错误日志的存放路径
# service mysql_3307 restart => 重启服务生效
再查看错误日志:
[root@mysql_01 ~]# ll /mysql_3307/data/
total 123012
...
-rw-r-----. 1 mysql mysql 46934 Jun 13 17:22 mysql_01.err
-rw-r-----. 1 mysql mysql 11100 Jun 13 17:22 mysql_change.err
...
二进制日志文件 binlog.log
作用: 二进制日志记录数据库的所有更改操作(DDL/DML/DCL),不包含select或者show这类语句。
binlog二进制日志应用场景:
- 用于主从复制中,master主服务器将二进制日志中的更改操作发送给slave从服务器,从服务器执行这些更改操作是的和主服务器的更改相同。
用于数据的恢复操作
默认binlog日志是关闭的,可以通过修改配置文件完成开启,如下:
- 进制日志比较特殊,需要使用mysqlbinlog工具查看,如mysqlbinlog 二进制日志文件
修改配置文件:
# vim /mysql_3307/my.cnf => 增加两行信息,5.7版本
...
server-id=1
log-bin=/mysql_3307/data/binlog
说明:5.7版本官方说明需要定义一下服务的id名称,主要是集群的时候使用,id的名称随意,只要不重复即可
# service mysql_3307 restart => 修改完重启服务
查看二进制文件:
[root@mysql_01 ~]# ll /mysql_3307/data/
total 123028
-rw-r-----. 1 mysql mysql 154 Jun 13 17:39 binlog.000001
-rw-r-----. 1 mysql mysql 31 Jun 13 17:39 binlog.index
说明:
binlog.index: 二进制文件的汇总信息
binlog.00000X:每次重启或刷新日志文件都会生成一个这样的文件,
中继日志 relay log
作用: 记录从(slave)服务器接受来自主(master)服务器的二进制日志
应用场景: 用于主从复制
master 主服务器将自己的二进制日志发送给slave从服务器,slave 先保存在自己的中继日志中,然后再执行本地的relay log 里的sql 达到数据库更改和master保持一致
默认中继日志是没有开启的,可以通过修改配置文件完成开启
修改配置文件,开启中继日志:
# vim /mysql_3307/my.cnf
...
relay-log=/path/xxx.log
如:relay-log=/mysql_3306/data/relaylog
说明:指定二进制日志存放位置及文件名
一般查询日志
作用: 当客户端连接或断开时,服务器会将信息写入该日志,并记录从客户端收到的每一条SQL语句。
应用场景: 当怀疑客户端的错误并想知道客户端发送给mysqld的确切信息时,该日志非常有用。
默认情况下慢查询日志是关闭的,可以通过修改配置文件完成开启,如下:
# vim /etc/my.cnf
[mysqld]
general_log=1 => 打开或关闭一般通用日志,0表示关闭;1表示开启
general_log_file=/path/file.log => 指定一般查询日志的路径及文件名,默认$datadir/hostname-slow.log
log-output=FILE => 定义日志的输出目标
说明:
log-output参数用于定义一般通用日志和慢查询日志的输出目标,即log-output=[value,…]
value=[TABLE|FILE|NONE],默认值为FILE
value | 描述 |
---|---|
TABLE | 表示将日志记录到表中,general_log表或者slow_log表中 |
FILE | 表示将日志记录的文本文件中 |
NONE | 表示不记录到表或者文件 |
注意:
- 如果log-output=NONE,则即使启用了日志,也不会写入条目。
- 如果log-output不等于NONE,但是没有启用日志也不会写入条目。
慢查询日志
作用: 慢查询日志记录的是一些SQL语句,可用于查找需要很长时间才能执行的查询;
应用场景: 用于找出长时间才能执行的查询语句,并对其进行优化。
但是,检查一个很长的慢查询日志可能成为一项艰巨的任务。为了简化这一过程,可以使用mysqldumpslow命令处理慢查询日志文件,以汇总日志中显示的查询。
默认情况下慢查询日志是关闭的,可以通过修改配置文件完成开启,如下:
# vim /etc/my.cnf
[mysqld]
slow_query_log={1|0} => 打开或关闭慢查询日志,0表示关闭;1表示开启
slow_query_log_file=/path/file_name.log => 指定慢查询日志的路径及文件名,默认$datadir/host_name-slow.log
log-output=FILE => 定义日志的输出目标
long_query_time=n => 表示查询语句超过n秒被记录到slow log里,最小值为0,默认值为10
常见的数据文件
数据文件类型 | 描述 |
---|---|
*.frm 文件 | 1、任何存储引擎,每一个表都会有一个以表名命名的.frm文件。 2、与表相关的元数据(meta)信息都存放在此文件中,包括表结构的定义信息等 |
*.MYD文件 | 1、myisam存储引擎专用,存放myisam表的数据(data) 2、每一个myisam表都会有一个.MYD文件与之呼应,同样存放在所属数据库的目录下 |
*.MYI文件 | 1、myisam存储引擎专用,存放myisam表的索引相关信息 2、对于myisam存储引擎来说,可以被缓存(cache)的内容主要就是来源于.MYI文件中。 每一个myisam表对应一个.MYI文件 |
*.ibd文件和ibdata文件 | 1、存放innoDB的数据文件(包括索引) 2、innoDB存储引擎有两种表空间方式:独享表空间和共享表空间。 3、独享表空间:使用.ibd文件来存放数据,且每个表一个.ibd文件。 4、共享表空间:使用.ibdata文件,所有表共同使用一个(或多个,自行配置).ibdata文件。 |
db.opt文件 | 此文件在每一个自建的库里都会有,记录这个库的默认使用的字符集和校验规 |
以上是关于MySQL体系结构的主要内容,如果未能解决你的问题,请参考以下文章
连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段