開始學習除錯MySQL
上週參加Oracle技術嘉年華 2015
收穫非常大.
其中呂海波老師分享的內容是 《除錯Oracle二三例:除錯技術在日常運維中的應用》
其中有關於除錯MySQL原始碼的內容.
實驗如下:
下載MySQL 5.7的原始碼
編譯,注意增加 DEBUG 選項。(cmake的版本要求在2.8.2以上)
cmake \
-DCMAKE_INSTALL_PREFIX=/home/mysql5.7/mysql-5.7.9/ \
-DMYSQL_DATADIR=/home/mysql5.7/mysql-5.7.9/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/home/mysql5.7/mysql-5.7.9/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_DEBUG=1 \
-DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp -DDOWNLOAD_BOOST_TIMEOUT=60000
make && make install
scripts/mysql_install_db --basedir=/home/mysql5.7/mysql-5.7.9/ --datadir=/home/mysql5.7/mysql-5.7.9/data --user=mysql5.7
原始碼安裝完MySQL之後,使用Debug模式啟動
mysqld --debug --console &
然後重頭戲來了
先找到MySQL的PID
[mysql5.7@localhost~]$ps -ef | grep mysqld
mysql5.7 26086 1 2 19:29 pts/3 00:00:01 mysqld --debug --console
mysql5.7 26170 26118 0 19:30 pts/3 00:00:00 grep mysqld
這時候,tail -f /tmp/mysqld.trace
可以看到,任何在MySQL的操作,呼叫的函式資訊都記錄在這個trace檔案中.
找到其中任意一行,比如 PROFILING::status_change
使用命令gdb除錯.
gdb --pid 26086 --tui
將上述函式打斷點.
break PROFILING::status_change
開啟另外一個MySQL終端.執行查詢,然後進入gdb的斷點.
可以看到原始碼,並且單步執行,列印變數.
看靜態的程式碼一般比較枯燥,用這種方式感覺比較好入門.
同樣的方式,也適用於Redis
收穫非常大.
其中呂海波老師分享的內容是 《除錯Oracle二三例:除錯技術在日常運維中的應用》
其中有關於除錯MySQL原始碼的內容.
實驗如下:
下載MySQL 5.7的原始碼
編譯,注意增加 DEBUG 選項。(cmake的版本要求在2.8.2以上)
cmake \
-DCMAKE_INSTALL_PREFIX=/home/mysql5.7/mysql-5.7.9/ \
-DMYSQL_DATADIR=/home/mysql5.7/mysql-5.7.9/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/home/mysql5.7/mysql-5.7.9/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_DEBUG=1 \
-DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp -DDOWNLOAD_BOOST_TIMEOUT=60000
make && make install
mysqld --debug --console &
然後重頭戲來了
先找到MySQL的PID
[mysql5.7@localhost~]$ps -ef | grep mysqld
mysql5.7 26086 1 2 19:29 pts/3 00:00:01 mysqld --debug --console
mysql5.7 26170 26118 0 19:30 pts/3 00:00:00 grep mysqld
這時候,tail -f /tmp/mysqld.trace
可以看到,任何在MySQL的操作,呼叫的函式資訊都記錄在這個trace檔案中.
找到其中任意一行,比如 PROFILING::status_change
使用命令gdb除錯.
gdb --pid 26086 --tui
將上述函式打斷點.
break PROFILING::status_change
開啟另外一個MySQL終端.執行查詢,然後進入gdb的斷點.
可以看到原始碼,並且單步執行,列印變數.
看靜態的程式碼一般比較枯燥,用這種方式感覺比較好入門.
同樣的方式,也適用於Redis
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1847415/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 開始學nodejs —— 除錯篇NodeJS除錯
- 開始學習Mysql了MySql
- 除錯:案例學習除錯
- 開始學習啦
- 開始學習 Backbone
- 開始學習OpenRestyREST
- GitHub學習除錯記錄Github除錯
- 【CUDA學習】核心程式除錯除錯
- 今天開始學習 goGo
- 開始學習Python!Python
- 開始重新學習JAVAJava
- 【從零開始學習 MySql 資料庫】(2) 函式MySql資料庫函式
- 2011-02-19 , 開始正式學習MySQLMySql
- Python 學習除錯記錄Python除錯
- 《學習Oracle從這裡開始》之解決錯誤篇Oracle
- 使用VS Code從零開始開發除錯.NET 5除錯
- 今天開始學習PYTHONPython
- 從頭開始學習VuexVue
- 從零開始學習KafkaKafka
- 被迫開始學習Typescript —— classTypeScript
- 從零開始學習機器學習機器學習
- 開始學習 PixiJSJS
- 開始學習電商實戰
- 從零開始學習laravelLaravel
- 被迫開始學習Typescript —— interfaceTypeScript
- go學習--->開始編碼Go
- Java Web學習之旅開始JavaWeb
- 開始學習Functional ProgrammingFunction
- SQL Server開始學習感受SQLServer
- 我想開始學習javaJava
- 開始我的學習之旅。。。。
- 《從零開始學Swift》學習筆記(Day54)——丟擲錯誤Swift筆記
- GDB除錯MySQL除錯MySql
- 今天開始應該使用 5 個JavaScript除錯技巧JavaScript除錯
- 使用VS Code從零開始開發除錯.NET Core 1.0除錯
- 從0開始學習java,應該從那塊開始學起?Java
- (學習)godot4.2 Android除錯GoAndroid除錯
- Python學習之錯誤除錯和測試Python除錯