十三、Mysql的存储引擎

news2025/1/12 4:02:39

在这里插入图片描述

Mysql的存储引擎

  • 十三、Mysql的存储引擎
  • 一、什么是存储引擎
  • 二、存储引擎的常见功能
  • 三、存储引擎的种类及特性对比
    • 1、存储引擎的种类
    • 2、常见存储引擎的特性对比
    • 3、查看存储引擎
  • 四、InnoDB存储引擎
    • 1、InnoDB存储引擎介绍
    • 2、InnoDB存储引擎的优点
    • 3、InnoDB与MyISAM的区别
    • 4、存储引擎查看
      • 4.1使用 SELECT 确认会话存储引擎
      • 4.2 存储引擎(不代表生产操作)
      • 4.3 SHOW 确认每个表的存储引擎:
      • 4.4 INFORMATION_SCHEMA 确认每个表的存储引擎
      • 4.5 修改一个表的存储引擎
      • 4.6 平常处理过的MySQL问题--碎片处理
      • 4.7扩展:如何批量修改存储引擎
    • 5、InnoDB存储引擎物理存储结构
    • 6、表空间
      • 6.1共享表空间
      • 6.2独立表空间
      • 6.3案例说明

十三、Mysql的存储引擎

一、什么是存储引擎

存储引擎是MySQL数据库用来处理不同表类型的SQL操作的组件。是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。

MySQL 的核心就是存储引擎。

简单来说存储引擎相当于linux的文件系统,只不过比文件系统强大

二、存储引擎的常见功能

1、数据读写
2、数据安全和一致性
3、提高性能
4、热备份
5、自动故障恢复
6、高可用方面支持
等等

三、存储引擎的种类及特性对比

1、存储引擎的种类

Oracle MySQL

InnoDB
MyISAM
MEMORY
ARCHIVE
FEDERATED
EXAMPLE
BLACKHOLE
MERGE
NDBCLUSTER
CSV

2、常见存储引擎的特性对比

img

3、查看存储引擎

show engines;
存储引擎是作用在表上的,也就意味着,不同的表可以有不同的存储引擎类型。
PerconaDB:默认是XtraDB
MariaDB:默认是InnoDB
其他的存储引擎支持:
TokuDB    
RocksDB
MyRocks
以上三种存储引擎的共同点:压缩比较高,数据插入性能极高
现在很多的NewSQL,使用比较多的功能特性.

四、InnoDB存储引擎

1、InnoDB存储引擎介绍

img

在MySQL5.5版本之后,默认的存储引擎,提供高可靠性和高性能。

2、InnoDB存储引擎的优点

1)、事务(Transaction)

2)、MVCC(Multi-Version Concurrency Control多版本并发控制)

3)、行级锁(Row-level Lock)

4)、ACSR(Auto Crash Safey Recovery)自动的故障安全恢复

5)、支持热备份(Hot Backup)

6)、Replication: Group Commit , GTID (Global Transaction ID) ,多线程(Multi-Threads-SQL )

3、InnoDB与MyISAM的区别

img

1. MyISAM不支持事务,书摘
摘自《高性能MySQL》
InnoDB:MySQL默认的事务型引擎,也是最重要和使用最广泛的存储引擎。它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的,很少被回滚。InnoDB的性能与自动崩溃恢复的特性,使得它在非事务存储需求中也很流行。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
MyISAM:在MySQL 5.1 及之前的版本,MyISAM是默认引擎。MyISAM提供的大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM并不支持事务以及行级锁,而且一个毫无疑问的缺陷是崩溃后无法安全恢复。正是由于MyISAM引擎的缘故,即使MySQL支持事务已经很长时间了,在很多人的概念中MySQL还是非事务型数据库。尽管这样,它并不是一无是处的。对于只读的数据,或者表比较小,可以忍受修复操作,则依然可以使用MyISAM(但请不要默认使用MyISAM,而是应该默认使用InnoDB)

2. MyISAM表锁与InnoDB行锁的区别
在MySQL中,表级锁有两种模式:表共享读锁,表独占写锁。也就是说对于MyISAM引擎的表,多个用户可以对同一个表发起读的请求,但是如果一个用户对表进行写操作,那么则会阻塞其他用户对这个表的读和写。
InnoDB引擎的表是通过索引项来加锁实现的,即只有通过索引条件检索数据的时候,InnoDB才会使用行级锁,否则也会使用表级锁。

3. 在物理空间的存储
所有数据库的文件都在data目录下,一个文件夹对应一个数据库,本质是文件的存储
InnoDB在数据库中只存在一个*.frm文件,以及上级目录下的ibdata文件
MyISAM在磁盘上存储成三个文件
*.frm(存储表定义)
MYD(MyData,数据文件)
MYI(MyIndex,索引文件)

