1.MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试
2.MySQL全文索引源码剖析之Insert语句执行过程
3.ubuntu上源码编译安装mysql5.7.27
4.Ubuntu源码安装MySQL官方标准步骤
5.MySQL 优化器源码入门-内核实现 FULL JOIN 功能
6.MySQL · 源码分析 · Subquery代码分析
MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试
在探索MySQL世界的现源过程中,有些同学希望更深入地了解如何在Visual Studio中进行源码级调试。现源不用担心,现源让我们一步步来。现源必备工具
MySQL是现源用C++编写的,要在Windows上编译,现源哪有卖燕窝饮品溯源码需要几个关键工具:CMake用于生成可打开的现源解决方案,如MySQL.sln;Boost是现源强大的C++库,Bison是现源用于解析MySQL语法规则的工具;当然,选择适合自己版本的现源MySQL源码(如5.7.)也是必不可少的。详细安装步骤
安装过程需要细心,现源特别是现源Bison,务必避免默认路径中的现源空格问题,以免后续VS编译受阻。现源安装CMake和Bison时选择自定义路径,现源例如C:\2\GnuWin,确保它们的bin文件路径被添加到环境变量中。接下来解压mysql-5.7..zip,构建项目。编译与调试
使用CMake编译MySQL源码,当看到Build files written to: C:/2/mysql-5.7./brelease,说明成功生成.sln文件。用Visual Studio 打开MySql.Sln,耐心等待十几分钟,编译成功后即可进行下一步。启动MySQL并调试
首先,开启MySQL的调试模式,修改mysqld.cc中的test_lc_time_sz方法。然后,在Visual Studio的命令行参数中加入--console --initialize,开始调试。可能会遇到编码问题,解决后,输入默认密码zJDE>IC5o+ya,阿里28源码连接到MySQL并修改密码。追踪write_row
在上一篇中提到的write_row是一个虚方法,通过实际调试,我们可以看到它在ha_innodb.cc的实现。设置断点,执行insert操作,可以看到代码进入ha_innodb::write_row方法,深入查看局部变量和调用堆栈,验证之前的理论。总结
通过一整天的努力,我们掌握了在Visual Studio中对MySQL源码进行调试的技巧。记住,每一步都可能是个挑战,但只有亲自动手,才能真正理解MySQL的运作机制。希望这些经验能帮助你避免一些常见的坑,祝你在源码的世界里探索得更深入!MySQL全文索引源码剖析之Insert语句执行过程
本文来源于华为云社区,作者为GaussDB数据库,探讨了MySQL全文索引源码中Insert语句的执行过程。
全文索引是一种常用于信息检索的技术,它通过倒排索引实现,即单词和文档的映射关系,如(单词,(文档,偏移))。以创建一个表并在opening_line列上建立全文索引为例,插入'Call me Ishmael.'时,文档会被分为'call', 'me', 'ishmael'等单词,并记录在全文索引中。
全文索引Cache的作用类似于Change Buffer,用于缓存分词结果,避免频繁刷盘。检测源码安全Innodb使用fts_cache_t结构来管理cache,每个全文索引的表都会在内存中创建一个fts_cache_t对象。
Insert语句的执行分为三个阶段:写入行记录阶段、事务提交阶段和刷脏阶段。写入行记录阶段生成doc_id并写入Innodb的行记录,并将doc_id缓存。事务提交阶段对文档进行分词,获取{ 单词,(文档,偏移)}关联对,并插入到cache。刷脏阶段后台线程将cache刷新到磁盘。
全文索引的并发插入可能导致OOM问题,可通过修复patch #解决。当MySQL进程崩溃时,fts_init_index函数会恢复crash前的cache数据。
ubuntu上源码编译安装mysql5.7.
在Ubuntu系统上源码编译安装MySQL5.7.涉及到多个步骤,旨在实现自定义配置与优化。首先,通过查看发行版本信息和内核版本来了解当前系统的状态。命令如下:
#cat /etc/issue
#cat /proc/version
#uname -a
接着,创建必要的组和用户以确保MySQL服务的权限正确。具体操作包括:
#sudo groupadd mysql
#sudo useradd -r -g mysql mysql
随后,创建MySQL的安装目录与相关目录以存放数据、日志和源码。
#mkdir -p /usr/local/mysql/installdir
#mkdir -p /usr/local/mysql/datadir//data
#mkdir -p /usr/local/mysql/logdir/
#mkdir -p /usr/local/mysql/src
安装构建工具,包括cmake、bison、gcc和ncurses,确保编译环境的完整性。
#sudo apt-get install cmake
#sudo apt-get install bison
#sudo apt-get install gcc
#sudo apt-get install libncurses5-dev
下载并解压MySQL与MySQL-Boost,注意不要将两者解压至同一目录以避免文件覆盖。确保下载链接的php代码源码准确性。
下载:f设置文件至 /etc/目录,以实现系统统一配置。接着,创建执行程序软链接,方便访问相关命令。
五、创建MySQL用户组与用户
使用sudo groupadd mysql命令创建用户组mysql,然后在该组下使用sudo useradd -g mysql mysql命令创建用户mysql。
六、初始化MySQL数据库
进入安装目录/usr/local/mysql后,使用sudo bin/mysql_install_db --user=mysql命令创建MySQL数据库的授权表。完成后,手动重启服务器。
七、调整文件权限
使用sudo chown -R root .命令将/usr/local/mysql/目录下的所有文件更改为根用户root所有。接着,使用sudo chown -R mysql var命令将/usr/local/mysql/var/目录下的所有文件更改为用户mysql所有。最后,使用sudo chgrp -R mysql .命令将/usr/local/mysql/目录下的所有文件更改为用户组mysql所有。
八、启动MySQL服务
在终端执行sudo bin/mysql_safe --use=mysql &命令,以后台方式初始化并测试MySQL服务。
MySQL 优化器源码入门-内核实现 FULL JOIN 功能
本文以实现MySQL内核的FULL JOIN功能为目标,深入解析了MySQL源码的优化器工作流程。首先,作者通过环境和知识准备,明确将重点放在Server执行流程的探索上,从语法规则的修改开始,如在`sql_yacc.yy`中添加新支持,以及在`parse_tree_nodes.cc`中处理FULL JOIN的语法树解析和打印。接着,作者逐步解析了词法、语法分析后的tiktok协议源码Query_expression、Query_block和Query_term结构,并在关键函数中设置了断点以跟踪执行流程。
在探索了JOIN的优化工作流程后,作者选择在hypergraph_optimizer中实现FULL JOIN,该部分涉及RelationalExpression、JoinHypergraph的构建和AccessPath的生成。尽管过程复杂,但作者通过逐步调试和修改,成功在HashJoinIterator中添加了对FULL JOIN的支持,包括添加新数据成员和状态标记,以及在LEFT JOIN后执行ANTI JOIN流程。
在测试阶段,作者确认了FULL JOIN功能的正确性,通过在代码关键位置的断点观察,确认了FULL OUTER_JOIN的出现,并展示了改造后的迭代器结构。整个过程中,作者强调了在实现过程中面临的挑战和对MySQL历史的参考,最终决定以最少改动的方式完成任务,以保持代码的简洁和性能。
通过这个项目,作者不仅深入理解了MySQL源码,还实现了FULL JOIN功能,为读者提供了一个从零开始实现新功能的实例。
MySQL · 源码分析 · Subquery代码分析
子查询在MySQL中的处理方式,主要涉及到其在条件/投影中的应用。它们以Item_subselect这个表达式类的子类形式存在,描述结构丰富多样。所有子查询在MySQL中以Item_subselect为基类,包含相关或非相关的类型,且具有特定的标记来描述其性质。子查询的执行方式在Subquery_strategy枚举中被明确,共有五种最终执行方式。处理流程分为prepare、optimize和execute三个阶段。在prepare阶段,子查询通过抽象语法树进行初步构建,主要完成将子查询转换为衍生表或选择性执行的逻辑。optimize阶段根据代价估算决定子查询的执行策略,包括物化执行或EXISTS方式。execute阶段,依据优化阶段确定的策略执行子查询。总结而言,子查询的处理流程在MySQL中较为复杂,特别是在prepare阶段的转换逻辑,但整体处理思路清晰。通过这种方式,MySQL能够高效地处理子查询,实现数据查询和分析的复杂需求。
MySQL源码加载配置
MySQL源码加载配置主要涉及在启动过程中完成初始化系统变量和装载插件操作。MySQL通过加载配置文件或命令行参数完成这一过程,代码主要体现在mysql.cc中。
启动流程中,mysql调用load_defaults函数完成配置文件和命令行参数的装载。该函数根据argc和argv参数,即命令行参数数量和参数数组,来初始化默认系统变量。其中,MYSQL_CONFIG_NAME宏值默认为"my"。
load_defaults函数初始化默认搜索配置文件的路径,并依次将目录加入数组。在Linux下,路径包括'/etc'、'/etc/mysql'、'MySQL安装目录/etc'、'$MYSQL_HOME'、'~/'等。在Windows下,路径则包括C:\Windows\System、C:\Windows、mysqld所在目录以及MySQL安装目录。
my_load_defaults函数具体实现这一过程,初始化默认配置文件目录,构造默认的配置文件路径。函数中,DEFAULT_SYSCONFDIR宏值为mysql安装目录下的etc目录。如果环境变量MYSQL_HOME被设置,则该目录也被加入默认目录列表中。
my_search_option_files函数进一步实现加载配置文件。该函数根据启动时设置的参数--defaults-file、--no-defaults等,或者在指定位置读取配置文件,或者在默认目录中依次读取配置文件。最终读取到的结果被缓存下来。
解析mysqld执行命令,通常会在命令后设置--defaults-file参数。如果没有这个参数,系统将从默认目录中查找my.cnf或my.ini文件。如果这些文件都无法找到,系统会退出。
确定配置文件后,系统通过search_default_file_with_ext函数打开并解析配置文件中的每一行内容。文件支持分组,因此在解析时会确定参数所属的组,组名包括mysqld、server、mysql5.7等。所有有效参数设置都会被标准化并缓存,标准化操作会在命令设置时进行。
每个参数都会被缓存到内存中,这一操作由handle_default_option函数完成。函数会处理当前handle_option_ctx->group中含有的组名,即服务器组,其他组的参数被暂时忽略。这一步操作将组的参数缓存并传到上层栈桢,以便后续处理。
load_defaults执行完成后,配置文件中的参数和命令行参数全部存放在remaining_argc和remaining_argv中。这两个全局变量用于后续初始化变量。
在初始化过程中,handle_early_options函数用于初始化部分需要在mysqld --initialize时使用的系统变量。handle_options函数则根据remaining_argc和remaining_argv更新系统变量值。get_options函数将属性为NORMAL的系统变量和静态系统变量装载到全局变量all_options中。
MySQL · 源码分析 · change master
分析MySQL源码中change master功能,需要理解其执行流程及权限要求。以mysql_execute_command()作为入口点,可以观察到change_master操作需要具备SUPER权限,确保安全执行。
change master的核心作用在于调整SQL和IO线程的配置参数,执行此操作时,系统可能会清除relay log。因此,在实际使用中,建议默认选择auto_position=1,以自动定位复制位置,避免手动指定可能导致的数据丢失风险。
在需要对change master进行调整时,务必在锁保护下进行变量修改,同时注意调整锁的顺序,以防止出现死锁情况。确保操作的稳定性和数据的一致性。
通过上述分析,我们可以明确change master的功能、执行过程中的关键点及最佳实践,从而在使用中更加高效、安全地进行数据库复制与配置调整。
MySQL源码阅读4-do_command函数/功能类命令
do_command函数在MySQL的线程循环中执行,分为读取命令和分发执行命令两个主要步骤。
在读取命令阶段,首先设置读取超时(my_net_set_read_timeout),通过vio(Virtual I/O)接口从连接中读取数据。读取时,先解析包头,然后根据包头大小读取数据,同时检查是否超过最大包限制。若数据被压缩,使用zstd_uncompress或zlib_uncompress解压。解析数据并校验,将结果存储到thd对象中。
执行命令阶段,依据获取到的命令执行逻辑,分配内存给String对象。通过dispatch_command函数,进入switch...case...结构,执行不同命令的特定逻辑。功能类命令包括初始化数据库(COM_INIT_DB)、注册从节点(COM_REGISTER_SLAVE)、重置连接(COM_RESET_CONNECTION)、克隆插件(COM_CLONE)、修改用户(COM_CHANGE_USER)等。其他类如数据操作、未实现命令则在后续阅读。
以功能类命令为例,COM_INIT_DB用于改变当前连接的默认数据库。COM_REGISTER_SLAVE则在master节点上注册从节点,启动从节点与master节点的同步。COM_RESET_CONNECTION重置连接,但不创建新连接或更新授权。COM_CLONE命令用于克隆远程插件到本地,并确保一致性。COM_CHANGE_USER允许修改当前连接的用户,并重置连接。
具体操作包括解析请求包、验证、更新thd信息、保存用户连接信息、证书验证、检查密码有效期、限制最大连接数、更新schema属性等。COM_QUIT命令用于清除数据并退出循环。COM_BINLOG_DUMP_GTID和COM_BINLOG_DUMP用于请求发送binlog数据流,而COM_REFRESH命令用于刷新缓存、权限、日志、表、连接主机信息等数据。
在COM_PROCESS_INFO命令中获取进程处理信息,COM_SET_OPTION设置连接属性,COM_DEBUG触发打印调试信息,而COM_PROCESS_KILL用于终止连接。最后,检查是否具有RELOAD_ACL权限并加载数据。
本文总结了do_command函数的命令读取和执行流程,详细介绍了功能类命令的执行情况,为理解MySQL核心工作原理提供了深入洞察。