欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Oracle Freelist和HWM原理及性能優(yōu)化

系統(tǒng) 2000 0

近期來,F(xiàn)reeList的重要作用逐漸為Oracle DBA所認(rèn)識(shí),網(wǎng)上也出現(xiàn)一些相關(guān)的討論。本文以FreeList為線索對(duì)Oracle的存儲(chǔ)管理的原理進(jìn)行較深入的探討,涉及Oracle段區(qū)塊管理的原理,F(xiàn)reeList算法等。而與FreeList密切相關(guān)的一個(gè)重用特性HWM,與sql性能密切相關(guān),本文也作了原理分析介紹。在原理探討的基礎(chǔ)上,介紹了常用的存儲(chǔ)參數(shù)分析方法,并對(duì)所涉及的存儲(chǔ)優(yōu)化、HWM的優(yōu)化和Freelist競爭優(yōu)化作了說明。

縮略語:
ASSM:auto segement space management
HWM:high water mark
DBA:data block address
OLTP:online transaction process
OPS:oracle parallel server

1.簡介
Oracle的空間管理和存儲(chǔ)參數(shù)管理是Oracle管理及優(yōu)化的重要部分。FreeList作為Oracle底層存儲(chǔ)參數(shù)中的核心參數(shù),其行為方式對(duì)Oracle的存儲(chǔ)管理及性能優(yōu)化有重大影響,而現(xiàn)有的Oracle文檔對(duì)此方面的內(nèi)容比較缺乏。雖然Oracle 9i已出現(xiàn)了ASSM,但是作為深入調(diào)優(yōu)對(duì)FreeList認(rèn)識(shí)仍是必要的。

近期來,F(xiàn)reeList的重要作用逐漸為Oracle DBA所認(rèn)識(shí),網(wǎng)上也出現(xiàn)一些相關(guān)的討論。本文以FreeList為線索對(duì)Oracle的存儲(chǔ)管理的原理進(jìn)行較深入的探討,涉及Oracle段區(qū)塊管理的原理,F(xiàn)reeList算法等。而與FreeList密切相關(guān)的一個(gè)重用特性HWM,與sql性能密切相關(guān),本文也作了原理分析介紹。在原理探討的基礎(chǔ)上,介紹了常用的存儲(chǔ)參數(shù)分析方法,并對(duì)所涉及的存儲(chǔ)優(yōu)化、HWM的優(yōu)化和Freelist競爭優(yōu)化作了說明。

這些原理分析和性能優(yōu)化都建立在探討的基礎(chǔ)上,限于篇幅和本人經(jīng)驗(yàn)可能存在局限、偏差或謬誤。

為了準(zhǔn)確文中部分結(jié)構(gòu)和字段的說明直接用英文描述。限于篇幅本文不對(duì)同樣很重要的block結(jié)構(gòu)作更深入的討論,對(duì)OPS性能有重要影響的free list group本文也未提及,因此本文在單一free list group下討論。對(duì)于block的深入討論、free list group的介紹與優(yōu)化以及PCTUSED和PCTFREE等重要參數(shù)的優(yōu)化請(qǐng)參見參考文獻(xiàn)和資料。

2.原理探討

FreeList作為一個(gè)Oracle存儲(chǔ)管理的核心參數(shù)。其行為方式由Oralce內(nèi)部控制,我們一般不需要掌握和控制。但是我們可能會(huì)遇到這些問題,當(dāng)插入一條記錄,會(huì)插入到那個(gè)塊中?是使用新塊,還是插入有數(shù)據(jù)的老塊?段是什么時(shí)候擴(kuò)展的,如何擴(kuò)展的?表中只有一條記錄,但是作一次select時(shí)代價(jià)卻是上千個(gè)塊,為什么?如果我們從原理上清楚了Oracle的存儲(chǔ)管理方式,對(duì)相關(guān)這些問題的解決及性能優(yōu)化就清晰自然了。

2.1 Oracle的邏輯儲(chǔ)存結(jié)構(gòu)

