免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
mysql之show engine innodb status解讀
注:以下內(nèi)容為根據(jù)《高性能mysql第三版》和《mysql技術(shù)內(nèi)幕innodb存儲(chǔ)引擎》的innodb status部分的個(gè)人理解,如果有錯(cuò)誤,還望指正?。?/span>
  innodb存儲(chǔ)引擎在show engine innodb status(老版本對(duì)應(yīng)的是show innodb status)輸出中,顯示除了大量的內(nèi)部信息,它輸出就是一個(gè)單獨(dú)的字符串,沒有行和列,內(nèi)容分為很多小段,每一段對(duì)應(yīng)innodb存儲(chǔ)引擎不同部分的信息,其中有一些信息對(duì)于innodb開發(fā)者來說非常有用,但是,許多信息,如果你嘗試去理解,并且應(yīng)用到高性能innodb調(diào)優(yōu)的時(shí)候,你會(huì)發(fā)現(xiàn)它們非常有趣,甚至是非常有必要的。
    輸出內(nèi)容中包含了一些平均值的統(tǒng)計(jì)信息,這些平均值是自上次輸出結(jié)果生成以來的統(tǒng)計(jì)數(shù),因此,如果你正在檢查這些值,那就要確保已經(jīng)等待了至少30s的時(shí)間,使兩次采樣之間的積累足夠長(zhǎng)的統(tǒng)計(jì)時(shí)間并多次采樣,檢查計(jì)數(shù)器變化從而弄清其行為,并不是所有的輸出都會(huì)在一個(gè)時(shí)間點(diǎn)上生成,因而也不是所有的顯示出來的平均值會(huì)在同一時(shí)間間隔里重新再計(jì)算。而且,innodb有一個(gè)內(nèi)部復(fù)位間隔,而它是不可預(yù)知的,各個(gè)版本也不一樣。
