MySQL中Global、Session和Both(Global & Session)範圍

來源:互聯網
上載者:User

標籤:

1. Global & Dynamic

example:slow_query_log

?  顯示該變數的值:


當前設定為OFF

?  在一個session中設定該Global &Dynamic類型的變數:



可以看到,對於global類型的變數必需通過global關鍵字來設定其值。

 ?  在同一個session中重新查看該變數的值:


發現該變數值已經發生了改變。

 ?  通過另外的session來查看該變數的值:

ü  該session在改變變數值時已存在


ü  該session在改變變數值時不存在,為之後建立的session


發現,無論是在改變變數值時已經存在的其他session中還是後來建立的session中均可以看到改變後的變數值。

 ?  重啟mysql伺服器之後重新查看該變數的值:


可以看到又恢複到了預設情況。(當然,在其他session中亦是如此)

 

結論:

l  對於Global& Dynamic類型的變數,需通過set global語句設定變數值。變數設定後,在該session和其他session中(已存在的和後串連的)可即刻看到設定後的值。但重啟伺服器後設定的 值失效,恢複為預設值。(理由是顯然的,因為沒有將設定的值寫進設定檔。)

l  對於Global類型的變數show、show session、show global顯示的結果是一致的,因為該Global變數對所有session可見,通過setglobal設定了該變數的值就相當於立刻設定了各session中該變數的值。


2. Global & Not Dynamic

example:bind_address

?  顯示該變數的值:

 

?  在一個session中設定該Global& Not Dynamic類型的變數:


發現對於Not Dynamic類型的變數不能通過此種方式設定變數值。

 

結論:

l  對於Not Dynamic類型的變數並不能通過命令直接設定值。

l  因為是Global類型的,因此在各session中執行show、show session、show global顯示的結果是一致的。


3. Session & Dynamic

example:gtid_next

?  顯示該變數的值:


對於Session類型的變數通過show global是得不到值的,需用show、show session命令查看。

?  在一個session中設定該Session&Dynamic類型的變數:

?  在同一個session中重新查看該變數的值:


可以看到變數值已經變化為設定後的值。

?  通過另外的session來查看該變數的值:

ü  該session在變數值更改前已存在


可以看到,在其他已存在session中該變數的值仍為設定之前的值。

ü  該session在變數值更改前不存在,為變數值更改後新串連的session


可以看到,無論是在其他已存在session中還是後來建立的session中,該變數的值仍為設定之前的值。

?  重啟mysql伺服器之後重新查看該變數的值:


可以看到,變數值又恢複到設定前的預設值。

 

結論:

l  對於Session&Dynamic類型的變數可直接通過set、set session命令設定值,但是設定後的變數值只對設定時所使用的session有效,在其他session中(已存在的和後來建立的)不可見。 mysql伺服器重啟後設定的變數值失效。

l  對於Session類型的變數,通過showglobal不能得到結果。通過show、show session可得到針對發起命令的每個session中變數的值。


4. Session & Not Dynamic

example:proxy_user

?  顯示該變數的值:

 

?  在一個session中設定該Session&Not Dynamic類型的變數:

可以看到,對於Not Dynamic類型的變數不可以通過命令的方式設定變數值。

 

結論:

l  對於not dynamic類型的變數並不能通過命令直接設定值。

l  對於Session類型的變數,通過showglobal不能得到結果。通過show、show session可得到針對發起命令的每個session中變數的值。


5. Both & Dynamic

example:auto_increment_increment

?  顯示該變數的值:

可以看到當前session範圍和global範圍的變數值均為1。

在一個session中通過set session語句設定該Both& Dynamic類型的變數:

這裡沒有使用關鍵字global,所以,預設使用set session語句設定變數的值。

ü  在同一個session中重新查看該變數的值:


這裡沒有使用關鍵字global,所以,預設使用showsession語句顯示變數的值。在該session中變數值已變為設定後的值。

這裡使用關鍵字global來顯示變數的值。在該session中global範圍的變數值並沒有變為通過setsession語句設定後的值。 

ü  通過另外的session來查看該變數的值(在設定變數值時該session已存在):


在另外的已存在的session中global型的變數值仍為原來的值。在上個session中通過set session語句設定後的變數值在這裡的session中並不可見。

ü  通過另外的session來查看該變數的值(在設定變數值時該session不存在,是之後新串連的session):



在另外的設定好變數值後建立的session中global型的變數值仍為原來的值。在上個session中通過set session語句設定後的變數值在這裡的session中並不可見。               