Oralce的邏輯存儲(chǔ)結(jié)構(gòu)按表空間,段,區(qū),塊進(jìn)行管理。塊是Oracle用來管理存儲(chǔ)空間的最基本單元,Oracle數(shù)據(jù)庫在進(jìn)行輸入輸出操作時(shí),都是以塊為單位進(jìn)行邏輯讀寫操作的。區(qū)由一系列連續(xù)的塊組成,Oralce在進(jìn)行空間分配、回收和管理時(shí)是以區(qū)為基本單位的。段由多個(gè)區(qū)組成,這些區(qū)可以是連續(xù)的也可以是不連續(xù)的,一般情況下一個(gè)對(duì)象擁有一個(gè)段。表空間中容納段和區(qū)。

在生成段的時(shí)候,會(huì)同時(shí)分配初始區(qū)(initial extents), 初始區(qū)的第一個(gè)塊就格式化為segment header,并被用來記錄free list描述信息、extents信息,HWM信息等。

2.2 free list概念

free list是一種單向鏈表用于定位可以接收數(shù)據(jù)的塊,在字典管理方式的表空間中,Oracle使用free list來管理未分配的存儲(chǔ)塊。Oracle記錄了有空閑空間的塊用于insert或Update。空閑空間來源于兩種方式:1.段中所有超過HWM的塊,這些塊已經(jīng)分配給段了,但是還未被使用。2.段中所有在HWM下的且鏈入了free list的塊,可以被重用。free list具有下列屬性

l flag指示free list 被使用(1)或未使用(0)
l free list 鏈的首塊的地址DBA(data block address)
l free list 鏈的尾塊的地址DBA
free list 的信息通常保留在segment header中,這里給出segment header block dump片段加以說明:
nfl = 3, nfb = 1 typ = 1 nxf = 0
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
SEG LST:: flg: USED lhd: 0x03c00233 ltl: 0x03c00233
SEG LST:: flg: USED lhd: 0x03c00234 ltl: 0x03c00234
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000

Segment Header:
==> nfl: number of free lists/block
==> nfb: number of free list blocks + segment header
==> typ: block type
==> nxf: number of transaction free lists
Segment List:
==> flg: flag USED or UNUSED the free list
==> lhd: head of free list
==> ltl: tail of free list

在每一個(gè)塊中都有一個(gè)標(biāo)記flg用來表明塊是否鏈入了 free list鏈中。如果這個(gè)標(biāo)志置上,該塊中后向指針指向free list鏈中下一個(gè)塊的DBA。如果當(dāng)前塊是鏈的最末尾的塊,該后向指針值為0。這里給出位于free list上的block dump的片段

Block header dump: 0x03c00235
Object id on Block? Y
seg/obj: 0xe2d8 csc: 0x00.6264c61 itc: 1 flg: O typ: 1 - DATA
fsl: 1 fnx: 0x3c00234 ver: 0x01

==> Seg/obj Object ID in dictionary
==> csc SCN of last block cleanout
==> itc Number of ITL slots
==> flg O = On freelist , - = Not on freelist
==> typ 1 = DATA 2 = INDEX
==> fsl ITL TX freelist slot
==> fnx DBA of NEXT block on freelist

舉例來說如果有五個(gè)塊在free list中,分別為A,B,C,D,E
就會(huì)形成segment header->A->B->C->D->E--|
同時(shí)segment header->E

2.3 free list類別

在段中存在3類free list, 即Master Freelists (MFL), Process Freelists (PrFL), 和 Transaction Freelists.

2.3.1 Master Free List(公用空閑空間池):

每一個(gè)段中有一個(gè)Master free list,在段創(chuàng)建的時(shí)候自動(dòng)生成。對(duì)于每一個(gè)段來說都有這樣一個(gè)空閑空間池,對(duì)每個(gè)進(jìn)程都是公用的,空閑空間就是位于master free list 的塊上。由于Master free list是公用的,因此當(dāng)多個(gè)進(jìn)程同時(shí)插入行到同一個(gè)段上,master free list競爭使用程度就會(huì)增加。

2.3.2 Process Free Lists

