1. 程式人生 > >一次關於Waiting for table metadata lock的處理

一次關於Waiting for table metadata lock的處理

一個簡單的DDL操作(表資料很少,訪問高)執行很久,導致Waiting for table metadata lock。

版本:mysql5.5.17

檢視:Innodb_buffer_pool_pages_free = 0

解決:set global innodb_stats_on_metadata=0

這個問題來自冷之同學測試時候碰到的一個“詭異現象”。

1、 測試現象       

測試的庫有很多資料,但是重啟之後,只對一個表的5w條記錄作查詢。查詢條件客戶端控制,確保查詢範圍。innodb_buffer_pool_size設定為35G。

現象1:查詢效能會出現大幅度抖動;

現象2:介入追查後發現,Innodb_buffer_pool_pages_free = 0

         其中bp剩餘量這個是最直觀異常的,因為訪問的5w行記錄撐死也不可能把35G記憶體吃光的。在QA同學確認沒有別人在使用這個庫的情況下。

2、過程和原因

         其實幾乎確定還是有別的查詢在訪問的。所以開啟general_log。 發現除了QA同學壓的語句外,這個Server上還有一些監控語句。

         其中一個語句如下

select constraint_schema,table_name,constraint_name,constraint_type from information_schema.table_constraints where table_schema not in ('information_schema', 'mysql', 'test');  

         這個語句訪問了表 information_schema.table_constraints.

跟蹤發現這個語句觸發了讀盤操作。原因是需要訪問引擎的info()介面,而InnoDB此時又“順手”做了更新索引統計的操作dict_update_statistics。

更新索引統計的基本流程是隨機讀取部分demo行。所以這個操作實際上是訪問了這個Server裡面的所有表,因此不只是訪問5w行

而且由於別的表事先沒有被訪問,就會導致讀盤操作,也包括BP的LRU更新。

3、哪些表會觸發

         不只是上面提到的table_constraints,information_schema庫下的一下幾個表,訪問時候都會觸發這個“順手”操作。

information_schema.TABLES

information_schema.STATISTICS

information_schema.PARTITIONS

information_schema.KEY_COLUMN_USAGE

information_schema.TABLE_CONSTRAINTS

information_schema.REFERENTIAL_CONSTRAINTS

         其實還有 show table status ,也會觸發這個操作,只是只處理單表,所以影響沒那麼明顯。

4、修改

頭痛醫頭的方法是把這些監控去掉。但實際上像TABLES、TABLE_CONSTRAINTS這些表,都是靜態資料,訪問時不作索引統計也沒關係的。

另外一個方法就是把innodb_stats_on_metadata設定成off,這樣上述說到的這些表訪問都不會觸發索引統計。

         實際上這個動態統計的功能已經不推薦了,官方已經在6.0以後增加引數控制DML期間也不作動態統計了。因此這個引數配置成off更合理些(預設是on)


相關推薦

Waiting for table metadata lock處理

檢視鎖表的程序: 1、查程序,查詢被鎖表的那個程序的ID show processlist; 2、kill掉鎖表的程序ID kill id; 3、查詢是否鎖表 show OPEN TABLES where In_use > 0; 解決過程: 版本:mysq

關於Waiting for table metadata lock處理

一個簡單的DDL操作(表資料很少,訪問高)執行很久,導致Waiting for table metadata lock。 版本:mysql5.5.17 檢視:Innodb_buffer_pool_pages_free = 0 解決:set global innodb_sta

MySQL中Waiting for table metadata lock的解決方法

最近專案中的資料庫查詢經常掛起,應用程式啟動後也報操作超時。測試人員就說資料庫又掛了(貌似他們眼中的連線失敗,查詢無果都是掛了),通過 show processlist 一看,滿屏都是 Waiting for table metadata lock 狀態的連線。

20180117MySQL出現Waiting for table metadata lock的原因以及解決方法

存在 ces ldb 環境 gpo open 這就是 理解 而且 轉自http://www.cnblogs.com/digdeep/p/4892953.html 轉自:http://ctripmysqldba.iteye.com/blog/1938150 (有修改) MyS

【MySQL經典案例分析】 Waiting for table metadata lock

排查 同時 導致 大量 並發 技術幹貨 mysql模塊 lee exist 本文由雲+社區發表 一、 問題是這樣來的 ? 2018年某個周末,接到連續數據庫的告警,告警信息如下: 二、 苦逼的探索過程 1、總體的思路 看到too many connection的報錯信

MySQL Waiting for table metadata lock故障分析

源起 線上執行ALTER時,通過show processlist檢視到出現Waiting for table metadata lock ,導致後面的查詢都無法執行。 5217122 | create_table_04 | 172.100.207.148:31291 | finance | Quer

mysql出現Waiting for table metadata lock的原因及解決方案

http://www.cnblogs.com/dyllove98/archive/2013/07/16/3194332.html 最近經常遇到mysql資料庫死鎖,鬱悶死, show processlist; 時 Waiting for table metadata lo

