天天看點

源代碼的編譯和調試

InnoDB存儲引擎是開源的,這意味着你可以獲得其源代碼,并檢視内部的具體實作。任何時候,WHY都比WHAT重要。通過研究源代碼,可以更好地了解資料庫是如何工作的,進而知道如何使資料庫更好地為你工作。如果你有一定的程式設計能力,則完全可以對InnoDB存儲引擎進行擴充,開發出新的功能子產品來更好地支援你的資料庫應用。

InnoDB存儲引擎的源代碼被包含在MySQL資料庫的源代碼中,在MySQL的官方網站連結為:http://www.mysql.com/downloads/mysql/。下載下傳MySQL資料庫的源代碼即可。 這裡有不同作業系統下的源代碼可供下載下傳,一般隻需下載下傳Generic Linux的版本即可。通過MySQL官網首頁的Download連結,可以迅速地找到GA版本的下載下傳。但是,如果想要下載下傳目前正在開發的MySQL版本,可能在官網找了很久都找不到連結。這時,隻要把下載下傳的連結從www換到dev即可:如http://dev.mysql.com/downloads/mysql,在這裡可以找到開發中的MySQL版本的源代碼了。單擊“Download”下載下傳标簽後可以進入下載下傳頁面。當然,如果你有mysql.com賬戶,可以進行登入。MySQL官方提供了大量的鏡像用來分流下載下傳,你可以根據所在的位置選擇下載下傳速度最快的位址,中國使用者一般可以在“Asia”這裡的鏡像下載下傳。

下載下傳的檔案是tar.gz結尾的檔案,可以通過Linux的tar指令、Windows的WinRAR工具來進行解壓,解壓後得到一個檔案夾,這裡面就包含了MySQL資料庫的所有源代碼。所有存儲引擎的源代碼都被放在storage的檔案夾下,其源代碼結構如圖所示。

源代碼的編譯和調試

可以看到,所有存儲引擎的源代碼都在這裡。檔案夾名一般就是存儲引擎的名稱,如archive、blackhole、csv、fedorated、heap、ibmdb2i、myisam、innobase。從MySQL 5.5版本開始,InnoDB Plugin已經作為預設的InnoDB存儲引擎版本;而在MySQL 5.1的源代碼中,應該可以看到兩個版本的InnoDB存儲引擎源代碼。可以看到有innobase和innodb_plugin兩個檔案夾:innobase檔案夾是舊的InnoDB存儲引擎的源代碼;innodb_plugin檔案夾是InnoDB Plugin存儲引擎的源代碼。如果你想将InnoDB Plugin直接靜态編譯到MySQL資料庫中,那麼需要删除innobase檔案夾,再将innodb_plugin檔案夾重命名為innobase。

進入InnoDB存儲引擎的源代碼檔案夾,可以看到源代碼結構 :

下面介紹一些主要檔案夾内源代碼的具體作用:

btr:B+樹的實作。

buf:緩沖池的實作,包括LRU算法、Flush重新整理算法等。

dict:InnoDB存儲引擎記憶體資料字典的實作。

dyn:InnoDB存儲引擎動态數組的實作。

fil:InnoDB存儲引擎中檔案資料結構以及對于檔案的一些操作。

fsp:你可以了解為file space,即對InnoDB存儲引擎實體檔案的管理,如頁、區、段等。

ha:雜湊演算法的實作。

handler:繼承于MySQL的handler,插件式存儲引擎的實作。

ibuf:插入緩沖的實作。

include:InnoDB将頭檔案(.h,.ic)都統一放在這個檔案夾下。

lock:InnoDB存儲引擎鎖的實作,如S鎖、X鎖以及定義鎖的一系列算法。

log:日志緩沖和重組日志檔案的實作。對重組日志感興趣的,應該好好閱讀該源代碼。

mem:輔助緩沖池的實作,用來申請一些資料結構的記憶體。

mtr:事務的底層實作。

os:封裝一些對于作業系統的操作。

page:頁的實作。

row:對于各種類型行資料的操作。

srv:對于InnoDB存儲引擎參數的設計。

sync:InnoDB存儲引擎互斥量(Mutex)的實作。

