一个crash case问题的猜测
线上在批量resize buffer的时候,从库会遇到crash的情况2024-12-27T02:52:17.267661Z 0 [Note] InnoDB: Completed to resize buffer pool from 15032385536 to 30064771
MySQL MEM_ROOT 内存分配
使用mem_root进行内存分配的操作,如果没有设置max_capacity,那么是不会限制的,内存不够了,就分配内存。如果设置了error_for_capacity_exceeded,那么超过限制,只会输出错误,还是会分配内存,所以针对这部分的内存,使用可能会超过预期的。默认设置:void init_alloc_root(PSI_memory_key key, MEM_RO
GDB使用场景
图形化的工具看代码很方便,gdb命令的方式相对原始,但是一些场景下还是需要gdb命令行。1 在调试MySQL还是有些问题,vs code 不支持non-stop调试,导致多线程的场景下没法调试单个线程,只能使用命令行2 在分析corefile的时候,还是在Linux上用命令行方便,因为需要相同的环境编译的版本,才能看文件的详细信息。通常服务器内存都比较大,生成的文件也很大,肯定在服务器上分析更快。
FLUSH NO_WRITE_TO_BINLOG BINARY LOGS 的风险点
在性能差的磁盘上,执行上面命令是有风险的,执行上面的命令过程中,会purge未在index 文件中的binlog ,如果过多,清理的时间慢,持有的Lock_log时间过长,会阻塞dml。这个风险点相对较高,一般线上机器磁盘性能高不会遇到这个问题,但是需要注意这个风险点。调用栈如下:MYSQL_BIN_LOG::purge_index_entry(THD*, unsigned l
半同步在线切换,切换后从库报数据重复错误
在开启使用after_sync半同步的集群上,执行了在线切换,切换过程中,旧主上报duplicate entry错误。分析:开启半同步的时候,在commit阶段,更新executed_gtid是在after_sync_hook之后,所以master在等待从库ack的过程中,如果这个过程比较慢,那么从库上的数据是会比主库的数据新。在主库更新executed_gtid 之前,调整了拓扑,并启动了复制,
MySQL并行复制2
MySQL5.7基于时间戳的并行复制,https://dev.mysql.com/worklog/task/?id=7165 中作了优化,之前是机遇parent- commit的并行,就是说在之前的事务都提交后开始的prepare能并行,这种方式并行度不够理想,然后换成了lock- base的并行,这种方式是同时进入prepare的就能并行,就是说在加锁阶段有重复,说明是互相之间没有锁的