引言
为了方便后续调试学习源码,先自己动手编译一个Debug版本的MySQL。我这里使用的环境是CentOS版的WSL。如果系统不是Win10没有WSL,可以用虚拟机安装CentOS,也可以在Docker中拉个CentOS镜像创建实例。MySQL选择5.7中当前最新的一个GA版本,即5.7.28。
下载源码
我的WSL是自动root登录的,用户目录为/root。从MySQL官方的CDN中下载源码,并解压到用户目录下。我这里放置的目录为/root/develop/mysql-5.7.28,其中mysql-5.7.28为压缩包里自带的文件夹。
wget https://cdn.mysql.com/Downloads/MySQL-5.7/mysql-boost-5.7.28.tar.gz
tar -xzvf mysql-boost-5.7.28.tar.gz -C ~/develop
构建安装
安装依赖的工具,如果一开始不知道要装哪个,可以先不装,等到执行时少了某个命令,或者编译出错也会提示缺少什么工具,这时再一个个补上。
yum install -y cmake gcc gcc-c++ gdb
yum install -y openssl-devel ncurses-devel
yum install -y bison
gcc/gcc-c++是C和C++的编译器,cmake是构建工具,gdb是调试器,openssl-devel是TLS和SSL协议的开发包,ncurses-devel是字符终端显示的开发包,bison是一个语法分析器生成器。
接下来可以开始编译和安装了。首先建个文件夹output来存放编译过程产生的文件,方便管理。这也是使用cmake的好处,可以建多个文件夹,分别用不同的参数来构建。
cd ~/develop/mysql-5.7.28
mkdir output
cd output
cmake .. -DWITH_DEBUG=1 \
-DWITH_UNIT_TESTS=0 \
-DWITH_BOOST=../boost/boost_1_59_0
make -j 10
make install
WITH_DEBUG参数设置编译模式是否是Debug,配置了这个参数,脚本会去设置CMAKE_BUILD_TYPE=Debug。WITH_UNIT_TESTS参数设置是否需要单元测试。boost库为C++标准库提供了扩展功能,我们下的源码中已自带,需要用WITH_BOOST指定boost库的路径。由于编译很慢,这里设置10个线程加快编译速度。
如果cmake过程中发生错误,需要删掉CMakeCache.txt文件,然后重新运行cmake。
rm CMakeCache.txt
如果想要把编译安装过程中产生的文件都删除掉,可以运行如下命令:
xargs rm < install_manifest.txt
rm -rf ../output
make install时会把安装的文件记录在install_manifest.txt,查看该文件可以发现,默认都放在/usr/local/mysql下,所以删掉/usr/local/mysql和output两个文件夹即可。
初始化
如果直接用root用户初始化,不被允许会报错。所以在初始化前,建个mysql组和不允许登录的mysql用户,并把我们编译好的mysql目录权限给它。
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
chown -R mysql:mysql /usr/local/mysql
mysqld是MySQL的核心程序,加initialize参数初始化后会自动生成数据文件夹,一般是/usr/local/mysql/data,也会创建MySQL的root用户,带初始密码,注意从控制台中复制出来,第一次登录需要使用。mysql_ssl_rsa_setup会创建SSL证书和RSA公私钥。
/usr/local/mysql/bin/mysqld --initialize --user=mysql
/usr/local/mysql/bin/mysql_ssl_rsa_setup
mysqld --initialize --user=mysql执行后控制台输出的root密码如下:
[Note] A temporary password is generated for root@localhost: haQ2Ql3gM+T1
这里haQ2Ql3gM+T1即为密码,每次初始化都不一样的值。接下来启动mysqld,并用mysql客户端连接,修改个好记的密码就大功告成了。
/usr/local/mysql/bin/mysqld_safe --user=mysql &
mysqld_safe是一个脚本文件,会帮我们启动mysqld。也可以直接启动mysqld,但是需要指定的参数会多些。如果想用gdb调试,就只能通过mysqld了。
/usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql
修改密码
下面登录mysql,修改密码为123456。
/usr/local/mysql/bin/mysql -u root -p
SET PASSWORD = PASSWORD('123456');
因为这里编译的目的是给后续调试使用,所以不设置服务自启动。
关键词
下载源码;构建安装;初始化;修改密码