這些輸出信息足夠提供給手工計(jì)算出大多數(shù)你想要的統(tǒng)計(jì)信息,有一款監(jiān)控工具innotop可以幫你計(jì)算出增量差值和平均值。下面,在你的mysql命令行敲下show engine innodb status;看著輸出跟著下面的步驟一步一步理解輸出信息是什么含義:
注意:以下使用mysql5.5.24版本做解讀,mysql5.6.x和5.7.x輸出內(nèi)容有些地方有調(diào)整。
1.第一段是頭部信息,它僅僅聲明了輸出的開始,其內(nèi)容包括當(dāng)前的日期和時(shí)間,以及自上次輸出以來經(jīng)過的時(shí)長(zhǎng)。
=====================================
160129 12:07:26 INNODB MONITOR OUTPUT  #第二行是當(dāng)前日期和時(shí)間
=====================================
Per second averages calculated from the last 24 seconds #第四行顯示的是計(jì)算出這一平均值的時(shí)間間隔,即自上次輸出以來的時(shí)間,或者是距上次內(nèi)部復(fù)位的時(shí)長(zhǎng)
2.從innodb1.0.x開始,可以使用命令show engine innodb status;來查看master thread的狀態(tài)信息:
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 30977173 1_second, 30975685 sleeps, 3090359 10_second, 166112 background, 165988 flush #這行顯示主循環(huán)進(jìn)行了30977173 1_second次,每秒掛起的操作進(jìn)行了30975685 sleeps次(說明負(fù)載不是很大),10秒一次的活動(dòng)進(jìn)行了3090359 10_second次,1秒循環(huán)和10秒循環(huán)比值符合1:10,backgroup loop進(jìn)行了166112 background次,flush loop進(jìn)行了165988 flush次,如果在一臺(tái)很大壓力的mysql上,可能看到每秒運(yùn)行次數(shù)和掛起次數(shù)比例小于1很多,這是因?yàn)?span lang="EN-US">innodb對(duì)內(nèi)部進(jìn)行了一些優(yōu)化,當(dāng)壓力大時(shí)間隔時(shí)間并不總是等待1秒,因此,不能認(rèn)為每秒循環(huán)和掛起的值總是相等,在某些情況下,可以通過兩者之間的差值來比較反映當(dāng)前數(shù)據(jù)庫(kù)的負(fù)載壓力。
srv_master_thread log flush and writes: 31160103
3.如果有高并發(fā)的工作負(fù)載,你就要關(guān)注下接下來的段(SEMAPHORES信號(hào)量),它包含了兩種數(shù)據(jù):事件計(jì)數(shù)器以及可選的當(dāng)前等待線程的列表,如果有性能上的瓶頸,可以使用這些信息來找出瓶頸,不幸的是,想知道怎么使用這些信息還是有一點(diǎn)復(fù)雜,下面先給出一些解釋:
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 68581015, signal count 218437328 
--Thread 140653057947392 has waited at btr0pcur.c line 437 for 0.00 seconds the semaphore:
S-lock on RW-latch at 0x7ff536c7d3c0 created in file buf0buf.c line 916
a writer (thread id 140653057947392) has reserved it in mode  exclusive
number of readers 0, waiters flag 1, lock_word: 0
Last time read locked in file row0sel.c line 3097
Last time write locked in file /usr/local/src/soft/mysql-5.5.24/storage/innobase/buf/buf0buf.c line 3151
--Thread 140653677291264 has waited at btr0pcur.c line 437 for 0.00 seconds the semaphore:
S-lock on RW-latch at 0x7ff53945b240 created in file buf0buf.c line 916
a writer (thread id 140653677291264) has reserved it in mode  exclusive
number of readers 0, waiters flag 1, lock_word: 0
Last time read locked in file row0sel.c line 3097
Last time write locked in file /usr/local/src/soft/mysql-5.5.24/storage/innobase/buf/buf0buf.c line 3151
Mutex spin waits 1157217380, rounds 1783981614, OS waits 10610359
RW-shared spins 103830012, rounds 1982690277, OS waits 52051891
RW-excl spins 43730722, rounds 602114981, OS waits 3495769
Spin rounds per wait: 1.54 mutex, 19.10 RW-shared, 13.77 RW-excl
內(nèi)容比較多,下面分段依次解釋:
3.1.
    OS WAIT ARRAY INFO: reservation count 68581015, signal count 218437328  #這行給出了關(guān)于操作系統(tǒng)等待數(shù)組的信息,它是一個(gè)插槽數(shù)組,innodb在數(shù)組里為信號(hào)量保留了一些插槽,操作系統(tǒng)用這些信號(hào)量給線程發(fā)送信號(hào),使線程可以繼續(xù)運(yùn)行,以完成它們等著做的事情,這一行還顯示出innodb使用了多少次操作系統(tǒng)的等待:保留統(tǒng)計(jì)(reservation count)顯示了innodb分配插槽的頻度,而信號(hào)計(jì)數(shù)(signal count)衡量的是線程通過數(shù)組得到信號(hào)的頻度,操作系統(tǒng)的等待相對(duì)于空轉(zhuǎn)等待(spin wait)要昂貴些。
