第五章:MYSQL存储引擎

1.介绍

存储引擎MySQL中的“文件系统”

2.种类:

2.1查看MYSQL的自带存储引擎

mysql> show engines;
InnoDB           ******  
MyISAM   
MRG_MYISAM        
CSV                              
BLACKHOLE         
PERFORMANCE_SCHEMA   
ARCHIVE            
MEMORY            
FEDERATED  

面试题:请你列举MYSQL中支持的存储引擎的种类:

INNODB MYISAM CSV MEMORY

2.2分支产品的引擎种类介绍

Percona、Mariadb 
TokuDB、MyRocks、Rocksdb
特点:
1. 压缩比15倍以上
2. 插入数据性能
适应场景:例如Zabbix监控类的平台、归档库、历史数据存储业务

3.InnoDB存储引擎特性

MVCC       : 多版本并发控制 
聚簇索引   : 用来组织存储数据和优化查询,IOT。
支持事务   : 数据安全保证
支持行级锁 : 控制并发
外键   
多缓冲区支持
自适应Hash索引: AHI
复制中支持高级特性。
备份恢复: 支持热备。
自动故障恢复:CR  Crash Recovery
双写机制:DWB  Double Write Buffer

面试题: InnoDB 核心特性有哪些? InnoDB和MyISAM区别有哪些?

InnoDB 支持: 事务、MVCC、聚簇索引、外键、缓冲区、AHI、CR、DWB,MyISAM不支持。
    InnoDB 支持: 行级锁,MyISAM支持表级锁。    
    InnoDB 支持热备(业务正常运行,影响低),MyISAM支持温备份(锁表备份)。
    InnoDB 支持CR(自动故障恢复),宕机自动故障恢复,数据安全和一致性可以得到保证。MyISAM不支持,宕机可能丢失当前修改。

4. 存储引擎的基本操作

  1. 存储引擎的基本操作

    4.1.1 查询支持的存储引擎
    mysql> show engines;
    +--------------------------+
    | @@default_storage_engine |
    +--------------------------+
    | InnoDB                   |
    +--------------------------+
    1 row in set (0.00 sec)
    

    4.1.3 查看、设定 表的存储引擎

    查看某张表的存储引擎
     mysql> show create table +表名
    (2) 查询系统中所有业务表的存储引擎信息
    mysql> select 
     table_schema,
     table_name ,
     engine 
     from information_schema.tables  
     where table_schema not in ('sys','mysql','information_schema','performance_schema');
     ------------------------------------------------------
     +--------------+-----------------+--------+
    | TABLE_SCHEMA | TABLE_NAME      | ENGINE |
    +--------------+-----------------+--------+
    | school       | course          | InnoDB |
    | school       | sc              | InnoDB |
    | school       | student         | InnoDB |
    | school       | teacher         | InnoDB |
    | test         | stu             | InnoDB |
    | test         | student         | InnoDB |
    | wordpress    | stu             | InnoDB |
    | world        | city            | InnoDB |
    | world        | country         | InnoDB |
    | world        | countrylanguage | InnoDB |
    +--------------+-----------------+--------+
    10 rows in set (0.01 sec)
    (3)创建表设定存储引擎
    mysql> create table xxx (id int) engine=innodb charset=utf8mb4;
    (4)修改已有表的存储引擎
      mysql> alter table xxx engine=myisam;
      mysql> alter table world.xxx engine=innodb;
    

    案例项目:

    将所有的非InnoDB引擎的表查询出来,批量修改为InnoDB

     mysql> select table_schema,table_name ,engine 
      from information_schema.tables  
      where 
      table_schema not in ('sys','mysql','information_schema','performance_schema') 
      and engine !='innodb';
      
      mysql> select concat("alter table ",table_schema,".",table_name," engine=innodb;")   from information_schema.tables     where    table_schema not in ('sys','mysql','information_schema','performance_schema')    and engine !='innodb' into outfile '/tmp/a.sql';
      mysql> source /tmp/a.s
    

    5. InnoDB 存储引擎的体系结构 ******

    5.1 磁盘结构 (on-disk)

    5.1.1 表空间结构

    介绍: 表空间的概念源于Oracle数据库。最初的目的是为了能够很好的做存储的扩容。

    5.1.1 表空间结构
    介绍: 表空间的概念源于Oracle数据库。最初的目的是为了能够很好的做存储的扩容。

    共享(系统)表空间

    存储方式

    ibdata1~ibdataN, 5.5版本默认的表空间类型 。

    ibdata1共享表空间在各个版本的变化

    5.5版本:

     系统相关:(全局)数据字典信息(表基本结构信息、状态、系统参数、属性..)、UNDO回滚日志(记录撤销操作)、Double Write Buffer信息、临时表信息、change buffer
     用户数据: 表数据行、表的索引数据   
    

    5.6版本:共享表空间只存储于系统数据,把用户数据独立了,独立表空间管理。

 系统相关:(全局)数据字典信息、UNDO回滚信息、Double Write信息、临时表信息、change buffer