4. 是否保存数据库表中表的具体行数
InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table 时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。

4、存储引擎查看

4.1使用 SELECT 确认会话存储引擎

SELECT @@default_storage_engine;

4.2 存储引擎(不代表生产操作)

会话级别(仅影响当前会话):
set default_storage_engine=innodb;
全局级别(仅影响新会话):
set global default_storage_engine=innodb;
重启之后,所有参数均失效.
如果要永久生效:
写入配置文件
vim /etc/my.cnf
[mysqld]
default_storage_engine=innodb
存储引擎是表级别的,每个表创建时可以指定不同的存储引擎,但是我们建议统一为innodb.

4.3 SHOW 确认每个表的存储引擎:

SHOW CREATE TABLE City\G;
SHOW TABLE STATUS LIKE 'CountryLanguage'\G

4.4 INFORMATION_SCHEMA 确认每个表的存储引擎

[world]>select table_schema,table_name ,engine from information_schema.tables where table_schema not in ('sys','mysql','information_schema','performance_schema');
Master [world]>show table status;
Master [world]>show create table city;

4.5 修改一个表的存储引擎

[king]>alter table ywx engine innodb;
注意:此命令我们经常使用他,进行innodb表的碎片整理

4.6 平常处理过的MySQL问题–碎片处理

环境:centos7.4,MySQL 5.7.20,InnoDB存储引擎
业务特点:数据量级较大,经常需要按月删除历史数据.
问题:磁盘空间占用很大,不释放
处理方法:
以前:将数据逻辑导出,手工drop表,然后导入进去
现在:
对表进行按月进行分表(partition,中间件)
业务替换为truncate方式

4.7扩展:如何批量修改存储引擎

需求:将zabbix库中的所有表,innodb替换为tokudb
select concat("alter table zabbix.",table_name," engine tokudb;") from
information_schema.tables where table_schema='zabbix' into outfile '/tmp/tokudb.sql';

5、InnoDB存储引擎物理存储结构

在数据目录中(ll /data/mysql/data)

[root@vm01 ~]# ll /data/mysql/
total 1049852
-rw-r----- 1 mysql mysql        56 Nov  2 22:15 auto.cnf
-rw-r----- 1 mysql mysql       455 Nov 12 05:55 ib_buffer_pool
-rw-r----- 1 mysql mysql  79691776 Nov 14 18:32 ibdata1
-rw-r----- 1 mysql mysql  50331648 Nov 14 18:32 ib_logfile0
-rw-r----- 1 mysql mysql  50331648 Nov 13 04:54 ib_logfile1
-rw-r----- 1 mysql mysql  12582912 Nov 14 18:31 ibtmp1
drwxr-x--- 2 mysql mysql      4096 Nov  2 22:15 mysql
-rw-r----- 1 mysql mysql      5042 Nov 12 05:55 mysql-bin.000001
-rw-r----- 1 mysql mysql 882012661 Nov 14 18:32 mysql-bin.000002
-rw-r----- 1 mysql mysql        38 Nov 12 05:55 mysql-bin.index
drwxr-x--- 2 mysql mysql        56 Nov 14 18:07 oldboy
drwxr-x--- 2 mysql mysql      8192 Nov  2 22:15 performance_schema
drwxr-x--- 2 mysql mysql       152 Nov 11 00:30 school
drwxr-x--- 2 mysql mysql      8192 Nov  2 22:15 sys
-rw-r----- 1 mysql mysql     38020 Nov  4 05:13 vm01.err
-rw-r----- 1 mysql mysql         6 Nov 12 05:55 vm01.pid
drwxr-x--- 2 mysql mysql       144 Nov 14 18:32 world
drwxr-x--- 2 mysql mysql        52 Nov 10 05:19 ywx
ibdata1:系统数据字典信息(统计信息),UNDO表空间等数据
ib_logfile0 ~ ib_logfile1: REDO日志文件,事务日志文件。
ibtmp1: 临时表空间磁盘位置,存储临时表
frm:存储表的列信息
ibd:表的数据行和索引

6、表空间

6.1共享表空间

需要将所有数据存储到同一个表空间中 ,管理比较混乱
5.5版本出现的管理模式,也是默认的管理模式。
5.6版本以,共享表空间保留,只用来存储:数据字典信息,undo,临时表。
5.7 版本,临时表被独立出来了
8.0版本,undo也被独立出去了

具体变化参考官方文档:

 https://dev.mysql.com/doc/refman/5.6/en/innodb-architecture.html
 https://dev.mysql.com/doc/refman/5.7/en/innodb-architecture.html
 https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html

共享表空间设置

