收到mysql主从切换告警,并且业务反馈数据库无法正常使用进入只读模式。
查看数据库日志,不确定日志所在目录可以通过参数查看。
查看日志发现在反馈问题的时间段出现这样的日志
提示myisam引擎表的数据文件写不进tmp目录,df -Th查看果然tmp目录满了。手动清理目录后数据库恢复正常。
随便说一下innodb引擎和myisam的区别。
1.innodb
innodb是一种兼顾高可用和高性能的通用存储引擎,在Mysql5.5版本后是mysql的默认引擎。表结构是.frm,文件名以表名开头,以. ibd 为扩展名。
2.特点
dml操作遵循acid模型,支持事务;
行级锁,提高并发访问性能;
支持外键foreign ker约束,保证数据的完整性和正确性;
MylSAM
MylSAM是MySQL早期的默认存储引擎。
特点:不支持事务,不支持外键,支持表锁,不支持行锁,访问速度快。
文件
xxx.sdi:存储表结构信息
xxx.MYD:存储数据
xxx.MYI:存储索引。
再说一下为什么要用myisam引擎的表,导致问题的sql使用的表大部分操作是查询,而myisam只查询的话效率要比innodb要快。原因引用下文。
https://blog.csdn.net/is_scarecrow/article/details/131403353
大家总说 MyISAM 适合读多,并发少的场景。查询快,是因为 InnoDB 的表是根据主键进行展开的 B+tree 的聚簇索引,MyISAM 是非聚簇索引,MyISAM 存储会有两个文件,一个是索引文件,一个是数据文件,其中索引文件中的索引指向数据结构中的表数据。聚集索引并不是一种单独的索引类型,而是一种存储方式,InnoDB 聚集索引是在同一结构中保存了 B+tree 索引和数据行,当有聚簇索引的时候,他的索引实际放在叶子页中。
- 1.数据块,innodb 要缓存,MyISAM 只缓存索引块,这中间还有换进换出的减少;InnoDB 寻址要映射到块,再到行,MyISAM 记录的直接是文件的 offset,定位比 InnoDB 要快;InnoDB 还需要维护 MVCC 一致,虽然场景没有,但是他还是需要去检查和维护 MVCC 多版本并发控制。
- 2.InnoDB:通过为每一行记录添加两个额外的隐藏的值来实现 MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(或者被删除)。但是 InnoDB 并不存储这些事件发生时的实际时间,相反它只存储这些事件发生时的系统版本号。这是3.一个随着事务的创建而不断增长的数字。每个事务在事务开始时会记录它自己的系统版本号。每个查询必须去检查每行数据的版本号与事务的版本号是否相同。
- InnoDB 还需要维护 MVCC 一致。
简单的理解myisam没有事务,不需要像innodb需要维护事务。所以查询快。
引发故障的sql据业务侧反馈因为是临时写用来跑数据,只执行这一次。所以无需优化。