一條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
連接成功后就可以進行斷點調試了。