共享表空间设置(在搭建MySQL时,初始化数据之前设置到参数文件中)
[(none)]>select @@innodb_data_file_path;
[(none)]>show variables like '%extend%';
将下面2行写入my.cnf文件
innodb_data_file_path=ibdata1:512M:ibdata2:512M:autoextend
innodb_autoextend_increment=64
#先使用定义了的512M的ibdata1,满了再使用定义的512M的ibdata2,再满了就ibdata2每次自增长64M的空间
#注意:ibdata1为固定的512M空间不会再增长

6.2独立表空间

[root@vm01 ~]# cd /data/mysql/world/
[root@vm01 world]# ls
city.frm  city.ibd  country.frm  country.ibd  countrylanguage.frm  countrylanguage.ibd  db.opt

从5.6,默认表空间不再使用共享表空间,替换为独立表空间。
主要存储的是用户数据
存储特点为:一个表一个ibd文件,存储数据行和索引信息
基本表结构元数据存储:xxx.frm
最终结论:
      元数据            数据行+索引
mysql表数据    =(ibdataX+frm)+ibd(段、区、页)
        DDL             DML+DQL

MySQL的存储引擎日志:
Redo Log: ib_logfile0  ib_logfile1,重做日志
Undo Log: ibdata1 ibdata2(存储在共享表空间中),回滚日志
临时表:ibtmp1,在做join union操作产生临时数据,用完就自动

独立表空间设置

db01 [(none)]>select @@innodb_file_per_table;
+-------------------------+
| @@innodb_file_per_table |
+-------------------------+
|                      1 |
+-------------------------+

alter table city dicard tablespace;
#删除表空间
alter table city import tablespace;
#导入表空间

6.3案例说明

案例背景:

硬件及软件环境:
联想服务器(IBM) 
磁盘500G 没有raid
centos 6.8
mysql 5.6.33  innodb引擎  独立表空间
备份没有,日志也没开

开发用户专用库:
jira(bug追踪) 、 confluence(内部知识库)    ------>LNMT

故障描述:

断电了,启动完成后“/” 只读
fsck  重启,系统成功启动,mysql启动不了。
结果:confulence库在  , jira库不见了

求助内容:

求助:
这种情况怎么恢复?
我问:
有备份没
求助:
连二进制日志都没有,没有备份,没有主从
我说:
没招了,jira需要硬盘恢复了。
求助:
1、jira问题拉倒中关村了
2、能不能暂时把confulence库先打开用着
将生产库confulence,拷贝到1:1虚拟机上/var/lib/mysql,直接访问时访问不了的

问:有没有工具能直接读取ibd
我说:我查查,最后发现没有

一个方法

表空间迁移:
create table xxx
alter table  confulence.t1 discard tablespace;
alter table confulence.t1 import tablespace;
虚拟机测试可行。

处理问题思路:

confulence库中一共有107张表。
1、创建107和和原来一模一样的表。
他有2016年的历史库,我让他去他同时电脑上 mysqldump备份confulence库
mysqldump -uroot -ppassw0rd -B  confulence --no-data >test.sql
拿到你的测试库,进行恢复
到这步为止,表结构有了。
2、表空间删除。
select concat('alter table ',table_schema,'.'table_name,' discard tablespace;') from information_schema.tables where table_schema='confluence' into outfile '/tmp/discad.sql';
source /tmp/discard.sql
执行过程中发现,有20-30个表无法成功。主外键关系
很绝望,一个表一个表分析表结构,很痛苦。
set foreign_key_checks=0 跳过外键检查。
把有问题的表表空间也删掉了。
3、拷贝生产中confulence库下的所有表的ibd文件拷贝到准备好的环境中
select concat('alter table ',table_schema,'.'table_name,' import tablespace;') from information_schema.tables where table_schema='confluence' into outfile '/tmp/discad.sql';
4、验证数据
表都可以访问了,数据挽回到了出现问题时刻的状态(2-8)

p/discad.sql’;
source /tmp/discard.sql
执行过程中发现,有20-30个表无法成功。主外键关系
很绝望,一个表一个表分析表结构,很痛苦。
set foreign_key_checks=0 跳过外键检查。
把有问题的表表空间也删掉了。
3、拷贝生产中confulence库下的所有表的ibd文件拷贝到准备好的环境中
select concat(‘alter table ‘,table_schema,’.‘table_name,’ import tablespace;’) from information_schema.tables where table_schema=‘confluence’ into outfile ‘/tmp/discad.sql’;
4、验证数据
表都可以访问了,数据挽回到了出现问题时刻的状态(2-8)




 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PTA题目 三天打鱼两天晒网

中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”? 输入格式: 输入在一行中给出一个不超过1000的正整数N。 输出格式: 在一行中输…

【网页设计】基于HTML在线图书商城购物项目设计与实现

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业,Web大学生网页 HTML&a…

java面试强基(6)

面向对象三大特征了解吗? 封装 ​封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。如果属性不想被外界访问,我们…

