最近由于项目的关系,需要使用到Mysql数据库,而我的工作任务与数据库有很大的关系,所以,决定好好学学Mysql,同时,也把Mysql的源码下载了,希望能有利于对它的学习。这里记录一下windows平台下编译Mysql的过程,与大家分享一下我的经验。
平台环境:
操作系统:windows 2003 sp2
编译环境:VS2010
辅助工具:CMake【windows版本】
编译过程:
1.首先下载Mysql源码,版本community server 5.5.17,地址http://dev.mysql.com/downloads/mysql/,下载 Windows
(x86, 32-bit), ZIP Archive(27.5M)这个;
2.解压Mysq文件,如(D:\mysql-5.5.17),然后使用CMake生成sln解决方案;
配置的时候,选择合适的编译器,我本地有VS2010,故使用VS2010 的 cl 编译。
3.编译之前,先定位到"sql/sql_locale.cc",把该文件另存为utf-8的格式,不然编译时会因为字符问题而出现大量错误。编译的时候遇到一个错误,说的是"Mysqld项目中预链接事件错误"。于是,定位到mysqld项目-->属性-->生成事件-->预链接事件。在右边的命令行选项中,看到有如下文字:
setlocal
cd D:\mysql-5.5.17\sql
if %errorlevel% neq 0 goto :cmEnd
D:
if %errorlevel% neq 0 goto :cmEnd
D:\mysql-5.5.17\client\Debug\echo.exe x86 && cscript //nologo D:\mysql-5.5.17\win\create_def_file.js x86 D:\mysql-5.5.17\sql\$(Configuration)\sql.lib D:\mysql-5.5.17\mysys\$(Configuration)\mysys.lib D:\mysql-5.5.17\dbug\$(Configuration)\dbug.lib
D:\mysql-5.5.17\strings\$(Configuration)\strings.lib > mysqld.def
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
应该是执行这里的命令时出现了错误,最终查出是红色区域命令的错误,于是在命令行中执行这段命令,并打开"mysqld.def"文件,发现了错误的内容"没有文件扩展".js"的脚本引擎"。这应该是我以前修改了js脚本关联文件导致WSH不能找到js脚本引擎的缘故。解决方法是打开注册表(运行命令中输入regedit),定位到"HKEY_CLASSES_ROOT / .js",把右边的"默认"字符串值设为"JSFile"。
接着编译,编译过程中报"Mysqld.exe 异常",于是在命令行中定位到"D:\mysql-5.5.17\sql\Debug",执行命令:"mysqld -debug",结果如下:
通过定位错误信息中对应的文件,发现原来在"mysqld.cc"文件中有一句"DBUG_ASSERT(0)",如下图,这句代码加入了一个断言,该断言始终为False,抛出了异常,从而导致了编译时候出错。将其去掉,或者修改为"DBUG_ASSERT(1)",再次编译,成功。
4.既然编译已经成功,那么我们就来调试一下代码。首先打开mysql服务,进入命令行,定位到"D:\mysql-5.5.17\sql\Debug",输入命令"mysqld --debug --standalone"。这个时候,mysqld.exe就已经启动了;接着,在VS中附加进程调试中选择"mysqld.exe";然后打开mysql客户端,另外打开一个命令行,定位到"D:\mysql-5.5.17\client\Debug",执行命令"mysql -u
root -p",进入mysql客户端,执行命令"show databases"。现在,我们在vs中为mysql源码打上一个断点(如图),再次执行"show databases"。
5.调试结束后,如何终止Mysqld.exe呢,打开命令行,定位到"D:\mysql-5.5.17\client\Debug",执行命令"mysqladmin shutdown -u root -p",从而完整终止mysqld.exe。
现在,我们就能一步一步的去读Mysql源码了,开源的东东多好啊。
注意:如果你的电脑中正在运行其他Mysql服务,那么在执行调试的时候,最好是把之前的Mysql服务停止的好。因为Mysql服务默认的端口是3306,如果与其他的Mysql服务冲突的话,就不能启动用于调试的Mysql服务了,当然也可以修改相应的端口号。