1
| 序号 | 特性 | 解释说明 |

|—|—|—|

1
2
3
4
5
6
7
| 01 | 数据访问特性 | 支持多版本并发控制特性(MVCC),支持行级锁控制并发 |
| 02 | 数据索引特性 | 支持聚簇索引/辅助索引特性,可以组织存储数据和优化查询(IOT) |
| 03 | 数据事务特性 | 支持事务概念特性,可以实现数据的安全保证 |
| 04 | 数据缓冲特性 | 支持多缓冲区功能,自适应hash索引(AHI) |
| 05 | 数据迁移特性 | 支持复制数据中的高级功能特性,支持数据备份恢复的热备 |
| 06 | 服务自愈特性 | 支持自动故障恢复(CR-Crash Recover y) |
| 07 | 数据存储特性 | 支持数据双写机制(Double write) 数据存储有关的安全机制 |

基础章节-01-MySQL数据库服务中级课程

1.00 课程知识章节说明

目前在互联网的实际应用中,各个企业都会比较关注自身网站的数据信息,既要保证数据信息的安全性,同时也要保证数据存储读取效率 并且在特殊的场景下,还要对存储的数据信息进行检索和分析;因此数据库服务业务已经在各行各业应用非常的广泛 对于互联网领域的技术人员,对于数据库服务知识的掌握,也将是在求职时必备的技能,有些时候还会绝对入职的定级和薪资水平。

1.09 数据库服务存储引擎

1.9.1 数据库存储引擎概念

存储引擎就是数据库服务中的文件系统,用户可以根据应用的需要选择如何存储和索引数据,是否使用事务等;

1.9.2 数据库存储引擎种类

在各种版本的数据库服务中,是有多种存储引擎可以应用的,以MySQL数据库服务为例,可以使用命令查看可以应用存储引擎: 引擎类型信息输出: 在实际场景中,99.9%都是使用innodb存储引擎,并且在最新版8.0数据库中,所有mysql数据库中的表对应的引擎也都改为了innodb;

如果在面试环节中,面试官询问你: 列举出mysql中支持的存储引擎种类:InnoDB、MyISAM、CSV、MEMORY; 列举出mysql分支产品的存储引擎种类:在percone、mariadb数据库中,可能还会应用TokuDB MyRocks Rocksdb存储引擎 从特点上可以支持innodb引擎的特性(支持事务),并且数据压缩比比较高(15倍),数据插入性能比较强(5~6倍); 以上存储引擎就比较适合于zabbix监控类的平台,归档数据、历史数据存储业务等,数据量级比较大的情况; 监控服务部署tokuDB存储引擎参考链接:https://www.cnblogs.com/oldboy-heqing /articles/16891210.html

1.9.3 数据库存储引擎特性

在数据库服务领域,大部分场景下都会使用innodb存储引擎,是因为innodb存储引擎具有一定优秀特性:

1
mysql> show engines;

如果在面试环节中,面试官询问你: InnoDB核心特性有哪些,以及与MyISAM存储引擎之间的区别: InnoBD支持:事务、mvcc、聚簇索引、外键、缓冲区、AHI、DW;MyISAM均不支持 InnoDB支持:行级锁,MyISAM只支持表级锁; InnoDB支持:数据热备,可以保证业务正常运行,对业务影响低,MyISAM只支持温备份,需要锁表备份; InnoDB支持:支持CR自动故障恢复,宕机自动恢复,数据安全和一致性可以得到保证;MyISAM不支持,宕机可能丢失当前数据;

