1、简介
相当于Linux 文件系统,只不过比文件系统强大
2、功能了解
数据读写、数据安全和一致性、提高性能、热备份、自动故障恢复、高可用方面支持等。
3、存储引擎介绍
show engines;
笔试题:写出几个mysql 支持的引擎
InnoDB MyISAM MEMORY CSV
Mysql5.5以后的存储引擎默认为InnoDB
PerconaDB:默认是XtraDB
Mariadb:默认是InnoDB
常用的第三方存储引擎:
RocksDB MyRocks TokuDB
压缩比较高,数据的插入性能高,其他功能 和InnoDB没差。
+++++++++++++++++++++++++++++++++++++++++++
案例:--------- zabbix 监控系统架构整改
环境:zabbix 3.2 Mariadb 5.5 centos 7.3
现象:zabbix卡的要死,每陋3-4个月,都要重新搭建一遍zabbix,存储空间经常爆满
问题:zabbix 版本 数据库版本 zabbix数据库500G,存在一个文件里
优化建议:
数据库版本升级到Mariadb 最新版本,zabbix升级到最新版本
mariadb 存储引擎修改为tokudb
监控数据按月份进行切割(二次开发: zabbix 数据保留机制功能重写,数据库分表)
关闭binlog 和 双1,提升性能。
参数调整........
优级结果:监控状态良好
为什么这么做?
mariadb 支持tokudb 引擎,经过测试,mariadb 最新版要比5.5版本性能 高 2---3倍
tokudb:insert 数据比Innodb 快得多,数据压缩比要比Innodb高
监控数据按月份进行切割,为了能够truncate 每个分区表,立即释放空间。
关闭binlog -------->减少无关日志的记录
参数调整.....------->安全性参数关闭,提高性能 。
+++++++++++++++++++++++++++++++++++++++++++
delete 删除表数据,逻辑删除,逐行删除,删除完后,占用的磁盘空间并不会立即释放。
truncate table from city; 物理删除,删除所有数据行,保留表结构,会将整个表段中所有的区删除,会立即释放占用的空间,只能单表单表的删除,不能按行删除。
单台zabbix 4核8G,可以监控上百台服务器。
+++++++++++++++
5、InnoDB 存储引擎,核心特性说明
事务,行集锁定(就是单行锁定),外键,热备,自动故障恢复(ACSR),MVCC(多版本并发)
复制(多线程,GTID,MTS)
6、InnoDB---->MyISAM存储引擎的替换(客户案例)
环境:centos 5.8, Mysql 5.0 版本,MyISAM 存储引擎,网站业务(LNMP),数据量50G
现象问题:业务压力大的时候,非常非常卡,经历过宕机,会有部分数据丢失。
问题分析:
MyISAM存储引擎是表级锁,在高并发时,会有很高的锁等待
MyISAM存储引擎不支持事务,在断电时,会有可能丢失数据(内存里面的数据,无法及时写到磁盘上)
职责:
监控锁的情况:有很多的表 锁等待
存储引擎查看:所有表默认是MyISAM
解决方案:
1、升级到Mysql 5.6.10版本,先升级到5.5,再升级到5.6
2、迁移所有表到新环境
3、开启双1安全参数
++++++++++++++++++++
7、存储引擎查看(了解)
select @@default_storage_engine;
show engines;
查看表的存储引擎状态
show create table ttt;
show table status like 'ttt'\G
8、存储引擎的修改
alter table ttt engine=innodb;
8.2、整理碎片(引擎必须是innodb)
碎片:我们在做delete 删除操作时,数据逐行进行逻辑删除,删除后,它原来所占有的空间,不会立即释放掉,就会产生碎片。
早期整理碎片方法:
先导出原表里面的数据,把表truncate 掉,再把数据导入。(这样处理是零碎片,比较有风险,对业务影响时间长)
alter table ttt engine=innodb; #快速整理
自动扫描表里面的数据页的缝隙,自动合并这些缝隙,数据会自动做一些迁移。尽量避开业务繁忙时候,会有短暂的锁表。
++++++ 案例:
平常处理过的Mysql 问题-----碎片处理
环境:centos 7.4 Mysql 5.7.2 Innodb 存储引擎
业务特点:数据量级较大,经常需要按月删除历史数据
问题:磁盘空间占用很大,不释放
处理方法:
以前:将数据逻辑导出,手工truncate表 ,然后导入进去
现在:
对表按月进行分表(partition,中间件)
业务替换为truncate方式
定期进行碎片整理
8.3、批量替换zabbix 100张表的引擎innodb 为 tokudb
alter table zabbix.a engine=tokudb;#样本
select concat("alter table ",table_schema,".",table_name," engine=tokudb;") from information_schema.tables where table_schema='zabbix' into outfile '/tmp/ch_engine_tokudb.sql'; #将语句导出到文件
mysql -uroot -p </tmp/ch_engine_tokudb.sql #实现了批量操作
9、最直观的存储方式(/data/mysql/data)
ibdata1:共享表空间,在不同的版本存储的不一样,
5.5才有的共享表空间,默认模式,所有表的行和索引都存储到ibdata1
5.6 独立表空间,一个表一个ibd文件(存储数据行和索引),共享表空间只用来存储数据字典信息,undo信息,临时表空间)
5.7版本,在5.6的基础上,又把临时表空间信息独立出来了(ibtmp1临时表空间)
8.0版本,又在5.7的基础上把undo的信息独立出来了,8.0开始,ibdata1,主要存储数据字典的一些信息了。
ibdata1:系统数据字典信息(统计信息),UNDO表空间等数据。(5.7 version)
ib_logfile0 ~ ib_logfile1: REDO日志文件,事务日志文件。(记录内存数据页的数据变化(增删改))
ibtmp1:临时表空间的磁盘区域,存储临时表,在做多表连接或者union时的虚拟表就存放ibtmp1。
undo 重做的日志存储位置
frm:存储表的列信息
ibd:表的数据行和索引
9.1、表空间(Tablespace)
9.1.0、表空间数据问题
ibdata1:整个库的统计信息 + UNDO
ibd:数据行和索引
9.1.1、共享表空间(所有数据都存储在表空间里面,管理比较混乱,ibdata1~N)
5.5版本出现的管理模式,也是默认模式
5.6转换为了独立表空间,共享表空间保留,只用来存储数据字典信息,undo,临时表信息
5.7版本临时表被独立出来了
8.0版本,undo也被独立出来了。
select @@innodb_data_file_path;
9.1.2、独立表空间 *****
从5.6,默认表空间不再用不用 共享 表空间,而是替换为独立表空间。
主要存储的是用户数据
存储特点:一个表一个ibd文件,存储数据行和索引信息
最终结论:
一张Innodb表=frm+ibd+ibdata1
Mysql 的存储引擎日志:
Redo Log: ib_logfile0 ib_logfile1 ,重做日志
Undo log: ibdata1 ibdata2(存储在共享表空间中),回滚日志。
临时表:ibtmp1,在做join union 操作时产生的数据,用完就自动清理。
独立表空间的设置
select @@innodb_file_per_table;
默认为1,就是,独立表空间,0为共享表空间
set global innodb_file_per_table=0;
独立表空间迁移(两个版本必须一样,至少大版本要一样,小版本不能相差太多。)
1、创建和原表结构一致的空表
show create table xxx(原表名); 查找到建表信息
2、将空表的ibd 文件删除
alter table t100 discard tablespace;
3、将原来表的ibd文件拷贝过来,修改权限。
4、将拷贝过来的原表ibd文件进行导入。
alter table t100 import tablespace;
将一块盘的内容镜像到另一块盘
dd if=/dev/sdb of=/dev/sdc