<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MySQL8.0源碼編譯和Clion調(diào)試

          共 3768字,需瀏覽 8分鐘

           ·

          2022-06-09 11:33

          點(diǎn)擊上方"程序員歷小冰",選擇“置頂或者星標(biāo)”

          ? ?你的關(guān)注意義重大!

          MySQL 是最為流行的開源關(guān)系型數(shù)據(jù)庫(kù)之一,有關(guān)它的使用、優(yōu)化和運(yùn)維處理相關(guān)的文章汗牛充棟。我個(gè)人也寫過(guò)《MySQL探秘》和《MySQL死鎖》系列文章,詳細(xì)介紹了諸如 MySQL 內(nèi)存結(jié)構(gòu)、持久化機(jī)制、鎖和事務(wù)等多方面的知識(shí)。不過(guò)上述知識(shí)大多數(shù)都來(lái)自《高性能MysQL》、《MySQL技術(shù)內(nèi)幕:InnoDB存儲(chǔ)引擎》等書籍以及網(wǎng)上一些優(yōu)秀博主的文章。

          所以本人也希望更進(jìn)一步,進(jìn)入MySQL源碼層面,從源碼方面了解其具體實(shí)現(xiàn),為自己累計(jì)數(shù)據(jù)庫(kù)內(nèi)核方面的開發(fā)經(jīng)驗(yàn)。有關(guān) MySQL 和 RocksDB 的源碼閱讀其實(shí)已經(jīng)持續(xù)了半年左右,所以現(xiàn)在希望開一個(gè)新坑,從源碼層面講解一下 MySQL。


          想要了解數(shù)據(jù)庫(kù)內(nèi)核開發(fā),直接去閱讀MySQL巨量的源碼并不是一個(gè)最優(yōu)的方法,讀者們可以先從諸如 Pingcap Talent 和 CMU 15-445/645 課程入手。不過(guò)我也只是一個(gè)學(xué)習(xí)者,寫系列文章更多是通過(guò)記錄和輸出來(lái)幫助學(xué)習(xí),所以如有紕漏,還請(qǐng)各位讀者指出。


          閱讀源碼過(guò)程中,最好可以手動(dòng)調(diào)試,重復(fù)了解代碼的實(shí)現(xiàn),所以編譯和調(diào)試MySQL代碼很重要,不過(guò)整個(gè)過(guò)程中還是遇到了一些坑,所以這里記錄一下整個(gè)過(guò)程和遇到的坑。

          操作系統(tǒng)環(huán)境

          我把個(gè)人的臺(tái)式機(jī)重裝了 Ubuntu 20.04 ,內(nèi)核版本是 5.13.0-44-generic,內(nèi)存16G,磁盤240G,有關(guān)依賴的編譯工具版本如下所示。

          相關(guān)的安裝命令是從 PolarDB-通過(guò)編譯源碼安裝部署文檔上來(lái)的,專門適配于 Ubuntu 20版本,Centos的版本可以具體去它文檔中查看

           安裝GCC7
          apt install -y gcc-7 g++-7
          update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 \
          ? ? ? ? ? ? ? ? ? ? ? ? --slave /usr/bin/g++ g++ /usr/bin/g++-7
          update-alternatives --config gcc
          gcc --version
          g++ --version

          # 安裝依賴
          apt install make automake cmake git bison libaio-dev libncurses-dev libsasl2-dev libldap2-dev libssl-dev pkg-config

          MySQL 源碼下載

          我們選擇最新的 8.0.28版本,可以去 https://dev.mysql.com/downloads/mysql/ 直接下載帶 Boost 第三方庫(kù)依賴的源碼。

          Boost 是一個(gè)功能強(qiáng)大、構(gòu)造精巧、跨平臺(tái)、開源并且完全免費(fèi)的 C++ 程序庫(kù),可以認(rèn)為是半個(gè)C++標(biāo)準(zhǔn)庫(kù)。MySQL 的代碼依賴 Boost庫(kù),所以直接下載一個(gè)攜帶Boost庫(kù)的源碼比較省心,不需要再去下載對(duì)應(yīng)的Boost庫(kù)。

          編譯命令

          我們首先需要使用 cmake 進(jìn)行編譯,可以直接使用命令行,也可以用 Clion 開發(fā)后,配置對(duì)應(yīng)的cmake編譯配置。

          其中,有關(guān) CMake Options 的部分參數(shù)如下所示:

          -DWITH_BOOST=~/work/c++/mysql-8.0.28/boost -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/home/homer/build -DMYSQL_DATADIR=/home/homer/build/data -DSYSCONFDIR=/home/homer/build -DMYSQL_UNIX_ADDR=/home/homer/build/data/mysql.sock -DMYSQL_MAINTAINER_MODE=false

          其中比較重要的有:

          • DWITH_BOOST: 指定 boost 路徑,可以直接指向源碼文件夾下的boost文件夾;

          • DCMAKE_BUILD_TYPE: 表示是debug,方便后續(xù)代碼調(diào)試;

          • DCMAKE_INSTALL_PREFIX: ?表示編譯狀態(tài)的路徑,選擇源碼文件夾之外的一個(gè)自建的build文件夾

          • DMYSQL_DATADIR:表示MySQL默認(rèn)的數(shù)據(jù)目錄,選擇build文件夾下的data文件

          然后執(zhí)行命令進(jìn)行編譯,大概會(huì)花費(fèi)數(shù)分鐘的時(shí)間,并且可能會(huì)出現(xiàn)各類錯(cuò)誤和問(wèn)題。問(wèn)題和錯(cuò)誤會(huì)在本文后邊進(jìn)行記錄。

          Clion 調(diào)試

          如果Clion的CMake執(zhí)行成功后,就會(huì)出現(xiàn)對(duì)應(yīng)的 Run / Debug Configurations 選項(xiàng),里邊會(huì)有名稱為mysqld的選項(xiàng),它就是 MySQL Server 啟動(dòng)的選項(xiàng)。可以先用該選項(xiàng)執(zhí)行 MySQL 數(shù)據(jù)目錄的初始化操作,生成對(duì)應(yīng)的配置文件和用戶名密碼。然后再使用該選項(xiàng)來(lái)啟動(dòng) MySQL Server。兩個(gè)操作對(duì)應(yīng)的參數(shù)不同。


          第一步初始化數(shù)據(jù)目錄時(shí),也需要先創(chuàng)建對(duì)應(yīng)的用戶。

          # 創(chuàng)建 MySQL 用戶組和 MySQL 用戶
          groupadd mysql
          useradd -r -g mysql -s /bin/false mysql

          然后使用 clion 的 mysqld 執(zhí)行選項(xiàng),輸入的 Program arguments 如下所示:

          --basedir=/home/homer/build --datadir=/home/homer/build/data --lower_case_table_names=0 --initialize-insecure --user=mysql

          其中 --initialize-insecure 表示非安全的初始化,可以設(shè)置無(wú)密碼的用戶。然后需要給對(duì)應(yīng)的文件夾添加讀寫和執(zhí)行權(quán)限。

          chmod -R 777 /home/homer/build/data

          初始化后,就可以繼續(xù)使用 clion 的 mysqld 執(zhí)行選項(xiàng)來(lái)啟動(dòng) MySQL了。輸入的 Program arguments 如下所示:

          --basedir=/home/homer/build --datadir=/home/homer/build/data --lower_case_table_names=0 --user=mysql

          然后我們可以在 /home/homer/build/bin 目錄下執(zhí)行 ./mysql -uroot -h127.0.0.1 -P3306 -p來(lái)使用客戶端連接 MySQL Server。登錄時(shí)無(wú)需密碼,直接回車。

          然后就可以看到我們?cè)赾lion中設(shè)置斷點(diǎn)的代碼邏輯被攔截,下面我們就可以進(jìn)行調(diào)試和代碼閱讀了。


          問(wèn)題記錄

          在整個(gè)過(guò)程中,特別是編譯階段遇到了很多問(wèn)題,這里也簡(jiǎn)單記錄一下,相信不同的同學(xué)進(jìn)行這個(gè)過(guò)程中都會(huì)遇到不同的問(wèn)題,大家耐心解決。

          一、default.cfg不存在

          編譯時(shí)會(huì)有如下報(bào)錯(cuò):

          CMake Error: File /home/homer/work/c++/mysql-8.0.28/router/src/harness/tests/data/logger.d/default.cfg does not exist.

          CMake Error at router/cmake/testing.cmake:211 (CONFIGURE_FILE):

          可以在 cmake配置文件中找到如下片段,直接刪除。

          CONFIGURE_TEST_FILE_TEMPLATES(${CMAKE_CURRENT_SOURCE_DIR}/data
          "tests-good-1.cfg.in;tests-good-2.cfg.in;tests-start-1.cfg.in")
          SET(TEST_FILES
          logger.cfg
          magic-alt.cfg
          tests-bad-1.cfg
          tests-bad-2.cfg
          tests-bad-3.cfg
          )


          二、編譯警告作為錯(cuò)誤處理

          在編譯過(guò)程中,發(fā)現(xiàn)編譯器會(huì)把warning當(dāng)做error處理,導(dǎo)致整個(gè)編譯過(guò)程失敗。具體報(bào)錯(cuò)如下所示。

          cc1plus: all warnings being treated as errors

          經(jīng)過(guò)搜索最終在 https://dev.mysql.com/doc/mysql-sourcebuild-excerpt/8.0/en/compilation-problems.html 文檔中找到了對(duì)應(yīng)的解決版本,需要將DMYSQL_MAINTAINER_MODE設(shè)置為false,否則就會(huì)導(dǎo)致編譯器將warning作為error處理。

          嵌入可以理解為一種組合或者代理模式的自動(dòng)語(yǔ)法糖。

          三、編譯cache

          編譯異常后,需要?jiǎng)h除對(duì)應(yīng)的 cmake cache 后再次進(jìn)行編譯,否則每次都會(huì)讀取緩存進(jìn)行相同的報(bào)錯(cuò)。


          后記

          我個(gè)人有關(guān) MySQL 源碼編譯和調(diào)試的過(guò)程就如本文所示,后續(xù)就開始相關(guān)源碼的閱讀和學(xué)習(xí)了。希望大家持續(xù)關(guān)注。

          -關(guān)注我

          推薦閱讀

          MySQL讀寫分離,寫完讀不到問(wèn)題如何解決

          MySQL 的 join 功能弱爆了?

          線上發(fā)生死鎖異常了,該怎么辦


          瀏覽 63
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品无码污污污 | 日日操夜夜爽 | 亚洲a免费观看 | 日韩欧美高清视频 | 精品无码在线视频 |