Mac下使用Clion调试MySQL源码配置流程

   一条SQL语句是如何执行的?count(*),count(1)有什么不同?insert数据时为什么有时候会导致自增主键不连续?等等这一系列问题,可能我们在网上的各种文章上能看到具体的讲解,但是很少有文章能分析到源码层级,都是直接告诉我们结果是什么。深入理解这些问题的实现过程就需要我们自己去看MySQL的源码来找寻答案。

   网上搜寻了一些调试源码的文档,发现不全面,所以结合自身配置过程,形成一篇教程以供参考。

一、准备工作

1、MacBook笔记本;[有homebrew]

2、创建MySQL安装目录和MySQL data目录

#mysql安装目录
mkdir -p /Users/tal/data0/dev_mysql/build_out
#mysql data目录 mkdir
-p /Users/tal/data0/dev_mysql/build_out/data

3、下载MySQL源码包;

#这里选择5.7.30版本: [https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.30.tar.gz]
#进入下载目录
cd /Users/tal/data0/dev_mysql
#下载源码包
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.30.tar.gz
#解压源码包
tar -zxvf mysql-5.7.30.tar.gz

4、cmake环境;

brew install cmake

这里额外说一下homebrew配置国内源以提高效率:

# 替换 Homebrew
git -C "$(brew --repo)" remote set-url origin https://mirrors.ustc.edu.cn/brew.git

# 替换 Homebrew Core
git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git

# 替换 Homebrew Cask
git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git

# 替换 Homebrew-bottles
# 对于 bash 用户:
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile
# 对于 zsh 用户:
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc
source ~/.zshrc

 

二、编译安装MySQL

#进入mysql解压目录
cd /Users/tal/data0/dev_mysql/mysql-5.7.30
#执行cmake 这里用sudo
sudo cmake . -DWITH_DEBUG=1 \
-DCMAKE_INSTALL_PREFIX=/Users/tal/data0/dev_mysql/build_out \
-DMYSQL_DATADIR=/Users/tal/data0/dev_mysql/build_out/data

若遇到以下报错:

CMake Error at cmake/boost.cmake:88 (MESSAGE):
  You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=<directory>

  This CMake script will look for boost in <directory>.  If it is not there,
  it will download and unpack it (in that directory) for you.

  If you are inside a firewall, you may need to use an http proxy:

  export http_proxy=http://example.com:80

Call Stack (most recent call first):
  cmake/boost.cmake:245 (COULD_NOT_FIND_BOOST)
  CMakeLists.txt:547 (INCLUDE)


-- Configuring incomplete, errors occurred!
See also "/Users/tal/data0/dev_mysql/mysql-5.7.30/CMakeFiles/CMakeOutput.log".

则说明缺少boost,我们参照提示增加cmake参数:

#首先创建boost目录
sudo mkdir -p /usr/local/boost

#然后
#增加DDOWNLOAD_BOOST=1 自动下载boost
#DWITH_BOOST=/usr/local/boost  指定boost目录
sudo cmake . -DWITH_DEBUG=1 \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/usr/local/boost \
-DCMAKE_INSTALL_PREFIX=/Users/tal/data0/dev_mysql/build_out \
-DMYSQL_DATADIR=/Users/tal/data0/dev_mysql/build_out/data

如果网络不好的话,估计会超时,下载不下来boost,会提示:

CMake Error at cmake/boost.cmake:194 (MESSAGE):
  You can try downloading
  http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
  manually using curl/wget or a similar tool, or increase the value of
  DOWNLOAD_BOOST_TIMEOUT (which is now 600 seconds)
Call Stack (most recent call first):
  CMakeLists.txt:547 (INCLUDE)

-- Configuring incomplete, errors occurred!

如果这样的话,那我们wget单独下载boost:

#进入boost目录
cd /usr/local/boost

#wget
sudo wget http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz

#解压
sudo tar -xvzf boost_1_59_0.tar.gz

然后继续执行之前的cmake

sudo cmake . -DWITH_DEBUG=1 \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/usr/local/boost \
-DCMAKE_INSTALL_PREFIX=/Users/tal/data0/dev_mysql/build_out \
-DMYSQL_DATADIR=/Users/tal/data0/dev_mysql/build_out/data

最好将整个dev_mysql目录的权限更改为当前用户,不要root。且sudo设置为不输入密码。

以上,就编译好了。接下来开始配置Clion:

将/Users/tal/data0/dev_mysql/mysql-5.7.30的MySQL源码引入。

然后进入Clion的配置型:将之前cmake编译的参数放到CMake options中

填写完之后Apply ok后,返回代码界面:

在命令里周到mysqld,然后点击修改配置[Edit Configura...],对命令参数进行配置:

对mysqld命令追加参数: --defaults-file=/Users/tal/data0/dev_mysql/build_out/dev_my.cnf

dev_my.cnf参考内容:

[mysqld]
log-error=/tmp/dev_mysql_log.err
basedir=/Users/tal/data0/dev_mysql/build_out/
datadir=/Users/tal/data0/dev_mysql/build_out/data/
pid-file=user.pid
skip-grant-tables
innodb_file_per_table=1
port=33060
# transaction_isolation=READ-COMMITTED

[client]
# 客户端来源数据的默认字符集
default-character-set=utf8mb4
[mysqld]
# 服务端默认字符集
character-set-server=utf8mb4
# 连接层默认字符集
collation-server=utf8mb4_unicode_ci
socket=/Users/tal/data0/dev_mysql/build_out/mysql.sock

[mysql]
# 数据库默认字符集
default-character-set=utf8mb4
socket=/Users/tal/data0/dev_mysql/build_out/mysql.sock

之后就可以进行debug了:点击debug启动mysql,第一次编译会比较慢,耐心等待下。

 

启动之后如下:

 

看下端口,是否成功启动了:

lsof -i:33060
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
mysqld  39231  tal   13u  IPv6 0xb98aab9dd3abf795      0t0  TCP *:33060 (LISTEN)

然后我们连接客户端试试:

cd /Users/tal/data0/dev_mysql/build_out
./bin/mysql -uroot --port=33060 --socket=/Users/tal/data0/dev_mysql/build_out/mysql.sock

连接成功后就可以进行断点调试了。 

 

 

  

posted @ 2020-08-24 11:19  弍月关  阅读(1113)  评论(0编辑  收藏  举报