存储引擎简介

一.存储引擎简介

  • 1、文件系统:

    • 1.1 操作系统组织和存取数据的一种机制。
    • 1.2 文件系统是一种软件。
  • 2、文件系统类型:ext2 3 4 ,xfs 数据(centos6 ext 4 centos7 xfs)
    • 2.1 不管使用什么文件系统,数据内容不会变化
    • 2.2 不同的是,存储空间、大小、速度。
  • 3、MySQL引擎:
    • 3.1 可以理解为,MySQL的“文件系统”,只不过功能更加强大。
  • 4、MySQL引擎功能:
    • 4.1 除了可以提供基本的存取功能,还有更多功能事务功能、锁定、备份和恢复、优化以及特殊功能

总之,存储引擎的各项特性就是为了保障数据库的安全和性能设计结构。

二.MySQL自带的存储引擎类型

MySQL 提供以下存储引擎:
01)InnoDB
02)MyISAM
03)MEMORY
04)ARCHIVE
05)FEDERATED
06)EXAMPLE
07)BLACKHOLE
08)MERGE
09)NDBCLUSTER
10)CSV


还可以使用第三方存储引擎:
01)MySQL当中插件式的存储引擎类型
02)MySQL的两个分支
03)perconaDB
04)mariaDB

#查看当前MySQL支持的存储引擎类型mysql> show engines#查看innodb的表有哪些mysql> select table_schema,table_name,engine from information_schema.tables where engine='innodb';#查看myisam的表有哪些mysql> select table_schema,table_name,engine from information_schema.tables where engine='myisam';
  • 1、innodb和myisam的区别

物理上的区别:

#进入mysql目录[root@db01~l]# cd /application/mysql/data/mysql#查看所有user的文件[root@db01 mysql]# ll user.*-rw-rw---- 1 mysql mysql 10684 Mar  6  2017 user.frm-rw-rw---- 1 mysql mysql   960 Aug 14 01:15 user.MYD-rw-rw---- 1 mysql mysql  2048 Aug 14 01:15 user.MYI#进入word目录[root@db01 world]# cd /application/mysql/data/world/#查看所有city的文件[root@db01 world]# ll city.*-rw-rw---- 1 mysql mysql   8710 Aug 14 16:23 city.frm-rw-rw---- 1 mysql mysql 688128 Aug 14 16:23 city.ibd
  • 2.innodb存储引擎的简介

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

优点:
01)事务安全(遵从 ACID)
02)MVCC(Multi-Versioning Concurrency Control,多版本并发控制)
03)InnoDB 行级别锁定
04)Oracle 样式一致非锁定读取
05)表数据进行整理来优化基于主键的查询
06)支持外键引用完整性约束
07)大型数据卷上的最大性能
08)将对表的查询与不同存储引擎混合
09)出现故障后快速自动恢复(csr)
10)用于在内存中缓存数据和索引的缓冲区池

innodb核心特性

重点:
MVCC
事务
行级锁
热备份
Crash Safe Recovery(自动故障恢复)

  • 3.查看存储引擎

1)使用 SELECT 确认会话存储引擎

#查询默认存储引擎SELECT @@default_storage_engine;

2)使用 SHOW 确认每个表的存储引擎

#查看表的存储引擎SHOW CREATE TABLE City\G SHOW TABLE STATUS LIKE 'CountryLanguage'\G

3)使用 INFORMATION_SCHEMA 确认每个表的存储引擎

#查看表的存储引擎mysql> select table_schema,table_name,engine from information_schema.tables \GSHOW CREATE TABLE City\G 
  • 4.存储引擎的设置

1)在启动配置文件中设置服务器存储引擎

#在配置文件的[mysqld]标签下添加[mysqld]default-storage-engine=<Storage Engine>

2)使用 SET 命令为当前客户机会话设置

#在MySQL命令行中临时设置SET @@storage_engine=<Storage Engine>

(3)在 CREATE TABLE 语句指定

