zoukankan      html  css  js  c++  java
  • 十六、存储引擎

    功能

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

    查看使用的存储引擎

    常用的存储引擎类型(面试题)
    InnoDB
    MyISAM
    MEMORY
    CSV

    对原有的存储引擎进行改进,也就是第三方存储引擎
    第三方的存储引擎:
    RocksDB
    MyRocks
    TokuDB
    压缩比较高,数据的插入性能高.其他功能和InnoDB没差别

    常用数据库使用的存储引擎
    PerconaDB:默认是XtraDB
    MariaDB:默认是InnoDB

    InnoDB存储引擎特性
    也就是MyISAM所不具备的特性
    1、事务
    2、行锁
    3、MVCC: 多版本并发控制
    4、外键
    5、ACSR自动故障恢复
    6、热备
    7、复制(多线程并发,GTID,MTS)



    查看存储引擎

    查看支持的存储引擎

    查看默认使用的存储引擎

    创建表t11,查看创表语句会发现自动加载默认存储引擎

    建表指定存储引擎

    其他查看表的存储引擎方式

    mysql> SHOW TABLE STATUS LIKE 'test'G
    *************************** 1. row ***************************
               Name: test
             Engine: InnoDB
            Version: 10
         Row_format: Dynamic
               Rows: 4
     Avg_row_length: 4096
        Data_length: 16384
    Max_data_length: 0
       Index_length: 0
          Data_free: 0
     Auto_increment: NULL
        Create_time: 2021-02-10 17:10:13
        Update_time: NULL
         Check_time: NULL
          Collation: utf8_general_ci
           Checksum: NULL
     Create_options: 
            Comment: 
    1 row in set (0.00 sec)
    
    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       | check_score        | NULL   |
    | school       | course             | InnoDB |
    | school       | score              | InnoDB |
    | school       | student            | InnoDB |
    | school       | teacher            | InnoDB |
    | school       | test               | InnoDB |
    | school       | vote_record        | InnoDB |
    | school       | vote_record_memory | MEMORY |
    +--------------+--------------------+--------+
    8 rows in set (0.00 sec)
    
    

    通过配置文件修改默认存储引擎

    $ cat /etc/my.cnf
    [mysqld]
    user=mysql
    basedir=/usr/local/mysql5.7
    datadir=/usr/local/mysql5.7/data
    socket=/tmp/mysql.sock
    server_id=6
    port=3306
    default_storage_engine=InnoDB #修改默认存储引擎
    [mysql]
    socket=/tmp/mysql.sock
    

    修改存储引擎

    修改表的存储引擎

    mysql> alter table test engine=myisam;
    mysql> show create table test;
    

    当我们使用delect删除表数据时,会有很多碎片,时间久了就会影响查询性能,此时可以使用修改存储引擎的方式整理碎片,此方法仅限于使用InnoDB引擎。

    #使用此命令进行碎片整理时需要在业务不繁忙的时间做,因为会有短暂的锁表情况,但锁表时间不长。
    mysql> alter table test engine=InnoDB;
    

    InnoDB物理存储结构

    以MySQL5.7版本为例
    InnoDB引擎存储方式由以下5种文件
    1、ibdata1文件
    也是就共享表空间文件,存储系统数据字典信息(即表的统计信息,类似于information_schema.table存储的表的属性状态数据行数引擎等信息)
    undo表空间数据(主要用于事务回滚)

    2、ib_logfile0~ib_logfile1文件
    是存储引擎日志,存储redo日志文件,也叫重做日志
    这两个文件是一样大小

    3、ibtmp1文件
    存储临时表的文件,例如在做join union操作产生临时数据,用完就自动删除

    4、frm文件
    存储表的列信息

    5、ibd文件
    存储表的数据行和索引

    总结:做表的备份迁移并不是复制frm、ibd文件就能实现的。

    表空间

    源于oracle数据库概念
    相当于一个逻辑分区,当物理硬盘sda挂载到表空间中供oracle使用,当空间不足时,再挂载一块硬盘sdb到表空间中供其使用。相当于linux的逻辑卷。

    共享表空间(ibdata1~N)
    在mysql5.5版本中引入,因为Mysql数据库访问硬盘数据要基于文件系统,所以出现共享表空间ibdata1文件理念。
    例如格式化sda硬盘,挂载到/data/目录下,myslq会在该目录下创建ibdata1文件,该文件就是共享表空间文件。

    共享表空间

    即ibdata1文件

    mysql各版本之间存储差距
    MySQL5.5版本
    默认模式为共享表空间
    需要将所有数据存储到同一个表空间ibdata1文件中,管理比较混乱
    所以在5.6中将默认表空间更改为独立表空间。

    MySQL5.6版本
    共享表空间ibdata1(存储数据字典信息,undo,临时表ibtmp1)
    frm
    ibd

    MySQL5.7版本
    共享表空间ibdata1(存储数据字典信息,undo)
    临时表ibtmp1
    frm
    ibd

    MySQL8.0版本
    共享表空间ibdata1(存储数据字典信息)
    undo表主要用于回滚
    临时表ibtmp1
    frm
    ibd

    查看ibdata1配置信息

    #ibdata1默认大小12M,自动以64M自增
    #ibdata1文件默认在mysql的/data目录下
    mysql> select @@innodb_data_file_path;
    +-------------------------+
    | @@innodb_data_file_path |
    +-------------------------+
    | ibdata1:12M:autoextend  |
    +-------------------------+
    1 row in set (0.00 sec)
    
    #所以ibdata1大小为12M+64M=76M,不够了再增加64M,以此类推
    $ ls -sh
    total 185M
       0 3307       96K client1.err            76M ibdata1      4.0K mysql                12K sys
       0 3308      4.0K client1.pid            48M ib_logfile0   12K performance_schema     0 test
       0 3309         0 client1.pid.shutdown   48M ib_logfile1     0 sch                    0 xyz
    4.0K auto.cnf  4.0K ib_buffer_pool         12M ibtmp1       4.0K school
    

    ibdata1设置是在初始化安装mysql时配置的

    #该命令在mysql初始化时会在硬盘上创建ibdata1跟ibdata2两个大小都为512M的文件,当这两个文件用完时才会自增
    $ mysqld --initialize-insecure --user=mysql --basedir=xxx
    innodb_data_file_path=ibdata1:512M:ibdata2:512M:autoextend inodb_autoextend_increment=64
    

    独立表空间

    从5.6版本开始,默认表空间不再使用共享表空间,而开始使用独立表空间。

    独立表空间特点
    每个表都是一个独立的ibd文件,用来存储数据行和索引
    即一张InnoDB表=frm+idb+ibdata1

    查看独立表空间

    #1表示使用的独立表空间模式,0表示使用的共享表空间模式
    mysql> select @@innodb_file_per_table;
    +-------------------------+
    | @@innodb_file_per_table |
    +-------------------------+
    |                       1 |
    +-------------------------+
    1 row in set (0.00 sec)
    
    #修改为共享表空间模式
    mysql> set global innodb_file_per_table=0;
    
    #当修改为共享表空间模式之后再创建表,此时表有frm文件,其余文件存储在ibdata1中
    

    表空间迁移

    前提是两个数据库的版本要一致。

    例如将school数据库中的student表迁移到test数据中

    #创建t100w数据库
    mysql> create database test charset utf8mb4;
    
    #查看school库中student表的建表语句
    #复制建表语句在test库中创建student表
    mysql> show create table student;
    
    #删除test库中的表空间文件
    mysql> use test;
    mysql> alter table student discard tablespace;
    
    #复制原表ibd到test库中,并且修改权限
    $ cp school/student.ibd test/
    $ chown -R mysql:mysql sutdent*
    
    #导入表空间
    mysql> alter table student import tablespace;
    
    #表迁移完成
    mysql> desc student;
    +-------+---------------------+------+-----+---------+----------------+
    | Field | Type                | Null | Key | Default | Extra          |
    +-------+---------------------+------+-----+---------+----------------+
    | sno   | int(11)             | NO   | PRI | NULL    | auto_increment |
    | sname | varchar(20)         | NO   | MUL | NULL    |                |
    | sage  | tinyint(3) unsigned | NO   |     | NULL    |                |
    | ssex  | enum('f','m')       | NO   |     | m       |                |
    +-------+---------------------+------+-----+---------+----------------+
    4 rows in set (0.00 sec)
    

    日志文件

    MySQL的存储引擎日志有以下2种
    1、Redo Log日志
    ib_logfile0,ib_logfile1日志文件,也叫重做日志

    2、Undo Log日志
    存储在共享表空间中,回滚日志


    学习来自:郭老师博客,老男孩深标DBA课程 第五章

    今天的学习是为了以后的工作更加的轻松!
  • 相关阅读:
    ORACLE错误笔记
    SQL-考试各科目的成绩以及各科目的参与考试次数
    MySql有几条更新sql不能执行时的解决方案
    面试中常遇到的算法面试题
    MySql绿色版安装教程
    Javaweb
    关于JavaWeb不使用框架上传文件的简单实现
    SSM框架
    数据库
    J2SE
  • 原文地址:https://www.cnblogs.com/tz90/p/14436255.html
Copyright © 2011-2022 走看看