婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL全局鎖和表鎖的深入理解

MySQL全局鎖和表鎖的深入理解

熱門標簽:怎么在地圖標注位置生成圖片 騰訊地圖標注提升 悟空科技電話機器人 電銷卡外呼系統供應商 福建外呼系統定制化 銅陵防封電銷卡 400電話可以免費申請嗎 美國反騷擾電話機器人 真人語音電話機器人

前言

根據加鎖的范圍,MySQL 里面的鎖大致可以分成全局鎖,表級鎖,行鎖。

行鎖已經在前面幾篇文章說過

1. 全局鎖

全局鎖就是對整個數據庫實例加鎖。MySQL 提供了一個加全局讀鎖的方法,命令是Flush tables with read lock (FTWRL)

當你需要讓整個庫處于只讀狀態的時候,可以使用這個命令,之后其他線程的以下語句會被阻塞:數據更新語句(數據的增刪改)、數據定義語句(包括建表、修改表結構等)和更新類事務的提交語句。

1.1 全局鎖使用場景

全局鎖的典型使用場景是,做全庫邏輯備份(mysqldump)。重新做主從時候

也就是把整庫每個表都 select 出來存成文本。

以前有一種做法,是通過 FTWRL 確保不會有其他線程對數據庫做更新,然后對整個庫做備份。注意,在備份過程中整個庫完全處于只讀狀態。

數據庫只讀狀態的危險性:

如果你在主庫上備份,那么在備份期間都不能執行更新,業務基本上就能停止。如果你在從庫上備份,那么備份期間從庫不能執行主庫同步過來的binlog,會導致主從延遲。

注:上面邏輯備份,是不加--single-transaction參數

看來加全局鎖不太好。但是細想一下,備份為什么要加鎖呢?來看一下不加鎖會有什么問題?

1.2 不加鎖產生的問題

比如手機卡,購買套餐信息

這里分為兩張表 u_acount (用于余額表),u_pricing (資費套餐表)
步驟:
1 . u_account 表中數據 用戶A 余額:300
u_pricing 表中數據 用戶A 套餐:空

2. 發起備份,備份過程中先備份u_account表,備份完了這個表,這個時候u_account 用戶余額是300
3. 這個時候套用戶購買了一個資費套餐100,餐購買完成,寫入到u_print套餐表購買成功,備份期間的數據。
4. 備份完成

可以看到備份的結果是,u_account 表中的數據沒有變, u_pricing 表中的數據 已近購買了資費套餐100.

哪這時候用這個備份文件來恢復數據的話,用戶A 賺了100 ,用戶是不是很舒服啊。但是你的想想公司利益啊。  

也就是說,不加鎖的話,備份系統備份的得到的庫不是一個邏輯時間點,這個數據是邏輯不一致的。

1.3 為什么需要全局讀鎖(FTWRL)

可能有的人在疑惑,官方自帶的邏輯備份工具是 mysqldump。當 mysqldump 使用參數--single-transaction的時候,導數據之前就會啟動一個事務,來確保拿到一致性快照視圖。而由于 MVCC 的支持,這個過程中數據是可以正常更新的。

為什么還需要 FTWRL 呢?
一致性讀是好,但前提是引擎要支持這個隔離級別。比如,對于 MyISAM 這種不支持事務的引擎,如果備份過程中有更新,總是只能取到最新的數據,那么就破壞了備份的一致性。這時,我們就需要使用FTWRL 命令了。

所以,single-transaction 方法只適用于所有的表使用事務引擎的庫。如果有的表使用了不支持事務的引擎,那么備份就只能通過 FTWRL 方法。這往往是 DBA 要求業務開發人員使用 InnoDB 替代 MyISAM 的原因之一。

1.4 全局鎖兩種方法

一.FLUSH TABLES WRITE READ LOCK

二.set global readonly=true

既然要全庫只讀,為什么不使用 set global readonly=true 的方式呢?確實 readonly 方式也可以讓全庫進入只讀狀態,但我還是會建議你用 FTWRL 方式,主要有幾個原因:

一是,在有些系統中,readonly 的值會被用來做其他邏輯,比如用來判斷一個庫是主庫還是備庫。因此,修改 global 變量的方式影響面更大,我不建議你使用。

二是,在異常處理機制上有差異。如果執行FTWRL 命令之后由于客戶端發生異常斷開,那么 MySQL 會自動釋放這個全局鎖,整個庫回到可以正常更新的狀態。而將整個庫設置為 readonly 之后,如果客戶端發生異常,則數據庫就會一直保持 readonly 狀態,這樣會導致整個庫長時間處于不可寫狀態,風險較高。

三是,readonly 對super用戶權限無效

