新手如何调试MySQL?看这一篇就够了
前几天看到姜老师的旧文 用 VSCode 编译和调试 MySQL,每个 DBA 都应 get 的小技能[1] , 文末留了一个思考题,如何修改源码,自定义版本,使得 select version() 输出自定义内容
调试过程参考 macOS VSCode 编译调试 MySQL 5.7[2]
内部 Item 对象参考从SQL语句到MySQL内部对象[3]
源码面前没有秘密,建义对 DB 感兴趣的尝试 debug 调试。本文环境为 mac + vscode + lldb 依赖及插件
vscode 插件: C/C++ C/C++ Clang Command Adapter CodeLLDB CMake Tools
mysql 源码: mysql-boost-5.7.35.tar.gz
补丁: MySQL <= 8.0.21 需要对 cmake/mysql_version.cmake 文件打补丁 (没有严格测试所有版本)tar -zxf mysql-boost-5.7.35.tar.gz cd mysql-5.7.35 mv VERSION MYSQL_VERSION sed -i "" "s|${CMAKE_SOURCE_DIR}/VERSION|${CMAKE_SOURCE_DIR}/MYSQL_VERSION|g" cmake/mysql_version.cmake
创建 cmake-build-debug 目录,后续 mysql 编译结果,以及启动后生成的文件都在这里mkdir -p cmake-build-debug/{data,etc} 配置 CMake 与编译
在 mysql 工程目录下面创建 .vscode/settings.json 文件{ "cmake.buildBeforeRun": true, "cmake.buildDirectory": "${workspaceFolder}/cmake-build-debug/build", "cmake.configureSettings": { "WITH_DEBUG": "1", "CMAKE_INSTALL_PREFIX": "${workspaceFolder}/cmake-build-debug", "MYSQL_DATADIR": "${workspaceFolder}/cmake-build-debug/data", "SYSCONFDIR": "${workspaceFolder}/cmake-build-debug/etc", "MYSQL_TCP_PORT": "3307", "MYSQL_UNIX_ADDR": "${workspaceFolder}/cmake-build-debug/data/mysql-debug.sock", "WITH_BOOST": "${workspaceFolder}/boost", "DOWNLOAD_BOOST": "0", "DOWNLOAD_BOOST_TIMEOUT": "600" } }
内容没啥好说的,都是指定目录及 boost 配置,其中 WITH_DEBUG 打开 debug 模式,会在 /tmp/debug.trace 生成 debug 信息
View -> Command Palette -> CMake: Configure 执行后生成 cmake 配置
View -> Command Palette -> CMake: Build 编译生成最终 mysql 相关命令
发现老版本编译很麻烦,各种报错,mysql 5.7 代码量远超过 5.5, 只能硬着头皮看 5.7 初始化数据库
首先初始化 my.cnf 配置,简单的就可以,共它均默认 cd cmake-build-debug cat > etc/my.cnf < select version();
执行上述 sql 自动跳转到断点处, Step Into , Step Over , Step Out 这些调试熟悉下即可
接下来分别调用主要函数: mysql_execute_command , execute_sqlcom_select , handle_query , select->join->exec() , Query_result_send::send_data , Item::send , Item_string:val_str , Protocol_text::store , net_send_ok 修改源码
启动 mysql 时 init_common_variables 会初始化一堆变量,其中会调用 set_server_version 生成版本信息,修改这个就可以static void set_server_version(void) { char *end= strxmov(server_version, MYSQL_SERVER_VERSION, MYSQL_SERVER_SUFFIX_STR, NullS); ...... #ifndef NDEBUG if (!strstr(MYSQL_SERVER_SUFFIX_STR, "-debug")) end= my_stpcpy(end, "-dongzerun"); #endif if (opt_general_log || opt_slow_log || opt_bin_log) end= my_stpcpy(end, "-log"); // This may slow down system ...... }
看好条件编译的是哪块,修改即可, 重新 CMake: Build 编译再运行mysql> select version(); +----------------------+ | version() | +----------------------+ | 5.7.35-dongzerun-log | +----------------------+ 1 row in set (0.00 sec) Item Class
这里不做过深分析,简单讲 select version() , select now() 这些简单 sql 在 server 层就能得到结果,无需进入引擎层version() , now() 这些函数在 yacc&lex 词法解析时就会解析成对应的 Item 类最后 mysql 渲染结果时,就是由 Item::itemize 写到 result 中function_call_generic: IDENT_sys "(" opt_udf_expr_list ")" { $= NEW_PTN PTI_function_call_generic_ident_sys(@1, $1, $3); } | ident "." ident "(" opt_expr_list ")" { $= NEW_PTN PTI_function_call_generic_2d(@$, $1, $3, $5); } ;
sql_yacc.cc 函数 PTI_function_call_generic_ident_sys 解析 sql, 识别出 version() 是一个函数调用 virtual bool itemize(Parse_context *pc, Item **res) { if (super::itemize(pc, res)) return true; ...... /* Implementation note: names are resolved with the following order: - MySQL native functions, - User Defined Functions, - Stored Functions (assuming the current
荷兰到底有多开放?很多国家都严令禁止的事,在这里几乎都合法虽然时代在高速的发展,我国还是存在一些相对保守的思想,比如孩子们从小到大的教育,很少会涉及到性教育。(此处已添加小程序,请到今日头条客户端查看)因为在大部分家长心目中,孩子们是不可
一家三口的元宵节晚餐,10个菜全是硬菜,有肉有素,看着诱人大家好,欢迎大家来到我的美食自媒体,我是美食领域创作者锦绣V山东专注美食,让生活更有味。今天为大家带来了几道家常美食的做法,这几道美食也是深受大家的喜欢,而且是很常见的几道美食。天
宏量营养素和微量营养素日常食物食物是我们日常生活中的基本需求。因此,了解什么是营养素对于选择吃什么很重要,以便形成良好的饮食习惯并保持下去。首先需要对营养素进行分类可以根据身体需要摄入的量来对营养素进行
春节大鱼大肉吃太多?营养科医生教你这么吃解腻春节期间大鱼大肉一顿接一顿吃得过于肥腻肠道要罢工怎么办?营养科医生为你推荐春节解腻食物快来看看吧!医生介绍,过年聚餐大多以鱼肉为主,在吃正餐前,餐前小吃可以选择以下两种1醋萝卜醋有
发芽的食物到底能不能吃在这特殊时期,每家每户都会囤一些蔬菜,但一不留神就会长出嫩嫩的小芽,而这也引起一个令不少人困惑的问题,那就是发芽的食物到底能不能吃?我想大家都知道的就是土豆发芽不可以吃,但是,其它
食物中的爱马仕,再贵也要买给孩子吃,开春个头猛长冬季是个自然界万物闭藏的季节,因此,冬季是进补的黄金季节。虽说冬季进补大有益处,并不是说冬季就要吃大量的补品,而是要通过日常食物进补营养。俗话说冬天不补钙,春天长不快。到了冬天,气
春节胡吃海喝,节后饮食调整很重要,医生这样建议俗话说每逢佳节胖三斤。春节期间每一餐都大鱼大肉,极大地增加了胃肠道的负担,导致消化系统疾病悄无声息找上了门。不少人吐槽节后出现了腹胀反酸便秘腹泻等症状。那么,节后怎么吃健康?如何通
经典球鞋NikeHyperdunk2008初代大灌篮,出道即巅峰作为全球体育龙头品牌,Nike从来都不会让篮球迷失望,一直引领着篮球鞋的发展,也一直站在体育与时尚的最前沿。从早期的AF系列,到后期的AJ系列,Nike的经典球鞋数不胜数。从篮球场
黄黑皮肤如何驾驭粉色系服饰美学嗨,我是六小姐您身边的服饰生活美学顾问阳光许暖的日子,正是正月初八日我们大多数人与亲人挥手告别陆陆续续踏上去往他乡的奋斗之路同时又种下一颗充满期待与希望的种子一年年,一月月,一日日
抗衰老护肤品国内品牌哪个好?郑明明红颜紧致套组如何不知不觉,新春小长假转眼就结束了。经过了假期的玩耍,聚会熬夜狂欢,辛辣油腻的食物,日晒风吹四处浪你的肌肤还好吗?如何补救节后疲劳危肌,让肌肤重返状态,焕然一新?一起来看看吧!抗衰老
白开水素颜妆,到底在哪里下功夫了?有一种长相,就是要妆容越素越好看!刘亦菲在去有风的地方中的妆造,整体就是一个字淡。妆容中看不见明显的眼影和修容,很少会运用这些大面积的色块去破坏面部比例,最大程度地凸显了她的完美骨