為了減少M(fèi)aster Free list的競爭問題, 引入了另一種free list叫做Process free lists, 根據(jù)sql命令 CREATE/ALTER 中的參數(shù)FREELISTS 創(chuàng)建. 這樣多個(gè)free list 就可以分?jǐn)偪臻e空間的管理,以提高OLTP應(yīng)用作高度并發(fā)插入和更新事務(wù)時(shí)空間分配管理的性能。通過指定CREATE TABLE / CLUSTER or INDEX的子句STORAGE的參數(shù)FREELISTS 來創(chuàng)建,例如: CREATE TABLE flg ( . . . .) . . . STORAGE ( ... FREELISTS 10 ...)。缺省的FREELISTS為1,此時(shí)不會(huì)創(chuàng)建Process free lists。當(dāng)FREELISTS>=2時(shí),創(chuàng)建Process free lists。
進(jìn)程在使用process free list是根據(jù)進(jìn)程的Oracle PID (Process ID)來選擇的,公式如下:
select list entry = (PID % NFL) + 1
NFL : FREELISTS定義的Process free list個(gè)數(shù)
2.3.3 Transaction Free Lists
當(dāng)Oracle需要時(shí)動(dòng)態(tài)創(chuàng)建。一個(gè)Transaction Free List 是一種專門給某一個(gè)事務(wù)使用的free list. 每個(gè)段至少有16個(gè)transactions free lists, 并且這個(gè)值在需要時(shí)會(huì)增長,直到達(dá)到Segment Header塊的大小限制。一個(gè)事務(wù)只有下面情況下會(huì)需要分配一個(gè)Tx Free Lists entry: 塊中釋放空間時(shí)(DELETE or UPDATE) 并且還不存在Tx Free Lists entry時(shí)。

2.4 Free list行為

2.4.1 Freelist Link and Unlink 操作

Freelist 按后進(jìn)先出隊(duì)列(LIFO) 方式管理。也就是說最后被link到freelist的塊擁有最先unlink的機(jī)會(huì)。當(dāng)塊中空閑空間增加到大于PCTFREE時(shí),塊放入freelist中。free list中的塊可用來作update 或insert。 當(dāng)塊中沒有足夠的空間用于insert操作時(shí)并且使用空間大于PCTUSED,塊就會(huì)從free list中移出。

在塊在DELETE or UPDATE 操作之后,如果使用空間落到PCTUSED下,塊再次link到free list中。每次塊加入free list時(shí),都是link到鏈表的頭部。

例如:考慮段中有120個(gè)塊編號(hào)由1到120。其中有6個(gè)塊在free list上并假設(shè)HWM是 80。(block實(shí)際使用DBA編號(hào))
10->24->45->46->65->80-|

現(xiàn)在作INSERT 操作,需要400 bytes空間。假設(shè)塊10上空間不足,但塊24上空間可用?,F(xiàn)在數(shù)據(jù)插入到塊 24 ,現(xiàn)在塊24的剩余空間小于該表的PCTUSED。因此塊 24 從free list鏈表中移出。PCTFREE and PCTUSED參數(shù)的目的就是用來控制數(shù)據(jù)塊從free list的鏈表中移入/移出行為的。現(xiàn)在free lists象這樣:
10->45->46->65->80-|
然后在同一事務(wù)中作DELETE同一個(gè)段的數(shù)據(jù),使塊 54 和 67落到PCTUSED下。現(xiàn)在這些塊加入到free list鏈中。free list鏈現(xiàn)在象這樣:
67->54->10->45->46->65->80-|

2.4.2 Transaction Free List 算法

掃描segment Header塊中所有的Tx free list,檢查是否還沒有Tx free list entry分配給transaction, 如何沒有,將尋找未使用的entry或已經(jīng)提交了事務(wù)的空的Tx free list。如果上述搜索過程失敗, 新的entry會(huì)在segment Header塊中Tx free lists區(qū)域中開辟。如果沒有空間來生成, 事務(wù)就必須等待entry的釋放。

segment header中的最大free list個(gè)數(shù):
Block Size Max # Freelists
----------- -----------------
2K 24
4K 50
8K 101
16k 204
事務(wù)T1釋放出來的空閑塊(DELETE or UPDATE)的使用 :
l 立即被T1所重用
l 當(dāng)T1 commit后被其它需要空閑塊的事務(wù)重用,過程舉例如下:

2.5 HMW概念

