MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。(本段话摘抄自百科)
作为一个开源的系统,源码当然是最权威的资料。本文详细的描述如何在wndows平台下使用visual studio对MySQL进行编译调试。网上关于这类的文章比较少,而且基本都是调试的MySQL5的文章。我从决定调试MySQL8开始,断断续续用了两周的时间,一度想放弃。好在最终阴差阳错的给弄出来了,本文详细的介绍了在调试MySQL8的过程中遇到的坑。话不多说,正文开始:
环境准备
1、windows10 x64 操作系统
2、Microsoft Visual Studio 2019
3、cmake
4、bison-2.4.1-setup.exe
5、boost_1_72_0
6、mysql-8.0.21.zip
简单介绍一下上述的几个软件。windows10建议用配置好一点的电脑,否则编译会很慢。Microsoft Visual Studio 2019从微软官网下载安装即可,cmake可以是免安装版的或者安装版的,请注意需要配置环境变量。bison是一个解析生成器,许多文档都说需要安装bison。但是好像不装也没问题,反正我已经装了,就暂且把它写进去吧,bison安装完也是需要配置环境变量的。MySQL参考手册上说的很明白,用Standard Source Distribution来build工程不需要Bison,而用Development Source Tree才需要Bsion,从官网上直接下载的标准版的源码ZIP包就是Standard Source Distribution,而在GitHub下载的最新的开发源码就是Development Source Tree。不装bison能不能成功我也懒得去测试了,毕竟编译一次也是要很久的。boost是必须要有的,不同版本的MySQL对应不同版本的boots库。如果不知道用哪个版本,可以先执行cmake,cmake会提示下载相应版本的boost。MySQL源码建议从官网下载。
cmake编译
上述的软件都准备好了,就可以开始用cmake编译MySQL了。
解压mysql-8.0.21.zip。我解压的路径为 F:\IDE\vs2019\MySQLSC。 在源码的解压路径下创建两个文件夹, boost 和 bld。
将boost_1_72_0.tar.gz拷贝到boost文件夹一份,就可以开始编译了。在命令提示符(或powershell)执行如下命令:
cmake .. -DDOWNLOAD_BOOST=1 -DWITH_BOOST="F:\IDE\vs2019\MySQLSC\boost\boost_1_72_0.tar.gz" -DWITH_DEBUG=1
-- Building for: Visual Studio 16 2019
如果boost库有问题或者版本不对。cmake会自动下载正确的版本,可能因为网络问题下载失败(cmake的服务器在国外),此处会报错,并提示正确版本boost库的下载地址。手动下载boost库后,换进去重新cmake编译即可。
当看到 Bulid files have been written to ... 这句话时,说明已经编译完成了。进入到 F:/IDE/vs2019/MySQLSC/bld文件夹,你会看到熟悉的 MySQL.sln。就可以用vs2019来构建MySQL服务了。
构建前准备
vs工程都已经生成了,还需要准备什么?当然是我踩过的坑了,能避免的肯定要提前避免了。要不编译了那么久,一大堆报错还要重新编译。
1、打开调试模式,F:\IDE\vs2019\MySQLSC\sql\mysqld.cc中的 test_lc_time_sz方法中的 DBUG_ASSERT(0); 改成 DBUG_ASSERT(1);
2、F:\IDE\vs2019\MySQLSC\sql\sql_locale.cc 用 [utf-8 + BOM] 格式保存一下,可以使用notepad++打开修改编码。
3、F:\IDE\vs2019\MySQLSC\plugin\x\src\mysql_function_names.cc 头文件添加 #include <iterator>
4、F:\IDE\vs2019\MySQLSC\components\example\test_string_service_charset.cc 编码修改为[utf-8 + BOM] 存在中文
用VS构建MySQL服务
打开vistul studio 2019。打开MySQL.sln。选择ALL_BULID项目,右键 生成 开始编译。
查看失败的项,然后按个处理一下:
其中常量中有换行符,打开该文件。高级保存选项,保存为UNICODE (UTF-8 带签名)。其他无法打开输入文件的报错,不用理会,在调试的时候会自动生成这些库文件。
启动MySQL服务
到现在编译已经完成了,可以启动MySQL服务了。第一次启动MySQL需要初始化,在启动增加启动参数 --console --initialize 。mysqld项目是MySQL的启动项目,在解决方案资源管理器中找到mysqld项目,设置为启动项目。点击属性,增加启动参数。
然后就可以开始调试了,按 F5 或者右键 mysqld 调试 启动新实例。
如图所示,数据库初始化完成了。并生成了一个随机密码,该密码作为初次登录MySQL服务器的密码。初始化完成之后报错,数据库停止了。原因目前还不知道,但是不影响数据库的最终运行,暂且就不管它了。
把启动参数中把 --initialize 删掉,重新启动MySQL服务。
可以看到,3306端口已经开启了,处于等待连接状态。编译的客户端工具都位于 F:\IDE\vs2019\MySQLSC\bld\runtime_output_directory\Debug\路径下。
登录并访问数据库
cmd进入到 F:\IDE\vs2019\MySQLSC\bld\runtime_output_directory\Debug\ 路径。执行mysql -u root -p , 密码用上文中随机生成的密码:
初次登录之后,执行一条语句,提示必须修改密码。我们通过以下命令来修改root用户的密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '111111';
flush privileges;
修改完密码之后再次登录数据库,执行 show databases;语句。再次报错:
ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist
据查资料说是,低版本升级会报这个错误。我们好像没有升级诶,不管原因了,先把错误处理了再说。停掉数据库。再次修改启动参数,添加 --upgrade=FORCE。重新启动。
再次报错,升级失败。但是虽然失败了,上一个问题已经解决了,原因再次不明。依然先不管它,数据库跑起来再说。删掉启动参数 --upgrade,再次启动数据库。
可算是成功了,现在可以去打断点,调试MySQL了哦!!!。
最后:
本文中遇到的一些坑,虽然解决了,但是原因还没弄明白。有了解的大神可以一起探讨一下。
本文参考文章https://www.cdsy.xyz/computer/programme/software/240906/cd63240.html 按照该文章编译MySQL5.7可以成功。没有MySQL8那么多的坑,可参考。