【滤波跟踪】基于扩展卡尔曼滤波的无人机路径跟踪附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

Linux基础8 - 网络配置

Linux基础8 - 网络配置 一、网络连接的三种方式 Vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)。 1、桥接模式…

[每周一更]-(第21期):什么是RPC?

RPC,也就是远程过程调用,是分布式系统中不同节点调用的方式(进程间通信),属于 C/S 模式。RPC 由客户端发起,调用服务端的方法进行通信,然后服务端把结果返回给客户端。 RPC的核心有两个&#x…

商品推荐系统实战:基于AFM推荐算法的推荐系统实现 代码+数据

例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。AFM推荐算法概…

Spring Boot官方推荐的Docker镜像编译方式-分层jar包

目录参考一、普通Dockerfile的缺点二、Docker分层三、Spring Boot分层四、实践核心理论新建demo工程pom.xml测试代码编写Dockerfile我们在项目根目录执行打包命令发布docker镜像修改代码重新发布docker参考 Spring Boot官方推荐的Docker镜像编译方式-分层jar包 Spring Boot la…

Windows11安装Maven

Windows11安装Maven官网下载压缩包:https://maven.apache.org/download.cgi 解压到任意盘 配置环境变量 3.1 右击我的电脑,选择属性 3.2 选择高级系统设置 3.3 选择环境变量 3.4 在系统变量中单击新建 3.5 新建 MAVEN_HOME 变量,然后…

四十四、​Fluent 收敛标准-质量和能量守恒

1. Fluent质量和能量守恒 Fluent收敛性的判断有时候很让人头疼,我们在三十二、Fluent收敛判断标准及方法中概括的讲述过几种收敛标准。 通常我们判断是否收敛最直接的就是看残差曲线,但是很多时候,残差曲线(尤其连续性曲线&#x…

web前端期末大作业 html+css古诗词主题网页设计

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 茶文化网站 | 中华传统文化题材 | 京剧文化水墨风书画 | 中国民间年画文化艺术网站 | 等网站的设计与制作 | HTML期末大学生网页设计作业,…

Linux从入门到入土③(GCC、静态与动态链接库、Git、Make、Makefile)

文章目录编译工具GCCGCC基本语法GCC编译流程预处理阶段编译阶段汇编阶段链接阶段GCC常用参数总结多文件编译静态与动态链接库Linux库的创建与使用静态库与动态库的区别静态库的制作与使用动态库的制作与使用解决动态库无法加载问题库的工作原理动态链接器解决方案静态库和动态库…

[附源码]java毕业设计日常饮食健康推荐平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【快速掌握Docker】Docker高级运用汇总--Dockerfile、Docker Compose与Docker Swarm使用

一、Dockerfile的构建 1、指定镜像 采用FROM指令: FROM 指定镜像名称2、设置标签信息 对镜像进行备注说明: LABEL manager"admin" \ label1"docker build1" \ lable2"docker build2"3、运行命令 容器运行后&#xf…

跟艾文学编程《Python基础》(6)numpy数值计算

作者: 艾文,计算机硕士学位,企业内训讲师和金牌面试官,公司资深算法专家,现就职BAT一线大厂。 邮箱: 1121025745qq.com 博客:https://wenjie.blog.csdn.net/ 内容:跟艾文学编程《Pyt…

java学习之包

包的引入 举例:小明和小强都想给自己定义的类命名为Dog(在同一个文件夹下不能有同名的类),包可以解决这个问题 包的作用 1.区分相同名字的类:可以把Dog类放在不同的包 2.当类很多的时候,可以很好的管理…

人工智能在医疗保健服务演变中的作用越来越大

人工智能正被应用于医疗保健服务中,使用的更多技术,从物联网和大数据到聊天机器人。然而,人工智能将破坏医疗保健的主要案例,是计算机辅助诊断。研究综述。 医疗保健提供者和支付方都在进行数字化转型。研究显示,现在…

sp-踩坑小记

想把$BSGS修改为从gUserdefined继承,只能删掉原来的$BSGS,然后在gUserdefined新建一个$BSGS----坑① 如果这个BSGS里面有200个属性,那么还得手动再敲一遍(无法批量导入属性)--坑② 新建的时候,在虚拟机的…

计算机毕业设计ssm+vue基本微信小程序的拼车自助服务小程序

项目介绍 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱拼车自助服务小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行拼车自助服务小程序的设计与开发的数据…

关于4diac的发布/订阅和客户端/服务端功能块的思考

关于4diac的发布/订阅和客户端/服务端功能块的思考 1、PUBLISH和SUBSCRIBE功能块通信 发布/订阅功能块是多对多通信,采用组播的方式,此时的IP地址应为D类IP地址224~239,使用其他的ip地址,则SUBSCRIBE功能块接收不到 2、CLIEN…