windows下使用visual studio編譯調試MySQL
MySQL是一種開放源代碼的關系型數據庫管理系統(RDBMS),使用最常用的數據庫管理語言--結構化查詢語言(SQL)進行數據庫管理。MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載並根據個性化的需要對其進行修改。MySQL因為其速度、可靠性和適應性而備受關注。大多數人都認為在不需要事務化處理的情況下,MySQL是管理內容最好的選擇。(本段話摘抄自百科)
作為一個開源的系統,源碼當然是最權威的資料。本文詳細的描述如何在wndows平台下使用visual studio對MySQL進行編譯調試。網上關於這類的文章比較少,而且基本都是調試的MySQL5的文章。我從決定調試MySQL8開始,斷斷續續用了兩周的時間,一度想放棄。好在最終陰差陽錯的給弄出來了,本文詳細的介紹了在調試MySQL8的過程中遇到的坑。話不多說,正文開始:
環境准備
1、windows10 x64 操作系統
2、Microsoft Visual Studio 2019
3、cmake
4、bison-2.4.1-setup.exe
5、boost_1_72_0
6、mysql-8.0.21.zip
簡單介紹一下上述的幾個軟件。windows10建議用配置好一點的電腦,否則編譯會很慢。Microsoft Visual Studio 2019從微軟官網下載安裝即可,cmake可以是免安裝版的或者安裝版的,請注意需要配置環境變量。bison是一個解析生成器,許多文檔都說需要安裝bison。但是好像不裝也沒問題,反正我已經裝了,就暫且把它寫進去吧,bison安裝完也是需要配置環境變量的。MySQL參考手冊上說的很明白,用Standard Source Distribution來build工程不需要Bison,而用Development Source Tree才需要Bsion,從官網上直接下載的標准版的源碼ZIP包就是Standard Source Distribution,而在GitHub下載的最新的開發源碼就是Development Source Tree。不裝bison能不能成功我也懶得去測試了,畢竟編譯一次也是要很久的。boost是必須要有的,不同版本的MySQL對應不同版本的boots庫。如果不知道用哪個版本,可以先執行cmake,cmake會提示下載相應版本的boost。MySQL源碼建議從官網下載。
cmake編譯
上述的軟件都准備好了,就可以開始用cmake編譯MySQL了。
解壓mysql-8.0.21.zip。我解壓的路徑為 F:\IDE\vs2019\MySQLSC。 在源碼的解壓路徑下創建兩個文件夾, boost 和 bld。
將boost_1_72_0.tar.gz拷貝到boost文件夾一份,就可以開始編譯了。在命令提示符(或powershell)執行如下命令:
cmake .. -DDOWNLOAD_BOOST=1 -DWITH_BOOST="F:\IDE\vs2019\MySQLSC\boost\boost_1_72_0.tar.gz" -DWITH_DEBUG=1 -- Building for: Visual Studio 16 2019
如果boost庫有問題或者版本不對。cmake會自動下載正確的版本,可能因為網絡問題下載失敗(cmake的服務器在國外),此處會報錯,並提示正確版本boost庫的下載地址。手動下載boost庫后,換進去重新cmake編譯即可。
當看到 Bulid files have been written to ... 這句話時,說明已經編譯完成了。進入到 F:/IDE/vs2019/MySQLSC/bld文件夾,你會看到熟悉的 MySQL.sln。就可以用vs2019來構建MySQL服務了。
構建前准備
vs工程都已經生成了,還需要准備什么?當然是我踩過的坑了,能避免的肯定要提前避免了。要不編譯了那么久,一大堆報錯還要重新編譯。
1、打開調試模式,F:\IDE\vs2019\MySQLSC\sql\mysqld.cc中的 test_lc_time_sz方法中的 DBUG_ASSERT(0); 改成 DBUG_ASSERT(1);
2、F:\IDE\vs2019\MySQLSC\sql\sql_locale.cc 用 [utf-8 + BOM] 格式保存一下,可以使用notepad++打開修改編碼。
3、F:\IDE\vs2019\MySQLSC\plugin\x\src\mysql_function_names.cc 頭文件添加 #include <iterator>
4、F:\IDE\vs2019\MySQLSC\components\example\test_string_service_charset.cc 編碼修改為[utf-8 + BOM] 存在中文
用VS構建MySQL服務
打開vistul studio 2019。打開MySQL.sln。選擇ALL_BULID項目,右鍵 生成 開始編譯。
查看失敗的項,然后按個處理一下:
其中常量中有換行符,打開該文件。高級保存選項,保存為UNICODE (UTF-8 帶簽名)。其他無法打開輸入文件的報錯,不用理會,在調試的時候會自動生成這些庫文件。
啟動MySQL服務
到現在編譯已經完成了,可以啟動MySQL服務了。第一次啟動MySQL需要初始化,在啟動增加啟動參數 --console --initialize 。mysqld項目是MySQL的啟動項目,在解決方案資源管理器中找到mysqld項目,設置為啟動項目。點擊屬性,增加啟動參數。
然后就可以開始調試了,按 F5 或者右鍵 mysqld 調試 啟動新實例。
如圖所示,數據庫初始化完成了。並生成了一個隨機密碼,該密碼作為初次登錄MySQL服務器的密碼。初始化完成之后報錯,數據庫停止了。原因目前還不知道,但是不影響數據庫的最終運行,暫且就不管它了。
把啟動參數中把 --initialize 刪掉,重新啟動MySQL服務。
可以看到,3306端口已經開啟了,處於等待連接狀態。編譯的客戶端工具都位於 F:\IDE\vs2019\MySQLSC\bld\runtime_output_directory\Debug\路徑下。
登錄並訪問數據庫
cmd進入到 F:\IDE\vs2019\MySQLSC\bld\runtime_output_directory\Debug\ 路徑。執行mysql -u root -p , 密碼用上文中隨機生成的密碼:
初次登錄之后,執行一條語句,提示必須修改密碼。我們通過以下命令來修改root用戶的密碼:
ALTER USER 'root'@'localhost' IDENTIFIED BY '111111'; flush privileges;
修改完密碼之后再次登錄數據庫,執行 show databases;語句。再次報錯:
ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist
據查資料說是,低版本升級會報這個錯誤。我們好像沒有升級誒,不管原因了,先把錯誤處理了再說。停掉數據庫。再次修改啟動參數,添加 --upgrade=FORCE。重新啟動。
再次報錯,升級失敗。但是雖然失敗了,上一個問題已經解決了,原因再次不明。依然先不管它,數據庫跑起來再說。刪掉啟動參數 --upgrade,再次啟動數據庫。
可算是成功了,現在可以去打斷點,調試MySQL了哦!!!。
最后:
本文中遇到的一些坑,雖然解決了,但是原因還沒弄明白。有了解的大神可以一起探討一下。
本文參考博文 https://www.cnblogs.com/huangxincheng/p/13084736.html 按照該博客編譯MySQL5.7可以成功。沒有MySQL8那么多的坑,可參考。