#建表的时候指定存储引擎CREATE TABLE t (i INT) ENGINE = <Storage Engine>;

三.真实企业案例

项目背景:

公司原有的架构:一个展示型的网站,LAMT,MySQL5.1.77版本(MYISAM),50M数据量。

小问题不断:

  • 1、表级锁:对表中任意一行数据修改类操作时,整个表都会锁定,对其他行的操作都不能同时进行。
  • 2、不支持故障自动恢复(CSR):当断电时有可能会出现数据损坏或丢失的问题。

如何解决:

  • 1、提建议将现有的MYISAM引擎替换为Innodb,将版本替换为5.6.38

    • 1)如果使用MYISAM会产生”小问题”,性能安全不能得到保证,使用innodb可以解决这个问题。
    • 2)5.1.77版本对于innodb引擎支持不够完善,5.6.38版本对innodb支持非常完善了。
  • 2、实施过程和注意要素

模拟环境

建表mysql> create table test1(sid int,name varchar(11)) engine=myisam;mysql> create table test1(sid int,name varchar(11)) engine=myisam;mysql> create table test3(sid int,name varchar(11)) engine=myisam;

1)备份生产库数据(mysqldump)

[root@db01 ~]# mysqldump -uroot -p123 -A --triggers -R --master-data=2 >/tmp/full.sql#-A系统库 -B程序业务恢复库

2)准备一个5.6.38版本的新数据库
3)对备份数据进行处理(将engine字段替换)

[root@db01 ~]# sed -i 's#ENGINE=MYISAM#ENGINE=INNODB#g' /tmp/full.sql

4)将修改后的备份恢复到新库

mysql -uroot -p123 -h 10.0.0.52 </tmp/full.sql#导出表mysqldump -uroot -p3308 -S /data/3308/data/mysql.sock --tables test student

5)应用测试环境连接新库,测试所有功能
6)停应用,将备份之后的生产库发生的新变化,补偿到新库
7)应用割接到新数据库

项目结果:

*解决了”小问题” *

四.Innodb存储引擎——表空间介绍

5.5版本以后出现共享表空间概念

表空间的管理模式的出现是为了数据库的存储更容易扩展

5.6版本中默认的是独立表空间

  • 1、共享表空间

    innodb的所有数据保存在一个独立的表空间里面,而这个表空间可以由很多的文件组成,一个表可以跨越多个文件存在,所以其大小限制不在是文件大小限制,而是其自身的限制,默认最大限制为64tb,这个大小包括这个表的所有所有索引等相关的数据

1)查看共享表空间

#物理查看[root@db01 ~]# ll /application/mysql/data/-rw-rw---- 1 mysql mysql 79691776 Aug 14 16:23 ibdata1#命令行查看mysql> show variables like '%path%';innodb_data_file_path =bdata1:12M:autoextend

5.6版本中默认存储:
1.系统数据
2.undo(事务的日志,5.7改配置文件可以独立出来)
3.临时表(查询临时生成的表)

5.7版本中默认会将undo和临时表独立出来,5.6版本也可以独立,只不过需要在初始化的时候进行配置

2)设置方法

#编辑配置文件[root@db01 ~]# vim /etc/my.cnf[mysqld]innodb_data_file_path=ibdata1:76M;ibdata2:50M:autoextend
  • 2、独立表空间

对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理

1)查看独立表空间

#物理查看[root@db01 ~]# ll /application/mysql/data/world/-rw-rw---- 1 mysql mysql 688128 Aug 14 16:23 city.ibd#命令行查看mysql> show variables like '%per_table%';innodb_file_per_table=ON

2)独立表空间

#物理查看[root@db01 ~]# ll /application/mysql/data/world/-rw-rw---- 1 mysql mysql 688128 Aug 14 16:23 city.ibd#命令行查看mysql> show variables like '%per_table%';innodb_file_per_table=ON

企业案例

在没有备份数据的情况下,突然断电导致表损坏,打不开数据库。

