標籤:
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)範圍