注 :業務的更新不只是增刪改數據(DML),還有可能是加字段等修改表結構的操作(DDL)。不論是哪種方法,一個庫被全局鎖上以后,你要對里面任何一個表做加字段操作,都是會被鎖住的。

即使沒有被全局鎖住,加字段也不是就能一帆風順的,還有表級鎖了

2. 表級鎖

MySQL 里面表級別的鎖有兩種:一種是表鎖,一種是元數據鎖(meta data lock,MDL)。

2.1 表鎖

lock tables 表名 read;#該表可以讀,不能ddl 和 dml 中增刪改,只能讀取表數據

lock tables 表名 read;# 既不能讀,也不能寫

表鎖的語法是 lock tables … read/write。與 FTWRL 類似,可以用 unlock tables 主動釋放鎖,也可以在客戶端斷開的時候自動釋放。需要注意,lock tables 語法除了會限制別的線程的讀寫外,也限定了本線程接下來的操作對象。

舉個例子, 如果在某個線程 A 中執行 lock tables t1 read, t2 write; 這個語句,則其他線程寫 t1、讀寫 t2 的語句都會被阻塞。同時,線程 A 在執行 unlock tables 之前,也只能執行讀 t1、讀寫 t2 的操作。連寫 t1 都不允許,自然也不能訪問其他表。

在還沒有出現更細粒度的鎖的時候,表鎖是最常用的處理并發的方式。而對于 InnoDB 這種支持行鎖的引擎,一般不使用 lock tables 命令來控制并發,畢竟鎖住整個表的影響面還是太大

2.2 MDL 鎖

另一類表級的鎖是 MDL(metadata lock)。MDL 不需要顯式使用,在訪問一個表的時候會被自動加上。MDL 的作用是,保證讀寫的正確性。你可以想象一下,如果一個查詢正在遍歷一個表中的數據,而執行期間另一個線程對這個表結構做變更,刪了一列,那么查詢線程拿到的結果跟表結構對不上,肯定是不行的。

因此,在 MySQL 5.5 版本中引入了 MDL,當對一個表做增刪改查操作的時候,加 MDL讀鎖;當要對表做結構變更操作的時候,加 MDL 寫鎖

  • 讀鎖之間不互斥,因此你可以有多個線程同時對一張表增刪改查。
  • 讀寫鎖之間、寫鎖之間是互斥的,用來保證變更表結構操作的安全性。因此,如果有兩個線程要同時給一個表加字段,其中一個要等另一個執行完才能開始執行。

雖然 MDL 鎖是系統默認會加的,但卻是你不能忽略的一個機制。

比如下面這個例子,我經常看到有人掉到這個坑里:給一個小表加個字段,導致整個庫掛了。

肯定知道,給一個表加字段,或者修改字段,或者加索引,需要掃描全表的數據。在對大表操作的時候,你肯定會特別小心,以免對線上服務造成影響。而實際上,即使是小表,操作不慎也會出問題。我們來看一下下面的操作序列,假設表 t 是一個小表。

show full processlist查看mdl 鎖詳情

我們可以看到 session A 先啟動,這時候會對表 t 加一個 MDL 讀鎖。由于 session B 需要的也是 MDL 讀鎖,因此可以正常執行。

之后 session C 會被 blocked,是因為 session A 的 MDL 讀鎖還沒有釋放,而 sessionC 需要MDL 寫鎖,因此只能被阻塞。

如果只有 session C 自己被阻塞還沒什么關系,但是之后所有要在表 t 上新申請 MDL 讀鎖的請求也會被 session C 阻塞。前面說了,所有對表的增刪改查操作都需要先申請MDL 讀鎖,就都被鎖住,等于這個表現在完全不可讀寫了。

如果某個表上的查詢語句頻繁,而且客戶端有重試機制,也就是說超時后會再起一個新session 再請求的話,這個庫的線程很快就會爆滿。

事務中的 MDL 鎖,在語句執行開始時申請,但是語句結束后并不會馬上釋放,而會等到整個事務提交后再釋放。
注 : 一般行鎖都有鎖超時時間。但是MDL鎖沒有超時時間的限制,只要事務沒有提交就會一直鎖注。

2.2.1 怎么解決了這個MDL鎖

上面不是說了嗎,提交或者回滾這個事務。所以要找到這個事務

怎么找到這個事務, 通過information_schema.innodb_trx查看事務的執行時間

# 查看事務超過60s的事務
mysql> select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60\G;
trx_started 表示什么時候執行的這個事務
 
#查看系統當前時間
mysql> select now();

事務開始時間和系統現在時間,一看事務執行了這么久。

查看這個線程id

怎么處理了這個長事務的線程id了

