日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql 死锁过程及案例详解之清空缓存锁Flush Lock

發布時間:2024/9/27 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。