模拟环境

db01 db02

1.打包表

tar tar.world.gz worldscp word  /application/mysql/data/

2.多实例模拟测试

1)拷贝库目录到新库中

[root@db01 ~]# cp -r /application/mysql/data/world/ /data/3307/data/

2)启动新数据库

[root@db01 ~]# mysqld_safe --defaults-file=/data/3307/my.cnf &

3)登陆数据库查看

mysql> show databases;

4)查询表中数据

mysql> select * from city;ERROR 1146 (42S02): Table 'world.city' doesn't exist

5)找到以前的表结构在新库中创建表

mysql> show create table world.city;#删掉外键创建语句CREATE TABLE `city` (  `ID` int(11) NOT NULL AUTO_INCREMENT,  `Name` char(35) NOT NULL DEFAULT '',  `CountryCode` char(3) NOT NULL DEFAULT '',  `District` char(20) NOT NULL DEFAULT '',  `Population` int(11) NOT NULL DEFAULT '0',  PRIMARY KEY (`ID`),  KEY `CountryCode` (`CountryCode`),  KEY `idx_city` (`Population`,`CountryCode`),  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1;

6)删除表空间文件

mysql> alter table city_new discard tablespaces;

7)拷贝旧表空间文件

[root@db01 world]# cp -a /data/3307/data/world/city.ibd /data/3307/data/world/city_new.ibd #加-a不需要授权

8)授权

[root@db01 world]# chown -R mysql.mysql *

9)导入表空间

mysql> alter table city_new import tablespace; 

10)物理删除旧表

[root@db02 world]# rm -fr city.*

11)改表明

mysql> alter table city1 rename city;

12)如果是新库,应用割接(修改代码连库的ip)

五.Innodb核心特性——事务

  • 1.什么是事务

主要针对DML语句(update,delete,insert)

一组数据操作执行步骤,这些步骤被视为一个工作单元:
1)用于对多个语句进行分组
2)可以在多个客户机并发访问同一个表中的数据时使用


所有步骤都成功或都失败
1)如果所有步骤正常,则执行
2)如果步骤出现错误或不完整,则取消

  • 2.事务的通俗理解

伴随着“交易”出现的数据库概念。

我们理解的“交易”是什么?
1)物与物的交换(古代)
2)货币现金与实物的交换(现代1)
3)虚拟货币与实物的交换(现代2)
4)虚拟货币与虚拟实物交换(现代3)


数据库中的“交易”是什么?
1)事务又是如何保证“交易”的“和谐”?
2)ACID

  • 3.事务ACID特性

Atomic(原子性)
所有语句作为一个单元全部成功执行或全部取消。

Consistent(一致性)
如果数据库在事务开始时处于一致状态,则在执行该。
事务期间将保留一致状态。

Isolated(隔离性)
事务之间不相互影响。

Durable(持久性)
事务成功完成后,所做的所有更改都会准确地记录在
数据库中。所做的更改不会丢失。


  • ** 4.事务流程举例**

  • 5.事务的控制语句

如下:
START TRANSACTION(或 BEGIN):显式开始一个新事务
SAVEPOINT:分配事务过程中的一个位置,以供将来引用
COMMIT:永久记录当前事务所做的更改
ROLLBACK:取消当前事务所做的更改
ROLLBACK TO SAVEPOINT:取消在 savepoint 之后执行的更改
RELEASE SAVEPOINT:删除 savepoint 标识符
SET AUTOCOMMIT:为当前连接禁用或启用默认 autocommit 模式

一个成功事务的生命周期

begin;sql1sql2sql3...commit;

一个失败事务的生命周期

begin;sql1sql2sql3...rollback;
  • 3.自动提交
#查看自动提交mysql> show variables like 'autocommit';#临时关闭mysql> set autocommit=0;#永久关闭,(企业中一般不关闭)[root@db01 world]# vim /etc/my.cnf[mysqld]autocommit=0
  • 4.事务演示

1)成功事务

