AnySQL.net ? Blog Archive ? 靜態編譯的MySQL易掛起
? 靜態編譯的MySQL易掛起 ?
MySQL ? http://www.anysql.net/mysql/mysql-hang-with-static-ldflags.html 2009-06-22? ? 準備試用MySQL, 先用它來存放收集的一些性能數據, 就找了一臺16GB的x86_64機器, 自已下載了源代碼進行編譯. 編譯成功, 建庫也成功, 直接用Linux LVM下的邏輯卷做Innodb的數據文件, 以為準備工作就做完了, 可以安心使用MySQL了. 在真實使用之前, 先跑跑自帶的sql-bench程序吧, 雖然看不懂sql-bench的結果, 但總算在MySQL中跑了一些SQL, 不料在這中間就出現MySQL掛起的情況.
? ? 事情源于發現轉給sql-bench程序的參數寫錯了, 想測試一下innodb上的效果的, 要指定所有表的默認建表選項, 于是用Control + C中斷了正在運行的程序, 用中斷的方式換了幾個參數后, 突然發現MySQL掛起了, 用"show status"命令查看MySQL的運行情況時, 發現大部份性能統計數值都不再變化. 以為是一時的情況, 沒想到今天集團同事也遇到了同樣的問題, 于是去重試了一下, 兩個Control + C就讓MySQL掛起了. 掛起后MySQL不能讀寫磁盤上所有磁盤上的表, 不能創建Innodb表, Myisam表, 連內存表也不能創建, 情況很嚴重.
? ? 內存是足夠的, MySQL的進程數也只有17個, 系統資源肯定不是問題. 用strace看了一下, 出錯后也沒有什么有用的出錯信息.
write(3, "\16\0\0\0\4columns_priv\0", 18) = 18
read(3, 0x71c150, 16384)? ? = -1 EINTR (Interrupted system call)
--- SIGINT (Interrupt) @ 0 (0) ---
read(3, 0x71c150, 16384)? ? = -1 EINTR (Interrupted system call)
--- SIGINT (Interrupt) @ 0 (0) ---
read(3, 0x71c150, 16384)? ? = -1 EINTR (Interrupted system call)
--- SIGINT (Interrupt) @ 0 (0) ---
read(3, 0x71c150, 16384)? ? = -1 EINTR (Interrupted system call)
--- SIGINT (Interrupt) @ 0 (0) ---? ? 于是請了淘寶的MySQL高手過來診斷, 他發現我的MySQL是靜態編譯(據說這種編譯方式下性能更好)的, 就是在編譯時用了如下的選項.
--with-mysqld-ldflags=-all-static
--with-client-ldflags=-all-static? ? 估計是這個有問題, 靜態編譯和動態編譯會使用不同的線程庫(具體情況不清楚), 很有可能是這個問題, 就去掉了這兩個選項重新編譯了一下. 然后繼續Control + C了幾十次, 都沒有能再重現掛起的情況.
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
