1. 程式人生 > 其它 >工具 | 使用 CLion 編譯除錯 MySQL 8.0

工具 | 使用 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