MySQL使用者現成的建立與使用者執行緒的狀態原始碼解析

2021-07-25 23:17:56 字數 1354 閱讀 6187

pig已經好長一段時間沒有分享文章了,有點對不起訂閱的朋友。最近在做比較複雜跟困難的事情,也並不一定最終會有成果,因此必須對此沉默。 停了一段時間,現在定個小目標----2個星期至少寫一篇小文章,簡單講清楚乙個小細節。希望自己最後堅持下來。

回題,mysql是多執行緒的資料庫,每個應用會話連線到資料庫時,會使用或者建立乙個使用者執行緒, 至於是使用尚未使用的使用者執行緒還是新建立乙個使用者執行緒,取決於是否還有沒有分配給使用者會話的使用者執行緒。 這樣說,可能還太好理解,下面再繼續描述跟補充:

mysql資料庫(這裡指的是mysql5.7,其他版本是否有這功能未查)為了使使用者會話連線可以快速建立,將一些將用於使用者會話的執行緒提前建立起來,這些執行緒是乙個普通的使用者執行緒,一直處於等待被某個使用者連線會話使用的狀態。下面是這類執行緒的棧,該執行緒在呼叫per_thread_connection_handler::

block_until_new_connection  函式,等待被新的會話連線使用。

另外一類使用者執行緒,就是被已經某個使用者連線(會話)占用著,該使用者執行緒可能正在執行資料庫的命令或者等待使用者傳送命令,下面是等待使用者會話傳送命令時的使用者執行緒的棧。該使用者執行緒在等待乙個網路事件的發生。

到此,應該大家清楚這兩種型別的使用者執行緒,我們再來看一下使用者執行緒是如何被建立的--使用者執行緒是被主線程在需要的時候建立的。所謂需要的時候, 就是使用者會話跟資料庫伺服器建立連線時,而資料庫伺服器沒有可以利用的使用者執行緒時(也就是不存在上面所說的第一類使用者執行緒),則直接建立乙個新的使用者執行緒。下面是建立使用者執行緒的函式,在該函式體內呼叫了mysql_thread_create, 建立入口函式為handle_connection的執行緒。因此handle_connection也就是使用者執行緒的頂層函式。

下面我們來看一下該函式的棧。

上面提到,在新的使用者會話連線進來的時候,會視情況來決定是否需要建立新的使用者執行緒,判斷函式如下: .

當blocked_pthread_count> wake_pthread的時候,是不需要建立新的執行緒的,直接wake up乙個idle的使用者執行緒。反之,則需要建立執行緒。

mysql 新增使用者 mysql建立使用者與授權

一 建立使用者 create user username host identified by password 說明username 你將建立的使用者名稱 host 指定該使用者在哪個主機上可以登陸,如果是本地使用者可用localhost,如果想讓該使用者可以從任意遠端主機登陸,可以使用萬用字元 ...

mysql 建立使用者指令碼 Mysql使用者建立指令碼

我試圖自動化mysql使用者建立過程。我想到建立乙個包含mysql使用者建立語句的臨時檔案,那麼我會這樣稱呼 mysql u root proot 這裡是我的臨時檔案的內容 drop database if exists mytestdatabase create database mytestda...

MySQL建立使用者與授權

一 建立使用者 命令 create user username host identified by password 說明 username 你將建立的使用者名稱,host 指定該使用者在哪個主機上可以登陸,如果是本地使用者可用localhost,如果想讓該使用者可以從任意遠端主機登陸,可以使用萬...