MySQL 调试

一个线上死锁问题分析

死锁日志如下: TRANSACTION 48AA4BB9, ACTIVE 0 sec inserting mysql tables in use 1, locked 1 LOCK WAIT 6 lock struct(s), heap size 1248, 4 row lock(s), undo log entries 2 MySQL thread id 1409173, OS thread handle 0x5659f940, query id 1084083936 10.246.138.197 bop_libra update insert into deadlock_test (deadlock_config_id, block_id, type, gmt_create, gmt_modified) values (31643, 92354, 1, […]


[MySQL 调试] 编译mysqld缺少gb2312的问题

最近在安装Percona5.5.18版本MySQL时,发现字符集不全,编译参数如下 CFLAGS=”-O3 -g -fno-exceptions -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing” CXX=gcc CXXFLAGS=”-O3 -g -fno-exceptions -fno-rtti -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing” export CFLAGS CXX CXXFLAGS cmake . \ -DCMAKE_BUILD_TYPE:STRING=Release             \ -DSYSCONFDIR:PATH=%{_prefix}            \ -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix}  \ -DENABLED_PROFILING:BOOL=ON                   \ -DENABLE_DEBUG_SYNC:BOOL=OFF                  \ -DMYSQL_DATADIR:PATH=%{_prefix}/data    \ -DMYSQL_MAINTAINER_MODE:BOOL=OFF              \ -DWITH_EXTRA_CHARSETS:STRING=all  \ -DWITH_BIG_TABLES:BOOL=ON \ -DWITH_FAST_MUTEXES:BOOL=ON \ -DENABLE-PROFILING:BOOL=ON \ -DWITH_SSL:STRING=bundled                     \ -DWITH_UNIT_TESTS:BOOL=OFF                    \ -DWITH_ZLIB:STRING=bundled                    \ -DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON       \ -DWITH_PLUGINS=heap,csv,partition,innodb_plugin,myisam \ -DDEFAULT_CHARSET=gbk […]


[MySQL 优化] 移除多余的checksum

1.bug#64170 根据bug#64170的描述,一个page在读入内存时就已经计算了一次checksum: buf_page_get_gen        |–>buf_read_page   (buf0buf.c:2543)               ->buf_read_page_low                   ->buf_page_io_complete                        ->buf_page_is_corrupted                              ->page_zip_calc_checksum 2612 […]


[MySQL调试] 集成breakpad到MySQL内核

基本参考twitter的实现,代码很简单,直接调用的breakpad的接口,关键是修改cmake文件比较蛋疼。 twitter的实现:https://github.com/twitter/mysql/commit/f95c5a49b4703779d05c200a9b282284248b7cb9 需要作部分修改,这里记录下我的操作步骤 1.下载google-breakpad,如果是在r1001之前的版本直接编译安装即可(未尝试),如果是checkout的最新版本,需要把源代码内的my_strchr全部替换掉,俺直接替换成bp_my_strchr,这个会和mysql的定义冲突。 2.配置环境变量BREAKPAD_ROOT,不然breakpad是不会编译到MySQL中的: $echo $BREAKPAD_ROOT /u01/project/breakpad 3.configure && make && make install 4. backport twitter的patch 有点小不一样,在MySQL5.5.20之前的版本,调用函数my_write_minidump是在mysqld.cc的handle_segfault中,而在之后的版本中,为了解决bug#54082,这部分代码独立在单独文件sql/signal_handler.cc文件中,因此需要在函数handle_fatal_signal中调用my_write_minidump cmake加上 -DENABLED_EMBEDDED_SERVER:BOOL=ON 5.用前几天report的一个bug尝试了一把,可以看到所有线程的堆栈/寄存器信息都被保存了下来,文件大小才629k。 通过minidump_stackwalk解析出来的部分内容如下: Thread 34 (crashed) 0 mysqld!google_breakpad::ExceptionHandler::WriteMinidump [exception_handler.cc : 534 + 0xd] rbx = 0x0000000000000000 r12 = 0x0000000000000000 r13 = 0x0000000000000000 r14 = 0x0000000000000080 r15 = 0x00007f0834008f10 rip = 0x0000000000991d3c rsp = 0x00007f0891da4240 rbp = […]


[MySQL 调试]DBUG_EXECUTE_IF简介

转载请署名:印风 ———————————————– DEBUG_EXECUTE_IF主要用于当设置了某个关键字key时,执行后面的代码, 可以简单的表示为: DEBUG_EXECUTE_IF(key,  code) 例如在open_and_lock_tables函数中. 5527 if (open_tables(thd, &tables, &counter, flags, prelocking_strategy)) 5528 goto err; 5529 5530 DBUG_EXECUTE_IF(“sleep_open_and_lock_after_open”, { 5531 const char *old_proc_info= thd->proc_info; 5532 thd->proc_info= “DBUG sleep”; 5533 my_sleep(6000000); 5534 thd->proc_info= old_proc_info;}); 5535 5536 if (lock_tables(thd, tables, counter, flags)) 5537 goto err;   那么如何让其生效呢,执行如下语句即可: set session debug=”+d, sleep_open_and_lock_after_open”   这时候当进入这个函数时,在执行完open_tables语句后,就会设置thd的状态为DBUG sleep,再sleep 6秒钟,然后再调用lock_tables函数   […]