首先看show full processlist; 中host 哪個字段 ,到底是誰連接了數據庫。例:我上面是localhost環境,進去commit或者/rollback ,哪如果不是localhost 環境了,是程序連接了這時候就要kill掉了

2.2.2 我身上發生的趣事

上次有個DBA 問我, 造成很大主從延遲,說要怎么解決。

我說你怎么解決的延遲, 知道主從延遲造成的具體的原因嗎?

ta給我說,開啟了多線程, 但是延遲還是很大,基本沒怎么用到多線程。

我說你怎么知道主從延遲,需要開啟多線程復制來解決, ta給我說,網上別人blog這莫說的,我一口老血吐出來。

后來又問ta, 主從延遲正常情況下,做了什么操作, ta給我說修改了alter 表結構。

然后讓ta 看是不是mdl 鎖造成的,讓tashow full processlist,一看果然是mdl 鎖原因。

然后跟ta 說 找長事務, 找到以后跟開發商議,這個長事務在做什么操作可不可以kill掉。

注:這是我真實遇到,別人問我這樣問題。首先你要知道造成這個結果,你事先做了什么操作, 然后解決這個問題,最根本你還是要知道原因,然后下次避免。

還有網上的環境,系統版本,應用版本,遇到問題的情況,跟你是不是一樣,有時候不要盲目相信。

2.3 如何安全地給小表加字段?

首先我們要解決長事務,事務不提交,就會一直占著 MDL 鎖。在 MySQL 的information_schema 庫的 innodb_trx 表中,你可以查到當前執行中的事務。如果你要做 DDL 變更的表剛好有長事務在執行,要考慮先暫停 DDL,或者 kill 掉這個長事務。這也是為什么需要在低峰期做ddl 變更,當然也要考慮具體做什么ddl,參考官方的online ddl。

2.4 online ddl 過程

  • 拿MDL寫鎖
  • 降級成MDL讀鎖
  • 真正做DDL
  • 升級成MDL寫鎖
  • 釋放MDL鎖

1、2、4、5如果沒有鎖沖突,執行時間非常短。第3步占用了DDL絕大部分時間,這期間這個個表可以正常讀寫數據,是因此稱為”online”

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • MySQL中的行級鎖、表級鎖、頁級鎖
  • MySQL行級鎖、表級鎖、頁級鎖詳細介紹
  • MySQL的全局鎖和表級鎖的具體使用

標簽:烏海 云浮 聊城 臨汾 湖南 武威 白銀 湖北

