编译指定的mysql版本,最好搜索英文 " Building MySQL on Windows"
mysql 编译方案:
1. 最初只支持linux shell编译. 需要bision2. 后来支持configure编译,依旧需要bision(5.1版本)
3. 后来利用cmake编译(mysql5.6.10不支持configure安装了,提供了CMAKE安装方式 ),依旧需要bision.
可能最初版本如何编译,已经没有人知道了..
最开始mysql(3.23.49)利用shell编译(是否能在windows上跑是个问题,系统兼容性),远程debug即可,后来引入cmake管理依赖. (bision一直存在)
configure安装
教程:
1. 在普通cmd下执行cmake,会出错. 不太了解内部原理. ( 如果不是遇到@周晓瑜,这个坎肯定跨不过去,计算机就是这样,搭建环境是一个大坎. 是什么就是什么,入门太难了)
D:\Program Files (x86)\mysql_source_mysql_for_debug\mysql-5.6.27>cmake -G "Visual Studio 12 2013"
-- Running cmake version 3.4.0-rc2
-- Could NOT find Git (missing: GIT_EXECUTABLE)
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:111 (PROJECT):
No CMAKE_C_COMPILER could be found.
CMake Error at CMakeLists.txt:111 (PROJECT):
No CMAKE_CXX_COMPILER could be found.
-- Configuring incomplete, errors occurred!
See also "D:/Program Files (x86)/mysql_source_mysql_for_debug/mysql-5.6.27/CMake
Files/CMakeOutput.log".
See also "D:/Program Files (x86)/mysql_source_mysql_for_debug/mysql-5.6.27/CMake
Files/CMakeError.log".
1.2 到visual的cmd去执行(第二个方案,去学习cmake,自己配置半天)
还是不对,发现不是2013 , 根据提示删除CMakeCache.txt和CMakeFiles目录. 看看这两个里是啥,学习下.
cmake -G "Visual Studio 10 2010"
1.3 bision说缺少 dll .下载安装,发现不兼容.
然后发现下载的是 bin.zip包,不是gnu32.bision的setup包. 需要自己安装所有的依赖.
解决方案: 重新下载bison的setup安装包
1.4 不能有空格,不然 visual 里面执行的时候报 找不到文件.(百度搜索后 明白) 导致m4找不到.
重新安装到 bison到无大写,无数字的目录.并将 mysql源目录移到无空格目录下.
1.5 遇到 3>sql_locale.cc
2>.\sql_locale.cc(621) : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
3>..\sql\sql_locale.cc(621) : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
2>.\sql_locale.cc(789) : error C2146: 语法错误 : 缺少“}”(在标识符“嗒忇喃嵿嗒苦”的前面)
3>..\sql\sql_locale.cc(789) : error C2146: 语法错误 : 缺少“}”(在标识符“嗒忇喃嵿嗒苦”的前面)
2>.\sql_locale.cc(789) : error C2146: 语法错误 : 缺少“;”(在标识符“嗒忇喃嵿嗒苦”的前面)
2>.\sql_locale.cc(789) : error C2143: 语法错误 : 缺少“;”(在“字符串”的前面)
3>..\sql\sql_locale.cc(789) : error C2146: 语法错误 : 缺少“;”(在标识符“嗒忇喃嵿嗒苦”的前面)
2>.\sql_locale.cc(789) : error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
3>..\sql\sql_locale.cc(789) : error C2143: 语法错误 : 缺少“;”(在“字符串”的前面)
2>.\sql_locale.cc(789) : error C2143: 语法错误 : 缺少“;”(在“}”的前面)
3>..\sql\sql_locale.cc(789) : error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
2>.\sql_locale.cc(789) : error C2059: 语法错误 : “}”
3>..\sql\sql_locale.cc(789) : error C2143: 语法错误 : 缺少“;”(在“}”的前面)
2>.\sql_locale.cc(791) : error C2146: 语法错误 : 缺少“}”(在标识符“嗒珖嗒”的前面)
3>..\sql\sql_locale.cc(789) : error C2059: 语法错误 : “}”
2>.\sql_locale.cc(791) : error C2146: 语法错误 : 缺少“;”(在标识符“嗒珖嗒”的前面)
3>..\sql\sql_locale.cc(791) : error C2146: 语法错误 : 缺少“}”(在标识符“嗒珖嗒”的前面)
2>.\sql_locale.cc(791) : error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
3>..\sql\sql_locale.cc(791) : error C2146: 语法错误 : 缺少“;”(在标识符“嗒珖嗒”的前面)
2>.\sql_locale.cc(791) : error C2059: 语法错误 : “字符串”
3>..\sql\sql_locale.cc(791) : error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
2>.\sql_locale.cc(791) : error C2143: 语法错误 : 缺少“;”(在“}”的前面)
3>..\sql\sql_locale.cc(791) : error C2059: 语法错误 : “字符串”
2>.\sql_locale.cc(791) : error C2059: 语法错误 : “}”
3>..\sql\sql_locale.cc(791) : error C2143: 语法错误 : 缺少“;”(在“}”的前面)
2>.\sql_locale.cc(793) : error C2146: 语法错误 : 缺少“}”(在标识符“嗒多珌嗒曕珝嗒班嗒距”的前面)
3>..\sql\sql_locale.cc(791) : error C2059: 语法错误 : “}”
2>.\sql_locale.cc(793) : error C2146: 语法错误 : 缺少“;”(在标识符“嗒多珌嗒曕珝嗒班嗒距”的前面)
3>..\sql\sql_locale.cc(793) : error C2146: 语法错误 : 缺少“}”(在标识符“嗒多珌嗒曕珝嗒班嗒距”的前面)
2>.\sql_locale.cc(793) : error C2143: 语法错误 : 缺少“;”(在“字符串”的前面)
3>..\sql\sql_locale.cc(793) : error C2146: 语法错误 : 缺少“;”(在标识符“嗒多珌嗒曕珝嗒班嗒距”的前面)
字符集问题
用notepad++打开sql_locale.cc
在菜单“格式”中选择“以UTF-8格式编码”,保存
1.6 SIGABRT
“TestIfly.exe”: 已加载“C:\Windows\SysWOW64\ntdll.dll”,Cannot find or open the PDB file
程序“[8868] TestIfly.exe: 本机”已退出,返回值为 126 (0x7e)。
查看调用堆栈,将mysql\sql\mysqld.cc将DBUG_ASSERT(0); 注释掉. 可以成功启动了.
1.7 启动sqld后立马退出了.
搜索了" windows 编译 mysql ",见下面附件"windows 编译mysql-5.1.59"
1 将mysql\win\data整个文件夹拷贝到mysql根目录下将mysql\win\data整个文件夹拷贝到mysql根目录下2 、 将mysql\sql\share整个文件夹拷贝到mysql根目录下
3、 打开vs2008编译整个代码,在cmd中到mysql\sql\Debug\执行mysqld.exe –debug
最终胜利完成.
在cmd中到mysql\client\Debug\ 下执行mysql -uroot –p
14、 要调试的话,直接在vs2008中将mysqld的进程加入
使用vs2008进行调试
测试---》附加到进程
选择mysqld
代码运行最终是为了学习细节和调用堆栈:
可设置的断点,
1.MySQL源码分析以及目录结构 含启动() 网络监听
1. 比如查询的总入口是sql/sql_select.cc 中的 handle_select 函数。
看如何解析sql和通过explain 改变抽象语法树 (见参考文章 动手写 sql 解析 )
2.比如写入口
1.事务的原子性实现, . 不同隔离级别下的读实现
Mysql Innodb中undo-log和MVCC多版本一致性读 的实现(源码解析)http://blog.sina.com.cn/s/blog_4673e603010111ty.html
Mysql中的MVCChttp://blog.youkuaiyun.com/chen77716/article/details/6742128
多版本并发控制:PostgreSQL vs InnoDB http://wangyuanzju.blog.163.com/blog/static/130292009107101544125/
2. bin log ,redo log, unlog的使用
Mysql Innodb中undo-log和MVCC多版本一致性读 的实现(源码解析)http://blog.sina.com.cn/s/blog_4673e603010111ty.html
3. 写如何锁
http://dev.mysql.com/doc/refman/5.5/en/innodb-monitors.html
ps: visual studio的增强.
1. 类似eclipse里的toggle mark occurrences https://visualstudiogallery.msdn.microsoft.com/4b92b6ad-f563-4705-8f7b-7f85ba3cc6bb Highlight all occurrences of selected word 免费
2. ctrl + / ,输入 open 文件名. 类似 eclipse里 open type
3. ctrl+, ( 编辑--->定位到)可以直接查找方法.
4. ouline eclipse
这个更好 Visual Assist X http://www.cr173.com/soft/32656.html
VSCommands for Visual Studio 2010
https://visualstudiogallery.msdn.microsoft.com/d491911d-97f3-4cf6-87b0-6a2882120acf/
附件:
windows 编译mysql-5.1.59
成后解压到自己的一个指定目录即可。 2、 下载CMAKE,安装后,软件中会提示要不要加入path,这个选中加入path,然后在CMD
中测试是否安装成功。下载地址http://www.cmake.org 3、 我电脑中装有vs2008,大家确保自己装好这个。
4、 下载bision,因为Mysql的词法和语法分析是使用的lex和yacc,下载地址:
http://gnuwin32.sourceforge.net/packages/bison.htm,具体是什么用,我自己也不是很清楚,看其他人说是作词法和语法的分析,这个下面再学习。
5、 在解压缩包中有win目录, 到该目录下执行cscript configure.js
WITH_INNOBASE_STORAGE_ENGINE WITH_PARTITION_STORAGE_ENGINE MYSQL_SERVER_SUFFIX=-pro 具体参数的用途Google一下。 6、 执行win目录下的build-vs9.bat批处理文件,这个在cmd中执行。 7、 做一个my.ini文件,内容如下: # set basedir to your installation path basedir=D:/mysql
# set datadir to the location of your data directory datadir=D:/mysql/win/data
将my.ini放到C:\WINDOWS下
8、 找到sql_locale.cc文件,在sql目录下,另存为UTF-8格式,覆盖原文件 9、 修改文件\mysql\sql\mysqld.cc中的test_lc_time_sz函数,将代码
if ((*loc)->max_month_name_length != max_month_len || (*loc)->max_day_name_length != max_day_len) {
DBUG_PRINT("Wrong max day name(or month name) length for locale:",("%s", (*loc)->name));
DBUG_ASSERT(0);
} 注释掉,我这边也是,看网上其他人也是,这边不注释掉,编译不通过。Mysqld出问题。 10、 将mysql\win\data整个文件夹拷贝到mysql根目录下 11、 将mysql\sql\share整个文件夹拷贝到mysql根目录下 12、 打开vs2008编译整个代码,在cmd中到mysql\sql\Debug\执行mysqld.exe –debug 13、 在cmd中到mysql\client\Debug\ 下执行mysql -uroot –p
14、 要调试的话,直接在vs2008中将mysqld的进程加入