mysql源码分析
qhgxinxing
这个作者很懒,什么都没留下…
展开
-
Semi 流程异常分析
正常流程1 在图中(1) 完成binlog 写入文件的pageCache2 在图中(2) 完成binlog sync 的磁盘binlog 文件3 在图中(3) 完成binlog 的异步发送,把binlog 发送到备库(等待sync完成,更新binlog updte pos,sync_binlog=1的流程)4 在图中(4) 完成binlog 发送完成的确认信息(此处可以完全确认binlog已经发送到从库)5 在图中(5) 用户线程被激活,完成第三阶段的事务提交异常流程分析1 在图中.原创 2021-07-15 11:53:13 · 232 阅读 · 0 评论 -
mysql 半同步 semi-sync 源码整理
用户线程事务提交MYSQL_BIN_LOG::ordered_commit 一阶段 flush binlog 后,执行semi插件 调用repl_semi_report_binlog_update file_name_ptr: binlog 文件名 flush_end_pos: flush binlog时的大小 -> if (RUN_HOOK(binlog_storage, after_flush,(thd, file_name_ptr, flush_end_pos)))原创 2021-07-10 15:56:56 · 312 阅读 · 0 评论 -
mysql收到tcp连接请求的过程
/*在请求的情况下,mysql 监听在此处*/0 Mysqld_socket_listener::listen_for_connection_event (this=0x6888a60) at sql/conn_handler/socket_connection.cc:866#1 0x0000000000ec0151 in Connection_acceptor<Mysqld_socket_listener>::connection_event_loop (this=0x6884e40原创 2021-03-23 15:33:15 · 188 阅读 · 0 评论 -
mysql5.7创建thd 的过程
/*一个tcp连接创建爱你thd的过程*/#0 THD::THD (this=0x7fff48000bc0, enable_plugins=true) at sql/sql_class.cc:1206#1 0x0000000001785ddd in Channel_info::create_thd (this=0x6966540) at sql/conn_handler/channel_info.cc:39#2 0x0000000001677a3f in Channel_info_local原创 2021-03-23 11:23:17 · 359 阅读 · 0 评论 -
mysql源码-innodb mvcc原理与源码解析
原理图解说1 在innodb中,保存了一个全局事务链表,记录了活跃事务,即还未完成的事务2 t2 时刻活跃的事务id为104~111,其中107已经完成3 在t2时刻,读事务A查询数据,在查询范围内的事务id为100~114,需要判断事务id100~114那些是否可 见的首先,先把当前活跃事务复制到自己空间,创建自己的readview,活跃的事务id有104~111,不包含107,107已经完成。最后,读取数据,读到事务id100~103,通过判断事务id<m_up_limit_id(1.原创 2021-01-01 13:25:07 · 590 阅读 · 0 评论 -
mysql8.0 redo日志无锁优化-架构图
流程简要说明1 应用线程并发从自己的mtr内存空间写入到log buffer,通过linkbuf 和预分配内存方式,实现并发下,此处不详细写应用线程在commit提交时阻塞等待,根据 innodb_flush_log_at_trx_commit 的值 等待不通过的触发信号2 log_writer 线程通过遍历linkbuf ,得到连续的内存的,即从上次写入的最小lsn到一直连续的最大lsn,即图中用大括号包含的部分,前面白色的方块表示后面的lsn已经不连续,说明还有没有写完的内存3 log_wri.原创 2020-12-08 17:23:38 · 317 阅读 · 0 评论 -
mysql8.0源码解析 InnoDB redo log日志 写 write ahead 巧用pageCache实现高效写
pageCache背景当往磁盘上写文件时,如果文件内容还没有被缓存或者被置换出去了,在内存里不存在对应的page cache,则需要先将对应page的内容从磁盘上读到内存里,修改要写入的数据,然后在将整个page写回到磁盘;在这种情况下,会有一次额外的读IO开销,IO的性能会有一定的损失。mysql的整体性能高度依赖redo log写IO的性能,InnoDB对对redo日志的写做了优化,redo log写入是追加写的模式(append write),引入了write ahead方法。巧用一个8192字节原创 2020-12-04 20:52:23 · 843 阅读 · 0 评论 -
mysql源码片段 innodb启动checkpoint flush脏页 lsn几个关键点检查过程整理
mysql 如何判断进程是正常停止(shutdown停止)还是异常停止(crash 或者 被kill 或者主机宕机导致的进程停止)呢?是如何判断的呢原创 2020-11-29 11:59:31 · 1667 阅读 · 2 评论 -
mysql 源码-- ut_ad ut_d ut_a 函数模式解析
在mysql源码中含有大量的函数ut_ad ut_d ut_a,又都是宏定义,记录下相关函数,便于初学者看代码易于理解ut_ad ut_d为源代码编译 DEBUG模式下才有作用,在release版本中不存在,代码中也就是没有相关的代码ut_a为源代码编译 DEBUG模式和release版本都存在ut_a ut_ad 函数的作用ut_a ut_ad 类似于C语言中assert的断言功能,当()中的表达式不为真则mysql主程序直接退出仅是判断函数或者变量是否是预期的值,仅仅是判断的功能,不会对流原创 2020-10-01 12:21:58 · 1253 阅读 · 0 评论 -
mysql 源码 innodb page 页面读取及刷脏 涉及的锁分析
InnoDB通过 读写锁、buf fix计数、io fix标记 来进行并发控制。page读取函数 buf_page_get_gen通过page_id 从链表读取(非第一次读取) 或者磁盘上加载(加载的过程中bpage→io_fix 为 BUF_IO_READ)buf_block_fix(fix_block) 引用计数加 1 (bpage→buf_fix_count )bpage→io_fix 完成后为BUF_IO_NONEmtr commit提交buf_block_unfix(bl原创 2020-09-17 20:54:45 · 683 阅读 · 0 评论 -
mysql源码-os_event_t 事件机制解析
mysql源码-os_event_t 事件机制解析在linux 平台下,实现主要是实现原理方法 pthread_mutex_lock pthread_cond_wait pthread_cond_broadcast变量 pthread_mutex_t pthread_condattr_t 来实现的实现过程log.checkpointer_event 是创建一个事件的举例创建事件的变量log.checkpointer_event = os_event_create(“log_checkpoi原创 2020-09-06 23:14:01 · 621 阅读 · 0 评论 -
mysql源码-线程池-如何保证仅有一个线程处理socket通信-EPOLLONESHOT
在epoll中 一个socket上的某个事件还是可能被触发多次,采用线程城池的方式来处理事件,可能一个socket同时被多个线程处理EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里mysql线程池对描述符socket注册了EPOLLONESHOT事件,则系统最多触发其上注册的一个可读、可写或者异常事件,且只触发一次,如果下次再触发则必须使用epoll_ctl重置该描述符上注册的事件,包括EPOLLON原创 2020-07-01 15:51:23 · 164 阅读 · 0 评论 -
mysql5.7 group commit 关于binlog文件切换(rotate)的笔记
@[TOC](mysql5.7 group commit 关于binlog文件切换(rotate)的笔记)在组提交的过程进入orderred_commit 函数 对binlog文件切换(rotate)的记录有事务提交完成此函数判断增加with_xid 确定为true,在写binglog 中写入 binary_log::XID_EVENTint binlog_cache_data::write_event(THD *thd, Log_event *ev)if (ev->get_type_cod原创 2020-05-13 17:59:24 · 348 阅读 · 0 评论