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>winconfigure.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:Projectmysql-5.5.5-m3>winuild-vs9.bat
这样就生成了MySQL.sln的工程文件,打开这个工程文件并将mysqld这个项目设置为默认的启动项,就可以进行MySQL的编译和调试了。
之后的编译、断点的设置和调试,与在Visual Studio下操作一般的程序没有什么区别。
Linux下的调试
Linux下的调试,通常使用Eclipse。其他一些类Unix操作系统,如Solaris、FreeBSD、MAC,同样可以使用Eclipse进行调试。
- 到http://www.eclipse.org/downloads/下载并安装Eclipse IDE for C/C++Developers。
- 解压MySQL源代码到指定目录,如解压到/root/workspace/mysql-5.5.5-m3,
- 运行如下命令产生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文件,不进行编译。
- 接着打开Eclipse,新建一个C++的项目。给项目取个名称,如这里的项目名为mysql_5_5_5,并选择一个空的项目。选择Finish按钮后,可以看到新产生的一个空项目。
- 之后选择左边的Project Explorer,右击项目mysql_5_5_5,选择新建文件夹,将文件夹/root/workspace/mysql-5.5.5-m3导入工程中。
- 导入文件夹后,再右击项目名mysql_5_5_5,选择项目属性,在C/C++Build选项这里进行设置,需要将Build directory选择为源代码所在路径。 编译配置完后,程序就会自动开始执行编译工作了。
- 上述的这个过程只是编译的过程,换句话说,编译完后就产生了mysqld这样的执行文件。如果想要进行调试,还需要在Debug这里进行如下的配置。 另外如果需要配置一些额外的参数,需要切换到Arguments选项。
- 之后就可以设置断点,进行调试工作了,这和一般的程序并没有什么不同。