企业实际场景案例分析说明: 案例说明01:某期学员负责运维+MySQL相关工作; 平台环境:zabbix 3.2 + centos 7.3 + mariadb 5.5(InnoDB引擎),利用监控平台,监控了2000多个节点服务; 问题现象:每隔一段时间zabbix服务就会运行操作很卡,每隔3-4个月,都要重新部署zabbix,存储空间经常爆满(ibdata1 400500G);ibdate1 ibdata1-01 异常分析: zabbix版本过低,建议将zabbix程序进行升级更新; zabbix使用的数据版本过低,建议将数据库版本进行升级,因为新版本数据库的原生态环境就比旧版本好些; 在数据库5.5版本中,在没有做数据存储调配时,数据库所有数据都会保存到ibdata1文件中; 在ibdata1文件中的数据空间,不会因为数据库中的数据删除,产生数据回缩的效果,即空间不释放; 优化建议: 数据库版本升级到percona 5.7+(mariadb 10.x+),zabbix软件升级更高版本; 数据库服务存储引擎改为tokudb; 监控数据最好按月份进行数据切割(二次开发zabbix程序,数据保留机制功能重写,并且数据库分表存储) 将数据库服务的binlog功能关闭(双1); 数据库服务相关内存优化参数调整; 优化思路: zabbix程序原生态支持TokuDB,经过压力测试,5.7要比5.5数据库版本性能高出 23倍; 使用TokuDB作为数据库存储引擎,insert数据比innodb要快的多,数据压缩比也要比Innodb高; 监控数据按月份进行切割(分区),为了能够truncate每个分区表,以便立即释放存储空间; 将数据库服务binlog关闭,是为了减少无关日志的记录,避免磁盘IO的消耗,以及节省磁盘空间的使用; 参数优化调整,主要是对安全性参数或内存相关参数调整,提高数据库服务运行性能; 企业案例资料参考: https://mariadb.com/kb/en/ installing-tokudb https://docs.percona.com/percona-ser ver/5.7/tokudb/tokudb_intro.html https://www.percona.com/doc/percona-ser ver/5.7/tokudb/tokudb_installation.html

案例说明02:企业客户实际数据库需求 平台环境:centos 5.8+mysql 5.0版本,MyISAM存储引擎+网站架构LNMP,数据量50G左右 问题现象:业务并发压力大的时候,整体网站访问非常卡,还会出现数据库服务宕机情况,造成部分数据丢失 问题分析: MyISAM存储引擎具有表级锁,在高并发访问时,会频繁出现锁等待情况; MyISAM存储引擎不支持事务机制,在断电或宕机时,会有可能丢失数据信息; 优化建议: 数据库服务版本进行升级,从5.0升级到更高的版本;ok 数据库服务升级后,迁移所有表数据到新环境(表空间迁移),调整存储引擎为InnoDB; 数据库服务开启双1安全参数; 数据库服务进行重构主从架构

1.9.4 数据库存储引擎应用

01 引擎基本操作说明:

数据库存储引擎信息查看:

数据库存储引擎配置修改:

数据表存储引擎信息查看:(具体表的存储引擎)

数据表存储引擎配置修改:(具体表的存储引擎)

1.9.5 数据库存储引擎结构

数据库服务存储引擎结构的介绍,可以依据官方图示参考说明: https://dev.mysql.com/doc/refman/8.0/en/ innodb-architecture.html

结合官方存储引擎结构图,可以看出存储引擎结构分为两个部分:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 查看数据库可用存储引擎
mysql> show engines;
# 查看数据库默认存储引擎
mysql> select @@default_storage_engine;
+----------------------------------+
| @@default_storage_engine         |
+----------------------------------+
| InnoDB                           |
+----------------------------------+
1 row in set (0.00 sec)
# 永久修改存储引擎配置
[root@xiaoQ-01 ~]# vim /etc/my.cnf
[mysqld]

default_storage_engine=InnoDB

1
2
3
4
5
-- 重启数据库服务生效
# 查看建表语句获取存储引擎信息
mysql > show create table city;
# 查看information_schema数据库获取存储引擎信息
mysql > select table_schema,table_name,engine from information_schema.tables where table_schema not

in(‘sys’,‘mysql’,‘information_schema’,‘performance_schema’)

1
2
3
4
5
# 创建表时设置存储引擎
mysql > create table xxx (id int) engine=innodb charset=utf8mb4;
# 修改表示设置存储引擎
mysql > alter table world.xxx engine=myisam;
mysql > alter table world.xxx engine=innodb;

数据库版本 存储数据 解释说明

1
MySQL 5.5版本

系统相关数据 全局数据字典信息(表基本结构信息、状态系统参数、属性)、undo回滚日志(记录撤销操作); Double write buffer信息、临时表信息、changer buffer

用户相关数据 业务表数据行、表的索引数据均统一存储在ibdata1中,实现集中管理 数据表中数据清理后,ibdata1也不会释放磁盘空间

1
MySQL 5.6版本

系统相关数据 全局数据字典信息(表基本结构信息、状态系统参数、属性)、undo回滚日志(记录撤销操作); Double write buffer信息、临时表信息、changer buffer

用户相关数据 共享表空间只存储系统数据,用户相关数据被独立管理了(独立表空间管理)

1
MySQL 5.7版本

系统相关数据 全局数据字典信息 undo回滚日志 Double write buffer信息、changer buffer 临时表信息被独立出来了,undo也可以设定为独立

