第15节:MySQL层事务提交流程简析
本节将来解释一下MySQL层详细的提交流程,但是由于能力有限,这里不可能包含全部的步骤,只是包含了一些重要的并且我学习过的步骤。我们首先需要来假设参数设置,因为某些参数的设置会直接影响到提交流程,我们也会逐一解释这些参数的含义。本节介绍
第29节:线程简介和MySQL调试环境搭建
最后我想简单说一下我的MySQL调试环境的搭建,但是在此之前不得不简单说一下什么是线程,因为如果不解释一下什么是线程,简单的调试可能都会有阻碍,同时了解线程对我们普通DBA诊断性能问题也有极大的帮助。但是详细解释线程已经超出了我的能力范围也超出了本系列讨论的范围,具体我
第29节:线程简介和MySQL调试环境搭建
最后我想简单说一下我的MySQL调试环境的搭建,但是在此之前不得不简单说一下什么是线程,因为如果不解释一下什么是线程,简单的调试可能都会有阻碍,同时了解线程对我们普通DBA诊断性能问题也有极大的帮助。但是详细解释线程已经超出了我的能力范围也超出了本系列讨论的范围,具体我
深入理解MySQL主从原理专栏(32节) 发布
相信作为一名DBA来讲MySQL主从一直都是一个绕不开的话题,我们在很多高可用构架中都能看到它的身影。在我们心中一定都或多或少的产生过一些疑问,比如: 主从延迟为什么会高?主从延迟为什么一直不动?主从延迟为什么瞬间跳动?延迟为0就一定代表没有延迟吗?从库异常重启为什么会报错?从库能和主库一样利用索引吗?MTS是如何提高从库应用效率的?为什么会有那么多和从库相关的sync参数,我该
深入理解MySQL主从原理专栏 发布
购买可联系我 wx:gaopp_22389860 相信作为一名DBA来讲MySQL主从一直都是一个绕不开的话题,我们在很多高可用构架中都能看到它的身影。在我们心中一定都或多或少的产生过一些疑问,比如: 主从延迟为什么会高?主从延迟为什么一直不动?主从延迟为什么瞬间跳动?延迟为0就一定代表没有延迟吗?从库异常重启为什么会报错?从库能和主库一样利用索引吗?MTS是如何提高从库应用效率的?为
Innodb 下null '' ' '的存储表现的不同
今天顺便测试了一下 他们三者是不同的,简单的说就是 null :nullbits 位图上的区别。‘’:可变字节多一个字节。‘ ‘:可变字节多一个字节且实际数据区域为0X20多一个字节。 如下语句: mysql> show create table testnull1 \G *************************** 1. row *******************
Innodb 下null '' ' '的存储表现的不同
今天顺便测试了一下 他们三者是不同的,简单的说就是 null :nullbits 位图上的区别。‘’:可变字节多一个字节。‘ ‘:可变字节多一个字节且实际数据区域为0X20多一个字节。 如下语句: mysql> show create table testnull1 \G *************************** 1. row *******************
二十五:从库的关闭和恢复流程(笔记)
一、stop slave流程用户线程: stop_slave -> terminate_slave_threads ->带入参数rpl_stop_slave_timeout设置,作为等待SQL线程退出的超时时间。 SQL: -> 设置SQL线程终止,mi->rli->abort_slave= 1; 这个才是决定作用的 -> ter
二十四:从库数据的查找和参数slave_rows_search_algorithms(笔记)
**本文是我《深入理解MySQL主从原理》 系列的笔记部分,具体可以点击:ttps://j.youzan.com/yEY_Xi** 一、索引操找和定位栈帧slave_rows_search_algorithms默认。 一些debug的断点: ha_innobase::index_read:这个函数是访问索引的时候定位到值所在的位置用到的函数,因为必须要知道读取索引的开始位置才能向下访问。ha_innobase::index_next_same:访问索引的下一条数据封装的 ha_innobase::general_fet
二十三:从库的SQL 线程(MTS协调线程)和sql_slave_skip_counter参数(笔记)
一、调用流程大概如下handle_slave_sql ->是否开启了slave_preserve_commit_order和log_slave_updates参数,开启的话需要设置提交顺序管理器 if (opt_slave_preserve_commit_order && rli->opt_slave_parallel_workers > 0 &
二十二:从库的IO线程(笔记)
一、流程解析start_slave ->start_slave_threads -> if (!mi->inited || !mi->rli->inited)//如果没有初始化 { int error= (!mi->inited ? ER_SLAVE_MI_INIT_REPOSITORY :
二十:从库MTS多线程并行回放(二)(笔记)
**本文是我《深入理解MySQL主从原理》 系列的笔记部分,具体可以点击:ttps://j.youzan.com/yEY_Xi** 一、工作线程执行Event外部循环 slave_worker_exec_job_group ->pop_jobs_item 出队 获取event 但是不删除 如果队列为空则等待 stage_slave_waiting_event_from_coordinator Waiting for an event from Coordinator ->
二十:从库MTS多线程并行回放(二)(笔记)
**本文是我《深入理解MySQL主从原理》 系列的笔记部分,具体可以点击:ttps://j.youzan.com/yEY_Xi** 一、工作线程执行Event外部循环 slave_worker_exec_job_group ->pop_jobs_item 出队 获取event 但是不删除 如果队列为空则等待 stage_slave_waiting_event_from_coordinator Waiting for an event from Coordinator ->
十九:从库MTS多线程并行回放(一)(笔记)
一、分发调用流程->ev->apply_event(rli); Log_event::apply_event 这里如果是非MTS进行应用 如果MTS 如果是GTID event 进行WORKER线程的分配 ,如果不是则获取WORKER线程 -> 是否是进行 MTS recovery if (rli->is_mts_recovery())
十九:从库MTS多线程并行回放(一)(笔记)
一、分发调用流程->ev->apply_event(rli); Log_event::apply_event 这里如果是非MTS进行应用 如果MTS 如果是GTID event 进行WORKER线程的分配 ,如果不是则获取WORKER线程 -> 是否是进行 MTS recovery if (rli->is_mts_recovery())
十七:主库的DUMP线程(笔记)
DUMP 线程启动函数调用流程 1、多次select 交互,从库需要保存主库的信息2、注册从库信息3、读取从库发送的各种信息 com_binlog_dump_gtid 读取从库的信息包括 - server id - 需要读取的binlog为名字 - 读取的位点 - 从库GTID - kill_zombie_dump_threads 杀掉本从库以前
十五:MySQL层事务提交流程简析(笔记)
部分栈帧: 2、prepare栈帧 (gdb) bt #0 binlog_prepare (hton=0x346f260, thd=0x7fff2c000b70, all=false) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:1578 #1 0x0000000000f64e80 in ha_prepare_l
十四:事务Event的生成和写入流程(笔记)
关于各个Event的生成时机直接debug前面讲Event的时候给出的各个接口即可。 一、Query_log_event栈帧:初始化 #0 Query_log_event::Query_log_event (this=0x7fffec0f30d0, thd_arg=0x7ffe7c000b70, query_arg=0x22e0614 "BEGIN", query_length=5, usi
十一:参数binlog_row_image(笔记)
一、设置过程插入前先调用TABLE::mark_columns_per_binlog_row_image函数函数中有image的详细设置 /* Mark columns according the binlog row image option. When logging in RBR, the user can select whether to log partial
四:GTID中的运维(笔记)
一、ONGOING_ANONYMOUS_TRANSACTION_COUNT主库 生成GTID: 这下面可以调用匿名+1 (gdb) bt #0 Gtid_state::generate_automatic_gtid (this=0x308ab20, thd=0x7ffe7c000b70, specified_sidno=0, specified_gno=0, locked_sidno=0x7