5.7版本:在5.6基础上,把临时表独立出来,UNDO也可以设定为独立

 系统相关:(全局)数据字典信息、UNDO回滚信息、Double Write信息、change buffer

8.0.11~8.0.19版本:

在5.7的基础上将UNDO回滚信息默认独立,数据字典不再集中存储了。
系统相关:Double Write信息、change buffer

8.0.20版本:在之前版本基础上,独立 Double Write信息
系统相关:change buffer
https://dev.mysql.com/doc/refman/5.7/en/innodb-architecture.html

## 共享表空间管理

### 扩容共享表空间
mysql> select @@innodb_data_file_path;  ##查看共享空间的大小
mysql>  select @@innodb_data_file_path;
+-------------------------+
| @@innodb_data_file_path |
+-------------------------+
| ibdata1:12M:autoextend  |
+-------------------------+
1 row in set (0.01 sec)
###查看可扩容共享表空间的大小  默认可扩容64k
mysql>  select @@innodb_autoextend_increment;
+-------------------------------+
| @@innodb_autoextend_increment |
+-------------------------------+
|                            64 |
+-------------------------------+

初始化数据库之后进行数据库的扩容:

第一步:
vim /etc/my.cnf


image-20201111203516330.png

查看ibdata的初始化大小

du -h  /data/3306/data/ibdata1

错误案例的分析 将ibdata的空间大小改成与当前的ibdata大小不一致

第一步:重启数据库进行查看错误


image-20201111204353823.png

错误分析: 查看数据库的日志


image-20201111205440067.png
  1. 正确的设置大小

    先查看实际大小:
    [root@db01 data]# ls -lh ibdata1 
    -rw-r----- 1 mysql mysql 76M May  6 17:11 ibdata1
    配置文件设定为和实际大小一致: 
    innodb_data_file_path=ibdata1:76M;ibdata2:100M;ibdata3:100M:autoextend
    
    

    在初始化数据库的时候进行ibdata的设置:

    ### 模拟在初始化时设置共享表空间(生产建议)
    5.7 中建议:设置共享表空间2-3个,大小建议1G或者4G,最后一个定制为自动扩展。
    8.0 中建议:设置1-2个就ok,大小建议1-4G
    
    

    模拟初始化数据库是设置表空间

    第一步:停止数据库

    /etc/init.d/mysqld stop\

    第二步:清理配置文件

    [root@db01 data]# rm -rf /data/3306/data/*

    root@db01 data]# vim /etc/my.cnf
    # 修改 
    innodb_data_file_path=ibdata1:100M;ibdata2:100M;ibdata3:100M:autoextend
    

    第三步:重新初始化

    [root@db01 data]# mysqld --initialize-insecure   --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
    

    第四步:重启数据库生效

    [root@db01 data]# /etc/init.d/mysqld start
    

    独立表空间

    介绍

    5.6版本开始,针对用户数据,单独的存储管理。存储表的数据行和索引。
    8.0 之前: city ---> city.ibd city.frm ibdata1
    8.0 之后 city city.ibd

    通过参数进行查看独立表空间

    mysql> select @@innodb_file_per_table;
    +-------------------------+
    | @@innodb_file_per_table |
    +-------------------------+
    |                       1 |
    +-------------------------+
    测试: 共享表空间存储用户数据
    mysql> set global innodb_file_per_table=0;###在数据库的默认状态下用户的数据会存入在独立表空间
    

利用独立表空间进行快速数据迁移

第一步:进行锁表要迁移的表

 flush tables  test.t100w with read lock ;

第二步:在目标端创建跟第一个表一模一样的表

 show create table t100w;  ###查看原来表的属性

第三步在目标的数据库进行创建数据库:

create database test;
复制原来表的属性进行创建表

第四步:删除目标表的空间文件

mysql> alter table test.t100w discard tablespace;

第五步:拷贝源端ibd文件到目标端目录,并设置权限

[root@db01 test]# cp /data/3306/data/test/t100w.ibd /data/3307/data/test/
[root@db01 test]# chown -R mysql.mysql /data/*

第六步:导入空间表(在目标端进行导入空间表)

mysql> alter table test.t100w import tablespace;

第七步:解锁源端数据表

mysql> unlock tables;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 1、简介 相当于Linux文件系统,只不过比文件系统强大 2、功能了解 数据读写 数据安全 提高性能 热备份 自动...
    极光01阅读 314评论 0 0
  • 1.什么是存储引擎 相当于mysql内置的文件系统。 与Linux中的文件系统打交道的层次结构。 2.mysql ...
    later02阅读 570评论 0 0
  • 上节回顾及尾巴 =============== 聚集索引 与 辅助索引 区别 1. 聚集索引 只能有一个,辅助索引...
    张鑫泽_2109阅读 365评论 0 0
  • 数据类型1.1 作用 控制数据的规范性,让数据有具体含义,在列上进行控制1.2 种类1) 字符串 char(32)...
    浪子_lucy阅读 149评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,454评论 16 22