用户相关数据 共享表空间只存储系统数据,用户相关数据被独立管理了(独立表空间管理)

1
MySQL 8.0.11

系统相关数据 Double write buffer信息、changer buffer undo回滚日志信息被独立出来了,数据字典信息也不再集中存储管理了

用户相关数据 共享表空间只存储系统数据,用户相关数据被独立管理了(独立表空间管理)

1
MySQL 8.0.20

系统相关数据 changer buffer Double write buffer信息被独立出来了

01 On-Disk Structures(磁盘结构部分)

在磁盘存储结构中,会使用表空间模式进行数据信息的管理,经常提到的段 区 页概念也是属于表空间的逻辑结构; 表空间的概念源于oracle数据库,最初的目的是为了能够更好的做存储的扩容;因此数据库的表空间技术类似磁盘管理的LVM技术; 在数据库服务中所使用的表空间也被划分出几种种类: 类型一:共享(系统)表空间 属于数据库服务5.5版本时默认的表空间应用,具体数据存储数据方式为:ibdata1~ibdataN ibdata共享表空间在各个版本之间的作用区别:

共享表空间管理: 扩容共享表空间操作: 扩容前共享表空间信息查看:

共享表空间的扩容操作方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
mysql> select @@innodb_data_file_path;
+-------------------------------------+
| @@innodb_data_file_path             |
+-------------------------------------+
| ibdata1:12M:autoextend              |
+-------------------------------------+
1 row in set (0.00 sec)
-- 可以在初始安装好数据库服务后,进行修改配置为两个ibdate文件,每个共享表空间文件占用2G,总共占用4个G空间
mysql> select @@innodb_autoextend_increment;
+---------------------------------------------+
| @@innodb_autoextend_increment               |
+---------------------------------------------+
| 64                                          |
+---------------------------------------------+
1 row in set (0.00 sec)
-- 查看参数信息说明:ibdata1文件,默认初始大小12M,不够用会自动扩展,默认每次扩展64M
# 编写数据库配置文件信息
vim /etc/my.cnf

| 序号 | 版本信息 | 建议说明 |

|—|—|—|

1
| 01 |  |  |

02

1
MySQL 8.0

设置共享表空间1个即可,大小建议512M或1G

数据库初始化时设置共享表空间容量建议:

共享表空间的初始设置方法:

类型二:独立表空间 在数据库服务5.6版本中,针对用户数据,可以进行单独的存储管理,存储表的数据行和索引等相关信息;

独立表空间在各个版本之间的作用区别: 在数据库服务8.0版本前 用户表包含三个部分组成(表.ibd 表.frm ibdata1-全局数据字典信息存储); 所以在8.0之前,如果想修改表数据结构信息(元数据修改),都会修改frm和ibdata文件信息,每次更新都会锁表(元数据锁); 因为要保证数据一致性,并且两个表均更新完,才能释放解锁,因此在8.0前修改元数据信息,要避开业务繁忙时间段; 在数据库服务8.0版本后 用户表数据进行统一存储(表.ibd); 如果想修改表数据结构信息(元数据修改),只会修改ibd文件信息; 此时不需要对两个表文件均更新,只要更新一个文件即可,因此对文件锁的代价降低了,降低了对业务的影响;

独立表空间管理: 表空间配置参数信息查看

1
2
3
4
[mysqld]

innodb_data_file_path=ibdata1:12M;ibdata2:100M;ibdata3:100M:autoextend
-- 需要注意的是ibdata1文件大小必须和实际数据库要存储的数据相匹配,否则会出现如下报错信息

[ERROR] [MY-012264] [InnoDB] The innodb_system data file ‘./ ibdata1’ is of a different size 768 pages (rounded down to MB) than the 4864 pages specified in the .cnf file!

 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
-- 表示ibdate1指定大小超过了原有ibdata1实际的大小尺寸
# 查看配置信息是否生效
mysql> select @@innodb_data_file_path;
+---------------------------------------------------------------------+
| @@innodb_data_file_path                                             |
+---------------------------------------------------------------------+
| ibdata1:12M;/data02/ ibdata2:100M;/data03/ ibdata3:100M:autoextend  |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)
# 模拟初始化清理数据
[root@xiaoQ-01 ~]# /etc/ init.d/mysqld stop
[root@xiaoQ-01 ~]# rm -rf /data/3306/data/*
# 模拟初始化配置文件
[root@xiaoQ-01 ~]# vim /etc/my.cnf
[mysqld]

