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

    一、简介

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

    1.种类

    InnoDB 在MySQL5.5版本之后,默认的存储引擎,提供高可靠性和高性能。
    MyISAM
    MEMORY
    ARCHIVE
    FEDERATED
    EXAMPLE
    BLACKHOLE
    MERGE
    NDBCLUSTER
    CSV

    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 )

    二、引擎替换案例

    环境: zabbix 3.2    mariaDB 5.5  centos 7.3
    现象 : zabbix卡的要死 ,  每隔3-4个月,都要重新搭建一遍zabbix,存储空间经常爆满.
    问题 :
    1. zabbix 版本 
    2. 数据库版本
    3. zabbix数据库500G,存在一个文件里
    优化建议:
    1.数据库版本升级到5.7版本,zabbix升级更高版本
    2.存储引擎改为tokudb
    3.监控数据按月份进行切割(二次开发:zabbix 数据保留机制功能重写,数据库分表)
    4.关闭binlog和双1
    5.参数调整....
    优化结果:
    监控状态良好
    
    为什么?
    1. 原生态支持TokuDB,另外经过测试环境,5.7要比5.5 版本性能 高  2-3倍
    2. TokuDB:insert数据比Innodb快的多,数据压缩比要Innodb高
    3.监控数据按月份进行切割,为了能够truncate每个分区表,立即释放空间
    4.关闭binlog ----->减少无关日志的记录.
    5.参数调整...----->安全性参数关闭,提高性能.
    View Code

    三、存储引擎查看

    1.select查看

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

    2.SHOW 确认每个表的存储引擎

    SHOW CREATE TABLE CityG;
    SHOW TABLE STATUS LIKE 'CountryLanguage'G
    View Code

    3.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;
    View Code

    4.修改一个表的存储引擎

    db01 [oldboy]>alter table t1 engine innodb;
    注意:此命令我们经常使用他,进行innodb表的碎片整理。
    此命令适合小表,不适合大表。这条命令很重要。
    View Code

    5.平常处理过的MySQL问题--碎片处理

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

    6.扩展:如何批量修改

    需求:将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';
    View Code

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

    1.最直观的存储方式(/data/mysql/data)

    ibdata1:系统数据字典信息(统计信息),UNDO表空间等数据
    ib_logfile0 ~ ib_logfile1: REDO日志文件,事务日志文件。
    ibtmp1: 临时表空间磁盘位置,存储临时表
    frm:存储表的列信息
    ibd:表的数据行和索引

    2.表空间

    2.1共享表空间

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

    2.2共享表空间设置

    共享表空间设置(在搭建MySQL时,初始化数据之前设置到参数文件中)
    [(none)]>select @@innodb_data_file_path;
    [(none)]>show variables like '%extend%';
    innodb_data_file_path=ibdata1:512M:ibdata2:512M:autoextend
    innodb_autoextend_increment=64
    View Code

    2.3独立表空间

    从5.6,默认表空间不再使用共享表空间,替换为独立表空间。
    主要存储的是用户数据
    存储特点为:一个表一个ibd文件,存储数据行和索引信息
    也就是一个表一个ibd文件,一个frm文件
    基本表结构元数据存储:
    xxx.frm
    最终结论:
          元数据            数据行+索引
    mysql表数据    =(ibdataX+frm)+ibd(段、区、页)
            DDL             DML+DQL
    
    MySQL的存储引擎日志:
    Redo Log: ib_logfile0  ib_logfile1,重做日志
    Undo Log: ibdata1 ibdata2(存储在共享表空间中),回滚日志
    临时表:ibtmp1,在做join union操作产生临时数据,用完就自动
    View Code

    2.4 独立表空间设置问题

    db01 [(none)]>select @@innodb_file_per_table;#查看是独立表模式还是共享表模式
    +-------------------------+
    | @@innodb_file_per_table |
    +-------------------------+
    |                      1 |            #1就是独立表模式,0就是共享表模式
    +-------------------------+
    alter table city dicard tablespace;    #删除表空间文件,只删ibd,元数据还在
    alter table city import tablespace; #导入表空间文件
    View Code

    2.5 真实的案例

    案例背景:
    硬件及软件环境:
    联想服务器(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
    View Code
  • 相关阅读:
    不务正业系列-浅谈《过气堡垒》,一个RTS玩家的视角
    [LeetCode] 54. Spiral Matrix
    [LeetCode] 40. Combination Sum II
    138. Copy List with Random Pointer
    310. Minimum Height Trees
    4. Median of Two Sorted Arrays
    153. Find Minimum in Rotated Sorted Array
    33. Search in Rotated Sorted Array
    35. Search Insert Position
    278. First Bad Version
  • 原文地址:https://www.cnblogs.com/xufengnian/p/11885843.html
Copyright © 2011-2022 走看看