源代码的编译和调试

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: InnoDB存储引擎是开源的,这意味着你可以获得其源代码,并查看内部的具体实现。任何时候,WHY都比WHAT重要。通过研究源代码,可以更好地理解数据库是如何工作的,从而知道如何使数据库更好地为你工作。如果你有一定的编程能力,则完全可以对InnoDB存储引擎进行扩展,开发出新的功能模块来更好地支持你的数据库应用。

InnoDB存储引擎是开源的,这意味着你可以获得其源代码,并查看内部的具体实现。任何时候,WHY都比WHAT重要。通过研究源代码,可以更好地理解数据库是如何工作的,从而知道如何使数据库更好地为你工作。如果你有一定的编程能力,则完全可以对InnoDB存储引擎进行扩展,开发出新的功能模块来更好地支持你的数据库应用。

获取InnoDB存储引擎源代码

InnoDB存储引擎的源代码被包含在MySQL数据库的源代码中,在MySQL的官方网站链接为:http://www.mysql.com/downloads/mysql/。下载MySQL数据库的源代码即可。 这里有不同操作系统下的源代码可供下载,一般只需下载Generic Linux的版本即可。通过MySQL官网首页的Download链接,可以迅速地找到GA版本的下载。但是,如果想要下载目前正在开发的MySQL版本,可能在官网找了很久都找不到链接。这时,只要把下载的链接从www换到dev即可:如http://dev.mysql.com/downloads/mysql,在这里可以找到开发中的MySQL版本的源代码了。单击“Download”下载标签后可以进入下载页面。当然,如果你有mysql.com账户,可以进行登录。MySQL官方提供了大量的镜像用来分流下载,你可以根据所在的位置选择下载速度最快的地址,中国用户一般可以在“Asia”这里的镜像下载。

下载的文件是tar.gz结尾的文件,可以通过Linux的tar命令、Windows的WinRAR工具来进行解压,解压后得到一个文件夹,这里面就包含了MySQL数据库的所有源代码。所有存储引擎的源代码都被放在storage的文件夹下,其源代码结构如图所示。

可以看到,所有存储引擎的源代码都在这里。文件夹名一般就是存储引擎的名称,如archive、blackhole、csv、fedorated、heap、ibmdb2i、myisam、innobase。从MySQL 5.5版本开始,InnoDB Plugin已经作为默认的InnoDB存储引擎版本;而在MySQL 5.1的源代码中,应该可以看到两个版本的InnoDB存储引擎源代码。可以看到有innobase和innodb_plugin两个文件夹:innobase文件夹是旧的InnoDB存储引擎的源代码;innodb_plugin文件夹是InnoDB Plugin存储引擎的源代码。如果你想将InnoDB Plugin直接静态编译到MySQL数据库中,那么需要删除innobase文件夹,再将innodb_plugin文件夹重命名为innobase。

InnoDB源代码结构

进入InnoDB存储引擎的源代码文件夹,可以看到源代码结构 :

下面介绍一些主要文件夹内源代码的具体作用:

btr:B+树的实现。

buf:缓冲池的实现,包括LRU算法、Flush刷新算法等。

dict:InnoDB存储引擎内存数据字典的实现。

dyn:InnoDB存储引擎动态数组的实现。

fil:InnoDB存储引擎中文件数据结构以及对于文件的一些操作。

fsp:你可以理解为file space,即对InnoDB存储引擎物理文件的管理,如页、区、段等。

ha:哈希算法的实现。

handler:继承于MySQL的handler,插件式存储引擎的实现。

ibuf:插入缓冲的实现。

include:InnoDB将头文件(.h,.ic)都统一放在这个文件夹下。

lock:InnoDB存储引擎锁的实现,如S锁、X锁以及定义锁的一系列算法。

log:日志缓冲和重组日志文件的实现。对重组日志感兴趣的,应该好好阅读该源代码。

mem:辅助缓冲池的实现,用来申请一些数据结构的内存。

mtr:事务的底层实现。

os:封装一些对于操作系统的操作。

page:页的实现。

row:对于各种类型行数据的操作。

srv:对于InnoDB存储引擎参数的设计。

sync:InnoDB存储引擎互斥量(Mutex)的实现。

thr:InnoDB储存引擎封装的可移植的线程库。

trx:事务的实现。

ut:工具类。

编译和调试InnoDB源代码

Windows下的调试

在Windows平台下,可以通过Visual Studion 2003、2005和2008开发工具对MySQL的源代码进行编译和调试。在此之前,需要预先安装如下的工具:

CMake:可以从http://www.cmake.org下载。

bison:可以从http://gnuwin32.sourceforge.net/packages/bison.htm下载。

安装之后,还需要通过configure.js这个命令进行配置:

C:\workdir>win\configure.js options

option比较重要的选项如下所示。

WITH_INNOBASE_STORAGE_ENGINE:支持InnoDB存储引擎。

WITH_PARTITION_STORAGE_ENGINE:分区支持。

WITH_ARCHIVE_STORAGE_ENGINE:支持Archive存储引擎。

WITH_BLACKHOLE_STORAGE_ENGINE:支持Blackhole存储引擎。

WITH_EXAMPLE_STORAGE_ENGINE:支持Example存储引擎,这个存储引擎是展示给开发人员的,你可以从这个存储引擎开始构建自己的存储引擎。

WITH_FEDERATED_STORAGE_ENGINE:支持Federated存储引擎。

WITH_NDBCLUSTER_STORAGE_ENGINE:支持NDB Cluster存储引擎。