innodb_data_file_path=ibdata1:100M;ibdata2:100M;ibdata3:100M:autoextend
# 模拟初始化操作命令
[root@xiaoQ-01 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
# 模拟初始化重启服务
[root@xiaoQ-01 ~]#  /etc/ init.d/mysqld start
mysql > select @@innodb_file_per_table;
+---------------------------------+
| @@innodb_file_per_table         |
+---------------------------------+
| 1                               |
+---------------------------------+
1 row in set (0.00 sec)
-- 表示每个表就是一个独立文件,进行数据信息的独立存储,不建议进行修改,如果改为0就是所有数据统一存储在共享表空间
[root@xiaoQ-01 ~]#  ibd2sdi city.ibd
-- 可以看到文件中存储的元数据信息(数据字典信息),并且数据库8.0之后不再有表对应的frm文件信息了
-- 在数据库5.7环境中,每个表数据信息会存储生成两个表 frm ibd
-- frm文件中存储数据表的数据字典信息(元数据信息)

表空间配置参数信息修改

表空间企业应用案例: 案例01:利用独立表空间进行快速数据迁移(源端 3306/test/t100w –> 目标端 3307/test/t100w)

说明:可以在需要某个表中的数据信息时,可以将数据表的独立表空间数据信息做迁移,在另一个数据库中进行恢复即可

操作步骤一:锁定源端t100w表

操作步骤二:目标端创建oldboy库和t100w空表

操作步骤三:单独删除空的表空间文件

操作步骤四:拷贝源端ibd文件到目标端目录,并设置权限

操作步骤五:导入表空间

操作步骤六:解锁源端数据表

案例02:利用表空间迁移功能实现数据损坏恢复

1
2
3
4
5
6
7
-- ibd文件中存储数据行信息和索引信息
mysql > set global innodb_file_per_table=0
-- 设置为0表示利用共享表空间存储用户数据 1表示利用独立表空间存储用户数据
mysql > lock tables oldboy.t100w write;
-- 给t100w表加写数据锁
mysql > show create table oldboy.t100w;
CREATE TABLE `t100w` (

id int DEFAULT NULL, num int DEFAULT NULL, k1 char(2) DEFAULT NULL, k2 char(4) DEFAULT NULL, dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, KEY idx (k1,k2,num) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |

1
2
3
4
-- 获取创建表结构数据信息
mysql> create database oldboy;
-- 创建新的数据库
mysql > CREATE TABLE `t100w` (

id int DEFAULT NULL, num int DEFAULT NULL, k1 char(2) DEFAULT NULL, k2 char(4) DEFAULT NULL, dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, KEY idx (k1,k2,num) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
-- 创建新的数据表
mysql> alter table oldboy.t100w discard tablespace;
-- 删除t100w表的ibd数据文件信息,但是保留t100w的frm,ibdata1中关于t100w的系统数据
[root@xiaoQ-01 ~]# cp /data/3306/data/oldboy/t100w.ibd /data/3307/data/oldboy/
[root@xiaoQ-01 ~]# chown -R mysql.mysql /data/*
mysql> alter table oldboy.t100w import tablespace;
-- 在目标端加载识别迁移过来的数据文件信息
mysql> select count(*) from t100w;
+----------+
| count(*) |
+----------+
| 1000000  |
+----------+
1 row in set (0.04 sec)
-- 查看数据表中是否有迁移古来的数据信息
mysql> unlock tables;

说明:操作系统突然断电了,启动完成后 / 变为只读了,fsck修复文件系统,系统再次重新启动后,mysql启动不了了

结果:造成confulence库在、jira库不见了(备份没有 日志也没开) 服务:jira(bug追踪)、confluence(内部知识库) 、mysql 5.6.33(innodb引擎 使用独立表空间) – LNMT架构 硬件:联想服务器(8核 16G内存 500G存储空间 没有raid),centos 6.8系统

对话描述: 学生:这种情况怎么恢复? 老师:有备份吗? 学生:连二进制日志都没有,没有备份,没有主从 老师:jira数据库数据没什么办法了,只能进行硬盘数据恢复了 学生:jira数据库数据先不用关注,数据磁盘已经拉到中关村处理了 主要是confulence库还想使用,但将生成中的库目录,导入到其他主机上(var/lib/mysql),无法直接访问数据库中数据? /data/3306/data/confulence 老师有没有工具能直接读取数据库目录中的ibd文件内容 老师:我查查,最后发现没有 我们可以尝试下独立表空间迁移

1
2
3
create table xx
alter table coufulence.t1 discard tablespace;
alter table coufulence.t1 import tablespace;

虚拟环境测试可行 问题:confulence库中总共有107张表 困惑:如何创建107张和原来一模一样的表 解决:学生环境中有2016年的历史库,让学生利用mysqldump命令备份confulence历史库

1
mysqldump -uroot -ppassw0rd -B confulence --no-date > test.sql    只获取所有表结构信息

如果是自研数据库,没有备份怎么办 mysql工具包中,拥有mysqlfrm工具也可以读取frm文件获取表结构

操作步骤一:备份历史数据库的所有表结构信息,并进行恢复

操作步骤二:删除空表的独立表空间 实际执行过程发现,有20-30张表无法成功,主外键关系问题,如果一个表一个表分析表结构,处理外键关系很痛苦

操作步骤三:拷贝生成中confulence库下的所有表的ibd文件到准备好的环境中并加载识别

操作步骤四:进行数据信息验证 表都可以访问了,数据挽回了出现问题时刻的状态

案例03:mysql 5.7中误删除了ibdata1数据文件,导致数据库服务无法启动;(作业)

说明:如何恢复t100w表中数据,并且假设库中有100张表,而且表结构无法通过show create table获得;

提示:有可能是自研数据库,并且没有数据备份 思路:先获取表结构信息,然后重新建表,删除空表的独立表空间,导入表的数据文件,加载识别表数据信息 操作步骤一:mysql工具包中含有mysqlfrm工具,可以读取frm文件获得表结构; 操作步骤二:将新库中所有独立表空间进行删除

1
2
3
4
[root@xiaoQ-01 ~]# mysqldump -uroot -ppassw0rd -B confulence --no-date > test.sql
mysql > create database confulence
mysql > source test.sql
select concat("alter table ",table_schema,".",table_name," discard tablespace;") from information_schema.tables where table_schema='confulence'; into outfile

‘/tmp/discard.sql’;

1
2
3
4
source /tmp/discard.sql
set foreign_key_checks=0
-- 跳过外键检查,从而把有问题的20-30张表的独立表空间也删除了
select concat("alter table ",table_schema,".",table_name," import tablespace;") from information_schema.tables where table_schema='confulence' into outfile

‘/tmp/ import.sql’;

1
2
source /tmp/ import.sql
[root@xiaoQ-01 ~]# ./mysqlfrm /data/3306/data/test/t100w.frm --diagnostic

类型三:undo表空间 利用undo表空间主要用来完成撤销工作(回滚操作); 在数据库5.7版本中,默认存储在共享表空间中(ibdata);在数据库8.0版本后,默认就是独立存储了(undo_001-undo_002); 在实际生产环境中,建议在5.7版本之后,都将undo表空间进行独立文件存储;

undo表空间管理: 表空间配置参数信息查看 官方参数使用说明(important): The number of undo tablespaces can only be configured when initializing a MySQL instence and is fixed for the life of the instance; undo表空间的数量只能在初始化MySQL实例时配置,并且在实例生命周期内是固定的

表空间配置参数修改调整 修改数据库5.7版本服务的undo表空间,实现undo表空间的独立存储; 查看获取数据库5.7版本的默认undo配置情况:

关闭数据库服务程序,对undo表空间进行独立存储配置:

1
select concat('alter table ',table_schema,'.'table_name,' discard tablespace;') from informatin_schema.tables where table_schema='confluence' into outfile

‘/tmp/discard.sql’;

 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
35
36
37
38
39
40
41
source /tmp/discard.sql
mysql> select @@innodb_undo_tablespaces;
+-------------------------------------------+
| @@innodb_undo_tablespaces                 |
+-------------------------------------------+
| 2                                         |
+-------------------------------------------+
1 row in set (0.00 sec)
-- 确认是否打开独立undo模式,并设置undo表空间文件个数(3-5个)
mysql> select @@innodb_max_undo_log_size;
+-------------------------------------------+
| @@innodb_max_undo_log_size                |
+-------------------------------------------+
| 1073741824                                |
+-------------------------------------------+
1 row in set (0.00 sec)
-- 表示undo日志信息的大小,默认1G
mysql> select @@innodb_undo_log_truncate;
+-------------------------------------------+
| @@innodb_undo_log_truncate                |
+-------------------------------------------+
| 1                                         |
+-------------------------------------------+
1 row in set (0.00 sec)
-- 表示开启undo自动回收的机制(undo purge)
mysql> select @@innodb_purge_rseg_truncate_frequency;
+----------------------------------------------------------+
| @@innodb_purge_rseg_truncate_frequency                   |
+----------------------------------------------------------+
| 128                                                      |
+----------------------------------------------------------+
1 row in set (0.00 sec)
-- 触发自动回收的条件,单位是检测次数
mysql> select @@innodb_undo_tablespaces;
+--------------------------------------+
| @@innodb_undo_tablespaces            |
+--------------------------------------+
| 0                                    |
+--------------------------------------+
1 row in set (0.00 sec)
-- 在数据库5.7版本中,undo表空间默认并未实现独立存储;

重新初始化数据库服务程序:

重新启动数据库服务程序:

实现undo表空间文件指定目录存储

说明:对于数据库8.0版本,在进行undo表空间配置信息调整的时候,可以进行在线调整;

数据库8.0 undo表空间与数据库5.7undo表空间区别资料: https://dev.mysql.com/doc/refman/8.0/en/ innodb-undo-tablespaces.html

数据库8.0独立表空间设置扩展:Adding Undo Tablespaces Because undo logs can become large during long-running transactions, creating additional undo tablespaces can help prevent individual undo tablespaces from becoming too large. A s of MySQL 8.0.14, additional undo tablespaces can be created at runtime using CREATE UNDO TABLESPACE syntax.

1
2
3
# 关闭数据库服务程序,清理数据库服务数据目录
[root@xiaoQ-01 ~]# systemctl stop mysqld3357
[root@xiaoQ-01 ~]# systemctl is-active mysqld3357

unknown

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
-- 关闭数据库服务程序
[root@xiaoQ-01 ~]# rm -rf /data/3357/data/*
-- 删除清空数据库数据目录
# 编写修改数据库服务配置文件
[root@xiaoQ-01 ~]# vim /data/3357/my.cnf
[mysqld]

innodb_undo_tablespaces=3
innodb_max_undo_log_size=128M
innodb_undo_log_truncate=ON
innodb_purge_rseg_truncate_frequency=32
-- 在数据库服务端添加以上参数信息
[root@xiaoQ-01 ~]#  /usr/local/mysql57/bin/mysqld --defaults-file=/data/3357/my.cnf --initialize-insecure  --basedir=/usr/local/mysql57 --datadir=/data/3357/data

–user=mysql

1
2
3
4
5
6
[root@xiaoQ-01 ~]# ll /data/3357/data/undo*
-rw-r----- 1 mysql mysql 10485760 11月 15 10:19 /data/3357/data/undo001
-rw-r----- 1 mysql mysql 10485760 11月 15 10:19 /data/3357/data/undo002
-rw-r----- 1 mysql mysql 10485760 11月 15 10:19 /data/3357/data/undo003
[root@xiaoQ-01 ~]# systemctl start mysqld3357
[root@xiaoQ-01 ~]# systemctl is-active mysqld3357

active

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 将数据库服务进行关闭
[root@xiaoQ-01 ~]# systemctl stop mysqld3357
# 编写数据库服务配置文件
[root@xiaoQ-01 ~]# vim /data/3357/my.cnf
[mysqld]

innodb_undo_director y=/data/3357/undologs
# 创建存储undo表空间文件目录
[root@xiaoQ-01 ~]# mkdir -p /data/3357/undologs
[root@xiaoQ-01 ~]# chown -R mysql.mysql /data/*
[root@xiaoQ-01 ~]# cp -a /data/3357/data/undo* /data/3357/undologs/
# 将数据库服务进行启动
[root@xiaoQ-01 ~]# mysql -S /tmp/mysql3357.sock
mysql > select @@innodb_undo_director y;
+-------------------------------------+
| @@innodb_undo_director y            |
+-------------------------------------+
| /data/3357/undologs                 |
+-------------------------------------+
1 row in set (0.00 sec)
# 创建新的独立的undo表空间文件

===============================================================================================

类型四:temp表空间 临时表空间主要用于存储临时表信息,主要是在使用group by,order by,having,unique all,子查询等情况都会使用临时表; 临时表可以存储在内存和磁盘上;

临时表空间管理: 扩容临时表空间操作: 扩容前临时表空间信息查看:

临时表空间的扩容操作方法:

说明:建议数据初始化之前设定好临时表空间,建议23个,大小512M1G;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';
# 查看已经创建的独立的undo表空间文件
mysql> select tablespace_name,file_name from information_schema.files where file_type like 'undo log';
+---------------------------+----------------+
| TABLESPACE_NAME           | FILE_NAME      |
+---------------------------+----------------+
| innodb_undo_001           | ./undo_001     |
| innodb_undo_002           | ./undo_002     |
| tablespace_name           | ./xiaoQ1.ibu   |
+---------------------------+----------------+
3 rows in set (0.00 sec)
# 删除已有的独立的undo表空间文件
ALTER UNDO TABLESPACE tablespace_name SET INACTIVE;
-- 将指定的undo表空间信息设置为失效
DROP UNDO TABLESPACE tablespace_name;
-- 删除指定的undo表空间信息
# 查看已有的独立的undo表空间状态
SELECT NAME, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES

WHERE NAME LIKE ’tablespace_name’;

 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
mysql> select @@innodb_temp_data_file_path;
+--------------------------------------------+
| @@innodb_temp_data_file_path               |
+--------------------------------------------+
| ibtmp1:12M:autoextend                      |
+--------------------------------------------+
1 row in set (0.00 sec)
mysql> select @@innodb_autoextend_increment;
+---------------------------------------------+
| @@innodb_autoextend_increment               |
+---------------------------------------------+
| 64                                          |
+---------------------------------------------+
1 row in set (0.00 sec)
-- 查看参数信息说明:ibtmp1文件,默认初始大小12M,不够用会自动扩展,默认每次扩展64M
# 编写数据库配置文件信息
vim /etc/my.cnf
[mysqld]

innodb_temp_data_file_path=ibtmp1:12M;ibtmp2:120M:autoextend:max:500M
-- 需要注意的是ibdata1文件大小必须和实际数据库要存储的数据相匹配,否则会出现如下报错信息
# 查看配置信息是否生效
mysql> select @@innodb_temp_data_file_path;
+---------------------------------------------------------------------+
| @@innodb_temp_data_file_path                                        |
+---------------------------------------------------------------------+
| ibtmp1:12M;ibtmp2:120M:autoextend:max:500M                          |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)

| 序号 | 版本信息 | 建议说明 |

|—|—|—|

1
| 01 |  |  |

02

1
MySQL 8.0

设置共享表空间1个即可,大小建议512M或1G 数据库初始化时设置临时表空间容量建议:

临时表空间的初始设置方法:

类型五:redo事务日志 redo log属于事务重做日志文件,主要用于记录内存数据页的变化(记录在内存中对数据页的操作信息),都会以日志文件方式记录; 可以实现"前进"(WAL-write ahead log)的功能,数据库会保证redo操作日志优先于数据写入磁盘,加快了事务提交效率(提高并发); 在进行日志信息记录时,采用的是顺序IO,而数据存储时采用的异步IO(随机IO); redo事务日志的存储路径为:默认存储在数据库服务的数据目录下,默认大小为48M

redo事务日志管理: 进行redo事务日志操作: redo事务日志配置信息查看:

redo事务日志配置操作方法:

类型六:ib_buffer_pool预热文件 ib_buffer_pool预热文件可以用于缓冲和缓存,可以存储"热"数据页(经常查询或修改的数据页),从而减少物理IO消耗; 从数据库5.7版本开始,数据库正常关闭后,内存中存储的数据页缓冲或缓存信息均会失效,重新启动后还会消耗IO获取相应数据页信息;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 模拟初始化清理数据
[root@xiaoQ-01 ~]# /etc/ init.d/mysqld stop
[root@xiaoQ-01 ~]# rm -rf /data/3306/data/*
# 模拟初始化配置文件
[root@xiaoQ-01 ~]# vim /etc/my.cnf
[mysqld]

innodb_temp_data_file_path=ibtmp1:12M;ibtmp2:120M:autoextend:max:500M
# 模拟初始化操作命令
[root@xiaoQ-01 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
# 模拟初始化重启服务
[root@xiaoQ-01 ~]#  /etc/ init.d/mysqld start
[root@xiaoQ-01 data]# pwd

/data/3306/data

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@xiaoQ-01 data]# ll ib_log*
-rw-r----- 1 mysql mysql 50331648 11月 15 11:34 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 11月 15 11:27 ib_logfile1
mysql> show variables like '%innodb_log_file%';
+-----------------------------------+---------------+
| Variable_name                     | Value         |
+-----------------------------------+---------------+
| innodb_log_file_size              | 50331648      |
| innodb_log_files_in_group         | 2             |
+-----------------------------------+---------------+
2 rows in set (0.00 sec)
-- 在实际生产环境中,建议大小为512M~4G,应用组数为2~4组(写入数据过程轮询写入)
# 编写数据库配置文件信息
vim /etc/my.cnf
[mysqld]

innodb_log_file_size=100M
innodb_log_files_in_group=3
# 确认配置信息是否已经生效
[root@xiaoQ-01 data]# /etc/ init.d/mysqld restart
[root@xiaoQ-01 data]# ll /data/3306/data/ ib_log*
-rw-r----- 1 mysql mysql 104857600 11月 15 15:12 /data/3306/data/ ib_logfile0
-rw-r----- 1 mysql mysql 104857600 11月 15 15:12 /data/3306/data/ ib_logfile1
-rw-r----- 1 mysql mysql 104857600 11月 15 15:12 /data/3306/data/ ib_logfile2

为了可以尽量减少磁盘IO的消耗,可以将内存中的热数据页信息存储在ib_buffer_pool文件中; 数据库服务再次启动后,会直接读取ib_buffer_pool文件中信息,并将读取的信息加载到内存中,最终减少随机IO数量;

说明:存在ib_buffer_pool预热文件后,有可能在数据库服务关闭时比较耗费一些时间,但实际环境数据库服务关闭情况较少;

类型七:Doublewrite Buffer(DWB)文件 DWB文件主要作用是:mysql process crash in the middle of a page write(在数据库服务存储时,数据页写了一半); 数据库Innodb可以找到一个好的数据页副本从Doublewrite Buffer文件中,主要是避免数据信息出现损坏; MySQL数据库最小IO存储单元是page(16kB),OS系统中最小的IO存储单元是block(4kB),OS也可以称为存储子系统; 会出现一个问题:数据库系统与操作系统的存储关系问题,在数据库中写入一个数据页时,在文件系统层面可能只是写入了2个block; 问题解决思路: 在数据库8.0.19之前,默认在ibdataN文件中进行存储,在数据库8.0.20以后,可以进行独立文件存储;

02 In-Memor y Structures(内存结构部分)

在内存结构中也是包含很多的组成部分,主要的组成部分有: 组成部分一:InnoDB Buffer Pool(IBP) Buffer Pool内存存储区域主要用来缓冲或缓存数据库服务的数据页和索引页,是MySQL中最大的、最重要的内存区域;

Buffer Pool内存空间管理: Buffer Pool配置参数信息查看:

Buffer Pool配置参数修改方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[root@xiaoQ-01 data]# ll *ib_16384*
-rw-r----- 1 mysql mysql   196608 11月 15 15:14 #ib_16384_0.dblwr
-rw-r----- 1 mysql mysql 8585216 11月 15 11:27 #ib_16384_1.dblwr
mysql> select @@innodb_buffer_pool_size;
+---------------------------------------+
| @@innodb_buffer_pool_size             |
+---------------------------------------+
| 134217728                             |
+---------------------------------------+
1 row in set (0.00 sec)
-- buffer pool默认内存空间大小为128M,生产建议大小可以设置为物理内存总量的50%~80%

组成部分二:InnoDB Log Buffer(ILB)

1
2
3
4
Log Buffer内存存储区域主要用来缓冲 redo log日志信息
Log Buffer内存空间管理
Log Buffer配置参数信息查看
Log Buffer配置参数修改方法

存储引擎体系结构总览:(事务工作流程前讲解)

 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 > set global innodb_buffer_pool_size=268435456;
-- 配置调整后,重新登录mysql数据库生效
# 配置信息永久调整
[root@xiaoQ-01 ~]# vim /etc/my.cnf
[mysqld]

innodb_buffer_pool_size=256M
-- 配置调整后,重新启动mysql数据库生效
mysql> select @@innodb_log_buffer_size;
+--------------------------------------+
| @@innodb_log_buffer_size             |
+--------------------------------------+
| 16777216                             |
+--------------------------------------+
1 row in set (0.00 sec)
-- log_buffer默认内存空间大小为16M,生产建议大小可以设置为innodb_log_file_size文件大小的 1-N倍(后续说明)
# 配置信息临时调整
mysql > set global innodb_log_buffer_size=33554432;
-- 配置调整后,重新登录mysql数据库生效
# 配置信息永久调整
[root@xiaoQ-01 ~]# vim /etc/my.cnf
[mysqld]

innodb_log_buffer_size=32M
-- 配置调整后,重新启动mysql数据库生效