Mysql原始碼分析系列(1): 編譯和調試–轉載

來源:互聯網
上載者:User
文章目錄
  • 相關資源:
  • 下載代碼:
  • 編譯代碼:
  • 安裝和運行:
  • 調試:
拖了很久了Mysqld原始碼分析從今天開始吧,隨著我閱讀的進度推進,我會寫一些文章記錄自己的心得,但是不保證一定會寫。其實也不保證一定有時間來完整的閱讀所有的代碼。閱讀代碼的目的有如下幾點:
  • 通過瞭解Mysql的架構,學習大型系統軟體的體繫結構,希望自己在工作的時候也能應用到其中的一些技術
  • 通過閱讀代碼,能夠更好的理解Mysql的使用,也能做更深入的應用,比如效能調優,加入自己需要的功能和模組,等等

至於寫文章,還是一件比較費腦力和時間的事情,雖然把想法寫下來有助於更好的掌握學到的東西,盡量吧,而且我的文筆比較差。

這是第一篇,從編譯和調試Mysql開始,不急於進入代碼閱讀階段。

相關資源:
  • http://www.mysql.com/

從這個地方下載原始碼和使用文檔。

  • 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 下載。

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的效能調試需求的讀者使用,當然也是進行其他程式效能調試不可缺少的工具。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.