mysql> create table stu(id int,name varchar(10),sex enum('f','m'),money int);mysql> begin;mysql> insert into stu(id,name,sex,money) values(1,'zhang3','m',100), (2,'zhang4','m',110);mysql> commit;

2)事务回滚

mysql> begin;mysql> update stu set name='zhang3';mysql> delete from stu;mysql> rollback;
  • 6.事务隐式提交情况

1)现在版本在开启事务时,不需要手工begin,只要你输入的是DML语句,就会自动开启事务。
2)有些情况下事务会被隐式提交

例如:
在事务运行期间,手工执行begin的时候会自动提交上个事务
在事务运行期间,加入DDL、DCL操作会自动提交上个事务
在事务运行期间,执行锁定语句(lock tables、unlock tables)
load data infile
select for update (查询sql语句的执行结果)
在autocommit=1的时候

  • 7.事务日志redo基本功能

1)Redo是什么?

redo,顾名思义“重做日志”,是事务日志的一种。

2)作用是什么?

在事务ACID过程中,实现的是“D”持久化的作用。

特性:WAL(Write Ahead Log)日志优先写
REDO:记录的是,内存数据页的变化过程

3)REDO工作过程

#执行步骤update t1 set num=2 where num=1; 

1)首先将t1表中num=1的行所在数据页加载到内存中buffer page
2)MySQL实例在内存中将num=1的数据页改成num=2
3)num=1变成num=2的变化过程会记录到,redo内存区域,也就是redo buffer page中

#提交事务执行步骤commit; 

1)当敲下commit命令的瞬间,MySQL会将redo buffer page写入磁盘区域redo log
2)当写入成功之后,commit返回ok

  • 8.redo数据实例恢复过程
  • 9.事务日志undo

1)undo是什么?

undo,顾名思义“回滚日志”,是事务日志的一种。

_2)作用是什么?

在事务ACID过程中,实现的是“A”原子性的作用。当然CI的特性也和undo有关

  • 10.redo和undo的存储位置
#redo位置[root@db01 data]# ll /application/mysql/data/-rw-rw---- 1 mysql mysql 50331648 Aug 15 06:34 ib_logfile0-rw-rw---- 1 mysql mysql 50331648 Mar  6  2017 ib_logfile1#undo位置[root@db01 data]# ll /application/mysql/data/-rw-rw---- 1 mysql mysql 79691776 Aug 15 06:34 ibdata1-rw-rw---- 1 mysql mysql 79691776 Aug 15 06:34 ibdata2

在MySQL5.6版本中undo是在ibdata文件中,在MySQL5.7版本会独立出来。

  • 11.事务中的锁

1)什么是“锁”?

“锁”顾名思义就是锁定的意思。

2)“锁”的作用是什么?

在事务ACID特性过程中,“锁”和“隔离级别”一起来实现“I”隔离性的作用。

排他锁:保证在多事务操作时,数据的一致性。
共享锁:保证在多事务工作期间,数据查询时不会被阻塞。

悲观锁:同时修改数据,谁先修改谁为准

乐观锁:谁先提交就是谁为准

  • 12.多版本并发控制(MVCC)

1)只阻塞修改类操作,不阻塞查询类操作(排他锁,共享锁)
2)乐观锁的机制(谁先提交谁为准)

  • 13.锁的粒度
    MyIsam:低并发锁(表级锁)
    Innodb:高并发锁(行级锁)

    行级锁.必须的有聚集索引(主键),否则还是表级锁

  • 14.事务的隔离级别

四种隔离级别:

READ UNCOMMITTED(独立提交)RU级别
允许事务查看其他事务所进行的未提交更改

READ COMMITTED RC级别 (容易出现幻读)
允许事务查看其他事务所进行的已提交更改

REPEATABLE READ****** RR级别 (可以解决幻读,退出重连)
确保每个事务的 SELECT 输出一致
InnoDB 的默认级别