HIGH WATER MARK代表一個(gè)表使用的最大的(top limit)塊 。2.1中已經(jīng)提到HIGH WATER MARK 記錄在segment header中,并且在Oracle插入數(shù)據(jù)時(shí)一般增長5個(gè)blocks(并非總是5個(gè)塊,具體參見2.4.2中流程圖中HMW增長方式)。
segment header block中與HWM相關(guān)信息說明如下:
EXTENT CONTROL:
Extent Header:: spare1: 0 space2: 0 #extents: 13 #blocks: 1429
last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x020004d0 ext#: 12 blk#: 275 ext size: 475
#blocks in seg. hdr’s freelists: 5
#blocks below: 1229
mapblk 0x00000000 offset: 12
Unlocked
==> spare1: this field is no longer used (old inc#, now always 0)
==> space2: this field is no longer used (old ts#, now always 0)
==> #extents: number of extents allocated to segment
==> #blocks: number of blocks allocated to segment

==> last map: address of last extent map block
0 if extent map is entirely in the segment header
==> #maps: number of extent map block
==> offset: offset to end of extent map

==> HWM dba: address of block at highwater mark
==> ext#: HWM extent number relative to segment
==> blk#: HWM block number within extent
==> ext size: HWM extent size (in blocks)
==> #blocks in seg. hdr’s freelists: number of blocks in seg. hdr’s free list
==> #blocks below: number of blocks below HWM
==> mapblk dba: dba of extent map block containing HWM extent
is 0 if HWM is in the segment header
==> offset: offset within extent map block
is the ext# if HWM is in segment header
==> Locked by: if locked by a transaction, the xid is displayed

HWM可以說是已經(jīng)使用過的存儲(chǔ)空間和未使用過的存儲(chǔ)空間之間的分界線。在表使用過程中,HWM一直向一個(gè)方向移動(dòng),插入記錄時(shí)HWM可能會(huì)向增加的方向移動(dòng),但是刪除記錄時(shí)HWM并不會(huì)向相反的方向移動(dòng)。參見2.4.2。下圖顯示了某個(gè)數(shù)據(jù)段中HWM的位置情況。

HIGH WATER MARK之所以重要是因?yàn)樗鼘?duì)全表掃描性能的影響。當(dāng)實(shí)施一個(gè)全表掃描時(shí),Oracle會(huì)讀取所有HIGH WATER MARK下的塊即使它們是空塊。當(dāng)HIGH WATER MARK 下有很多unused block時(shí)實(shí)施全表掃描會(huì)增加額外的不必要的I/O。它也會(huì)在全局共享區(qū)中填充很多很多空塊

3.分析方法

存儲(chǔ)參數(shù)基本上屬于oracle internal的東西,因此oralce并沒有提供很好的手段來分析。但是對(duì)于DBA來說,還是可以通過block dump和DBMS_SPACE等手段來獲取部分信息。

3.1 提取block和free list信息

創(chuàng)建dbms_space使用的存儲(chǔ)過程show_space

      
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > create or replace procedure show_space ( p_segname in varchar2 , p_owner in varchar2 default user , p_type in varchar2 default ' TABLE ' , p_partition in varchar2 default NULL ) as l_free_blks number ; l_total_blocks number ; l_total_bytes number ; l_unused_blocks number ; l_unused_bytes number ; l_LastUsedExtFileId number ; l_LastUsedExtBlockId number ; l_last_used_block number ; procedure p( p_label in varchar2 , p_num in number ) is begin dbms_output.put_line( rpad(p_label, 40 , ' . ' ) || p_num ); end ; begin dbms_space.free_blocks ( segment_owner => p_owner, segment_name => p_segname, segment_type => p_type, partition_name => p_partition, freelist_group_id => 0 , free_blks => l_free_blks ); dbms_space.unused_space ( segment_owner => p_owner, segment_name => p_segname, segment_type => p_type, partition_name => p_partition, total_blocks => l_total_blocks, total_bytes => l_total_bytes, unused_blocks => l_unused_blocks, unused_bytes => l_unused_bytes, last_used_extent_file_id => l_LastUsedExtFileId, last_used_extent_block_id => l_LastUsedExtBlockId, last_used_block => l_last_used_block ); p( ' Free Blocks ' , l_free_blks ); p( ' Total Blocks ' , l_total_blocks ); p( ' Total Bytes ' , l_total_bytes ); p( ' Unused Blocks ' , l_unused_blocks ); p( ' Unused Bytes ' , l_unused_bytes ); p( ' Last Used Ext FileId ' , l_LastUsedExtFileId ); p( ' Last Used Ext BlockId ' , l_LastUsedExtBlockId ); p( ' Last Used Block ' , l_last_used_block ); end ; 過程已創(chuàng)建。