thr:InnoDB儲存引擎封裝的可移植的線程庫。

trx:事務的實作。

ut:工具類。

在Windows平台下,可以通過Visual Studion 2003、2005和2008開發工具對MySQL的源代碼進行編譯和調試。在此之前,需要預先安裝如下的工具:

CMake:可以從http://www.cmake.org下載下傳。

bison:可以從http://gnuwin32.sourceforge.net/packages/bison.htm下載下傳。

安裝之後,還需要通過configure.js這個指令進行配置:

C:\workdir>win\configure.js options

option比較重要的選項如下所示。

WITH_INNOBASE_STORAGE_ENGINE:支援InnoDB存儲引擎。

WITH_PARTITION_STORAGE_ENGINE:分區支援。

WITH_ARCHIVE_STORAGE_ENGINE:支援Archive存儲引擎。

WITH_BLACKHOLE_STORAGE_ENGINE:支援Blackhole存儲引擎。

WITH_EXAMPLE_STORAGE_ENGINE:支援Example存儲引擎,這個存儲引擎是展示給開發人員的,你可以從這個存儲引擎開始建構自己的存儲引擎。

WITH_FEDERATED_STORAGE_ENGINE:支援Federated存儲引擎。

WITH_NDBCLUSTER_STORAGE_ENGINE:支援NDB Cluster存儲引擎。

如果隻是比較關心InnoDB存儲引擎,可以這樣進行設定,如圖所示。

源代碼的編譯和調試

之後,可以根據你使用的是Visual Studio 2005還是Visual Studio 2008,在win檔案下運作build-vsx.bat檔案來生成Visual Studio的工程檔案。build-vs8.bat表示Visual Studio 2005,build-vs8_x64.bat表示需要編譯64位的MySQL資料庫。如我們需要在32位的作業系統下使用Visual Studio 2008進行調試工作,則可以使用如下指令:

D:\Project\mysql-5.5.5-m3>win\build-vs9.bat

這樣就生成了MySQL.sln的工程檔案,打開這個工程檔案并将mysqld這個項目設定為預設的啟動項,就可以進行MySQL的編譯和調試了。

之後的編譯、斷點的設定和調試,與在Visual Studio下操作一般的程式沒有什麼差別。

Linux下的調試,通常使用Eclipse。其他一些類Unix作業系統,如Solaris、FreeBSD、MAC,同樣可以使用Eclipse進行調試。

到http://www.eclipse.org/downloads/下載下傳并安裝Eclipse IDE for C/C++Developers。

解壓MySQL源代碼到指定目錄,如解壓到/root/workspace/mysql-5.5.5-m3,

運作如下指令産生Make檔案(Eclipse會使用産生的這些Make檔案):[root mysql-5.5.5-m3]#BUILD/compile-amd64-debug-max-no-ndb-c,BUILD下有很多compile檔案,你可以選擇你所需要的檔案。編譯的平台是64位的Linux系統,并且希望可以進行Debug調試,是以選擇了compile-amd64-debug-max-no-ndb檔案。注意-c選項,這個選項隻生産Make檔案,不進行編譯。

接着打開Eclipse,建立一個C++的項目。給項目取個名稱,如這裡的項目名為mysql_5_5_5,并選擇一個空的項目。選擇Finish按鈕後,可以看到新産生的一個空項目。 

之後選擇左邊的Project Explorer,右擊項目mysql_5_5_5,選擇建立檔案夾,将檔案夾/root/workspace/mysql-5.5.5-m3導入工程中。 

導入檔案夾後,再右擊項目名mysql_5_5_5,選擇項目屬性,在C/C++Build選項這裡進行設定,需要将Build directory選擇為源代碼所在路徑。 編譯配置完後,程式就會自動開始執行編譯工作了。

上述的這個過程隻是編譯的過程,換句話說,編譯完後就産生了mysqld這樣的執行檔案。如果想要進行調試,還需要在Debug這裡進行如下的配置。 另外如果需要配置一些額外的參數,需要切換到Arguments選項。 

之後就可以設定斷點,進行調試工作了,這和一般的程式并沒有什麼不同。