巨人網絡通訊聲明:本文標題《MySQL全局鎖和表鎖的深入理解》,本文關鍵詞  MySQL,全局,鎖,和,表鎖,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL全局鎖和表鎖的深入理解》相關的同類信息!
  • 本頁收集關于MySQL全局鎖和表鎖的深入理解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    一区二区三区日韩欧美| 日韩西西人体444www| 色呦呦网站一区| 97aⅴ精品视频一二三区| 国产精品一区二区在线观看不卡 | 成人性生交大片免费看视频在线| 久久久一区二区| 一本久道中文字幕精品亚洲嫩 | 国产在线精品一区二区不卡了| 中文字幕一区二区三区在线观看| 国产不卡免费视频| 久久久久亚洲蜜桃| 国产精品夜夜嗨| 一本一道久久a久久精品| 中文字幕一区二区三区色视频| 成人不卡免费av| 国产精品灌醉下药二区| 国产亚洲综合av| 久久精品免费观看| eeuss鲁片一区二区三区在线观看| 在线观看91视频| 久久久三级国产网站| 91.com视频| 久久精品72免费观看| 国产欧美日韩视频一区二区| 91黄色激情网站| 欧美性猛交一区二区三区精品| 国产精品免费久久| 91精品午夜视频| 亚洲一区二区精品3399| 亚洲二区在线视频| 日韩黄色片在线观看| 国产精品综合一区二区| 成人激情开心网| 国产精品久久久久久妇女6080| 亚洲精品国产第一综合99久久| 91福利精品视频| 青青草原综合久久大伊人精品优势| 精品成人一区二区三区| 精品日韩99亚洲| 欧美一区二区网站| 国产精品伦理一区二区| 最新日韩av在线| 免费观看91视频大全| 91免费国产在线| 欧美久久久久久久久久| 国产精品久久精品日日| 亚洲国产精品黑人久久久 | 久久精品免费看| 一区二区三区日韩在线观看| 亚洲人亚洲人成电影网站色| 欧美激情一二三区| 国产精品天干天干在观线| 欧美高清在线一区二区| 日本欧美大码aⅴ在线播放| 日本不卡一二三区黄网| 欧美日韩1234| 美女视频黄频大全不卡视频在线播放 | 在线一区二区三区四区五区| 亚洲图片激情小说| 欧美色区777第一页| 热久久国产精品| 国产精品国产三级国产a| 欧美精品视频www在线观看| 国产精品69毛片高清亚洲| 亚洲天堂av一区| 日韩一区二区免费视频| www.色精品| 日本成人中文字幕在线视频| 国产精品污www在线观看| 欧美日韩亚洲综合在线| 成人国产精品免费网站| 天天做天天摸天天爽国产一区| 国产欧美一区二区三区在线老狼| 色成年激情久久综合| 国产suv一区二区三区88区| 一区二区高清免费观看影视大全 | 国产精品影视在线| 中文字幕av一区 二区| 成人黄色免费短视频| 毛片一区二区三区| 色av成人天堂桃色av| 欧美日韩精品一区二区三区四区| 久久综合网色—综合色88| 精品亚洲成av人在线观看| 26uuu成人网一区二区三区| 99久久久无码国产精品| 蜜桃av一区二区在线观看| 亚洲精品第1页| 亚洲综合在线电影| 国产欧美一区二区三区在线老狼 | 色综合久久久久综合体桃花网| 精品系列免费在线观看| 视频在线观看91| 精品久久久久久久人人人人传媒| 麻豆一区二区三区| 国产精品人妖ts系列视频| av亚洲精华国产精华精华| 亚洲色图制服诱惑| 精品免费一区二区三区| 91丝袜美女网| 日本成人在线一区| 中文字幕精品一区| 久久婷婷国产综合精品青草| 99视频一区二区| 国产露脸91国语对白| 免费观看在线色综合| 男男视频亚洲欧美| 免费av网站大全久久| 日韩精品午夜视频| 男男视频亚洲欧美| 久久精品国内一区二区三区| 日韩福利电影在线观看| 天堂蜜桃一区二区三区| 日韩中文字幕区一区有砖一区 | 欧美mv和日韩mv的网站| 717成人午夜免费福利电影| 欧美美女视频在线观看| 欧美日韩综合一区| 91精品国产综合久久蜜臀| 欧美成人三级电影在线| 精品国产麻豆免费人成网站| 久久亚洲私人国产精品va媚药| 久久久精品免费网站| 国产精品久久久久影院| 亚洲视频一区二区在线| 中文字幕中文字幕一区二区| 精品一区二区三区蜜桃| 亚洲国产精品久久久男人的天堂| 精品sm在线观看| 久久久综合激的五月天| 亚洲国产精品v| 亚洲夂夂婷婷色拍ww47| 激情av综合网| 国产欧美日韩亚州综合| 国产精品国产三级国产aⅴ中文 | 午夜成人免费视频| 97久久人人超碰| 自拍偷拍欧美精品| 在线一区二区视频| 日韩福利电影在线观看| 久久久久国产精品厨房| 日韩 欧美一区二区三区| 成人18视频在线播放| 色综合久久综合网| 欧美va亚洲va在线观看蝴蝶网| 亚洲精品在线免费观看视频| 国产精品伦理在线| 成熟亚洲日本毛茸茸凸凹| 99视频在线观看一区三区| 欧美激情中文不卡| 久久av老司机精品网站导航| 色噜噜偷拍精品综合在线| 成人深夜在线观看| 欧美精品在线观看播放| 久久一区二区三区四区| 一区二区三区四区在线播放| 久久国产精品免费| 欧美性大战久久| 国产日本欧洲亚洲| 免费欧美高清视频| 欧美视频中文字幕| 国产精品久久影院| 精东粉嫩av免费一区二区三区| 色欧美片视频在线观看在线视频| 久久婷婷国产综合国色天香| 午夜国产精品影院在线观看| 成人性生交大片免费看中文| 欧美成人伊人久久综合网| 亚洲电影一区二区三区| 99久久亚洲一区二区三区青草| 欧美日韩国产一区二区三区地区| 中文字幕一区二区在线观看| 狠狠色狠狠色综合系列| 欧美精品粉嫩高潮一区二区| 最新久久zyz资源站| 国产黄色成人av| 欧美精品一区二区三区视频| 青青草国产成人99久久| 在线一区二区三区| 综合激情网...| 成人免费黄色在线| 久久精品亚洲精品国产欧美kt∨| 日韩精品91亚洲二区在线观看| 欧美综合视频在线观看| 亚洲另类一区二区| 99re6这里只有精品视频在线观看| 日韩午夜中文字幕| 欧美一区三区四区| 日韩精品一区二区在线观看| 国产精品三级av| 欧美高清激情brazzers| 91在线精品一区二区三区| 成人av在线一区二区三区| 美女www一区二区| 亚洲综合视频网| 亚洲免费大片在线观看| 国产精品午夜免费| 综合中文字幕亚洲| 亚洲人成网站影音先锋播放|