3.2.
--Thread 140653057947392 has waited at btr0pcur.c line 437 for 0.00 seconds the semaphore:
S-lock on RW-latch at 0x7ff536c7d3c0 created in file buf0buf.c line 916
a writer (thread id 140653057947392) has reserved it in mode  exclusive
number of readers 0, waiters flag 1, lock_word: 0
Last time read locked in file row0sel.c line 3097
Last time write locked in file /usr/local/src/soft/mysql-5.5.24/storage/innobase/buf/buf0buf.c line 3151
--Thread 140653677291264 has waited at btr0pcur.c line 437 for 0.00 seconds the semaphore:
S-lock on RW-latch at 0x7ff53945b240 created in file buf0buf.c line 916
a writer (thread id 140653677291264) has reserved it in mode  exclusive
number of readers 0, waiters flag 1, lock_word: 0
Last time read locked in file row0sel.c line 3097
Last time write locked in file /usr/local/src/soft/mysql-5.5.24/storage/innobase/buf/buf0buf.c line 3151
    這部分顯示的是當(dāng)前正在等待互斥量的innodb線程,在這里可以看到有兩個(gè)線程正在等待,每一個(gè)都是以--Thread <數(shù)字> has waited...開始,這一段內(nèi)容在正常情況下應(yīng)該是空的(即查看的時(shí)候沒有這部分內(nèi)容),除非服務(wù)器運(yùn)行著高并發(fā)的工作負(fù)載,促使innodb采取讓操作系統(tǒng)等待的措施,除非你對(duì)innodb源碼熟悉,否則這里看到的最有用的信息就是發(fā)生線程等待的代碼文件名 /usr/local/src/soft/mysql-5.5.24/storage/innobase/buf/buf0buf.c line 3151。
    在innodb內(nèi)部哪里才是熱點(diǎn)?舉例來說,如果看到許多線程都在一個(gè)名為buf0buf.c的文件上等待,那就意味著你的系統(tǒng)里存在著
緩沖池競(jìng)爭(zhēng),這個(gè)輸出信息還顯示了這些線程等待了多少時(shí)間,其中waiters flag顯示了有多少個(gè)等待著正在等待同一個(gè)互斥量。 如果waiters flag為0那就表示沒有線程在等待同一個(gè)互斥量(此時(shí)在waiters flag 0后面可能可以看到wait is ending,表示這個(gè)互斥量已經(jīng)被釋放了,但操作系統(tǒng)還沒有把線程調(diào)度過來運(yùn)行)。
    你可能想知道innodb真正等待的是什么,innodb使用了互斥量和信號(hào)量來保護(hù)代碼的臨界區(qū),如:限定每次只能有一個(gè)線程進(jìn)入臨界區(qū),或者是當(dāng)有活動(dòng)的讀時(shí),就限制寫入等。在innodb代碼里有很多臨界區(qū),在合適的條件下,它們都可能出現(xiàn)在那里,常常能見到的一種情形是:獲取緩沖池分頁(yè)的訪問權(quán)的時(shí)候。
3.3.
在等待線程之后的部分信息如下,這部分顯示了更多的事件計(jì)數(shù)器,在每一個(gè)情形中,都能看到innodb依靠操作系統(tǒng)等待的頻度:
Mutex spin waits 1157217380, rounds 1783981614, OS waits 10610359 #這行顯示的是跟互斥量相關(guān)的幾個(gè)計(jì)數(shù)器
RW-shared spins 103830012, rounds 1982690277, OS waits 52051891 #這行顯示讀寫的共享鎖的計(jì)數(shù)器
RW-excl spins 43730722, rounds 602114981, OS waits 3495769 #這行顯示讀寫的排他鎖的計(jì)數(shù)器
Spin rounds per wait: 1.54 mutex, 19.10 RW-shared, 13.77 RW-excl
    innodb有著一個(gè)多階段等待的策略,首先,它會(huì)試著對(duì)鎖進(jìn)行空轉(zhuǎn)等待,如果經(jīng)歷了一個(gè)預(yù)設(shè)的空轉(zhuǎn)等待周期(設(shè)置innodb_sync_spin_loops配置變量命令)之后還沒有成功,那就會(huì)退到更昂貴更復(fù)雜的等待數(shù)組中。
    空轉(zhuǎn)等待的成本相對(duì)較低,但是它們要不停地檢查一個(gè)資源能否被鎖定,這種方式會(huì)消耗CPU周期,但是,這沒有聽起來那么糟糕,因?yàn)楫?dāng)處理器在等待IO時(shí),一般都有一些空閑的CPU周期可用,即使是沒有空閑的CPU周期,空等也要比其他方式更加廉價(jià)一些。然而,當(dāng)另外一個(gè)線程能做一些事情的時(shí)候,空轉(zhuǎn)等待也還會(huì)把CPU獨(dú)占著。
    空轉(zhuǎn)等待的替代方案就是讓操作系統(tǒng)做上下文切換,這樣,當(dāng)一個(gè)線程在等待時(shí),另外一個(gè)線程就可以被運(yùn)行,然后,通過等待數(shù)組里的信號(hào)量發(fā)出信號(hào),喚醒那個(gè)沉睡的線程,通過信號(hào)量來發(fā)送信號(hào)是比較有效的,但是上下文切換就很昂貴,這很快就會(huì)積少成多,每秒鐘幾千次的切換會(huì)引發(fā)大量的系統(tǒng)開銷。
    你可以通過修改innodb_sync_spin_loops的值,試著在空轉(zhuǎn)等待與操作系統(tǒng)等待之間達(dá)成平衡,不要擔(dān)心空轉(zhuǎn)等待,除非你在一秒里看到幾十萬(wàn)個(gè)空轉(zhuǎn)等待。此時(shí),你可以考慮performance_schema庫(kù)或者show engine innodb mutex;查看下相關(guān)信息。
