MySQL源码分析整理稿.docx
《MySQL源码分析整理稿.docx》由会员分享,可在线阅读,更多相关《MySQL源码分析整理稿.docx(33页珍藏版)》请在冰豆网上搜索。
![MySQL源码分析整理稿.docx](https://file1.bdocx.com/fileroot1/2022-10/29/af07128f-61b9-4f75-8bdc-56f5908ae7c9/af07128f-61b9-4f75-8bdc-56f5908ae7c91.gif)
MySQL源码分析整理稿
MySQL源码分析
JonYao
编译安装
为了实现MySQL的更高级别的性能调优,我们通常需要理解其内部实现机制,并对其进行优化调试。
在下面的系列中,我们会分别介绍MySQL的部分内部实现机制。
首先我们介绍如何从源代码部署一台MySQL服务器。
1.下载MySQL源码
本文中演示使用的是mysql-5.5.8版本。
2.安装环境:
[root@localhost~]#uname-a
Linuxnx2.6.35-24-generic#42-UbuntuSMPThuDec201:
41:
57UTC2010i686GNU/Linux
[root@localhost~]#gcc-v
Usingbuilt-inspecs.
Target:
i686-linux-gnu
Configuredwith:
../src/configure-v--with-pkgversion='Ubuntu/Linaro4.4.4-14ubuntu5'--with-bugurl=file:
///usr/share/doc/gcc-4.4/README.Bugs--enable-languages=c,c++,fortran,objc,obj-c++--prefix=/usr--program-suffix=-4.4--enable-shared--enable-multiarch--enable-linker-build-id--with-system-zlib--libexecdir=/usr/lib--without-included-gettext--enable-threads=posix--with-gxx-include-dir=/usr/include/c++/4.4--libdir=/usr/lib--enable-nls--with-sysroot=/--enable-clocale=gnu--enable-libstdcxx-debug--enable-objc-gc--enable-targets=all--disable-werror--with-arch-32=i686--with-tune=generic--enable-checking=release--build=i686-linux-gnu--host=i686-linux-gnu--target=i686-linux-gnu
Threadmodel:
posix
gccversion4.4.5(Ubuntu/Linaro4.4.4-14ubuntu5)
添加运行MySQL程序的mysql用户(root权限):
Øgroupaddmysql
Øuseraddmysql–gmysql
Øcmake.-DCMAKE_BUILD_TYPE:
STRING=Release-DCMAKE_INSTALL_PREFIX:
PATH=/usr/local/mysql-DCOMMUNITY_BUILD:
BOOL=ON-DENABLED_PROFILING:
BOOL=ON-DENABLE_DEBUG_SYNC:
BOOL=OFF-DINSTALL_LAYOUT:
STRING=STANDALONE-DMYSQL_DATADIR:
PATH=/usr/local/mysql/data-DMYSQL_MAINTAINER_MODE:
BOOL=OFF-DWITH_EMBEDDED_SERVER:
BOOL=ON-DWITH_EXTRA_CHARSETS:
STRING=all-DWITH_SSL:
STRING=bundled-DWITH_UNIT_TESTS:
BOOL=OFF-DWITH_ZLIB:
STRING=bundled-LH
Ømake&&makeinstall
3.配置
配置MySQL的参数,可以support-files下配置文件的模板:
跳转到MySQL安装路径,cmake指定的地址:
/usr/local/mysql
cpsupport-files/my-f/etc/f
vi/etc/f
#//////////////////////////////////////////////
#UncommentthefollowingifyouareusingInnoDBtables
innodb_data_home_dir=/usr/local/mysql/data
innodb_data_file_path=ibdata1:
10M:
autoextend
innodb_log_group_home_dir=/usr/local/mysql/data
#Youcanset.._buffer_pool_sizeupto50-80%
#ofRAMbutbewareofsettingmemoryusagetoohigh
innodb_buffer_pool_size=16M
innodb_additional_mem_pool_size=2M
#Set.._log_file_sizeto25%ofbufferpoolsize
innodb_log_file_size=5M
innodb_log_buffer_size=8M
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=50
#//////////////////////////////////////////////
按照测试的需求修改,注意加上datadir和innodb等部分重要参数。
修改/usr/local/mysql用户访问权限,
chown–Rmysql.
chgrp–Rmysql.
软连接,配置MySQL的资源文件路径
/usr/local/share/mysql->/usr/local/mysql/share/
设置path环境变量,方便实用:
PATH="/usr/local/mysql/bin:
/usr/JDK/bin:
…
设置服务启动
cpsupport-files/my.server/etc/inid.d/mysql
vi/etc/init.d/mysql
修改配置路径
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
…
mysqld_pid_file_path=/usr/local/mysql/data/nx.pid
4.安装数据库
bin/mysql_install_db--user=mysql
这里安装必要的数据库文件,如MySQL的系统表,--user=mysql是用来运行mysql的用户。
5.试运行服务
简单测试一下,运行/etc/init.d/mysqlstart
在Ubuntu系统上以root运行mysqld_safe时,会自动切换到mysql用户来运行mysqld程序。
查看mysqld进程,记录下启动时参数(斜体加粗部分),为今后的调试做准备。
[root@localhost~]#psaux|grepmysql
root200230.80.01896584pts/0S19:
360:
00/bin/sh/usr/local/mysql/bin/mysqld_safe--datadir=/usr/local/mysql/data--pid-file=/usr/local/mysql/data/nx.pid
mysql204462.62.732062427848pts/0Sl19:
360:
00/usr/local/mysql/bin/mysqld--basedir=/usr/local/mysql--datadir=/usr/local/mysql/data--plugin-dir=/usr/local/mysql/lib/plugin--user=mysql--log-error=/usr/local/mysql/data/nx.err--open-files-limit=65535--pid-file=/usr/local/mysql/data/nx.pid--socket=/tmp/mysql.sock--port=3306
6.停止服务
/etc/init.d/mysqlstop
调试
安装结束,进入正题调试环节。
通常Linux下程序员倾向于使用强大的gdb(GNUProjectDebugger)来调试程序,可以查看程序的内部结构、设置断点、查看调用堆栈等。
在本文中,我们尝试使用EclipseCDE,其本质上是带有图形界面的gdb,更方便直观,但依赖Java桌面环境。
1.安装
到www.eclipse.org下载最新版的EclipseC++版本
2.在调试选项中输入前面记录mysqld的启动参数。
3.设置断点,按F5开始运行调试。
4.当程序运行到断点时会暂停,此时可以查看输出、调用栈和当前的堆栈值等。
参考资料
http:
//www.kdbg.org/
主要模块及数据流
经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改。
源码结构(MySQL-5.5.8)
1.BUILD:
内含在各个平台、各种编译器下进行编译的脚本。
如compile-pentium-debug表示在pentium架构上进行编译的脚本。
2.Client:
客户端工具,如mysql,mysqladmin之类。
3.Cmake:
新版mysql使用编译配置初始化工具包
4.Cmd-line-utils:
readline,libedit工具。
5.Config:
给aclocal使用的配置文件。
6.Dbug:
提供一些调试用的宏定义。
7.Docs:
文档库
8.Extra:
提供innochecksum,resolveip等额外的小工具。
9.Include:
包含的头文件
10.libmysql:
库文件,生产libmysqlclient.so。
11.libmysql_r:
线程安全的库文件,生成libmysqlclient_r.so。
12.libservices:
5.5.x中新加的目录,实现了打印功能。
13.Man:
手册页。
14.Mysql-test:
mysqld的测试工具一套。
15.Mysys:
为跨平台计,MySQL自己实现了一套常用的数据结构和算法,如string,hash等。
16.Packaging:
打包工具包
17.Netware:
在netware平台上进行编译时需要的工具和库。
18.Plugin:
mysql以插件形式实现的部分功能。
19.Pstack:
异步栈追踪工具。
20.Regex:
正则表达式工具。
21.Scripts:
提供脚本工具,如mysql_install_db等
22.Sql:
mysql主要代码,将会生成mysqld文件。
23.Sql-ben