阅读MySQL代码之源码安装
写在前面的话:
这个系列将会从学习者的角度去探索如何实现一个类MySQL的数据库,但是我们知道真正的在短时间内能够写出来的个人的版本是很难有很好的成品。但是从一个学习者的角度来说,最重要的是弄懂这个数据库是如何成功运行的,而首当其中的就是去编译其源码。
我挑选MySQL-5.1.34版本,作为这次实验的源代码包,这篇将记录我的整个安装的心路历程。
首先说下为什么选用这个版本的MySQL。卖得脱销的《MySQL核心内幕》全书的讲解基础就是基于这个版本的数据库,包括《深入理解MySQL》也是使用的5.1版本的MySQL。这个5.1版本的MySQL是接近原始开发版的,同时也是能够下载到完整的源代码,同时不包含任何鸡肋的功能,特别适合学习,特别是对数据库应用有了足够多了解的同学,因为我提到的两本书都是从应用的角度进行剖析,值得一读,也值得跟着一试。
配置环境是滴滴云平台上面的ubuntu 14.04LTS
第一步是获取到这个源码包,如果你们网站上不好下载可以通过我这里提供的下载路口:
mysql-5.1.34.tar.gz 获取网址
第二步是将其解压(可以在root环境下使用,如果是服务器那再好不过了):
tar zxvf mysql-5.1.34
第三步是设置用户组和用户(可能要使用sudo su
)
groupadd mysql
useradd -r mysql -g mysql
第四步是进入到该文件夹(没有必要将这个文件夹放来放去,累赘也没什么用):
cd mysql-5.1.34
第五步就是设置配置文件,生成MakeFile了,这也是MySQL的独特之处,我觉得最好的一点,根据不同场景下的环境,分析生成相对应的MakeFile文件,是一个可移植程度高的体现。
./configure --prefix=/usr/local/mysql --enable-asserbler --with-extra-charsets=all --with-plugins=all
这个部分的代码大家根据自己的需求进行配置,《MySQL核心内幕》一书中有讲解到,这里对Configure文件截个图:
之后安装成功之后会有一个感谢你选择MySQL的标示(这里借用他人编译的截图,我的当时忘了记录2333):
这个时候执行MakeFile的命令即可:
make -j 8 #Allow N(N=8) jobs at once; infinite jobs with no arg.
这时,相关的可执行文件已经放在MakeFile中的相应位置了,我们需要通过执行安装进行配置相关的初始设置:
make install
这里做一个补充解释:
- Configure列表内容Linux平台有各种不同的配置,安装时需要通过 configure 来确定,如:编译器用的是 cc 还是 gcc、不同库文件所在目录等。执行 configure 后会生成 Makefile,Makefile 规定了用什么编译器、编译参数等信息。
- make则是根据MakeFile中规定的内容进行编译,生成的可执行文件放在当前目录或某个子目录。
- make install则将make生成的文件安装到系统目录中,如
/usr/bin
,这一步需要root
权限,所以通常得用sudo make install
。如果没有这一步,在命令行中输入程序名字不能启动相应程序。
到了这里,顺利的话应该已经过去15分钟了,但是在这个过程中你有可能发生下面几种问题,我在之后会一一说明,因为到现在为止,还没有安装完成,但是当时我和我几个小伙伴刚开始触碰这个源代码的时候都倒在了这里,谢谢《MySQL核心内幕》的分析:我们到这个时候,我们需要进行初始设置了,这里包括数据文件的位置、根目录的为止,server的存放和使用MySQL的用户群以及socks等等。
所以接下来几步是:
mkdir /usr/local/mysql/etc #设置主要的可执行文件的位置(也要和my.cnf的一致)
cp support-files/my-medium.cnf /usr/local/mysql/etc/my.cnf #定义初始设置的安放位置
cd /usr/local/mysql #进入MySQL根目录进行用户组的设置
chown -R mysql .
chgrp -R mysql . #给予mysql用户组读写权限
bin/mysql_install_db --user=mysql --defaults-file=/usr/local/mysql/etc/my.cnf #这一步异常重要,安装初始配置文件,减少很多麻烦
chown -R root . #给予root用户组使用权
chown -R mysql var #实测这一步非常关键,这里涉及“/var“文件的访问权限
/usr/local/mysql/mysqld_safe -defaults-file=/usr/local/mysql/etc/my.cnf --user=mysql & #开启安全模式、且用户为mysql用户组
到此,MySQL的源码编译运行是结束了,但是多半不会那么顺利的!
你们有可能会遇到下面的一些问题:
问题一
发生在make阶段: No curses/termcap library found
解决的办法是:
apt list|grep ncurses
apt install libncurses-dev
版本不同可能会有不同
问题二
发生在make阶段:
error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
解决的办法是:
sudo apt-get install libncurses5-dev
如果这个时候显示已经安装或者安装成功之后发现运行make
依然不成功,则看看报错的地方调用了什么地方的库文件,有可能那个目录没有,但是其他的目录有例如:
问题三
发生在make阶段:这是一个发生在Mac上面的错误
Mountain Lion MacOSX sed: RE error: illegal byte sequence’
解决的办法是:
先执行这两句,再make
export LC_COLLATE='C'
export LC_CTYPE='C'
问题四
有可能发生在make也有可能再make install阶段:
macaclocal: command not found
解决的办法是:
安装automake相关的可执行文件:
apt-get install automake
apt-get install autoconf
apt-get install aclocal
问题五
发生在make install的几率很大:
libtoolize: command not found
解决的办法是:
apt install libtool
问题六
发生在初次启动(即本教程的最后一个语句执行的时候)
Manager of pid-file quit without updating fi[FAILED]的报错
解决的办法是:
注释/etc/my.cnf
里的skip-federated,即#skip-federated
问题七
这个时候直接打开MySQL的命令可能会有的问题:
Can ‘t connect to local MySQL server through socket ‘/tmp/mysql.sock ‘(2)
解决的办法:
推荐这篇博客,一般遇到这种情况是由于比较复杂的情况,当然如果没有正常的安装完成直接执行也会有这个问题,但是如果成功安装之后遇到这类的问题其实是很少的,但是也是比较热门的问题:
解决Can ‘t connect to local MySQL server through socket ‘/tmp/mysql.sock ‘(2) “
问题八
发生在服务器比较多(很多时候是make 的时候)
virtual memory exhausted: Cannot allocate memory
发生该问题的原因是服务器的内存不够,从而导致编译失败。而购买的服务器,未给你分配虚拟内存,所以可以通过自行增加虚拟内存的方法予以解决:
dd if=/dev/zero of=/swap bs=1024 count=1M
mkswap /swap
swapon /swap
echo "/swap swap swap sw 0 0" >> /etc/fstab
毕竟是服务器嘛~
如果一切顺利那么会看到下面的几个场景:
初始设置成功
bin/mysql_install_db --user=mysql --defaults-file=/usr/local/mysql/etc/my.cnf
打开服务成功
/usr/local/mysql/mysqld_safe -defaults-file=/usr/local/mysql/etc/my.cnf --user=mysql &
/usr/local/mysql/share/mysql/mysql.server start/stop #开始结束
打开MySQL成功
/usr/local/mysql/bin/mysql -umysql -p
到这为止,整个过程就算是结束了,当然还有用户的设置,那些都是常规操作了。
后语:安装的教程很多,每一个人的机器都有自己的相关的不同的配置,但是多琢磨会发现,MySQL的移植性做的还行!下一节将会从宏观的角度讲解关系型数据库的运行原理。