4.下面這一段外鍵錯(cuò)誤的信息一般不會(huì)出現(xiàn),除非你服務(wù)器上發(fā)生了外鍵錯(cuò)誤,有時(shí)問題在于事務(wù)在插入,更新或刪除一條記錄時(shí)要尋找父表或子表,還有時(shí)候是當(dāng)innodb嘗試增加或刪除一個(gè)外鍵或者修改一個(gè)已經(jīng)存在的外鍵時(shí),發(fā)現(xiàn)表之間類型不匹配,這部分輸出對(duì)于調(diào)試與innodb不明確的外鍵錯(cuò)誤發(fā)生的準(zhǔn)確原因非常有幫助,下面搞一個(gè)示例來看看:
4.1 創(chuàng)建父表:
mysql> create table parent(parent_id int not null,primary key(parent_id)) engine=innodb;
4.2 創(chuàng)建子表:
mysql> create table child(child_id int not null,key child_id(child_id),constraint i_child foreign key(child_id) references parent(parent_id)) engine=innodb;
4.3 插入數(shù)據(jù):
mysql> insert into parent(parent_id) values(1);
mysql> insert into child(child_id) values(1);
4.5 有兩種基本的外鍵錯(cuò)誤:
第一種:以某種可能違反外鍵約束關(guān)系的方法增加,更新,刪除數(shù)據(jù),將導(dǎo)致第一類錯(cuò)誤,如,在父表中刪除行時(shí)發(fā)生如下錯(cuò)誤:
mysql> delete from parent;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`xiaoboluo`.`child`, CONSTRAINT `i_child` FOREIGN KEY (`child_id`) REFERENCES `parent` (`parent_id`))
錯(cuò)誤信息相當(dāng)明了,對(duì)所有由增加,刪除,更新不匹配的行導(dǎo)致的錯(cuò)誤都會(huì)看到相似的信息,下面是show engine innodb status的輸出:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
160128  1:17:06 Transaction:  #這行顯示了最近一次外鍵錯(cuò)誤的日期和時(shí)間
TRANSACTION D203D6, ACTIVE 0 sec updating or deleting
mysql tables in use 1, locked 1
4 lock struct(s), heap size 1248, 2 row lock(s), undo log entries 1
MySQL thread id 20027, OS thread handle 0x7f0a4c0f8700, query id 1813996 localhost root updating
delete from parent
Foreign key constraint fails for table `xiaoboluo`.`child`:
, #上面部分顯示了關(guān)于破壞外鍵約束的事務(wù)詳情。后邊部分顯示了發(fā)現(xiàn)錯(cuò)誤時(shí)innodb正嘗試修改的準(zhǔn)確數(shù)據(jù),輸出中有許多是轉(zhuǎn)換成可打印格式的行數(shù)據(jù)。
  CONSTRAINT `i_child` FOREIGN KEY (`child_id`) REFERENCES `parent` (`parent_id`)
