拖了很久了Mysqld源代码分析从今天开始吧,随着我阅读的进度推进,我会写一些文章记录自己的心得,但是不保证一定会写。其实也不保证一定有时间来完整的阅读所有的代码。阅读代码的目的有如下几点:

  • 通过了解Mysql的架构,学习大型系统软件的体系结构,希望自己在工作的时候也能应用到其中的一些技术
  • 通过阅读代码,能够更好的理解Mysql的使用,也能做更深入的应用,比如性能调优,加入自己需要的功能和模块,等等

至于写文章,还是一件比较费脑力和时间的事情,虽然把想法写下来有助于更好的掌握学到的东西,尽量吧,而且我的文笔比较差。

这是第一篇,从编译和调试Mysql开始,不急于进入代码阅读阶段。

相关资源:

  • http://www.mysql.com/

从这个地方下载源代码和使用文档。

  • http://forge.mysql.com/wiki/MySQL_Internals

这里有一系列文章介绍Mysql的内部原理,是非常好的代码理解参考资源,强烈推荐有兴趣的人仔细阅读。除了代码本身,这也是是最权威的资料。

  • http://www.amazon.com/Understanding-MySQL-Internals-Sasha-Pachev/dp/0596009577

这好像是我知道的唯一介绍Mysql工作原理的书,可以看看,也不是很厚。Google一下这本书,很多地方都有下载,不过都是E文,大家讲究着看吧,谁叫这是老外做出来的呢。

下载代码:

  • http://dev.mysql.com/downloads/

需要注册,下载最新的5.1版本或者更高。

  • 通过Bazaar 下载。

Bazaar是Mysql使用的源代码管理工具,类似于CVS,俺也没用过,有兴趣的自己看文档吧:

  • A Contributor's Guide to Launchpad - Part 1 - Getting Started
  • A Contributor's Guide to Launchpad - Part 2 - Code Management

编译代码:

Mysql的代码编译是通过一些shell脚本来完成的。下载代码并解压后,有一个BUILD目 录,进去看看,里面有各种平台使用的编译脚本,我们要用的是debug版本,以方便我们使用gdb,所以使用的脚本是BUILD/compile- pentium-debug。打开看看,其实很简单,主要加了一个configure选项”--with-debug=full",并使用了 debug_cflags 和debug_configs。脚本内容如下:

BUILD/compile-pentium-debug
<pre>
#! /bin/sh

path=`dirname $0`                          #找到文件所在目录
set -- "$@" --with-debug=full            #将命令行加上"--with-debug=full"
. "$path/SETUP.sh"                          # 导入SETUP.sh的内容,设置一些变量

extra_flags="$pentium_cflags $debug_cflags"  
extra_configs="$pentium_configs $debug_configs"

. "$path/FINISH.sh"                          # 进行config和编译
</pre>

"--with-debug"实际上是autoconf脚本里面定义的,打开configure.in, 查找"with-debug",可以看看里面的参数有哪些不同。

执行脚本吧: $BUILD/compile-pentium-debug --prefix=$HOME/mysql-bin
这里我们执行目标安装目录是$HOME/mysql-bin,你也可以指定其他目录,尽量不要用默认目录,不然有可能和系统里面已经安装好的mysql文件冲突。
根据机器快慢,花的时间也不同,我用的机器花了不到10分钟。等待编译完毕,在sql目录下面可以看到sql/mysqld,恭喜你:-) 这就是mysql的服务器执行文件。

写到这里,我倒是很想就mysql的编译系统写点东西,呵呵,还是有很多比较有意思的地方的。

安装和运行:

安装: $make && make install
一大堆信息之后你应该可以在~/mysql-bin下面找到很多文件了
$ ls /home/liuli/mysql-bin/
bin include info lib libexec man mysql-test share sql-bench
比较重要的目录:
* bin: 客户端程序和脚本,可以发现比较眼熟的mysql, mysqld_safe, mysqldump, mysqladmin等
* libexec: 服务器程序,包括mysqld
* share: 配置文件,包括一些实例配置文件比如my-small.cnf以及初次安装运行需要的初始数据库文件比如mysql_system_tables.sql。

Mysql能够运行还需要一些配置文件和数据文件,执行这个命令:

