范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

新手如何调试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  database)        This will be revised with WL#2128 (SQL PATH)     */     Create_func *builder= find_native_function_builder(thd, ident);     if (builder)       *res= builder->create_func(thd, ident, opt_udf_expr_list); ......     return *res == NULL || (*res)->itemize(pc, res);   }
  find_native_function_builder  查找 hash 表,找到对应 version  函数注册的单例工厂函数static Native_func_registry func_array[] = {   { { C_STRING_WITH_LEN("ABS") }, BUILDER(Create_func_abs)},   { { C_STRING_WITH_LEN("ACOS") }, BUILDER(Create_func_acos)}, ......   { { C_STRING_WITH_LEN("VERSION") }, BUILDER(Create_func_version)}, ......   { {0, 0}, NULL} };
  mysql 启动时调用  item_create_init  将这些函数 builder 注册到 hash 表 native_functions_hash Create_func_version Create_func_version::s_singleton;  Item* Create_func_version::create(THD *thd) {   return new (thd->mem_root) Item_func_version(POS()); } class Item_func_version : public Item_static_string_func {   typedef Item_static_string_func super; public:   explicit Item_func_version(const POS &pos)     : Item_static_string_func(pos, NAME_STRING("version()"),                               server_version,                               strlen(server_version),                               system_charset_info,                               DERIVATION_SYSCONST)   {}    virtual bool itemize(Parse_context *pc, Item **res); };
  小结
  MySQL 代码太庞大,5.1 大约 100w 行,5.5 130w 行,5.7 以后 330w 行,只能挑重点读源码。最近很多群里的人在背八股,没必要,有那时间学着调试下源码,读读多好 总结了很多有关于java面试的资料,希望能够帮助正在学习java的小伙伴。由于资料过多不便发表文章,创作不易,望小伙伴们能够给我一些动力继续创建更好的java类学习资料文章,
  请多多支持和关注小作,别忘了点赞+评论+转发。右上角私信我回复【03】即可领取免费学习资料谢谢啦!
  原文出处:https://mp.weixin.qq.com/s/lJqb0kMtnAUmqUIWCShkIQ