SERIALIZABLE 串行化级别 (在事务执行的过程中,阻断查询结果)
将一个事务的结果与其他事务完全隔离

#查看隔离级别mysql> show variables like '%iso%';#修改隔离级别为RU[mysqld]transaction_isolation=read-uncommitmysql> use oldboymysql> select * from stu;mysql> insert into stu(id,name,sex,money) values(2,'li4','f',123);#修改隔离级别为RC[mysqld]transaction_isolation=read-commit

脏读 幻读 重复读 查询原因,和解决办法

一个事务读到另外一个事务还没有提交的数据,我们称之为脏读。解决方法:把事务隔离级别调整到READ COMMITTED一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读。解决方法:把事务隔离级别调整到REPEATABLE READ。一个事务先后读取一个范围的记录,但两次读取的纪录数不同,我们称之为幻象读。解决方法:把事务隔离级别调整到SERIALIZABLE。1, 脏读一个事务读到另一个事务,尚未提交的修改,就是脏读。这里所谓的修改,除了Update操作,不要忘了,还包括Insert和Delete操作。脏读的后果:如果后一个事务回滚,那么它所做的修改,统统都会被撤销。前一个事务读到的数据,就是垃圾数据。举个例子:预订房间。有一张Reservation表,往表中插入一条记录,来订购一个房间。 事务1:在Reservation表中插入一条记录,用于预订99号房间。 事务2:查询,尚未预定的房间列表,因为99号房间,已经被事务1预订。所以不在列表中。 事务1:信用卡付款。由于付款失败,导致整个事务回滚。        所以插入到Reservation 表中的记录并不置为持久(即它将被删除)。现在99号房间则为可用。所以,事务2所用的是一个无效的房间列表,因为99号房间,已经可用。如果它是最后一个没有被预定的房间,那么这将是一个严重的失误。注:脏读的后果很严重。 2,不可重复读。在同一个事务中,再次读取数据时【就是你的select操作】,所读取的数据,和第1次读取的数据,不一样了。就是不可重复读。举个例子: 事务1:查询99号房间是否为双人床房间。结果99号是。 事务2:将99号房间,改成单人床房间。 事务1:再次执行查询,99号房间不是双人房了。也就是说, 事务1,可以看到其他事务所做的修改。在不可重复读,里面,可以看到其他事务所做的修改,而导致2次的查询结果不再一样了。这里的修改,是提交过的。也可以是没有提交的,这种情况同时也是脏读。如果,数据库系统的隔离级别。允许,不可重复读。那么你启动一个事务,并做一个select查询操作。查询到的数据,就有可能,和你第2次,3次...n次,查询到的数据不一样。一般情况下,你只会做一次,select查询,并以这一次的查询数据,作为后续计算的基础。因为允许出现,不可重复读。那么任何时候,查询到的数据,都有可能被其他事务更新,查询的结果将是不确定的。注:如果允许,不可重复读,你的查询结果,将是不确定的。一个不确定的结果,你能容忍吗?3,幻读事务1读取指定的where子句所返回的一些行。然后,事务2插入一个新行,这个新行也满足事务1使用的查询where子句。然后事务1再次使用相同的查询读取行,但是现在它看到了事务2刚插入的行。这个行被称为幻象,因为对事务1来说,这一行的出现是不可思议的。举个例子:事务1:请求没有预定的,双人床房间列表。99号在其中。事务2:向Reservation表中插入一个新纪录,以预订99号房间,并提交。事务1:再次请求有双人床的未预定的房间列表,99号房间,不再位于列表中。注:幻读,针对的是,Insert操作。如果事务2,插入的记录,没有提交。那么同时也是脏读。
(0)

