zoukankan      html  css  js  c++  java
  • 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

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

      

  • 相关阅读:
    node 读取文件
    jQuery全局事件处理函数
    可以发送不同源请求的方式
    ajax 高度封装的函数
    jQuery中AJAX的回调
    jQuery中对AJAX的封装
    ajax 基本的封装
    AJAX 返回数据问题
    ajax 关于响应类型
    动态渲染数据到表格中
  • 原文地址:https://www.cnblogs.com/deverz/p/13552763.html
Copyright © 2011-2022 走看看