荷兰到底有多开放?很多国家都严令禁止的事,在这里几乎都合法虽然时代在高速的发展,我国还是存在一些相对保守的思想,比如孩子们从小到大的教育,很少会涉及到性教育。(此处已添加小程序,请到今日头条客户端查看)因为在大部分家长心目中,孩子们是不可一家三口的元宵节晚餐,10个菜全是硬菜,有肉有素,看着诱人大家好,欢迎大家来到我的美食自媒体,我是美食领域创作者锦绣V山东专注美食,让生活更有味。今天为大家带来了几道家常美食的做法,这几道美食也是深受大家的喜欢,而且是很常见的几道美食。天宏量营养素和微量营养素日常食物食物是我们日常生活中的基本需求。因此,了解什么是营养素对于选择吃什么很重要,以便形成良好的饮食习惯并保持下去。首先需要对营养素进行分类可以根据身体需要摄入的量来对营养素进行春节大鱼大肉吃太多?营养科医生教你这么吃解腻春节期间大鱼大肉一顿接一顿吃得过于肥腻肠道要罢工怎么办?营养科医生为你推荐春节解腻食物快来看看吧!医生介绍,过年聚餐大多以鱼肉为主,在吃正餐前,餐前小吃可以选择以下两种1醋萝卜醋有发芽的食物到底能不能吃在这特殊时期,每家每户都会囤一些蔬菜,但一不留神就会长出嫩嫩的小芽,而这也引起一个令不少人困惑的问题,那就是发芽的食物到底能不能吃?我想大家都知道的就是土豆发芽不可以吃,但是,其它食物中的爱马仕,再贵也要买给孩子吃,开春个头猛长冬季是个自然界万物闭藏的季节,因此,冬季是进补的黄金季节。虽说冬季进补大有益处,并不是说冬季就要吃大量的补品,而是要通过日常食物进补营养。俗话说冬天不补钙,春天长不快。到了冬天,气春节胡吃海喝,节后饮食调整很重要,医生这样建议俗话说每逢佳节胖三斤。春节期间每一餐都大鱼大肉,极大地增加了胃肠道的负担,导致消化系统疾病悄无声息找上了门。不少人吐槽节后出现了腹胀反酸便秘腹泻等症状。那么,节后怎么吃健康?如何通经典球鞋NikeHyperdunk2008初代大灌篮,出道即巅峰作为全球体育龙头品牌,Nike从来都不会让篮球迷失望,一直引领着篮球鞋的发展,也一直站在体育与时尚的最前沿。从早期的AF系列,到后期的AJ系列,Nike的经典球鞋数不胜数。从篮球场黄黑皮肤如何驾驭粉色系服饰美学嗨,我是六小姐您身边的服饰生活美学顾问阳光许暖的日子,正是正月初八日我们大多数人与亲人挥手告别陆陆续续踏上去往他乡的奋斗之路同时又种下一颗充满期待与希望的种子一年年,一月月,一日日抗衰老护肤品国内品牌哪个好?郑明明红颜紧致套组如何不知不觉,新春小长假转眼就结束了。经过了假期的玩耍,聚会熬夜狂欢,辛辣油腻的食物,日晒风吹四处浪你的肌肤还好吗?如何补救节后疲劳危肌,让肌肤重返状态,焕然一新?一起来看看吧!抗衰老白开水素颜妆,到底在哪里下功夫了?有一种长相,就是要妆容越素越好看!刘亦菲在去有风的地方中的妆造,整体就是一个字淡。妆容中看不见明显的眼影和修容,很少会运用这些大面积的色块去破坏面部比例,最大程度地凸显了她的完美骨
场均26分6板6助攻有多难!本赛季仅4人做到,2个80后,2个90后对于一个球员来说!什么是全能,全能就是又能得分,又能抢板,又能助攻队友。是又当爹来又当妈!场均至少26分6板6助攻有多难!本赛季仅4人做到,2个80后,2个90后第一位勒布朗詹姆斯联想再作妖,被罚一亿后彻底垄断老百姓的救命药,资本真是好手段罚得太轻了,联想控股的先声药业想垄断百姓的救命药,被罚款1。007亿,但是最终还是成功收购托毕西药业,实质上是完成了对于救命药从上游到下游的全垄断了。这场豪赌真的是资本的胜利吗?北iPhone14基本确定,iPhone13系列也开始降价,这次别等新机了研发手机是需要时间的,现在登场的机型大概率三个月前就已经立项了,而且如果是高端旗舰,立项的时间还将更早,时间会超过半年,至于苹果公司这样每年举办发布会次数少,并且发布手机数量少的厂入选名人堂!45岁的吉诺比利再添荣誉,迎来生涯高光时刻终于入选名人堂了!曾效力马刺队16年之久的马努吉诺比利,迎来了一个好消息,那就是他将以第一轮胜票的身份,入选2022年的篮球名人堂。毫无疑问,这让今年45岁的吉诺比利再添一大荣誉,威姆斯是继姚明后,第二位季后赛百发百中的球员在刚刚结束的季后赛首轮比赛中,广东东莞大益以124101战胜天津先行者,拿下了第一个系列赛的首场比赛。这场比赛虽然是在下午开始,但是广东队一改之前慢热的习惯,防守端专注度极高,进攻如果蚊子被消灭光了会怎样?蚊子早在6500万年前就出现在地球上,比人类的起源还要早得多。直到现在的蚊子每年夏天都在欺负着地球人。且传播各种各样的疾病威胁人类。根据不完全统计,蚊子可以传播80多种疾病,比如流50的女人尽量不要扮嫩,看看这些端庄得体的穿搭,减龄又显气质对于那些年过半百的女性来说,很容易因为用力过猛而塑造出装嫩的造型。在这种成熟的阶段,女性更要追求有质感的着装,同时不能忽视舒适感的营造。下面这些造型很适合五十多岁的女性借鉴,看看这30多岁的女人,春天尽量少穿黑色!推荐蓝色穿搭简约减龄在温暖的春天,如果总是尝试黑色服装,会导致压抑的氛围太浓郁,显老的风险提升。不如看看下面这些高级的蓝色系穿搭,营造出充分的减龄效果,十分简约。蓝色系穿搭也就是指在造型中融入几款蓝色王思聪又爱又恨的女人,网红孙一宁富二代王思聪有着国民老公之称,他的风流韵事也是众所周知,不但常年游走于网红之间,而且还有着数不清的网红女友。那这天底下有王思聪追不到的女网红吗?答案是肯定的,还真有。她就是网红孙一情商低的女人,通常说话时,有这三个共同点与人交流最关键的就是情商,如果情商出现问题,就算是你非常有钱,也不会得到别人的看重,这就是为什么很多人明明有付出,却不能够得到别人的认可的原因。一个女人光长得漂亮没有用,在开始的时男人的黄金25年最该做这些事人生的黄金时期是什么时候?应该是20岁到45岁这二十五年。这个时候是人的精力最旺盛,生命力最蓬勃的时期,也是寻找人生方向奠定人生基础的关键时期。那么,作为男人,在这段黄金时期,到底