Trying to delete or update in parent table, in index `PRIMARY` tuple:
DATA TUPLE: 3 fields;
 0: len 4; hex 80000001; asc     ;;
 1: len 6; hex 000000d203d6; asc       ;;
 2: len 7; hex 1e000001ca0110; asc        ;;
But in child table `xiaoboluo`.`child`, in index `child_id`, there is a record:
PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 4; hex 80000001; asc     ;;
 1: len 6; hex 000013a99b3e; asc      >;;
4.6 第二種:嘗試修改父表的表結(jié)構(gòu)時(shí)發(fā)生的錯(cuò)誤,這種錯(cuò)誤就沒有那么清楚了,這可能會(huì)讓調(diào)試更困難:
mysql> alter table parent modify parent_id int unsigned not null;
ERROR 1025 (HY000): Error on rename of './xiaoboluo/#sql-b695_4e3b' to './xiaoboluo/parent' (errno: 150)
查看show engine innodb status輸出信息:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
160128  1:32:33 Error in foreign key constraint of table xiaoboluo/child:
there is no index in referenced table which would contain
the columns as the first columns, or the data types in the
referenced table do not match the ones in table. Constraint:
,
  CONSTRAINT "i_child" FOREIGN KEY ("child_id") REFERENCES "parent" ("parent_id")
The index in the foreign key in table is "child_id"
See 
    死鎖在等待關(guān)系圖里是一個(gè)循環(huán),就是一個(gè)鎖定了行的數(shù)據(jù)結(jié)構(gòu)又在等待別的鎖,這個(gè)循環(huán)可以任意地大,innodb會(huì)立即檢測(cè)到死鎖,因?yàn)槊慨?dāng)有事務(wù)等待行鎖的時(shí)候,它都會(huì)去檢查等待關(guān)系圖里是否有循環(huán),死鎖的情況可能會(huì)比較復(fù)雜,但是,這一部分只顯示了最近的兩個(gè)死鎖的情況,它們?cè)诟髯缘氖聞?wù)里執(zhí)行的最后一條語(yǔ)句,以及它們?cè)诘却P(guān)系圖里形成環(huán)鎖的信息。在這個(gè)循環(huán)里你看不到其他事務(wù),也可能看不到在事務(wù)里早先真正獲得了鎖的語(yǔ)句,盡管如此,通常還是可以通過查看這些輸出結(jié)果來確定到底是什么引起了死鎖。

    innodb不僅會(huì)打印出事務(wù)和事務(wù)持有和等待的鎖,而且還有記錄本身,不幸的是,它至于可能超過為輸出結(jié)果預(yù)留的長(zhǎng)度(只能打印1M的內(nèi)容且只能保留最近一次的死鎖信息),如果你無(wú)法看到完整的輸出,此時(shí)可以在任意庫(kù)下創(chuàng)建innodb_monitor或innodb_lock_monitor表,這樣innodb status信息會(huì)完整且每15s一次被記錄到錯(cuò)誤日志中。如:create table innodb_monitor(a int)engine=innodb;,不需要記錄到錯(cuò)誤日志中時(shí)就刪掉這個(gè)表即可。