ü  重啟mysql伺服器之後重新查看該變數的值:



重啟mysql伺服器後,變數值恢複為預設的值。

在一個session中通過set global語句設定該Both & Dynamic類型的變數:

 

ü  在同一個session中重新查看該變數的值:


這裡沒有使用關鍵字global,所以預設使用showsession variables語句顯示變數的值。在該session中session範圍的變數值仍未設定前的值。

這裡使用關鍵字global來顯示變數的值。在該session中global範圍的變數的值已經變為通過setglobal語句設定後的值。

ü  通過另外的session來查看該變數的值(在設定變數值時該session已存在):


在上個session中通過set global語句設定後的變數值在這個之前已經存在的session中並不可見。而在這個已存在的session中,global範圍的變數已變為設定後的值。

ü  通過另外的session來查看該變數的值(在設定變數值時該session不存在,是之後新串連的session):


在另外的設定好變數值後建立的session中global範圍的變數為設定後的值。在上個session中通過set global語句設定後的變數值在這個之後建立的session可見。                

ü  重啟mysql伺服器之後重新查看該變數的值:


重啟mysql伺服器後,變數值恢複為預設的值。

 

結論:

l  若變數為Both(global/session),則set<=>setsession, show<=>show session。若要設定和顯示global範圍的變數,則要顯式的使用setglobal和和show global。

l  對於Both&Dynamic類型的變數,若通過set命令(預設執行set session命令)設定新值(此時設定的是session範圍的變數值)。那麼在進行設定的session通過show命令(預設執行show session)查看變數值可以得到設定後的值。而新設定的變數值對其他之前已經存在或者之後建立的session都不可見。另外,由於是用set session設定的變數值,所以對於global範圍的變數沒有影響,無論在哪些session中通過show global語句查看到的變數值都是在執行set session命令前的值。

l  若通過set global命令設定變數的值(此時設定的是global範圍的變數值)。在進行設定的session通過show命令(預設執行show session)查看變數值,得到的仍是設定前的值(也即session範圍的值)。在其他之前已存在的session中使用show session命令得到的同樣是設定前的值。而在之後建立的session中通過show session命令可得到設定後的值(因為新的session讀到了更改後的新值)。無論是在執行更改的session還是更改時已存在的其他 session又或者後來建立的session,通過執行show global命令得到的都是設定後的global範圍的值。

l  不管是global範圍的變數還是session範圍的變數,在重啟伺服器之後,設定的值都會失效,而恢複為預設的值。

6. Both& Not Dynamic

example:gtid_executed

?  顯示該變數的值:

?  在一個session中設定該Both& Not Dynamic類型的變數:

可以看到,對於Not Dynamic類型的變數無論是global範圍還是session範圍都無法通過命令進行設定。

結論:對於Not Dynamic類型的變數無法通過set、set session、set global命令直接進行設定。

綜上所述:

?  對於Not Dynamic類型的變數不能通過set、set session、set global命令進行設定。只有Dynamic類型的變數才可以通過這些方式進行設定。

?  對於Dynamic變數

ü  若變數為單一的Global範圍,則必需使用setglobal命令設定變數值,不能使用set(這裡set<=>set session)命令設定,且設定後立即對所有session有效。對於Global範圍的變數show、show session、show global等價。

ü  若變數為單一的Session範圍,則需使用set(這裡set<=>setsession)命令設定變數值,不能使用set global命令設定,且設定後僅對進行設定的session有效。對於Session範圍的變數需使用show(這裡show<=> show session)命令顯示變數值,不能使用showglobal顯示session範圍的變數,若使用show global則顯示為空白。

ü  若變數為Both範圍,則使用set(這裡set<=>setsession)命令設定的變數值僅對進行設定的session有效,此時使用 show(這裡show<=>show session)命令可在該session中得到修改後的值,而通過showglobal在該session中得到的仍是通過set設定之前的 Global範圍的值;若使用set global命令設定變數的值,則在進行設定的session以及其他既存的session中通過show(這裡show<=>show session)命令顯示變數值得到的是修改前的值,而在後來建立的session中通過show(這裡show<=>show session)命令可以得到修改後的值,但是,無論是建立的還是既存的session若使用show global均可以的到通過set global命令設定後的值。

?  不管是global範圍的變數還是session範圍的變數,在重啟伺服器之後,設定的值都會失效,而恢複為預設的值。


MySQL中Global、Session和Both(Global & Session)範圍

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.