mysql 源码笔记
qhgxinxing
这个作者很懒,什么都没留下…
展开
-
semi流程
Semi-sync 流程概况Semi-sync 利用原有的异步模式,通过嵌入等待从库ack binlog pos的模式,实现事务同步等待,保证事务提交前完成binlog redo 发送到slave节点问题After_sync 确认为ack应答为group commit 阶段的第三阶段开始,如果在收到应答之前宕机,会出现主从不一致的情况。1 sync_binlog 为1 时 发送binlog的时机为binlog sync 之后,在宕机的瞬间无法确定从库是否收到binlog1>从库未收到bi原创 2021-07-07 23:52:03 · 437 阅读 · 0 评论 -
数据更新 mysql redo 磁盘空间不足时
#0 log_checkpoint (sync=false, write_always=false) at /data/mysql-boost-5.7.32/mysql-5.7.32/storage/innobase/log/log0log.cc:1786#1 0x000000000196c74a in log_checkpoint_margin () at /data/mysql-boost-5.7.32/mysql-5.7.32/storage/innobase/log/log0log.cc:19原创 2021-06-21 11:41:38 · 232 阅读 · 0 评论 -
mysql非正常停止(宕机、crash) binlog的恢复过程
通过binlog 回滚 已sync的redo日志 #0 trx_undo_set_state_at_prepare (trx=0x7fffed2d5478, undo=0xfad8cd8, rollback=true, mtr=0x7fffffffc640) at /mysql-boost-5.7.32/mysql-5.7.32/storage/innobase/trx/trx0undo.cc:1904#1 0x0000000001ab981f in trx_rollback_low (trx=0x原创 2021-05-24 10:28:20 · 303 阅读 · 0 评论 -
mysql 数据更新 检查 redo日志空间是否充足log_free_check
#0 0x00007fda905cfe9d in nanosleep () from /lib64/libpthread.so.0#1 0x0000000000f77ce0 in os_thread_sleep (tm=tm@entry=10000) at /root/mysql5.7.32/mysql-5.7.32/storage/innobase/os/os0thread.cc:287#2 0x00000000010d166d in buf_flush_wait_flushed (new_ol原创 2021-05-11 18:06:20 · 376 阅读 · 0 评论 -
fsync操作
/*update 需要刷磁盘的操作*/#0 os_file_fsync_posix (file=20) at /data/mysql-boost-5.7.32/mysql-5.7.32/storage/innobase/os/os0file.cc:3081#1 0x000000000198c562 in os_file_flush_func (file=20) at /data/mysql-boost-5.7.32/mysql-5.7.32/storage/innobase/os/os0file.c原创 2021-04-28 19:23:36 · 3754 阅读 · 2 评论 -
binlog 切换时,调用流程
/* 关闭文件前写入数据,写入binlog的数据*/(gdb) where#0 Rotate_log_event::write (this=0x7fff92fa7d50, file=0x2d114e8 <mysql_bin_log+840>) at /root/mysql-boost-5.7.32/mysql-5.7.32/sql/log_event.cc:6625#1 0x00000000017eb6ce in MYSQL_BIN_LOG::new_file_impl (this=0原创 2021-04-27 14:01:31 · 159 阅读 · 0 评论 -
ha_flush_logs 在server层调用流程
#0 log_write_up_to (lsn=13521449, flush_to_disk=true) at /root/mysql-boost-5.7.32/mysql-5.7.32/storage/innobase/log/log0log.cc:1227#1 0x00000000019701a0 in log_buffer_flush_to_disk (sync=true) at /root/mysql-boost-5.7.32/mysql-5.7.32/storage/innobase/lo原创 2021-04-27 11:26:36 · 142 阅读 · 0 评论 -
mysql5.7 事务提交innodb记录binlog的文件名及偏移
#0 trx_sys_update_mysql_binlog_offset (file_name=0x2d23222 <mysql_bin_log+130> "mysql-bin.000026", offset=226, field=15384, mtr=0x7fff92fa7a80) at storage/innobase/trx/trx0sys.cc:225#1 0x0000000001af4989 in trx_write_serialisation_history (trx=0x7原创 2021-03-19 16:30:48 · 245 阅读 · 1 评论 -
mysql5.7异常崩溃后binlog的恢复过程
/*异常恢复时对undo日志的修改*/#0 trx_write_serialisation_history (trx=0x7fffd78cf480, mtr=0x7fffffffc6c0) at storage/innobase/trx/trx0trx.cc:1583#1 0x0000000001af5bbb in trx_commit_low (trx=0x7fffd78cf480, mtr=0x7fffffffc6c0) at storage/innobase/trx/trx0trx.cc:21原创 2021-03-19 15:33:24 · 153 阅读 · 0 评论 -
mysql5.7 将undo log加入到history list上
/*================ UNDO LOG HISTORY LIST =============================*/ 318| 319| /********************************************************************//** 320| Adds the update undo log as the first log in the history list. Removes the 321| update un.原创 2021-03-19 15:18:52 · 161 阅读 · 0 评论 -
mysql5.7undo 日志purge 流程
/*purge 线程清理undo 日志*/#0 trx_purge_remove_log_hdr (rseg_hdr=0x7fffcf908026 "\377\377\377\376", log_hdr=0x7fffa5878199 "", mtr=0x7fff8a727700) at storage/innobase/trx/trx0purge.cc:423#1 0x0000000001acf89d in trx_purge_truncate_rseg_history (rseg=0x7b690原创 2021-03-19 14:55:01 · 363 阅读 · 0 评论 -
mysql update 写undo日志的 加锁
/* If object is temporary, disable REDO logging that is done to track1922| changes done to UNDO logs. This is feasible given that temporary tables1923| are not restored on restart. */1924| mtr_start(&mtr);1925+> di原创 2021-03-18 17:56:48 · 189 阅读 · 0 评论 -
mysql5.7 在写数据大于cache大小时处理流程
/*此函数确定当前的cache是否已经写了临时文件 如果已经写过临时文件了,在把cache中的数据全部写入磁盘,cache清空,等待下次读取时用*/7812| if (reinit_io_cache(cache, READ_CACHE, 0, 0, 0)) 7813| { 7814| DBUG_EXECUTE_IF("simulate_tmpdir_partition_full", 7815| { 7816|原创 2021-03-12 20:47:35 · 128 阅读 · 0 评论 -
mysql5.7insert 执行一条语句,在提交前各个阶段生成binlog的流程
#0 my_b_safe_write (info=0x7ff48400c020, Buffer=0x7fffec035e1f "\021RHK`\036@\001", Count=1) at mysys/mf_iocache.c:1447#1 0x00000000017a7765 in Log_event::wrapper_my_b_safe_write (this=0x7ff48400c3c0, file=0x7ff48400c020, buf=0x7fffec035e1f "\021RHK`\03原创 2021-03-12 20:03:41 · 234 阅读 · 0 评论 -
mysql5.7 在启动时创建pageCache write head 过程
#0 MYSQL_BIN_LOG::open (this=0x2d9af00 <mysql_bin_log>, log_file_key=2, log_name=0x2f172f0 "mysql-bin", new_name=0x0) at sql/binlog.cc:3809#1 0x0000000001809938 in MYSQL_BIN_LOG::open_binlog (this=0x2d9af00 <mysql_bin_log>, log_name=0x2f172f原创 2021-03-10 11:33:08 · 128 阅读 · 0 评论 -
mysql 新连接接入创建binlog缓存的过程
#0 init_io_cache (info=0x7fffec492650, file=-1, cachesize=32768, type=WRITE_CACHE, seek_offset=0, use_async_io=0 '\000', cache_myflags=20) at mysys/mf_iocache.c:299#1 0x0000000001883244 in open_cached_file (cache=0x7fffec492650, dir=0x2e49ba0 "/data/kin原创 2021-03-09 20:24:33 · 130 阅读 · 0 评论 -
mysql 一个事务中形成binlog大于当前线程缓存大小的执行流程
(gdb) where#0 _my_b_write (info=0x7ffe6c24d910, Buffer=0x7ffe6c0b1a00 "", Count=51358) at /root/mysql-5.7.27_edit_malloc_log/mysys/mf_iocache.c:1313#1 0x000000000188764c in my_b_safe_write (info=0x7ffe6c24d910, Buffer=0x7ffe6c0b1a00 "", Count=51358) at原创 2021-03-09 10:47:13 · 155 阅读 · 0 评论 -
mysql insert json 大数据写redo日志的流程
0 mlog_write_string (ptr=0x7fff8cedc02e "", str=0x7ffe781df860 "", len=16330, mtr=0x7fffec491790) at storage/innobase/mtr/mtr0log.cc:322#1 0x0000000001b66943 in btr_store_big_rec_extern_fields (pcur=0x7fffec491df0, upd=0x0, offsets=0x7fffec4924c0, big_r原创 2021-03-05 10:55:48 · 185 阅读 · 1 评论 -
mysql 写redo日志大字段的处理方式
#0 mtr_t::Command::prepare_write (this=0x7fffec491140) at storage/innobase/mtr/mtr0mtr.cc:825#1 0x00000000019b14e0 in mtr_t::Command::execute (this=0x7fffec491140) at storage/innobase/mtr/mtr0mtr.cc:958#2 0x00000000019b0016 in mtr_t::commit (this=0x7f原创 2021-03-04 21:01:35 · 278 阅读 · 1 评论 -
mysql启动时通过binlog index 文件查找最新的binlog文件
do 8459| { 8460| strmake(log_name, log_info.log_file_name, sizeof(log_name)-1); 8461+> } while (!(error= find_next_log(&log_info, true/*need_lock_index=true*/)));/*启动时*/#0 MYSQL_BIN_LOG::find_next_log (this=0x2d9af00 &...原创 2021-03-02 21:18:26 · 737 阅读 · 0 评论 -
mysql 写binlog 大字段流程
/*当写binlog大于8192既IO_CACHE 的大小时,不写IO_CACHE 直接写入文件pageCache 当IO_CACHE 剩余空间无法写入当前binlog时,则先把IO_CACHE 里的内容写入直接写入文件pageCache */#0 _my_b_write (info=0x2d9b248 <mysql_bin_log+840>, Buffer=0x7ffe801f7487 "p", Count=51372) at /mysys/mf_iocache.c:1311#1原创 2021-03-02 10:48:18 · 177 阅读 · 0 评论 -
mysql commit提交写binlog的流程
/*mysql commit提交写binlog的流程*/#0 inline_mysql_file_write (src_file=0x2249420 "/mysys/mf_iocache.c", src_line=1566, file=35, buffer=0xfbf4d60 "/\277<`!@\001", count=264, flags=52) at /include/mysql/psi/mysql_file.h:1138#1 0x0000000001887b95 in my_b_flu原创 2021-03-01 19:41:30 · 638 阅读 · 0 评论 -
mysql redo日志类型
文件 mtr0types.h/** @name Log item typesThe log items are declared 'byte' so that the compiler can warn if valand type parameters are switched in a call to mlog_write_ulint. NOTE!For 1 - 8 bytes, the flag value must give the length also! @{ */enum mlog_原创 2021-03-01 11:00:18 · 157 阅读 · 0 评论 -
mysql更新事务创建trx->id 的流程
#0 trx_sys_get_new_trx_id () at storage/innobase/include/trx0sys.ic:437#1 0x0000000001b183a7 in trx_start_low (trx=0x7fffed7ce170, read_write=true) at storage/innobase/trx/trx0trx.cc:1407#2 0x0000000001b1c1ca in trx_start_if_not_started_xa_low (trx=0x原创 2021-02-26 17:42:29 · 462 阅读 · 0 评论 -
mysql5.7 import 对记录的操作
/** Update the BLOB refrences and write UNDO log entries for1773| rows that can't be purged optimistically.1774| @param block block to update1775| @retval DB_SUCCESS or error code */1776| dberr_t1777| PageConverter::update_records(1778| buf_b原创 2021-02-26 15:03:50 · 107 阅读 · 0 评论 -
mysql5.7.27import 数据文件流程
/*遍历ibd文件的分支*/#0 FetchIndexRootPages::operator() (this=0x7fffec4d7020, offset=0, block=0x7ffe90987958) at storage/innobase/row/row0import.cc:697#1 0x0000000001c1e577 in fil_iterate (iter=..., block=0x7ffe90987958, callback=...) at storage/innobase/fil/原创 2021-02-26 11:51:40 · 152 阅读 · 0 评论 -
mysql5.7.27 binglog 写入流程及大字段写入流程
原创 2021-02-19 10:54:16 · 122 阅读 · 0 评论 -
mysql5.7 dml 语句记录binlog 与redo日志
//写redo日志,和 生成binlog的代码 int handler::ha_write_row(uchar *buf){ int error; Log_func *log_func= Write_rows_log_event::binlog_row_logging_function; DBUG_ASSERT(table_share->tmp_table != NO_TMP_TABLE || m_lock_type == F_WRLCK); DBUG原创 2021-02-19 10:34:01 · 171 阅读 · 0 评论 -
show global status 申请2M(根据tmp_table_size 参数设置有关)内存的过程
#0 my_malloc (key=297, size=2094080, flags=16) at mysys/my_malloc.c:57#1 0x00000000018e230d in hp_get_new_block (block=0x7ff4c40a7730, alloc_length=0x7fffec215c28) at storage/heap/hp_block.c:80#2 0x00000000018e19b2 in next_free_record_pos (info=0x7ff4原创 2021-01-26 15:25:03 · 79 阅读 · 0 评论 -
buffer_pool 初始化,malloc 内存,每个page 创建os_event_create ,申请内存的过程
buffer_pool 初始化,malloc 内存,每个page 创建os_event_create ,申请内存的过程#0 ut_allocator::allocate_trace (this=0x7fffec214338, size=144, file=0x2288888 “storage/innobase/os/os0event.cc”, pfx=0x7ff4c496b900) at storage/innobase/include/ut0new.h:728#1 0x00000000019112原创 2021-01-26 15:22:06 · 171 阅读 · 0 评论 -
mysql set global 环境变量设置
客户端执行 set global global_sleep_time=100;调用堆栈信息#0 set_tmp_open_sleep (self=0x2d8e5c0 <Sys_tmp_sleep_time>, thd=0x7ff4c4000b70, type=OPT_GLOBAL) at /root/mysql-5.7.27_edit_malloc_log/sql/sys_vars.cc:3916#1 0x00000000014a869f in sys_var::update (thi原创 2021-01-20 18:18:36 · 3747 阅读 · 0 评论 -
select与show malloc的区别
select与show 从内存分配的情况看,select仅查询需要的变量而show 需要把所有的变量都查询后,在根据条件做过滤select @@read_only;malloc 内存的情况my_malloc_58 thread= 7f78224c8700 malloc key= 152 size= 64 ptr= 7f77f400e230my_malloc_58 thread= 7f78224c8700 malloc key= 152 size= 64 ptr= 7f77f400e280show原创 2021-01-19 14:33:52 · 1059 阅读 · 0 评论 -
PSI_memory_key的定义
static PSI_memory_info all_server_memory[]={ { &key_memory_locked_table_list, "Locked_tables_list::m_locked_tables_root", 0}, { &key_memory_locked_thread_list, "display_table_locks", PSI_FLAG_THREAD}, { &key_memory_thd_transactions, "THD原创 2021-01-07 19:15:07 · 386 阅读 · 0 评论 -
mysql PSI_memory_key的初始化调用关系
(gdb) where#0 0x0000000001cfeabd in pfs_register_memory_v1 (category=0x1e1e3d2 "sql", info=0x2c6cac8 <all_server_memory+2280>, count=41) at /opt/mysql-5.7.27_debug/storage/perfschema/pfs.cc:6475#1 0x0000000000ea2b0c in inline_mysql_memory_registe原创 2021-01-07 15:55:21 · 267 阅读 · 0 评论 -
delete写redo日志调用关系
/*undo 的redo日志*/#0 log_reserve_and_write_fast (str=0x7ffe378b44d0, len=34, start_lsn=0x7ffe378b41d8) at /data/mysql-5.7.32/storage/innobase/include/log0log.ic:405#1 0x0000000001960ffd in mtr_t::Command::finish_write (this=0x7ffe378b41c0, len=34) at /da原创 2021-01-04 11:25:59 · 218 阅读 · 0 评论 -
update写redo日志调用关系
/*写undo的 redo调用关系*/#0 log_write_low (str=0x7ffe378b3e80 "\b", str_len=486) at /data/mysql-5.7.32/storage/innobase/log/log0log.cc:442#1 0x0000000001961df1 in mtr_write_log_t::operator() (this=0x7ffe378b3b07, block=0x7ffe378b3e70) at /data/mysql-5.7.32/s原创 2021-01-04 11:12:17 · 95 阅读 · 0 评论 -
insert写redo调用关系
/*insert 写redo之前*/#0 mtr_t::Command::prepare_write (this=0x7ffe378b3510) at /data/mysql-5.7.32/storage/innobase/mtr/mtr0mtr.cc:792#1 0x000000000196114e in mtr_t::Command::execute (this=0x7ffe378b3510) at /data/mysql-5.7.32/storage/innobase/mtr/mtr0mtr.原创 2021-01-04 10:55:46 · 194 阅读 · 0 评论 -
启动时gtid写redo日志堆栈信息
#0 mtr_t::Command::execute (this=0x7ffe380b7bb0) at /data/mysql-5.7.32/storage/innobase/mtr/mtr0mtr.cc:863#1 0x000000000195fd1e in mtr_t::commit (this=0x7ffe380b7fc0) at /data/mysql-5.7.32/storage/innobase/mtr/mtr0mtr.cc:496#2 0x0000000001a5e79b in ro原创 2021-01-04 10:22:35 · 90 阅读 · 0 评论