工具 | 使用 CLion 編譯除錯 MySQL 8.0
MySQL 原始碼是基於關係模型理論的具體實現,是資料庫理論與實踐的結合。
閱讀 MySQL 及相關工具的原始碼,不僅是資料庫研發人員的日常,也是 DBA 進階的必經之路,全方位提高技術水平。
- 夯實原理: 對資料庫基礎理論以及事務等相關理論更加深刻的認識;
- 優化效能: 更加深入理解配置項的作用,適配環境,提升效能;
- 定位故障: 有助於資料庫故障的快速定位,知其然也知其所以然;
- 擁抱開源: 修改原始碼(修改 Bug、完善功能、提升效能),回饋開源。
| 從哪開始閱讀?
閱讀 MySQL 原始碼,主要是指閱讀 mysql-server[1] 裡面的程式碼。不僅需要理論知識的深入學習,還需要實際應用上手實踐,具體可從以下幾個角度著手,從不同維度,不同深度去了解 MySQL 原始碼。
1. SQL 執行流程
通過環境除錯,從理論基礎實踐掌握 SQL 語句(DDL/DML 等)完整的執行流程。
2. 結構層次
通過 MySQL 原始碼結構層次,掌握底層技術原理。
- 接入層:MySQL 協議、連線執行緒池等;
- SQL 層:詞法、語法解析、執行器、優化器;
- 儲存引擎層:外掛框架、儲存引擎設計原理,例如 InnoDB、RocksDB 架構等。
3. 資料抽象/資料轉換
資料庫對於使用者展現的是二維的關係表。在閱讀原始碼的時候,可以從資料抽象/資料轉換的角度去閱讀。
- 資料抽象:二維的關係表在 SQL 層/儲存引擎中的資料表現形式
- 資料轉換:二維關係表在 SQL 層到儲存引擎的資料轉換/儲存引擎到磁碟的資料轉換
4. 功能實現
通過觀察資料庫中每種具體功能的實現方式,來熟悉 MySQL 原始碼。
| 準備除錯環境
正所謂:“工欲善其事必先利其器”,閱讀原始碼必須要閱讀 "動" 態的程式碼,僅看 "靜" 態程式碼必定是枯燥且無用的。那麼搭建一個能夠除錯 MySQL 原始碼的環境,則是閱讀 MySQL 原始碼,實踐並掌握 MySQL 技術知識必不可少的過程。
本文介紹使用 CLion 在 Ubuntu 下的除錯過程,來例項演示 MySQL 原始碼環境的除錯過程,即從實踐掌握 SQL 執行流程。
CLion 簡介
CLion[2] 是一款專門為開發 C 及 C++ 所設計的跨平臺 IDE。它包含了外掛以及智慧功能來幫助開發人員提高開發程式碼的效率。
環境
- 作業系統:20.04.1-Ubuntu
- CLion 版本: CLion 2021.1.1
- MySQL 版本:8.0.25
編譯依賴
apt install libncurses-dev
apt install libssl-dev
apt install cmake
apt-get install bison
*MySQL 8.0.25 依賴 boost 1.73.0 版本[3]
CLion 除錯配置
通過 CLion 除錯 MySQL 原始碼,需將 MySQL 編譯路徑與 MySQL 安裝路徑的配置統一。
1. 將下載的原始碼放入 home 目錄中
2. 解壓原始碼,並在原始碼目錄下建立 build 和 /build/data 兩個目錄
3. 配置 CLion 的 Cmake 的編譯目錄
4. 配置 CLion 的 Cmake 的編譯引數
-DCMAKE_BUILD_TYPE=Debug
-DWITH_BOOST=/home/tool/boost_1_73_0
-DCMAKE_INSTALL_PREFIX=/home/code/mysql-server-mysql-8.0.25/build
#編譯路徑與安裝路徑需一致
-DMYSQL_DATADIR=/home/code/mysql-server-mysql-8.0.25/build/data
#資料庫初始化路徑
-DSYSCONFDIR= home/code/mysql-server-mysql-8.0.25/build
-DMYSQL_UNIX_ADDR=/home/code/mysql-server-mysql-8.0.25/build/data/mysql.sock
5. MySQL 編譯
方法一:使用 CLion 直接編譯
方法二:手動編譯
cd /home/code/mysql-server-mysql-8.0.25/build
make -j 4
說明:由於 CLion 匯入 MySQL 原始碼時,會在
/home/code/mysql-server-mysql-8.0.25/build
下面生成 makefile,可以直接執行 make 命令。
6. MySQL 資料庫初始化
# 建立 MySQL 使用者組和 MySQL 使用者
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
# MySQL 資料庫初始化
cd /home/code/mysql-server-mysql-8.0.25/build/bin
./mysqld --basedir=/home/code/mysql-server-mysql-8.0.25/build \
--datadir=/home/code/mysql-server-mysql-8.0.25/build/data \
--initialize-insecure --user=mysql
7. 修改檔案許可權
chmod -R 777 /home/code/mysql-server-mysql-8.0.25/build/data
8. 設定 CLion 的 mysqld 配置引數
Program arguments
引數設定為:
--basedir=/home/code/mysql-server-mysql-8.0.25/build --datadir=/home/code/mysql-server-mysql-8.0.25/build/data --user=mysql
Working directory
引數設定為:
/home/code/mysql-server-mysql-8.0.25/build/data
9. 除錯 mysqld
步驟一:啟動 mysqld ,並驗證 mysqld 是否啟動 ps -ef | grep mysql
步驟二:在 sql_parse.cc 中的 do_command
函式加上斷點。
步驟三:登入 MySQL ,驗證環境是否正常執行。
./mysql -uroot -h127.0.0.1 -P3306 -p
說明:初次登入無需密碼,直接回車。初始化時的引數
--initialize-insecure
。
| 結語
至此 MySQL 原始碼除錯環境正常執行,可在除錯環境上執行相關操作。瞭解 MySQL 原始碼執行機制、實現原理、配置引數作用等。
下期預告
下一期,我們將使用準備好的環境一起來閱讀 MySQL 外掛框架部分的原始碼,盡情期待~
參考
[1]. mysql-server:https://github.com/mysql/mysql-server/
[2]. CLion:https://www.jetbrains.com/clion/
[3]. boost :https://www.boost.org/
關於 RadonDB
RadonDB開源社群 是一個面向雲原生、容器化的資料庫開源社群。為資料庫技術愛好者提供圍繞主流開源資料庫(MySQL、PostgreSQL、Redis、MongoDB、ClickHouse 等)的技術分享平臺,並提供企業級 RadonDB 開源產品及服務。
目前 RadonDB 開源資料庫系列產品已被 光大銀行、浦發矽谷銀行、哈密銀行、泰康保險、太平保險、安盛保險、陽光保險、百年人壽、安吉物流、安暢物流、藍月亮、天財商龍、羅克佳華、升哲科技、無錫匯跑體育、北京電信、江蘇交通控股、四川航空、昆明航空、國控生物 等上千家企業及社群使用者採用。
RadonDB 可基於雲平臺與 Kubernetes 容器平臺交付,不僅提供覆蓋多場景的資料庫產品解決方案,而且提供專業的叢集管理和自動化運維能力,主要功能特性包括:高可用主從切換、資料強一致性、讀寫分離、一鍵安裝部署、多維指標監控&告警、彈性擴容&縮容、橫向自由擴充套件、自動備份&恢復、同城多活、異地災備 等。RadonDB 僅需企業及社群使用者專注於業務層邏輯開發,無需關注叢集高可用選型、管理和運維等複雜問題,幫助企業及社群使用者大幅度提升業務開發與價值創新的效率!
GitHub:
https://github.com/radondb
微信群: 請搜尋新增群助手微訊號 radondb