Mysql 死锁过程及案例详解之清空缓存锁Flush Lock
Mysql 清空緩存鎖Flush Lock?
清空緩存鎖Flush Locks
flush table的功能是關閉所有打開的表,強制關閉所有正在使用的表,并刷新準備好的語句緩存。
這種操作需要用戶擁有?FLUSH_TABLES、RELOAD權限。
flush tables在已經鎖定表(對應LOCK TABLES ... READ語句)的情況下不能使用,刷新和鎖定表一般用FLUSH TABLES?tbl_name?... WITH READ LOCK語句。
在我們需要做備份時為了同時防止有新數據寫入,那么備份時我們一般通過如下命令刷新并鎖定表:FLUSH?TABLES?WITH?READ?LOCK;
該操作實現的功能即是關閉所有的表并通過全局讀鎖鎖定所有數據庫里的所有表。
而這里的flush lock即是在使用FLUSH TABLES語句時被獲取的,它在語句執行期間會一直持續,除非是FLUSH TABLES添加WITH READ LOCK選項,因為在這種情況下共享(讀)鎖將被持有,直到鎖顯式釋放。
執行ANALYZE table語句后會觸發一個隱式的表刷新。
flush lock可通過參數鎖等待超時時間(lock_wait_timeout)來設置,如果等待時間超過該參數還未獲取鎖則會放棄。如果通過kill殺死FLUSH TABLES語句也讓鎖自動放棄。然而由于mysql內部有個更低級的鎖叫做表定義緩存(table definition cache)版本鎖不會立即釋放直至長時間運行的語句結束。這時解決鎖問題的唯一辦法就是殺掉長時間運行的語句對應的進程。
示意案例
-- Step1 連接1上執行按照id查詢city的語句,這里sleep(180)秒只是為了讓執行時間拉長。 SELECT *, SLEEP(180) FROM city WHERE ID = 1056-- Step2 連接2上執行按照id查詢city的語句 FLUSH TABLES world.city-- Step3 連接3上執行按照id查詢city的語句 SELECT * FROM world.city WHERE ID = 1055-- Step4 連接4上執行查看以上三個連接的會話信息。 SELECT thd_id, conn_id, state, current_statement FROM sys.session WHERE current_statement IS NOT NULL AND thd_id <> PS_CURRENT_THREAD_ID()/* 執行結果 thd_id conn_id state current_statement 48 9 User sleep SELECT *, SLEEP(180) FROM city WHERE ID = 1056 50 11 Waiting for table flush FLUSH TABLES world.city 49 10 Waiting for table flush SELECT * FROM world.city WHERE ID = 1055 */這里我們通過sys.session來查看的結果,類似的也可以通過performance_shchema.threads或者命令show processlist查看。會話1里查看city表里id為1056的信息,會話2執行了刷新表操作,會話3執行查看city表里id為1055的信息,這是我們可以通過會話4里的系統表查看以上三個會話里的狀態,可見會話2、3都是在“Waiting for table flush”即等待表刷新。
總結
以上是生活随笔為你收集整理的Mysql 死锁过程及案例详解之清空缓存锁Flush Lock的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 土耳其温泉鱼?温泉鱼是什么鱼 ?土耳其温
- 下一篇: Mysql 死锁过程及案例详解之元数据锁