如果只是比较关心InnoDB存储引擎,可以这样进行设置,如图所示。

之后,可以根据你使用的是Visual Studio 2005还是Visual Studio 2008,在win文件下运行build-vsx.bat文件来生成Visual Studio的工程文件。build-vs8.bat表示Visual Studio 2005,build-vs8_x64.bat表示需要编译64位的MySQL数据库。如我们需要在32位的操作系统下使用Visual Studio 2008进行调试工作,则可以使用如下命令:

D:\Project\mysql-5.5.5-m3>win\build-vs9.bat

这样就生成了MySQL.sln的工程文件,打开这个工程文件并将mysqld这个项目设置为默认的启动项,就可以进行MySQL的编译和调试了。

之后的编译、断点的设置和调试,与在Visual Studio下操作一般的程序没有什么区别。

Linux下的调试

 

Linux下的调试,通常使用Eclipse。其他一些类Unix操作系统,如Solaris、FreeBSD、MAC,同样可以使用Eclipse进行调试。

  1. 到http://www.eclipse.org/downloads/下载并安装Eclipse IDE for C/C++Developers。
  2. 解压MySQL源代码到指定目录,如解压到/root/workspace/mysql-5.5.5-m3,
  3. 运行如下命令产生Make文件(Eclipse会使用产生的这些Make文件):[root mysql-5.5.5-m3]#BUILD/compile-amd64-debug-max-no-ndb-c,BUILD下有很多compile文件,你可以选择你所需要的文件。编译的平台是64位的Linux系统,并且希望可以进行Debug调试,因此选择了compile-amd64-debug-max-no-ndb文件。注意-c选项,这个选项只生产Make文件,不进行编译。
  4. 接着打开Eclipse,新建一个C++的项目。给项目取个名称,如这里的项目名为mysql_5_5_5,并选择一个空的项目。选择Finish按钮后,可以看到新产生的一个空项目。 
  5. 之后选择左边的Project Explorer,右击项目mysql_5_5_5,选择新建文件夹,将文件夹/root/workspace/mysql-5.5.5-m3导入工程中。 
  6. 导入文件夹后,再右击项目名mysql_5_5_5,选择项目属性,在C/C++Build选项这里进行设置,需要将Build directory选择为源代码所在路径。 编译配置完后,程序就会自动开始执行编译工作了。
  7. 上述的这个过程只是编译的过程,换句话说,编译完后就产生了mysqld这样的执行文件。如果想要进行调试,还需要在Debug这里进行如下的配置。 另外如果需要配置一些额外的参数,需要切换到Arguments选项。 
  8. 之后就可以设置断点,进行调试工作了,这和一般的程序并没有什么不同。 

 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
运维 监控 负载均衡
ACS
阿里云容器计算服务ACS(Alibaba Cloud Container Compute Service,ACS)是一种基于容器技术的云计算服务,它可以帮助用户快速构建、部署和管理容器化应用程序。ACS提供了容器镜像、容器编排、负载均衡、日志监控等功能,使得用户可以专注于应用程序的开发和迭代,而无需关注底层的基础设施和运维。
554 3
|
弹性计算 数据可视化 关系型数据库
【最佳实践】Filebeat实现MySQL日志轻量化发送至Elasticsearch
在今天的文章中,我们来详细地描述如果使用Filebeat把MySQL的日志信息传输到Elasticsearch中。
4662 0
【最佳实践】Filebeat实现MySQL日志轻量化发送至Elasticsearch
|
域名解析 缓存 网络协议
DNS协议 是什么?说说DNS 完整的查询过程? _
DNS是互联网的域名系统,它像翻译官一样将域名转换成IP地址。域名由点分隔的名字组成,如www.xxx.com,包含三级、二级和顶级域名。查询方式分为递归和迭代,递归是请求者必须得到答案,而迭代则是服务器指引请求者如何获取答案。域名解析过程中,会利用浏览器和操作系统的缓存,如果缓存未命中,本地域名服务器会通过递归或迭代方式向上级服务器查询,最终得到IP地址并返回给浏览器,同时在各级缓存中保存记录。
667 1
DNS协议 是什么?说说DNS 完整的查询过程? _
|
SQL 数据库
达梦数据库记录
达梦数据库记录
|
Python
科学计算中的NumPy应用案例分享
【4月更文挑战第17天】本文介绍了NumPy在科学计算中的应用,包括使用NumPy的线性代数函数求解线性方程组、利用`trapz`函数进行数值积分以及结合`scipy.signal`进行信号滤波。这些案例展示了NumPy在处理实际问题时的实用性和灵活性,突显了其在Python科学计算领域的重要地位。
|
存储 安全 编译器
【c++】类和对象(四)深入了解拷贝构造函数
朋友们大家好啊,本篇内容带大家深入了解拷贝构造函数
【c++】类和对象(四)深入了解拷贝构造函数
|
存储 数据采集 人工智能
刚刚,国内的自主智能体OmBot发布了
刚刚,国内的自主智能体OmBot发布了
561 0
|
存储 物联网 网络性能优化
一文教你小区如何自建快递柜
共享快递拟收费事件后,国内小区物业开启一波自建快递柜的浪潮,阿里平台快递柜销量暴涨1400%。那么问题来了,企业如何基于阿里云物联网平台快速构建一套高可用的共享快递柜服务?
704 1
一文教你小区如何自建快递柜
|
JSON 数据可视化 Android开发
HarmonyOS(鸿蒙)——config.json详解
HarmonyOS(鸿蒙)——config.json详解
1067 0
HarmonyOS(鸿蒙)——config.json详解