相关推荐

  • mysql中的事务隔离级别及可重复读读提交详细分析(mvcc多版本控制/undo log)

    一.事物隔离级别 读未提交(read uncommitted)是指,一个事务还没提交时,它做的变更就能被别的事务看到.通俗理解,别人改数据的事务尚未提交,我在我的事务中也能读到. 读提交(read c ...

  • Mysql之锁、事务绝版详解

    一 锁的分类及特性 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能 ...

  • 聊一聊mysql的锁和事务隔离级别

    锁类型 - 性能锁 从性能上来看,可以分为两种类型的锁,分别是:乐观锁和悲观锁. 乐观锁是数据版本号(version)机制实现的,一般通过为数据库表增加一个数字类型的 "version&qu ...

  • 万字总结 MySQL核心知识,赠送25连环炮

    回复"000"获取大量电子书 前言 大家好,我是老田,之前写过 JVM.并发编程连环炮.然后有很多小伙伴私下找我就我继续把MySQL的连环炮整理出来,但是由于本人比较懒,又加上最近 ...

  • MySQL系列一:掌握MySQL底层原理从学习事务开始

    前言 面试时候,经常会被问到什么是事务.事务的特征.事务的隔离级别这些八股文问题,凭死记硬背通常也可回答的七七八八.但是面试官一旦换个角度问这些问题,有时候可能就语塞了. 所以学一个知识,我总在想有没 ...

  • MySQL(一):MySQL数据库事务与锁

    基本概念 事务是指满足ACID特性的的一组操作,可以通过Commit提交事务,也可以也可以通过Rollback进行回滚.会存在中间态和一致性状态(也是真正在数据库表中存在的状态) ACID Atomi ...

  • 开发者都需要了解的mysql索引四大存储引擎

    MySQL索引分为普通索引.唯一索引.主键索引.组合索引.全文索引.索引不会包含有null值的列,索引项可以为null(唯一索引.组合索引等),但是只要列中有null值就不会被包含在索引中. 接着让我 ...

  • 11、存储引擎

    查看表类型 查看存储引擎 > show engines; > show table status \G; > show table status like '%t1%' \G; 设置 ...

  • 大数据安全分析11:复杂事件处理(CEP)引擎简介

    目前已有的CEP引擎根据事件处理语言可以分为两大类:面向流和面向规则的CEP引擎. 面向流的CEP引擎有Microsoft Streamlnsight.Oracle CEP.IBM SPADE.Esp ...

  • 初探Mysql架构和InnoDB存储引擎

    前言 1.undo log和redo log了解过吗?它们的作⽤分别是什么? 2.redo log是如何保证事务不丢失的? 3.mysql的事务是先提交还是先刷盘? 4.更新操作为什么不直接更新磁盘反 ...

  • 点云存储文件格式简介

    在众多存储点云的文件格式中,有些格式是为点云数据"量身打造"的,也有一些文件格式(如计算机图形学和计算机和学领域的3D模型或通讯数据文件)具备表示和存储点云的能力,应用于点云信息的 ...

  • BAT小伙自研存储引擎,火爆Github

    大家好,我是Carl. 最近很多小伙伴问我关于一些,项目的选择,相信如果是C 后台开发路线的话,基本都会去做WebServer 服务器. 我在给小伙伴答疑,包括看了这么多简历,发现WebServer这 ...

  • MySQL数据库的事务及存储引擎

    一.关系型数据库与非关系型数据库 1.关系型数据库的特点: 1)数据以表格的形式出现 2)每行为各种记录名称 3)每列为记录名称所对应的数据域 4)许多的行和列组成一张表单 5)若干的表单组成数据库 ...

  • MySQL基础篇(05):逻辑架构图解和InnoDB存储引擎详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.MySQL逻辑架构 1.逻辑架构图 基于下面的逻辑架构图,可以大致熟悉MySQL各个架构组件之间的协同工作关系. 很经典的C/S架构风格, ...

  • 打造大数据平台底层计算存储引擎 | Apache孵化器迎来Linkis!

    微众银行开源项目Linkis正式通过Apache软件基金会(ASF)的投票表决,全票通过进入ASF孵化器! Linkis简介 Linkis 在上层应用程序和底层引擎之间构建了一层计算中间件.通过使用L ...