一直有想学习MySQL源码的心,但止于相关基础资料太少、C语言基础薄弱等因素。
正好前段时间,姜承尧老师的公众号文章:《用VSCode编译和调试MySQL,每个DBA都应get的小技能》一文(地址:https://mp.weixin.qq.com/s/RO_Ipa9_SH8_DuVholrgvg)成功的吸引了我的注意。于是乎,在我们自己技术小交流群的大佬 @一米阳光 成功实践后,我也跃跃欲试,经过两天不懈努力和踩了无数坑后,终是将MySQL 8.0编译&调试环境搞定。
看了姜承尧老师的文章,感觉搭建起来很简单,但是自己实践后,才深刻体会到:纸上得来终觉浅,绝知此事要躬行!下面就来分享一下我的踩坑("避坑")历程。
由于虚拟机采用最小化安装,测试环境操作系统很多软件都没有预装。配置步骤会根据我的测试环境进行,同时我会把重要软件版本信息列出来供大家参考。
服务器配置及重要软件版本
名称 | 详情 |
---|---|
远程Linux服务器配置 | 【VMware】16C/32G/500G |
操作系统版本 | CentOS Linux release 7.5.1804 (Core) |
Linux内核版本 | 3.10.0-862.el7.x86_64 |
GCC版本 | 9.3.1 |
CMake版本 | cmake3 version 3.17.5 |
Git版本 | 2.33.1 |
本地PC操作系统版本 | macOS Monterey 12.0.1 |
VSCode版本 | 1.62.3 (latest) |
Linux终端命令行&中文显示设置
设置终端命令行中文显示:
vim /etc/locale.confLANG=zh_CN.UTF8
设置完/etc/locale.conf文件后,需要重启服务器(reboot)生效,echo $LANG查看当前的语言环境已经变为中文。
设置自定义的终端命令行提示符:
vim /etc/profile.d/login.sh#!/bin/bashlocal_ip=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`ID=`id -u`PS1='[\[\e[01;31m\]$local_ip:\u\[\e[m\]\[\e[1;33m\]@\[\e[m\]\[\e[1;35m\]\h\[\e[m\]:$PWD]\$ 'export PS1echo -e "\e[01;34m**********************************************************************************************\e[00m"echo -e "\e[01;31m*\e[00m"echo -e "\e[01;33m* ** 请注意你当前登录的用户和IP地址 **\e[00m"echo -e "\e[01;31m*\e[00m"echo -e "\e[01;33m* ** 你目前登录的账户是: \e[01;31m$LOGNAME\e[00m ** \e[00m"echo -e "\e[01;31m* \e[00m"echo -e "\e[01;33m* ** 语言环境是: \e[01;31m$LANG\e[00m ** \e[00m"echo -e "\e[01;31m* \e[00m"echo -e "\e[01;33m* ** 本机的IP地址: \e[01;31m$local_ip\e[00m ** \e[00m"echo -e "\e[01;31m* \e[00m"echo -e "\e[01;33m* ** 当前路径是: \e[01;31m$PWD\e[00m \e[00m"echo -e "\e[01;31m* \e[00m"if [[ $ID -eq 0 ]];thenecho -e "\e[01;33m* ** 当前系统时间:\e[m \e[01;31m`date +%F_%T`\e[m \e[01;33m当前硬件时间:\e[m \e[01;31m`hwclock --show`\e[m"elseecho -e "\e[01;33m* ** 当前系统时间:\e[m \e[01;31m`date +%F_%T`\e[m \e[01;33m"fiecho -e "\e[01;31m* \e[00m"echo -e "\e[01;33m* ** 备用说明: MySQL 8.0编译调试环境!~ ** \e[00m"echo -e "\e[01;31m* \e[00m"echo -e "\e[01;34m**********************************************************************************************\e[00m"HISTSIZE=999999HISTTIMEFORMAT="%Y/%m/%d_%H:%M:%S `whoami` :"HISTFILESIZE=500000000
加载一下:
source /etc/profile.d/login.sh
最后的效果如下图,喜欢的童鞋可以自行尝试。
必要设置和依赖包的安装
# 编辑/etc/ssh/sshd_config文件,设置AllowTcpForwarding参数值为yesvim /etc/ssh/sshd_configAllowTcpForwarding yes# 重启sshd使之生效systemctl restart sshd
安装常用软件和依赖包(踩了N多坑后得出的结论,重要!):
yum -y install net-tools wget vim jemalloc-devel jemalloc libudev-devel ncurses-devel openldap openldap-devel cyrus-sasl-plain cyrus-sasl-devel cyrus-sasl-gssapi bison
安装Git
# 安装Git所需要的依赖包yum install curl-devel expat-devel gettext-devel openssl-devel zlib-level gcc-c++ perl-ExtUtils-MakeMaker -y# 下载指定版本的Git源码包cd /usr/local/src/wget --no-check-certificate https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.33.1.tar.gztar -zvxf git-2.33.1.tar.gz# 编译安装cd git-2.33.1./configure --prefix=/usr/local/gitmake && make install# 删除已有的Git版本yum remove git# 添加Git到环境变量(文件末尾添加)vim /etc/profileGIT_HOME=/usr/local/gitexport PATH=$PATH:$GIT_HOME/bin# 刷新环境变量source /etc/profile# 查看Git版本确认安装成功git --version
安装GCC
# 安装第三方软件选集SCLyum install centos-release-scl# 安装GCC 9.+版本yum install devtoolset-9-gcc*# 切换至GCC 9的版本scl --listsource /opt/rh/devtoolset-9/enable# 查看GCC版本gcc -vscl enable devtoolset-9 bash# 查看GCC安装目录which gcc# 设置环境变量(将上述临时切换GCC版本的命令追加到~/.bash_profile文件)vim ~/.bash_profile# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then . ~/.bashrcfi# User specific environment and startup programsPATH=$PATH:$HOME/bin:/usr/local/git/binscl enable devtoolset-9 bashsource /opt/rh/devtoolset-9/enableexport PATH# 使环境变量生效source ~/.bash_profile# 查看当前环境GCC版本,确保版本正确gcc --versionenv
安装CMake
# 安装CMake3cd /etc/pki/rpm-gpgwget https://archive.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7yum install cmake3# 设置软链接ln -s /usr/bin/cmake3 /usr/bin/cmake# 查看CMake版本,确认是否安装成功cmake -version
下载MySQL 8.0源码
# 使用git clone方式下载源码git clone https://github.com/mysql/mysql-server.git
1、MySQL 8.0版本编译需要CMake3以上版本;
2、Linux系统自带的GCC版本是4.8.5,务必需要GCC 9.+版本并最好设置为默认版本;
3、在编译调试过程中,VSCode的OUTPUT会报各种各样软件版本错误,上文'安装常用软件和依赖包'是将这些错误全部摸排后的最少、且均需要的所有软件包,直接通过yum install命令安装即可。
VSCode(Visual Studio Code)是微软(Microsoft)在2015年4月30日Build开发者大会上正式宣布一个运行于Mac OS X、Windows和Linux之上的,针对于编写现代Web和云应用的跨平台源代码编辑器,可在桌面上运行,并且可用于Windows,macOS和Linux。
我们编译调试MySQL 8.0源码就使用该IDE工具,首先我们需要安装以下插件:
Remote - SSH (v0.66.1)C/C++ (v1.7.1)CMake (v0.0.17)CMake Tools (v1.9.2)Code Spell Checker (v2.0.13)Doxygen Documentation Generator (v1.3.2)
VSCode软件的安装也非常简单,这里就不一一赘述了。插件的安装也非常简单,在插件页签下,搜索对应的插件,直接Install即可,非常方便。比如,我想安装一个'Docker Explorer'插件(如图4步即可搞定)。
通过Remote SSH连接远程Linux服务器
按照给出的格式填写我们自己远程Linux服务器的连接信息。我的连接地址就是'ssh root@192.168.11.36 -A'。第一次连接后,这个信息就会保存下来,下次我们直接可以通过下面的方式进行直接连接。
如果没有安装,我们需要安装一下,如下图4步,可以快速进行安装(查找并选择我们要安装的插件,点击OK即可完成安装)。
编译MySQL 8.0
选择源码目录并打开(如下图所示4步)。
如下图我们要运行和调试的程序是[mysqld],表示运行MySQL Server程序。
Code → Preferences → Settings → 'cmake:Configure' → 【Cmake:Configure Args】-DWITH_BOOST=./boost-DDOWNLOAD_BOOST=1-DWITH_JEMALLOC=1
Code → Preferences → Settings → 'cmake:Cache’ →【Cmake:Cache Init】"cmake.debugConfig": {"args:": ["--user=root --log-error=error.log"],}
编译完成,如下图。
调试MySQL 8.0
设置断点(鼠标左键在行号前单击一下即可),按最下面的小虫子图标就可以调试程序了。
进入调试阶段。
end