今天不念跟大家讲一讲mysql常见故障和解决方法
1、这个表我建了唯一索引,ptosc添加字段为啥还是不行呢?
解析:有一个关键点是这一行报错:
you have at least one UNIQUE and NOT NULLABLE index。
需要非空唯一索引才行。
比如上面两张表,测试之后,前面执行跟你报错一样,后面可以正常执行。
当然,看版本是MySQL 8.0.25,已经支持快速加列了,可以直接加列,不需要用pt-osc。
2、redo log在prepare准备阶段是否开始刷盘?
解析:Redo Log 在Prepare阶段会刷盘,Binlog是在提交阶段才会刷盘(前提是开启双一的情况)。
3、二阶段提交带来的数据一致性的好处
解析:
假设没有两阶段提交:
假设先Redo log落盘了,Binlog后落盘,比如Redo Log落盘之后,MySQL崩溃了,因为Redo log记录在磁盘中,可以把数据恢复回来,但是Binlog因为没完成落盘,那binlog就少一条记录,从库就会少一次变更;
假设先Binlog落盘,再Redo Log落盘,如果写完Binlog,MySQL崩溃了,因为Redo Log没全部完成记录,那这个事务就不会生效,但是Binlog中多出一条记录,那从库可能就会多了一次变更。
4、这个报错是什么原因?
解析:
如下图,是pt-mysql-summary 代码里的内容,需要找MySQL的环境变量
5、读已提交,在select时,需要看其他事务的提交情况,比如有三个事务版本,A事务提交,B事务未提交,C事务也未提交,那在C事务查询数据时,只会读取A事务提交后的数据,所以会造成读取的数据不一致的情况,对吗?
解析:
在读已提交隔离级别下,同一个事务前后两次相同的查询,可能结果会不一样。
也就出现了幻读(在一个事务里面,按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足查询条件的新数据)
如下图实验:
6、可重复读,在select时,不管其他事务是否更新,只看本次事务begin前的数据,所以不会造成数据不一致的问题,对吗?
解析:
对的,即使其他事务所做的变更提交了,也看到的是之前的数据:
7、从复制遇到这个UUID的问题
解析:
是不是从库所在的机器,是通过主库所在机器克隆的
因为uuid持久化到auto.cnf里了,克隆机器,这个文件自然也一样,删掉重启,基本可以修复。
测试环境的话,在从库
rm /data/mysql/data/auto.cnf
/etc/init.d/mysql.server restart