服務器IO過高處理過程

linux 服務器 緩沖區 io負載 記一次服務器IO過高處理過程 一、背景 在一次上線升級後,發現兩臺tomcat服務器的IOwait一直超過100ms,高峰時甚至超過300ms,檢查服務器發現CPU負載,內存的使用率都不高。問題可能出現在硬盤讀寫,而且那塊硬盤除了寫日誌外,沒有其他

truncate導致的鎖表處理

需要 表現 cti 分析 慢查詢 ces sql 業務 復雜 一個不是很大的表,由數據分析部門生成並用於業務。由於代碼發了新版需要第一次運行,所以在業務低峰期讓數據部門執行了,邏輯是先truncate再insert重建。由於一直以來都沒問題,覺得不會出錯。結果過一會兒悲劇了

MySQL之當數據庫數據源被鎖(Table Metadata Lock)時的解決方案

data style pan ack 不能 ssl com proc 方案 0.發生的原因分析:【hibernate的線程池連接導致了不能修改被鎖定數據庫的數據庫型模式】 1.關掉hibernate的所有線程池(選擇退出IDE或者其他辦法) 2.查看被鎖的進程ID:show

Ceph日誌損壞的分析處理過程

Ceph 日誌 1、故障現象 今天下午看到群友在說一個問題,說ceph的某個osd處於down的狀態,我大概整理下他的處理過程 1、查看OSD的狀態2、查看日誌信息3、啟動對應的ceph-osd服務4、檢查集群健康狀態 2、日誌損壞了,如何讓osd重新上線 思路:重建日誌a、先把/var/lib/ce

ipv6導致Cisco6509cpu高的處理過程

Cisco6509 cpu高 ipv6核心交換機是Cisco6509E,出現的問題是cpu從20%飆升到60%1、在Cisco6509上使用命令 show proc cpu sort 5min 可以查看到導致cpu高的原因是ipv6 input2、於是在Cisco6509下面的各個vlan抓包,共計12棟樓3

網頁打不開故障處理——無耐的退場

一個 火車 放棄 官網 故障處理 迷茫 影響 其中 垃圾 最近有一辦公室人員打來電話,說他有兩個網頁打不開,那是他工作中必須用的,請我去給處理。  不能影響工作啊。到了一看,確實是打不開。就是火車票的12306購票官網,能進網站,但是點客運服務的時候,就怎麽也沒反應了。換用

SQLSERVER2008R2資料庫查詢超時問題處理

資料庫環境: WINDOWS2008R2 SQLSERVER2008R2 應用程式環境: REDHAT6.5 TOMCAT JAVA   一、故障現象 某系統應用查詢超時 相關SQL: SELECT v.OBarcode Ba

記錄不能傳送郵件故障處理

伺服器使用的是萬網的vps,郵件伺服器是阿里雲郵箱。今天發現不能傳送郵件。 1:編寫測試程式碼,傳送過程中,發現出現服務超時。我沒有伺服器管理許可權,處理起來比較棘手。 2:經過百度搜索,發現阿里雲伺服器是禁止25埠傳送郵件的。 我們使用的是萬網vps,可能近期也封禁25 傳

Controller改造,及SpringMVC處理流程

概述 由於工作需要,需實現這樣一個功能的controller框架: 1,Restful API 2,請求引數校驗(請求中需要攜帶指定的引數,才能進入控制器方法。一次請求會攜帶一些基本資訊,以及請求資料,此處校驗的是請求資料的攜帶情況) 3,請求格式校驗(請求格式需要符合規定,才能進入

linux系統gpfs系統故障處理

故障現象:      客戶反應業務系統不能正常訪問,物理主機面板有告警燈。 故障判斷處理:    我們到達現場直接用顯示器接物理主機,顯示登入介面且可以正常登入。 1.檢視之後發現網路與閘道器不通。當時思路是將網路服務重啟。重啟網路服務卡死無法啟動,(思考:當時應該只

redis叢集搭建的問題處理

1.複製3份conf檔案,用來起不同埠的3個redis應用 修改conf: port 6399 bind 10.61.70.136 183.61.70.136 dir /data/redis/data/ 2.分別將3個redis啟動起來 ./redis-server ../con

坑爹的jack-server(摘記jack-server無法啟動問題處理要點)

本來jack-server挺好的,也成功編譯了一次android7.1.2原始碼。改天不知怎麼了,再編譯時報錯:communication error with Jack server (1),上網查,類似報錯多為(58)、(77)等,(1)的一個沒找到。硬著頭皮用相關方法進

JVM 原始碼分析(5.異常處理)

異常列印 Java 如果發生異常,通常會呼叫 Throwable.printStackTrace 去列印堆疊資訊。 堆疊資訊包括完整類名,方法名,java 檔名,行號 而這樣的資訊根據發生 Crash 執行緒所經歷的n個方法會打印出n行。 整個過程被稱為棧回朔