對(duì)非segment header的data block的dump方法和上述類似。data block的結(jié)構(gòu)和segment header block不一樣,如果需要了解,可查閱參考文獻(xiàn)和資料。

3.2 提取HWM信息

3.2.1 HWM位置

HWM位置按下面的公式計(jì)算:

HWM = useed byte = Total Bytes - Unused Blocks

Total Bytes和Unused Blocks都可以用show_space提取。

還可以通過ANALYZE tables得到HWM信息. DBA_TABLES視圖中包含了可用于各表空間分析的列。其中blocks代表已使用過的塊即HWM,empty_blocks代表未使用的空間。

3.2.1 HWM下空間利用信息
要比較有數(shù)據(jù)行的塊的塊數(shù)和HIGH WATER MARK下總塊數(shù),可以用下面的公式來展示HWM下未用空間的比例。

p = 1- r/h

r:有數(shù)據(jù)行的塊的塊數(shù)

h:HWM下的塊數(shù).

r可以通過如下方法獲得:

Oracle7:

SELECT count(distinct substr(rowid, 15,4) || substr(rowid, 1,8) ) FROM schema.table;

Oracle8 and Oracle9:

SELECT count(distinct substr(rowid, 7,3) || substr(rowid, 10,6) ) FROM schema.table;

如果公式計(jì)算的結(jié)果 p是0,就不需要對(duì)表進(jìn)行重建。如果結(jié)果p大于0,應(yīng)該考慮系統(tǒng)狀況和應(yīng)用需要來決定是否需要總組表。

4.優(yōu)化

4.1手工回收存儲(chǔ)空間

在HIGH WATER MARK以上的塊對(duì)性能沒有影響,但是會(huì)耗費(fèi)空間。如何空間大小是一個(gè)考慮的問題,就可以決定回收空塊。 假設(shè)表T1的存儲(chǔ)示意圖如圖2.5所示,使用ALTER TABLE ... DEALLOCATE UNUSED語句可以回收HWM以上的空間。比如:

alter table t1 deallocate unused;

回收后T1的存儲(chǔ)示意如圖4.1.1

如果在ALTER TABLE ... DEALLOCATE UNUSED語句中使用了KEEP關(guān)鍵字,則可以在HWM之后保留指定大小的空閑空間,比如:

alter table t1 deallocate unused keep 10K;

4.2刪減表

根據(jù)3.2.1可以得到HWM以下塊的使用情況。如何p大于時(shí),對(duì)全表掃描性能會(huì)產(chǎn)生影響,同時(shí)也會(huì)耗用空間。

如果能夠確認(rèn)應(yīng)用有良好的索引幾乎不會(huì)用到全表掃描,那么HIGH WATER MARK以下的空塊,盡管耗費(fèi)了空間,不會(huì)對(duì)訪問產(chǎn)生影響。如果不能確定,那么就需要考慮刪減表。

刪減表的操作將刪除表中所有的記錄,并且重置HWM標(biāo)記。表在刪減之后將成為一個(gè)空表。

在Oracle中刪減表只有如下的兩種辦法:

1.使用drop語句

先使用drop語句刪除整個(gè)表,然后再重建這個(gè)表。在刪除-重建的過程中,與表相關(guān)的所有索引、完整性約束以及觸發(fā)器都會(huì)丟失,并且所有依賴于該表的對(duì)象都會(huì)變?yōu)镮NVALID狀態(tài),同時(shí)原來爭對(duì)表的授權(quán)也會(huì)失效。因此采用這種方式刪除表中的記錄代價(jià)太大。

2.使用TRUNCATE語句

TRUNCATE語句屬于DDL語句,不會(huì)產(chǎn)生任何回退信息,并且被立即自動(dòng)提交。在執(zhí)行TRUNCATE語句時(shí)不會(huì)影響到與被刪減表相關(guān)的任何數(shù)據(jù)庫對(duì)象與授權(quán),也不會(huì)觸發(fā)表中所定義的觸發(fā)器。此外,在對(duì)標(biāo)進(jìn)行刪減時(shí),HWM將重置,已經(jīng)為表分配的存儲(chǔ)空間將被回收。

