因為公司是做網絡安全的,所以會對平時設備收到的日志以對應的規則集進行解析然後存入數據庫。涉及大數據,與數據庫的交互量大概是3000條/秒,所以如果設備持續收日志的話,一般兩天時間數據庫對應表的存放的數據量大概就有5、6億條。
有一天我突然發現後台的日志信息一直再報“隊列已滿”的錯誤信息,到數據庫查詢相應表的數據發現其入庫的數據量也是停留在之前的數量(此時該表的數據量已經有大概1億多條了,該信息是為下文作鋪墊的)。按照以往的經驗我将可能會出現的問題挨個排查了一遍,發現都沒有問題,最後我在對應的數據庫查看了一下該庫的 線程運行 情況,情況如下 :
入庫的insert語句一共有四條線程在執行,就報了四個“Waiting for the table metadata lock”的錯誤,表居然被鎖了,試着kill掉,可是死了馬上就活了,剛開始也不懂,看到表被鎖了就沒有繼續往下看(最關鍵的信息被忽略了),後問了一下公司的前輩,上圖的表中我遺漏了這麼一項重要的信息:
經過前輩講解我才恍然大悟。
原來在數據批量入庫的時候,組内的另一個哥們發現前台對于日志信息的查詢速度有點慢,所以他的想法就是給表中他要查的字段手動加索引“Alter table 'sim_event add index ...'”,可是他犯另一個大錯誤就是這個表現在差不多有1億多數據,要想成功添加得等到猴年馬月了,而對于MySQL而言,如果進行一些Alter table等DDL操作時,如果該表上有未提交的事務就會報Waiting for the table metadata lock的錯誤。
最後重新啟動數據庫,kill掉不必要的線程(其實重啟就好了),入庫就正常了!!!
,