1. 系統環境
centos release 6.7
percona-server-5.6.21-70.0(原始碼編譯安裝)
2. 故障簡述
mysql會不定期發生執行show ……命令失敗的情況。
3. 故障排查
3.1. 檢視錯誤日誌
客戶端返回錯誤資訊:
can't create/write tofile '/…… /tmp/#sql_3ce_1.myi' (errcode: 17 - file exists)
錯誤日誌有如下日誌報出:
/……/percona-5.6.21/bin/mysqld: incorrect key file for table '/…… /tmp/#sql_3ce_1';try to repair it
檢視快取檔案目錄/....../tmp,檔案#sql_3ce_1.myi存在,檔案大小為0。
執行命令,檢視當前執行緒狀態,所有執行緒狀態正常:
mysql>showprocesslist
通過以上資訊無法定位產生問題的原因,無法進行錯誤排查。
3.2. 蒐集更多的資訊
該現象會不定期的出現,我們採取如下方式進行更多資訊的收集。
開啟general_log,收集執行的所有的執行的sql資訊,等待錯誤重現後,檢視是否有特殊的sql語句可能引起問題。注意定時清理general log,防止出現日誌檔案較大,導致磁碟被寫滿的情況。
根據錯誤日誌中的內容和客戶端的報錯資訊,在網際網路查詢相關的資訊。較多的故障分析(包括percona官方)為快取表磁碟空間不足,導致檔案損壞或者檔案存在建立失敗。經排查,我們不存在磁碟空間不足的問題,排除這種情況。
3.3. 分析general_log資訊
在開啟general_log後問題仍然復現,檢視general log,在客戶端發生錯誤的時間點和錯誤日誌產生的時間點,檢視對應的sql語句。檢視結果如下:
> 有一定的併發量,一秒鐘執行50條以上的語句
> 無寫入語句,全部為show full field和select …from … where語句並沒有特殊的語句
3.4. 嘗試復現bug
由於general_log顯示執行的sql語句僅為如下兩種:
show full fields from …
select … from … wherea=…
我們編寫工具,以一定的併發量重複執行上述兩種語句,幸運的是,bug復現了,執行一段時間後就會出現上述現象。
但是經過幾次復現後,發現bug有如下幾個特點:
> 復現週期不定,有時幾秒鐘就可以復現,有時要超過30分鐘
> 每次發生問題的快取表檔案不確定,#sql_***_1.myi、#sql_***_17.myi、#sql_***_90.myi等
> 每次發生問題的現象不定,有時直接報錯後不影響業務,有時會阻塞到等待mutex、有時會發生core dump
3.5. 追蹤bug產生的原因
由於bug發生時,是在高併發的情況下,並且發生問題的檔案也不確定,我們嘗試檢視發生問題時程序堆疊。
檢視原始碼,兩種錯誤對應的錯誤碼如下:
can't create/write tofile '/…… /tmp/#sql_3ce_1.myi'
ee_cantcreatefile/ er_cant_create_file
incorrect key file fortable '/…… /tmp/#sql_3ce_1'; try to repair it
er_not_keyfile
檢視編譯後自動生成的標頭檔案mysqld_error.h,對上述錯誤碼有如下定義:
#defineer_cant_create_file 1004
#define er_not_keyfile1034
使用gdb工具設定條件斷點
(gdb)bmysqld.cc:3381 if error = 1004
(gdb)bmysqld.cc:3381 if error = 1034
在發生問題後檢視程序堆疊,發現在校驗快取表檔案合法性的時候,發生錯誤,檔案內容為空,同時tmp目錄下該檔案的大小為0。仍然不能確認bug產生的原因。猜測是由於併發的進行快取表檔案建立和刪除存在bug。
3.6. 使用其他方法追蹤bug
主要使用如下方法追蹤bug:
3.6.1. 查詢bug修復文件
3.6.2. 使用新的版本
使用新的版本來復現bug,檢視新版本時候已經修復了bug,同時可以縮小查詢bug修復列表的範圍
3.6.3. 繼續使用gdb追蹤
繼續使用gdb工具來追蹤bug,以獲得更多的資訊。
最終,通過使用新版本復現bug來縮小bug修復的版本的範圍,在release node中查詢多該問題對應的bug。
4. 總結
官方描述,在由於某些原因發生建立快取表失敗時,會發生對建立檔案標誌重複清理的情況。導致兩個執行緒使用相同的標誌來建立快取檔案,從而發生上述問題。
對於大併發產生的bug,尤其是現象不穩定的bug,較難定位到具體的問題所在。在自己身無法較快的定位問題時,可以嘗試通過其他方法去了解bug產生的原因。
其中bug修復版本為percona-server-5.6.23-72.1
,細節為:
5. 遺留問題
1. 官方修復的描述為由於某些原因導致快取表建立失敗,並沒有說明某些原因是否為mysql自身的原因
2. 並沒有分析為什麼會有檔案遺留,只是優化了對遺留檔案的處理
MySQL 常用show命令
命令為show databases 上圖就是所有資料庫了.前四個資料庫是預設的資料庫,後面兩個是我之後自己建立的資料庫.information schema資料庫是內部資料庫,裡面儲存的是其他資料庫的資訊 mysql資料庫用於儲存一些使用者資訊 performance schema資料庫主要用於收集...
mysql 查詢show 4 查詢命令 show
一 查詢資料庫 1.展示系統中當前所有資料庫 show databases 例 sql mysql show databases database information schema mysql performance schema school school 01 shop sys 7 rows...
mysql 中show 命令用法詳細介紹
以下所有命令都是在進入mysql監控器中執行的 a.show tables或show tables from database name 顯示當前資料庫 中所有表的名稱 b.show databases 顯示mysql中所有資料庫 的名稱 c.show columns from table name...