文章目錄
- 相關資源:
- 下載代碼:
- 編譯代碼:
- 安裝和運行:
- 調試:
拖了很久了Mysqld原始碼分析從今天開始吧,隨著我閱讀的進度推進,我會寫一些文章記錄自己的心得,但是不保證一定會寫。其實也不保證一定有時間來完整的閱讀所有的代碼。閱讀代碼的目的有如下幾點:
- 通過瞭解Mysql的架構,學習大型系統軟體的體繫結構,希望自己在工作的時候也能應用到其中的一些技術
- 通過閱讀代碼,能夠更好的理解Mysql的使用,也能做更深入的應用,比如效能調優,加入自己需要的功能和模組,等等
至於寫文章,還是一件比較費腦力和時間的事情,雖然把想法寫下來有助於更好的掌握學到的東西,盡量吧,而且我的文筆比較差。
這是第一篇,從編譯和調試Mysql開始,不急於進入代碼閱讀階段。
相關資源:
從這個地方下載原始碼和使用文檔。
- http://forge.mysql.com/wiki/MySQL_Internals
這裡有一系列文章介紹Mysql的內部原理,是非常好的代碼理解參考資源,強烈推薦有興趣的人仔細閱讀。除了代碼本身,這也是是最權威的資料。
- http://www.amazon.com/Understanding-MySQL-Internals-Sasha-Pachev/dp/0596009577
這好像是我知道的唯一介紹Mysql工作原理的書,可以看看,也不是很厚。Google一下這本書,很多地方都有下載,不過都是E文,大家講究著看吧,誰叫這是老外做出來的呢。
下載代碼:
- http://dev.mysql.com/downloads/
需要註冊,下載最新的5.1版本或者更高。
Bazaar是Mysql使用的原始程式碼控制工具,類似於CVS,俺也沒用過,有興趣的自己看文檔吧:
- A Contributor's Guide to Launchpad - Part 1 - Getting Started
- A Contributor's Guide to Launchpad - Part 2 - Code Management
編譯代碼:Mysql的代碼編譯是通過一些shell指令碼來完成的。下載代碼並解壓後,有一個
BUILD目 錄,進去看看,裡面有各種平台使用的編譯指令碼,我們要用的是debug版本,以方便我們使用gdb,所以使用的指令碼是BUILD/compile- pentium-debug。開啟看看,其實很簡單,主要加了一個configure選項”--with-debug=full",並使用了 debug_cflags 和debug_configs。指令碼內容如下:
BUILD/compile-pentium-debug
<pre>
#! /bin/sh
path=`dirname $0` #找到檔案所在目錄
set -- "$@" --with-debug=full #將命令列加上"--with-debug=full"
. "$path/SETUP.sh" # 匯入SETUP.sh的內容,設定一些變數
extra_flags="$pentium_cflags $debug_cflags"
extra_configs="$pentium_configs $debug_configs"
. "$path/FINISH.sh" # 進行config和編譯
</pre>
"--with-debug"實際上是autoconf指令碼裡面定義的,開啟configure.in, 尋找"with-debug",可以看看裡面的參數有哪些不同。
執行指令碼吧: $BUILD/compile-pentium-debug --prefix=$HOME/mysql-bin
這裡我們執行目標安裝目錄是$HOME/mysql-bin,你也可以指定其他目錄,盡量不要用預設目錄,不然有可能和系統裡面已經安裝好的mysql檔案衝突。
根據機器快慢,花的時間也不同,我用的機器花了不到10分鐘。等待編譯完畢,在sql目錄下面可以看到sql/mysqld,恭喜你:-) 這就是mysql的伺服器執行檔案。 寫到這裡,我倒是很想就mysql的編譯系統寫點東西,呵呵,還是有很多比較有意思的地方的。
安裝和運行:
安裝: $make && make install
一大堆資訊之後你應該可以在~/mysql-bin下面找到很多檔案了
$ ls /home/liuli/mysql-bin/
bin include info lib libexec man mysql-test share sql-bench
比較重要的目錄:
* bin: 用戶端程式和指令碼,可以發現比較眼熟的mysql, mysqld_safe, mysqldump, mysqladmin等
* libexec: 伺服器程式,包括mysqld
* share: 設定檔,包括一些執行個體設定檔比如my-small.cnf以及初次安裝運行需要的初始資料庫檔案比如mysql_system_tables.sql。
Mysql能夠運行還需要一些設定檔和資料檔案,執行這個命令:
$
~/mysql-bin/bin/mysql_install_db --defaults-file=my.cnf --basedir=~/mysql-bin --datadir=~/mysql-bin/var該命令將運行Mysqld的bootstrap過 程,主要是安裝Mysql的系統資料表,內容可以參照~/mysql-bin/share/mysql目錄下的 fill_help_tables.sql,mysql_system_tables.sql和 mysql_system_tables_data.sql。這裡我特彆強調"--defaults-file"參數,這個參數是用來指定系統運行需要 的"my.cnf"設定檔的。mysql_install_db需要知道系統的配置才能匯入上述的三個sql檔案,所以必須要制定一個設定檔,我就是 把~/mysql-bin/share/mysql下面的"my-small.cnf"做為設定檔,大家也可以選自己對應的設定檔,如果不指定,會從 /etc/mysqld/my.cnf匯入配置。注意: -defaults-file=my.cnf 選項必須放在第一個參數的位置,否則無效,而且mysql的大部分程式或者指令碼都接受這個參數,但也必須放在第一個參數的位置上。
好了,如果沒有錯誤發生,我們就可以運行mysqld啦!$
~/mysql-bin/libexec/mysqld --defaults-file=my.cnf --basedir=~/mysql-bin --datadir=~/mysql-bin/var --skip-networking
ps一下,能夠看到這個進程了吧。可以用mysql練一下:$mysql -S /tmp/mysql.sock$show databases;
應該可以看到:+--------------------+| Database |+--------------------+| information_schema || test |+--------------------+2 rows in set (0.00 sec)
安裝運行部分到這裡就結束羅!下面進入調試環節。
調試:代碼調試:
當然是使用gdb啦,或者DDD也行,看個人喜好,這裡用gdb做例子。
$ gdb --args ~/mysql-bin/libexec/mysqld --defaults-file=my.cnf --basedir=/home/aaa/mysql-bin --datadir=/home/aaa/mysql-bin/var --skip-networking$ (gdb) br handle_one_connection $ chandle_one_connection顧名思義,是mysqld接到一個串連請求以後的處理函數。另外上面的basedir和datadir用的都是全路徑,否則會報錯:Can't change dir to '~/mysql-bin/var/'
然後在另外一個shell裡面:$ mysql -S /tmp/mysql.sock這時gdb會下來,顯示:<pre>Breakpoint 1, handle_one_connection (arg=0x86ede38) at sql_connect.cc:10761076 THD *thd= (THD*) arg;(gdb) bt#0 handle_one_connection (arg=0x86ede38) at sql_connect.cc:1076#1 0x4fc133a8 in start_thread () from /lib/tls/i686/cmov/libpthread.so.0#2 0x4fb647fe in clone () from /lib/tls/i686/cmov/libc.so.6
</pre>後面就很簡單了,大家懂得的gdb奇技淫巧都可以上了,我就不再多說。
如果這裡看不到函數名和檔案名稱,那肯定是前面編譯的時候沒有用debug編譯,重新來一遍吧。效能調試:很多時候大家對於mysql當前的效能比較感興趣,想瞭解哪些函數大量佔用CPU,我推薦兩個工具,都是不用你重新編譯mysqld的:* sysprof: http://www.daimi.au.dk/~sandmann/sysprof/* oprofile:http://oprofile.sourceforge.net/news/ Sysprof相對來說比較好 用,oprofile功能更強大,用起來也稍微複雜。他們都可以用來顯示當前系統上運行程式個部分佔用CPU的情況,原理都是通過系統核心態定時的 timer,看當前CPU的進程和EIP,還可以通過爬堆棧的方式找到代用堆棧,並列印出來,而且他們都是不僅對使用者態的進程進行profile,還可以 進行kernel的profile,特彆強大。強烈推薦有對於mysqld的效能調試需求的讀者使用,當然也是進行其他程式效能調試不可缺少的工具。