$ ~/mysql-bin/bin/mysql_install_db   --defaults-file=my.cnf --basedir=~/mysql-bin --datadir=~/mysql-bin/var
该命令将运行Mysqld的bootstrap过 程,主要是安装Mysql的系统表,内容可以参照~/mysql-bin/share/mysql目录下的 fill_help_tables.sql,mysql_system_tables.sql和 mysql_system_tables_data.sql。这里我特别强调"--defaults-file"参数,这个参数是用来指定系统运行需要 的"my.cnf"配置文件的。mysql_install_db需要知道系统的配置才能导入上述的三个sql文件,所以必须要制定一个配置文件,我就是 把~/mysql-bin/share/mysql下面的"my-small.cnf"做为配置文件,大家也可以选自己对应的配置文件,如果不指定,会从 /etc/mysqld/my.cnf导入配置。
注意: -defaults-file=my.cnf 选项必须放在第一个参数的位置,否则无效,而且mysql的大部分程序或者脚本都接受这个参数,但也必须放在第一个参数的位置上。
好了,如果没有错误发生,我们就可以运行mysqld啦!
$~/mysql-bin/libexec/mysqld   --defaults-file=my.cnf --basedir=~/mysql-bin --datadir=~/mysql-bin/var --skip-networking
ps一下,能够看到这个进程了吧。
可以用mysql练一下:
$mysql -S /tmp/mysql.sock
$show databases;
应该可以看到:
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
2 rows in set (0.00 sec)

安装运行部分到这里就结束罗!下面进入调试环节。

调试:

代码调试:

当然是使用gdb啦,或者DDD也行,看个人喜好,这里用gdb做例子。
$ gdb --args ~/mysql-bin/libexec/mysqld   --defaults-file=my.cnf --basedir=/home/aaa/mysql-bin --datadir=/home/aaa/mysql-bin/var --skip-networking

$ (gdb) br   handle_one_connection
$ c
handle_one_connection顾名思义,是mysqld接到一个连接请求以后的处理函数。
另外上面的basedir和datadir用的都是全路径,否则会报错:Can't change dir to '~/mysql-bin/var/'
然后在另外一个shell里面:
$ mysql -S /tmp/mysql.sock
这时gdb会下来,显示:
<pre>
Breakpoint 1, handle_one_connection (arg=0x86ede38) at sql_connect.cc:1076
1076 THD *thd= (THD*) arg;
(gdb) bt
#0 handle_one_connection (arg=0x86ede38) at sql_connect.cc:1076
#1 0x4fc133a8 in start_thread () from /lib/tls/i686/cmov/libpthread.so.0
#2 0x4fb647fe in clone () from /lib/tls/i686/cmov/libc.so.6

</pre>
后面就很简单了,大家懂得的gdb奇技淫巧都可以上了,我就不再多说。

如果这里看不到函数名和文件名,那肯定是前面编译的时候没有用debug编译,重新来一遍吧。

性能调试:

很多时候大家对于mysql当前的性能比较感兴趣,想了解哪些函数大量占用CPU,我推荐两个工具,都是不用你重新编译mysqld的:
* sysprof: http://www.daimi.au.dk/~sandmann/sysprof/
* oprofile:http://oprofile.sourceforge.net/news/
Sysprof相对来说比较好 用,oprofile功能更强大,用起来也稍微复杂。他们都可以用来显示当前系统上运行程序个部分占用CPU的情况,原理都是通过系统核心态定时的 timer,看当前CPU的进程和EIP,还可以通过爬堆栈的方式找到代用堆栈,并打印出来,而且他们都是不仅对用户态的进程进行profile,还可以 进行kernel的profile,特别强大。强烈推荐有对于mysqld的性能调试需求的读者使用,当然也是进行其他程序性能调试不可缺少的工具。

转载于:https://www.cnblogs.com/end/archive/2011/05/18/2050277.html

