mysql 隨機產生show命令失敗

2021-07-29 06:11:58 字數 2930 閱讀 8151

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...