在執(zhí)行TRUNCATE語句時(shí),可以通過drop storage子句和reuse storage子句來控制被釋放的區(qū)是否回收到表空間中。如何作在線系統(tǒng)的TRUNCATE,不希望表長時(shí)間鎖住,那么可以使用reuse storage子句,僅將HWM重置。

4.3 free list優(yōu)化

free list 競爭出現(xiàn)在多個(gè)進(jìn)程使用同一個(gè)free list并試圖同時(shí)修改free list頭部數(shù)據(jù)塊時(shí)??梢酝ㄟ^查詢視圖v$waitsate的class類型為data block 的記錄來檢查競爭情況。

產(chǎn)生data block類型競爭的主要原因是多個(gè)進(jìn)程試圖同時(shí)修改free list頭部數(shù)據(jù)塊。 然而,它也會(huì)出現(xiàn)在當(dāng)進(jìn)程準(zhǔn)備將塊讀入buffer cathe時(shí),另一個(gè)進(jìn)程需要訪問同一個(gè)塊。如果能在V$SESSION_WAIT中正好捕獲buffer busy waits,就可以通過查詢V$SESSION_WAIT中的P3來判定是那一類。A 0 或 1014代表讀類型,其他的值為修改競爭的類型。

下一步需要確定競爭涉及那些段。 如果能夠在V$SESSION_WAIT捕獲waits,就可以用P1和P2的值 (對(duì)應(yīng)file 和 block) 在DBA_EXTENTS中找到段名。 如何是一個(gè)表,就很可能需要重建表來創(chuàng)建更多的process freelists。 一種計(jì)算需要?jiǎng)?chuàng)建多少個(gè)freelist的方法是dump一些段中接近HWM的塊,檢查interested transaction list的個(gè)數(shù),具體方法可參見3.1。interested transactions個(gè)數(shù)的峰值加1 就是需要的最小process freelists的值。

從2.3和2.4可以看出,使用多個(gè)free list可能導(dǎo)致更多的空塊未被使用, 也可能導(dǎo)致段更快地?cái)U(kuò)展。如果性能是當(dāng)前所關(guān)心的重點(diǎn),那么多free lists 可以用來提高并發(fā)訪問能力,當(dāng)然會(huì)增加一些額外空間的耗用。然而,如果空間使用大小是首先考慮的因素,那么推薦使用single freelist,使參數(shù)FREELISTS=1, 當(dāng)然就不能提升并發(fā)事務(wù)的性能了。

V$WAITSTAT 也可顯示其他類型class的競爭,包括segment header 和free list。 出現(xiàn)在同一個(gè)free list group中多個(gè)事務(wù)需要同時(shí)更新它們的free list header記錄時(shí)。 有多種方法來解決這個(gè)問題如重建表采用更多的free list groups,或者增加 _bump_highwater_mark_count大小,或者調(diào)整應(yīng)用本身。

Oracle Freelist和HWM原理及性能優(yōu)化


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 五月天色婷婷在线 | 天天摸夜夜摸狠狠摸夜夜摸 | 四虎影院在线播放 | 免费伊人网 | 亚洲视频1 | 青青热在线观看视频精品 | 一级毛片视频免费观看 | 91精品中文字幕一区二区三区 | 国产电影网 | 丝袜偷窥亚洲综合 | 又黄又爽免费无遮挡在线观看 | 人人干免费 | jzz 护士| 国产精品久久久久久中文字 | 亚洲黄色第一页 | 中文字幕三区 | 久久新网址 | 大伊香蕉在线观看视频 wap | 亚欧免费视频一区二区三区 | 欧美精彩视频 | 黑人狂躁日本妞无码A片 | 天天色影 | 婷婷久久精品 | 日本九九视频 | 色综合视频在线观看 | 欧美偷拍自拍视频 | 深夜爽爽爽gif福利免费 | 成人一区二区三区 | 天天干夜夜噜 | 精品欧美一区二区三区久久久小说 | A片扒开双腿猛进入免费观看 | 国产精品成人免费视频不卡 | 日韩欧美动作影片 | 国产成人精品在线观看 | 全黄裸片武则天艳史 | 国产在线视频2019最新视频 | 99久久99久久精品免费看蜜桃 | 97国产在线播放 | 毛片在线播放网址 | 国产视频播放 | 欧美国产精品一区 |