暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL实战中遇到的几个问题

89

大家好,我是马听,DBA界的一位小学生。

今天跟大家节选一些课程学员在答疑群问过的问题。

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


    最近原创干货

    什么?MySQL在从库读到了比主库更加新的数据?

    MySQL 8.0 安装脚本

    MySQL为什么不用Redo Log来进行主从复制?

    通过Otter同步MySQL数据

    MySQL常用工具

    同样一条SQL,3种场景体现3种不同的执行计划


    加图一微信,回复“进群”进微信群;或者扫描图二进QQ交流群。

     

    点击阅读原文跳转到小编的DBA体系课程。

    文章转载自MySQL数据库联盟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论