Purge done for trx's n:o < 4E01090B undo n:o < 0 #這是innodb清除舊MVCC行時(shí)所用的事務(wù)ID,將這個(gè)值和當(dāng)前事務(wù)ID進(jìn)行比較,就可以知道有多少老版本的數(shù)據(jù)未被清除。這個(gè)數(shù)字多大才可以安全的取值沒有硬性和速成的規(guī)定,如果數(shù)據(jù)沒做過任何更新,那么一個(gè)巨大的數(shù)字也不意味著有未清除的數(shù)據(jù),因?yàn)閷?shí)際上所有事務(wù)在數(shù)據(jù)庫(kù)里查看的都是同一個(gè)版本的數(shù)據(jù)(此時(shí)只是事務(wù)ID在增加,而數(shù)據(jù)沒有變更),另一方面,如果有很多行被更新,那每一行就會(huì)有一個(gè)或多個(gè)版本留在內(nèi)存里,減少此類開銷的最好辦法就是確保事務(wù)已完成就立即提交,不要讓它長(zhǎng)時(shí)間地處于打開狀態(tài),因?yàn)橐粋€(gè)打開的事務(wù)即使不做任何操作,也會(huì)影響到innodb清理舊版本的行數(shù)據(jù)。 undo n:o < 0這個(gè)是innodb清理進(jìn)程正在使用的撤銷日志編號(hào),為0 0時(shí)說明清理進(jìn)程處于空閑狀態(tài)。
mysql tables in use 1, locked 0 #該事務(wù)用到的表數(shù)和涉及表鎖的表數(shù),Innodb一般不會(huì)鎖定表,但對(duì)有些語(yǔ)句會(huì)鎖定,如果mysql服務(wù)器在高于innodb層之上將表鎖定,這里也是能夠顯示出來的,如果事務(wù)已經(jīng)鎖定了幾行數(shù)據(jù),這里將會(huì)有一行信息顯示出鎖定結(jié)構(gòu)的數(shù)目(注意,這跟行鎖是兩回事)和和堆大小,如:2 lock struct(s), heap size 376, 1 row lock(s), undo log entries 1,堆的大小指的是為了持有這些行鎖而占用的內(nèi)存大小,Innodb是用一種特殊的位圖表來實(shí)現(xiàn)行鎖的,從理論上講,它可將每一個(gè)鎖定的行表示為一個(gè)比特,經(jīng)測(cè)試顯示,每個(gè)鎖通常不超過4比特。

對(duì)于壓縮頁(yè)的表,每個(gè)表的壓縮比例可能不同,可能存在有的表頁(yè)大小為8K,有的表頁(yè)大小為2K的情況,unzip_LRUs 怎樣從緩存池中分配內(nèi)存的呢?

首先,在unzip_LRU列表中對(duì)不同壓縮頁(yè)大小的頁(yè)進(jìn)行分別管理,其次,通過伙伴算法進(jìn)行內(nèi)存的分配,例如:需要從緩存池中申請(qǐng)頁(yè)為4K的大小,其過程如下:

a:檢查4K的unzip_LRU列表,檢查是否有可用的空閑頁(yè)

b:若有,則直接使用

c:若沒有,檢查8K的unzip_LRU列表

d:若能夠得到空閑頁(yè),將頁(yè)分成2個(gè)4K的頁(yè),存放到4K的unzip_LRU列表

e:若不能得到空閑頁(yè),從LRU列表中申請(qǐng)一個(gè)16K的頁(yè),將頁(yè)分成1個(gè)8K,2個(gè)4K的頁(yè),分別存放到各自大小對(duì)應(yīng)的unzip_LRU列表中。

_buffer_pool_instances=num設(shè)置了大于1個(gè)緩沖池實(shí)例,那么就會(huì)按照這個(gè)參數(shù)把innodb_buffer_pool_size=xxx平分為num份。每份的信息顯示類似如下,這部分的內(nèi)容和9.1小節(jié)內(nèi)容類似,就不再多說。

 

 

10.這部分顯示了其他各項(xiàng)的innodb統(tǒng)計(jì):

 

注:內(nèi)核的主線程狀態(tài)可能的狀態(tài)值有如下一些:

A:doing background drop tables

B:doing insert buffer merge

C:flushing buffer pool pages

D:making checkpoint

E:purging

F:reserving kernel mutex

G:sleeping

H:suspending

I:waiting for buffer pool flush to end

J:waiting for server activity

打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服