Mysql源代码分析系列(1): 编译和调试--转载相关推荐

  1. Mysql源代码分析系列

    Mysql源代码分析系列(2): 源代码结构 Mysql源代码主要包括客户端程序代码,服务器端代码,测试工具和一些库构成,下面我们对比较重要的目录做些介绍. BUILD 这个目录在本系列的上篇文章中我 ...

  2. GDB调试器源代码分析系列--Inferior call的实现与分析(1)

    [转] GDB调试器源代码分析系列--Inferior call的实现与分析(1) (2011-10-11 20:41) 标签: 分析 分类: 调试器 先说说几个概念: (1)     什么是infe ...

  3. Quartz.NET 架构与源代码分析系列 part 1 :Quartz.NET 入门

    概述 作业调度的目标在于按照预先确定的时间和指定的顺序来确保高效的数据处理流程,从而最大限度的使用系统资源.批处理流程是一种在无需最终用户干预的方式下在后台通过顺序方式运行的操作. Windows X ...

  4. BlogEngine.Net架构与源代码分析系列(转载)

    01.BlogEngine.Net架构与源代码分析系列part1:开篇介绍 02.BlogEngine.Net架构与源代码分析系列part2:业务对象--共同的父类BusinessBase 03.Bl ...

  5. Quartz.NET 架构与源代码分析系列 part 2 :Job 作业

    在上一篇Quartz.NET 架构与源代码分析系列 part 1 :Quartz.NET 入门我们介绍了Quartz.NET 的基本知识和简单的应用,可以看出来它的使用是非常简单的,只要短短的几行代码 ...

  6. BlogEngine.Net架构与源代码分析系列part12:页面共同的基类——BlogBasePage

    上一篇文章我向大家展示了BlogEngine.Net中Theme的原理和一些开发规范,里面有很多内容和这篇文章有着联系,建议大家这两篇文章结合在一起看,这样效果会更好.在这篇文章中我主要向大家说明Bl ...

  7. MyBatis架构设计及源代码分析系列(一):MyBatis架构

    一.概述 MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己 The MyBatis data mapper framework makes it easier to use a re ...

  8. Spark SQL 源代码分析系列

    从决定写Spark SQL文章的源代码分析,到现在一个月的时间,一个又一个几乎相同的结束很快,在这里也做了一个综合指数,方便阅读,下面是读取顺序 :) 第一章 Spark SQL源代码分析之核心流程 ...

  9. avclient安装_反病毒软件clamAV源代码分析 01 - 安装编译

    最近发现网上有个开源的反病毒软件clamwin,官方地址是http://www.clamwin.com/,下个最新版本试下先. 据介绍这只是个UI壳,用Python/ wxPython写的,其实用的是 ...

  10. ◆勇敢者论坛源代码分析系列(1)—数据查询

    前言:勇敢者论坛是一个开放源码的ASP.NET c#论坛,使用VS.NET 2005开发管理,可以支持两种数据库 SQL2000或Accsee.作者的开发本意,就是提供给大家学习使用的.写本系列代码分 ...

最新文章

  1. GOF23设计模式(创建型模式)建造者模式
  2. ARP协议详解之ARP动态与静态条目的生命周期
  3. c++ 编译器支持情况表
  4. 使用GruntJS构建Web程序 (1)
  5. 验证异常处理调用顺序
  6. va_list 简介
  7. hwd是长宽高吗_五菱皮卡要来了,五种形态任你选,颜值是你期待的吗?
  8. php微信拍照图库js接口,ThinkPHP微信实例——JSSDK图像接口多张图片上传下载并将图片流写入本地...
  9. 谷歌地图插件Mapsed.js
  10. JDK和JRE它们之间的关系及区别
  11. 图形学的几个非常有用的转换
  12. 值得收藏!中国金融体系主要指标大全
  13. NUnit 2.5.9 官网学游记(一) 入门
  14. ccproxy8.0破解版
  15. 解决 Chrome最新版右键工具中的编码修改功能没有了的工具
  16. 00后程序员摸爬滚打近一年,为学弟学妹们总结出了以下 7 条人生建议(建议收藏)
  17. 2017年深圳积分入户分值表(精简版)
  18. 怎么用手机控制电脑?手机控制手机如何实现?
  19. 自然语言处理核心期刊_中国中文信息学会
  20. 算法的时间与空间复杂度介绍

热门文章

  1. 【HDU1284 中南林业大学第十一届校赛 B:】兑换零钱(dp)
  2. 大学计算机应用与基础第二版答案,大学计算机应用基础(第2版)上机指导与习题集...
  3. Softmax 回归的从零开始实现 pytorch
  4. 多层感知机从零开始实现
  5. 307.区域和检索-数组可修改
  6. Torch7 out of memory 解决方法
  7. 麻省理工线性代数第一讲
  8. Raki的读paper小记:XLNet: Generalized Autoregressive Pretraining for Language Understanding
  9. php 编译安装gd 失败,编译安装php5 解决编译安装的php加载不了gd
  10. 跨页面调用方法_Excel多表汇总不用愁,五种多表合并方法,高效完成日常工作...