Oracle原理學習筆記_第1頁
Oracle原理學習筆記_第2頁
Oracle原理學習筆記_第3頁
Oracle原理學習筆記_第4頁
Oracle原理學習筆記_第5頁
已閱讀5頁,還剩72頁未讀 繼續(xù)免費閱讀

付費下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Oracle原理學習筆記

實例

Oracle運行的時候,在內(nèi)存中會要開發(fā)一個區(qū)間,這個區(qū)間要緊是用于從磁盤(數(shù)據(jù)文

件)中讀出數(shù)據(jù)后的一個在內(nèi)存的緩存與處理。而處理這些數(shù)據(jù)的操作,需要有一些系統(tǒng)的

后臺進程,這些進行在Oracle數(shù)據(jù)庫啟動的時候,就開始運行,一直在響應(yīng)前臺的操作。實

際上,這一個區(qū)間(SGA)與這些后臺進程合在一起,就稱之實例。實例是包含SGA區(qū)與后

臺進程兩個部分的。

數(shù)據(jù)庫啟動執(zhí)行若干動作,經(jīng)歷三個階段,分別是未加載、加載與打開。

1、未加載(nomount)能夠把數(shù)據(jù)庫啟動的這一階段看作是Oracle實例的啟動。

這種方式啟動下可執(zhí)行:重建操縱文件、重建數(shù)據(jù)庫。這一啟動命令:

?讀取數(shù)據(jù)庫參數(shù)文件。

?啟動所需的后臺進程并按參數(shù)文件中的定義分配內(nèi)存。

?將進展情況寫入告警日志文件中。

2、加載(mount)在實例啟動加載階段,數(shù)據(jù)庫參數(shù)文件中指定的操縱文件被讀

取。記住操縱文件將數(shù)據(jù)庫各部分聯(lián)系在一起。實例從操縱文件中找到下列信息,然

后將進展寫入告警日志文件。這種方式啟動下可執(zhí)行:數(shù)據(jù)庫日志歸檔、數(shù)據(jù)庫恢復(fù)、

重新命名一些數(shù)據(jù)庫文件:

?所有數(shù)據(jù)文件與重做日志文件的名稱與位置。

-數(shù)據(jù)庫名。

?最新系統(tǒng)更換號(SCN)。

3、打開(open)包含在數(shù)據(jù)庫中的每個聯(lián)機數(shù)據(jù)文件在數(shù)據(jù)庫打開前務(wù)必被同

步。在數(shù)據(jù)庫打開階段:

?所有聯(lián)機數(shù)據(jù)文件的頭與操縱文件信息相比較。

?所有文件同步后,數(shù)據(jù)庫打開。

當數(shù)據(jù)庫關(guān)閉時,取決于它的關(guān)閉方式執(zhí)行不一致的任務(wù):

?正常(normal)在所有的用戶離線后發(fā)生的正常關(guān)閉。

?事務(wù)(transactional)事務(wù)關(guān)閉就是當所有的用戶執(zhí)行完當前的事務(wù)后,將用

戶從數(shù)據(jù)庫上清除。

?立即(immediate)立即關(guān)閉就是從數(shù)據(jù)庫清除所有當前用戶之后,回退所有未

完成的操作。

?特殊(abort)特殊關(guān)閉沒有給數(shù)據(jù)庫任何整理的機會。這種方式關(guān)閉后需要實

行崩潰恢復(fù)。

實例是數(shù)據(jù)管理的核心一它做所有的工作,而數(shù)據(jù)庫存儲所有的數(shù)據(jù)。

其他啟動方式:

?startuprestrict

約束方式啟動

這種方式能夠啟動數(shù)據(jù)庫,但只同意具有一定特權(quán)的用戶訪問

非特權(quán)用戶訪問時,會出現(xiàn)下列提示:

ERROR:0RA-01035:ORACLE只同意具有RESTRICTEDSESSION權(quán)限的用戶使用

,startupforce

強制啟動方式

當不能關(guān)閉數(shù)據(jù)庫時,能夠用startupforce來完成數(shù)據(jù)庫的關(guān)閉

先關(guān)閉數(shù)據(jù)庫,再執(zhí)行正常啟動數(shù)據(jù)庫命令

,startuppfile=參數(shù)文件名

帶初始化參數(shù)文件的啟動方式

先讀取參數(shù)文件,再按參數(shù)文件中的設(shè)置啟動數(shù)據(jù)庫

?startupEXCLUSIVE

一個Delete操作的流程:

1、檢查語法、語義(V$ROWCACHE:datadictionarycache),計算HASHVALUE,

在session的UGA中進行匹配(session_cached_cursors),假如UGA中沒有,

在librarychache中匹配(librarychachelocklatch保護library

chachelock對地址堆的訪問,而后librarychachepinlatch保護

librarycachepin對librarycache中sql有關(guān)信息的訪問)

2、根據(jù)執(zhí)行計劃讀取數(shù)據(jù):cachebufferchainlatch保護能定位到buffer

header并pin住該塊(假如沒有bufferheader,就pin住某個空塊(沒

有空塊就產(chǎn)生freebufferwaits),并到數(shù)據(jù)文件中讀?。<偃缛缃裼?/p>

某個進程想訪問該塊,將產(chǎn)生bufferbusywaits。

3、在redologbuffer中記錄delete操作的細節(jié)。(包含回滾段前后鏡像、數(shù)

據(jù)塊前后鏡像)。

4、在相應(yīng)回滾段段頭的事務(wù)表中創(chuàng)建一個undo條目,把將要刪除的記錄創(chuàng)建

前鏡像,存放到UndoBlock中。

5、在BufferCache中的相應(yīng)數(shù)據(jù)塊上刪除記錄,同時標記相應(yīng)的數(shù)據(jù)塊為

Dirty。

提交(COMMIT)

1.Oracle產(chǎn)生一個SCN

2.在回滾段事務(wù)表中標記該事務(wù)狀態(tài)為commited

3.LGWRFlushLogBuffer到日志文件

3.假如如今數(shù)據(jù)塊仍然在BufferCache中,那么SCN將被記錄到BlockHeader_b,

這被稱之快速提交(fastcommit)

4.假如dirtyblock已經(jīng)被寫回到磁盤,那么下一個訪問這個block的進程將會自

回滾段中獲取該事務(wù)的狀態(tài),確認該事務(wù)被提交。然后這個進程獲得提交SCN并寫

回到BlockHeader上。這被稱之延遲塊清除(delayedblockcleanout)?

內(nèi)存

SGA(系統(tǒng)全局區(qū)、共享全局區(qū))、PGA(進程全局區(qū)、私有全局區(qū))

內(nèi)存分配原則:

10%冗余內(nèi)存,OSSYS進程(約1.6G),OSBUFFER(約0.8G),數(shù)據(jù)庫連接消耗內(nèi)存(每

個連接約5'8M),PGA(每個連接約2M,V$PGA_TARGET_ADVTCE),SGA

SGA

v$sgastat

DatabaseBuffers

注意shov

Oracle的

?軟件

?系統(tǒng)

?進程

?排序

SGA中的Thefixedarea包含了數(shù)千個原子變量,與如指向SGA中其它區(qū)域的pointers(指

針)等小的數(shù)據(jù)結(jié)構(gòu).通過對fixedtable內(nèi)表XSKSMFSV查詢(如下)能夠獲得這些變量的名字,

變量類型,大小與在內(nèi)存中的地址.

thevariablearea是由largepool與sharedpool構(gòu)成

Sharedpool中永久性的內(nèi)存包含各類數(shù)據(jù)結(jié)構(gòu)如:thebufferheaders,processes,sessions,

transactionarrays,theenqueueresources,locks,theonlinerollbacksegmentarrays,variousarrays

forrecordingstatistics.其中大部分的SIZE是依靠初始參數(shù)的設(shè)置來確定的.這些初始參數(shù)只能

在實例被關(guān)閉的狀態(tài)下才能夠進行修改.因此這里說的永久性是針對實例打開狀態(tài)下的生存

期而言.

Thevariablearea的在SGA中的SIZES就等于

LARGE_POOL_SIZE,SHARED_POOL_SIZE與永久性的內(nèi)存arrays的SIZE三者相加.

永久性內(nèi)存arrays的SIZE=thevariablearea

(LARGE_POOL_SIZE+SHARED_POOL_SIZE).

數(shù)據(jù)緩沖區(qū)命中率

v$sysstat

這里命中率的計算應(yīng)該是

令x二physicalreadsdirect+physicalreadsdirect(lob)

命中率=100-(physicalreads-x)/(consistentgets+dbblockgets-x)*100

通常假如發(fā)現(xiàn)命中率低于90%,則應(yīng)該調(diào)整應(yīng)用可能夠考慮是否增大數(shù)據(jù)緩沖區(qū)

共享池的命中率

SQL>selectsum(pinhits-reloads)/sum(pins)*100"hitradio"fromv$librarycache;

hitradio

99.809291

假如共享池的命中率低于95%,就要考慮調(diào)整應(yīng)用(通常是沒使用bindvar)或者者增

加內(nèi)存

關(guān)于排序部分

SQL>selectname,valuefromv$sysstatwherenamelike'/sort%';

NAMEVALUE

sorts(memory)67935

sorts(disk)1

sorts(rows)7070

假如我們發(fā)現(xiàn)sorts(disk)/(sorts(memory)+sorts(disk))的比例過高,則通常意

味著sort_area_size部分內(nèi)存較小,可考慮調(diào)整相應(yīng)的參數(shù)。

關(guān)于log_buffer

SQL>selectname,valuefromv$sysstat

2wherenamein(,redoentries'redobufferallocationretries');

NAMEVALUE

redoentries2325719

redobufferallocationretries10

假如redobufferallocationretries/redoentries的比例超過1%我們就能夠考慮

增大log_buffer

共享池(SHARED_POOL_SIZE)

v$shared_pool_advice

ALTERSYSTEMFLUSHSHARED_POOL

HowtoKeepObjects--重點

使用DBMS_SHARED_POOL.KEEP過程來keepobjects,UNKEEP過程從sharedpool中移走

pinnedobjects

executedbms_shared_pool.keep(,address,hash_value,);--keep該匿名塊

共享池包含摩高速緩存(libraryca")、數(shù)據(jù)字典高速緩存與服務(wù)器操縱結(jié)構(gòu)(及如

數(shù)據(jù)庫字符集)。Oracle服務(wù)器用庫高速緩存來提高執(zhí)行SQL語句的性能;庫高速緩存包含

共享與專用SQL區(qū)。共享SQL區(qū)包含SQL語句語法分析樹與執(zhí)行路徑,而專用SQL區(qū)存儲特

定的會話信息,比如捆綁變量、環(huán)境與會話參數(shù)、運行堆棧與緩沖區(qū)等。

Softparse使用的資源包含CPU與librarycachelatchgets

Hardparse是指要解析的SQL沒有在libraecache中,或者者執(zhí)行的時候發(fā)現(xiàn)解析過

的SQL已經(jīng)agedout,就是離開了librarycache,稱之Librarycachemisses.使用的資

源包含額外的CPU,librarycachelatchgets,與sharedpoollatchgets.

專用SQL區(qū)在每個事務(wù)初始化時創(chuàng)建,在與專用SQL區(qū)有關(guān)的游標關(guān)閉時被釋放。一個

用戶會話能夠一次打開的專用SQL區(qū)的數(shù)量由init.ora參數(shù)OPEN_CURSORS決定。使用這兩

個結(jié)構(gòu),Oracle服務(wù)器能夠重用一條SQL語句的所有執(zhí)行的共同信息。與此同時,能夠從專

用SQL區(qū)中查詢執(zhí)行的特定會話信息。

注意游標使用過程中并不關(guān)閉游標的應(yīng)用會繼續(xù)為應(yīng)用分配越來越多的內(nèi)存,部分原因

是為每個打開的游標分配了專用SQL區(qū)。

庫高速緩存中的專用SQL區(qū)可更進一步分為永久區(qū)與運行區(qū)。

共享池的大小取決于init.ora文件參數(shù)SHARED_POOL_SIZE,它是以字節(jié)為單位的。你

務(wù)必將這個值設(shè)得足夠大,以確保有足夠的可用空間來裝載與存儲PL/SQL塊與SQL語句。共

享區(qū)通過長期裝卸與卸載數(shù)據(jù)對象會產(chǎn)生許多碎片,假如在共享池中沒有足夠的連續(xù)空間用

來裝載目標數(shù)據(jù),會產(chǎn)生錯誤。解決這個問題的捷徑是運行SQL命令A(yù)LTERSYSTEMFLUSH

SHARED_P00Lo但是假如在數(shù)據(jù)庫操作時,經(jīng)常遇到共享池錯誤,你務(wù)必增大共享池

Librarycache包含sharedSQLandPL/SQLareas(PL/SQL包含Procedures,

Functions,Packages,Trigger,匿名PL/SQL塊)

SizingtheLibraryCache

定義storedobject(packages,views等等)的內(nèi)存需求;定義經(jīng)常使用的sqlstatement

的所需內(nèi)存

1.初始時將SHARED_POOL_SIZE設(shè)得很大,運行應(yīng)用程序

2.計算storedobject所占的內(nèi)存

SELECTSUM(sharable_mem)FROMv$db_object_cacheWHEREtype=

'PACKAGE'ortype='PACKAGEBODY,ortype='FUNCTION'ortype='PROCEDURE';

3.應(yīng)用程序運行一段時間后,估計常用sql語句所占的內(nèi)存(不包含動態(tài)SQL)

SELECTSUM(sharable_mem)FROMv$sqlareaWHEREexecutions>5;

4.對每個user每個打開的cursor,需要250bytes,可在運行高峰期間使用查詢:

SELECTSUM(250*users_opening)FROMv$sqlarea;

5.在測試環(huán)境中,可讓一個用戶打開一定數(shù)量的cursor,運行下列語句測試共享內(nèi)存,

然后乘上user數(shù)

SELECT250*valuebytesjper_userFROMv$sesstats,v$statname

nWHEREs.statistic#=n.statistic#ANDn.name='openedcursorscurrent,AND

s.sid=15;

以上內(nèi)存的與,再加上一點內(nèi)存(留給動態(tài)SQL使用),作為你的應(yīng)用的理想內(nèi)存設(shè)置;預(yù)

留一部分空間作為大的內(nèi)存需要,避免miss與碎片;一些大的內(nèi)存需要:PL/SQL塊的編

譯,trigger的編譯;小的object不可能使預(yù)留空間碎片化,反而保證reservedlist有大的

連續(xù)塊,一旦從reservedlist中分配的內(nèi)存釋放它就返回reservedlist。

影響的參數(shù):SHARED_POOL_RESERVED_SIZE初始值二SHARED_POOL_SIZE*1O%,超過

50%,oracleserver報錯

OPEN_CURSORS缺省二50

定義了涉及分配給用戶進程的私有SQL區(qū)域的cursors數(shù)量,一個privateSQLarea

一直存在直至cursor關(guān)閉;為了利用更多的內(nèi)存給共享SQL區(qū)域,需要提高session每個

session同意多cursor數(shù)量,開發(fā)人員應(yīng)關(guān)閉不需要的cursor節(jié)約內(nèi)存

CURSOR_SPACE_FOR_TIME缺省二FALSE布爾值

設(shè)置TRUE,表示以空間換取時間,共享SQL區(qū)不可能被agedout直至有關(guān)的cursor被關(guān)

閉,因此確信有足夠的內(nèi)存,沒有cachemiss;除非RELOADSinV$LIBRARYCACHE一直為0,否

則不要改變此參數(shù)值

若應(yīng)用為FORM或者使用動態(tài)SQL,設(shè)此值為FALSE-由于動態(tài)sql總是不一致,將占用

過多內(nèi)存

SESSION_CACHED_CURSORS缺省=0表示沒有cache

當一個session打算關(guān)閉一個cursor時,假如這個cursor的parsecount超過3次,那

么這個cursor將會被加到sessioncursorcachelist的MRU端.當一個session打算parse

一個sql時,它會先去session的pga內(nèi)搜索sessioncursorcachelist,假如找到那么會

把這個cursor脫離list,然后當關(guān)閉的時候再把這個cursor加到MRU端.

session_cached_cursor提供了快速軟分析的功能,提供了比softparse更高的性能.

檢查系統(tǒng)是否需要此參數(shù)的方法:

對某個典型用戶session

selecta.sid,b.name,a.valuefromv$sesstata,v$statnamebwhere

a.statistic#=b.statistic#and(b.name=,sessioncursorcachehits,orb.namelike

'parsecount%^);

Iffewparsesresultinhits,則可提高此參數(shù),注意它將increaseoveralldemands

onmemory.-????

DataDictionaryCache

Selecttype,parameter,gets,getmisses,

round(getmisses/decode(gets,0,null,gets)*100,2)“ratio(%)“fromv$rowcache;

GoalforaGoodRatio

SUM(GETMISSES)/SUM(GETS)<15%,否則應(yīng)增大SHARED_POOL_SIZE

不可能希望getmisses趨近于0,由于數(shù)據(jù)庫啟動后需要讀取objects定義

OEM->PerformanceManager—>Memory—>DataDictionaryCacheHit%

檢索需要在共享池中要求大于100K連續(xù)空間的對象:

select*fromv$db_object_cachewheresharable_mem>100000andtypein

('PACKAGE','PACKAGEBODY','PROCEDURE','FUNCTION');

考察返回的結(jié)果,確認是否需要pin到共享池中,返回結(jié)果中的KEPT字段假如是YES,

那么表示該對象已經(jīng)固定在了共享池中,為N0,則表示還沒有固定。

假如需要固定,使用下面的語句:

execdbmssharedpool,keepCSYS.STANDARD');

數(shù)據(jù)庫默認安裝的時候沒有創(chuàng)建dbms_shared_pool包,因此需要先創(chuàng)建該包。

cd$ORACLE_HOME/rdbms/admin

sqlplus"/assysdba”

?dbmspool.sql

DATABUFFER——數(shù)據(jù)庫緩沖區(qū)高速緩存

v$db_cache_advice

==一堆數(shù)據(jù)塊(DB_BLOCK_SIZE*DB_BLOCK_BUFFERS)

數(shù)據(jù)庫的任何修改都在該緩沖里完成(LRU—>LRUW)?

所有的塊,被讀到內(nèi)存中后,它的塊頭(datablockheader)放在一?個Cachebufferchain

中,Cachebufferchain由多個雙向hash鏈表構(gòu)成,hash鏈表數(shù)量由

_db_block_hash_buckets決定.每個數(shù)據(jù)塊頭由DBA(datablockaddress)作為key,經(jīng)hash

函數(shù)后放在鏈表上,它與blockbuffer中的block對應(yīng),數(shù)據(jù)塊頭不包含實際的數(shù)據(jù),僅

是一個簡單的描述.后臺進程掃描hash鏈表前,務(wù)必獲得cachebufferchainlatch,假如

在CacheBufferchain中找不某塊,就由磁盤讀入.若需要查找某個block,則根據(jù)block

的信息能計算hashvalue然后迅速定位到hashtable,然后根據(jù)hashtable信息去查看

是否存在所想要的buffer,若有則命中,若沒有則不命中。顯然不可能根據(jù)list去逐個搜

索,這樣效率太低.

LRU就是一種盡可能將常用的數(shù)據(jù)保留在內(nèi)存的算法.當數(shù)據(jù)庫需要一個數(shù)據(jù)緩沖區(qū),

他會從數(shù)據(jù)庫緩沖區(qū)的LRU隊列的尾部找一個空閑的緩沖,將一個數(shù)據(jù)塊讀入,然后數(shù)據(jù)

庫會把這個緩沖區(qū)放到LRU隊列的中部,假如該緩沖被其他程序用到的話,那么他會往隊

列的頭上移動,假如這個緩沖沒有被其他程序用到,同時沒有被修改過,那么他會慢慢的移

動到LRU隊列的尾部,最終被認為是空緩沖區(qū)被其他數(shù)據(jù)塊所覆蓋.一旦這個緩沖區(qū)被修改

過DBWR把他從LRU隊列中移出,放到LRL'W隊列(也叫贓緩沖區(qū))中,等待DBWR把他們批

量寫入數(shù)據(jù)文件,然后再把他們的緩沖區(qū)連接到LRU隊列的尾部.周而復(fù)始的工作.

假如查找在一個閥值內(nèi)沒有結(jié)果或者者造成dirty緩沖區(qū)已經(jīng)溢出,在進一步查找free

buffer前系統(tǒng)將發(fā)出一個消息給DBWR讓他能夠?qū)RUW隊列的緩沖區(qū)寫入磁盤.這個閥值被

叫做這個閥值被叫做DBWRscandepthdirty緩沖區(qū)大小能夠用_DB_LARGE_DIRTY_QUEUE與

2*J)B_BL0CK』RITE_BATCH來確定.前臺進程繼續(xù)搜索freebuffer.直到

DBBLOCKMAXSCANCNT還沒有發(fā)現(xiàn)系統(tǒng)就會掛起該進程.記錄dirtybuffersinspected

的靜態(tài)變量并把該進程標志為freebufferwait.

cache與buffer_pool_keep是不一?樣的,cache是假如對該表全表掃描的話,會把塊

放在mru端,buffer_pool_keep是放在keep池中

selecttable_name,cache,buffer_poolfromdba_tableswheretable_name=,TEST);

將表與索引Cache到SGA中

從0RACLE805之后,支持ALTERTABLEtable_nameSTORAGE(BUFFER_POOLKEEP)命令了。

但是在805與8i中,需要設(shè)置buffer_pool_keep參數(shù)來設(shè)置KEEP池大小。這塊內(nèi)存來自數(shù)

據(jù)緩存區(qū),也就是從db_block_buffers中分配。在0RACLE8與8i中,還務(wù)必設(shè)置

db_block」ru_latches參數(shù)。該參數(shù)應(yīng)該比2*3*CPU數(shù)量少,但是要大于1,否則無法設(shè)置

buffer_pool_keepo在0RACLE9i中則需要設(shè)置DB_KEEP_CACHE_SIZE來設(shè)置KEEP池內(nèi)存的

大小。這樣將表KEEP才有用。而且KEEP池要能夠容納得下才行的

將函數(shù)Cache到SGA中

@$ORACLE_HOME\rdbms\admin\dbmspoo1.sql;

execdbms_shared_poo1.keepCprocedure_name",'P");

重做日志緩沖區(qū)(LOG_BUFFER)

logbuffer分成內(nèi)部的bufferblocks,而這些block各有8個字節(jié)的頭部信息存在于

variablearea中.

當重做日志緩沖區(qū)填滿時,將它的內(nèi)容寫入聯(lián)機重做日志文件。是循環(huán)使用。是數(shù)據(jù)庫

最活躍的情形,能夠用V$SYSSTAT視圖進行監(jiān)控。查詢V$SYSSTAT視圖value域,它說明用

戶進程等待重做日志緩沖區(qū)所花費的時間(此處value的值應(yīng)接近于0,否則應(yīng)增大初始化

參數(shù)文件的Log_buffers的值):

SELECTNAME,VALUEFROMV$SYSSTATWHERENAME='redologspacerequests);

PGA

v$pgastatv$pgatargetadvice

后臺進程

v$bgprocess

■數(shù)據(jù)庫寫進程(DBWR)

(DBBLOCKWRITEBATCH,DBBLOCKMAXSCAN,DBWRITES,DBBLOCKLRULATCHES,DBBL

OCK_C1IECKPOINT_BATCH,DB_BLOCK_CHECKSUM)

負責數(shù)據(jù)文件的讀寫與db_data_buffer的清理

dbwr負責搜集dirtybuffer,slaves負責寫磁盤

工作的前提條件:

1.dirtybuffer超出了dirtybufferlist的threshold.

2.serverprocess在buffercache中查找freebuffer時,則也可能會通知DBWn

將dirtybuffer寫入datafile.

3.DBWn每3秒會檢查是否有dirty數(shù)據(jù)要寫入datafile.

4.CKPT

5.tablespaceoffline或者tablespacebeginbackup(這里實際上是由CKPT弓I

起).

6.dropobject

7.shutdown(這里實際上也是由CKPT引起)

建議你使用與存儲數(shù)據(jù)文件的物理磁盤一樣多的DBWR進程;

DBWR寫入數(shù)據(jù)文件的任何修改已經(jīng)被記錄在重做日志文件中.

一次checkpoint的成功過程是:dbwr搜集dirtybuffer,交給slave寫磁盤,寫完畢

通知dbwr;然后dbwr才返回檢查點完成。

增加寫進程,同時要調(diào)整db_block_lru_latches參數(shù),如修改或者添加如下兩個參數(shù):

db_writer_processes=4

db_block_lru_latches=8

■日志寫進程(LGWR)。

L0G_CHECKP01NT」NTERVAL,L0G_CHECKP01NT_TIMEOUT,LOG_CHECKPOINTS_TO_ALERT

LGWR工作的要緊條件如下

1.用戶提交

2.有1/3重做日志緩沖區(qū)未被寫入磁盤

3.有大于1M重做日志緩沖區(qū)未被寫入磁盤

4.超時

5.DBWR需要寫入的數(shù)據(jù)的SCN號大于LGWR記錄的SCN號,DBWR觸發(fā)LGWR寫入

■歸檔進程(ARCH)。

ARCHIVE_LOG_START

■檢查點(CKPT)。

同步數(shù)據(jù)文件,日志文件與操縱文件

CKPT會更新數(shù)據(jù)文件/操縱文件的頭信息.

CKPT工作的要緊條件如下

1.在日志切換的時候

2.數(shù)據(jù)庫用immediate,transaction,normal選項shutdown數(shù)據(jù)庫的時候

3.根據(jù)初始話文件LOG_CHECKPOINT_INTERVAL,

L0G_CHECKP01NT_TIMEOUT,FAST_START」O_TARGET的設(shè)置的數(shù)值來確定

4.用戶觸發(fā)

■系統(tǒng)監(jiān)控與進程監(jiān)控進程(SM0N與PM0N)。

■調(diào)度進程(Dnnn)。

MTS_DISPATC1IERS

■恢復(fù)進程(RECO)。

DISTRIBUTED^TRANSACTIONS

■快照進程(SNPn)。

OB_QUEUE_PROCESS,JOB_QUEUE_INTERVAL

■鎖進程(LCKn)。

■并行查詢進程(Pnnn)。

PARALLEL_M1N_SERVERS,PARALLEL_MAX_SERVERS

■用戶與服務(wù)器進程(Snnn)。

回滾

v$rollstatv$waitstatv$sysstatx$bhdba_rollback_segs

一下事務(wù)的流程:

1.分配一個回滾段

2.在回滾段事務(wù)表中分配一個事務(wù)槽

3,分配undoblock

4.更新數(shù)據(jù)塊上的ITL事務(wù)槽

5.把前鏡像記錄在undoblock內(nèi)

6.更換數(shù)據(jù)塊的內(nèi)容

ITL事務(wù)槽一InterestedTransactionList(ITL)

ITL內(nèi)容包含:

xidTransactionID

Uba—UndoBlockAddress

Lek—LockStatus

xid=Undo.Segment.Number+Transaction.Table.Slot.Number+Wrap

uba=Address.Of.Last.Undo.Block.Used+Sequence+Last.Entry,in.UNDO.Record.Map

ALTERSYSTEMSETUNDO_MANAGEMENT=MANUALSCOPE=SPFILE;

SETTRANSACTIONUSEROLLBACKSEGMENTRB_LARGE1;

當一個事務(wù)開始的時候,會首先把變化前的數(shù)據(jù)與變化后的數(shù)據(jù)先寫入日志緩沖區(qū),然

后把變化前的數(shù)據(jù)寫入回滾段,最后才在數(shù)據(jù)緩沖區(qū)中修改數(shù)據(jù)

一致性讀取consistentreads

假設(shè)查詢開始的時候的SCN為T,則在查詢所掃描的數(shù)據(jù)塊中,假如數(shù)據(jù)的COMMITSCN

小于T,則查詢同意該數(shù)據(jù),假如COMMITSCN大于T或者者說還沒有產(chǎn)生COMMITSCN,則

查詢會嘗試去回滾段中查找數(shù)據(jù)。這是為了保證數(shù)據(jù)的讀取的時間點的一致性,因此叫一致

性讀。

我們能夠參考v$rollstat、v$transaction與x$bh表,在x$bh中的class字段,假如

是回滾段塊,假設(shè)回滾段USN為n,則回滾段頭class為ll+2n,回滾段塊為12+2n。

回滾段的使用、擴展、回縮

同一個事務(wù)不能跨越回滾段;一個回滾段至少包含2個extent。每個回滾段有一個回滾

段頭,回滾段頭是一個block,里面要緊記錄了事務(wù)表信息。當產(chǎn)生一個事務(wù)的時候,就在

回滾段頭的事務(wù)表中記錄一條信息,該信息中包含了事務(wù)標志、事務(wù)狀態(tài)、使用的回滾段塊

數(shù)等等信息。使用時從第一個extent的第二個block到最后一個extent循環(huán)使用;假如其

中的一個extent有未提交的事物,那么前面的extent不能跨越該extent,只能在2個extent

之間擴展新的extent,并修改相應(yīng)的節(jié)點指針(回滾段的extent之間是通過指針連起來的

一個單向循環(huán)的鏈表結(jié)構(gòu));

系統(tǒng)回滾段與延遲回滾段

SYSTEM回滾段是創(chuàng)建在系統(tǒng)表空間中,要緊是用于系統(tǒng)級的事務(wù)與分配普通事務(wù)于其他

回滾段上。當手工創(chuàng)建數(shù)據(jù)庫后需要創(chuàng)建普通回滾段之前務(wù)必首先創(chuàng)建系統(tǒng)回滾段。

系統(tǒng)回滾段要緊用于兩個方面。一是系統(tǒng)事務(wù),比如針對數(shù)據(jù)字典的操作的truncate

table與droptable。假如truncatetableordroptable的過程中沒有成功,則系統(tǒng)

會根據(jù)系統(tǒng)回滾段中的數(shù)據(jù)字典操作信息對該DDL操作進行回退。另一個方面,就是延遲回

滾段(DeferredRollbackSegment)。表空間off1ine時用戶申請回滾,數(shù)據(jù)庫會將回滾信

息寫入系統(tǒng)回滾段(就是延遲回滾段),等到。nline時,在寫入表空間。

回滾段的設(shè)置與管理

init.ora:transactions_per_ro11back_segment與transactions,

max_rollback_segments

1:系統(tǒng)并發(fā)事務(wù)數(shù)有多少?(要緊是產(chǎn)生恢復(fù)信息的會話數(shù)+一部分冗余數(shù)(20)=總回滾

段數(shù))

2:系統(tǒng)是否存在大查詢或者者大是事務(wù)?頻繁么?

3:能提供給系統(tǒng)的回滾段表空間的磁盤空間是多少?

不要將回滾段的MAXEXTENTS設(shè)為UNLIMITED,回滾段所在表空間也不要設(shè)為AUTOEXTEND

方式,否則將會使得由于某個不正常的事務(wù)導(dǎo)致整個數(shù)據(jù)庫處于失控狀態(tài)。

9i

undojetention表示在自動管理模式下,回滾段中的數(shù)據(jù)在被覆蓋前保留多長的時間,

單位是秒。這個參數(shù)應(yīng)該決定于系統(tǒng)所中一些大查詢運行的時間長度,以避免0RA-01555錯

誤。

在9i下創(chuàng)建非自動管理的的回滾段而不使用UNDO表空間,則設(shè)置undojnanagement

為MANUAL,然后在系統(tǒng)表空間中創(chuàng)建一個回滾段(注意這是務(wù)必的),創(chuàng)建自己的回滾段表空

間,這時能夠在回滾段表空間中創(chuàng)建回滾段,創(chuàng)建完畢刪除系統(tǒng)表空間中的回滾段。

著名的0RA-01555問題

一致讀獲取的時候發(fā)現(xiàn)回滾段已經(jīng)被覆蓋而出現(xiàn)找不著變化前映像,也就是當COMMIT

SCN大于T查詢嘗試去回滾段中找回數(shù)據(jù)卻發(fā)現(xiàn)回滾段已經(jīng)被覆蓋了(由于回滾段是循環(huán)使

用的),則會出現(xiàn)著名的0RA-01555錯誤。

重做

v$sysstatv$logv$logfilev$loghistory

altersystemswitchlogfile;

重做記錄了塊的改變,包含回滾段頭塊、回滾段塊、數(shù)據(jù)塊,同時在塊改變之前先記錄

重做信息。

更換矢量(changevector)一當要改變數(shù)據(jù)庫的數(shù)據(jù)時,這些改變的細節(jié)被記錄為更換

矢量。通過這些記錄,數(shù)據(jù)庫處理過程能夠被重現(xiàn)。

簡而言之,一個更換矢量就是記錄了一個數(shù)據(jù)塊的行槽從一個狀態(tài)改變到另一個狀態(tài)的

its蜀_

也就是redo的記錄單位是entry,即:fileX,blockY,rowslotZ。

Redo也記錄了數(shù)據(jù)塊(tableblock&indexblock)前照,事實上記錄的就是undo,

由于即使沒有commit,改動也會被記錄到redo文件里,這時的tableblock&indexblock

就是未提交的最新狀態(tài),假如如今系統(tǒng)崩潰,則需要redo中記錄的undo(前照)進行恢復(fù),

因此redo記錄了數(shù)據(jù)塊、索引塊、回滾塊o

ORACLE推薦logswitch時間最好在15—30分鐘之間。

跟redologfile有關(guān)的其它數(shù)據(jù)庫參數(shù)

1、log_buffer它最好不要大于512K或者者128K*CPU個數(shù)。

我們能夠用下面的SQL語句檢測log_buffer使用情況:

SELECTRBAR.NAME,RBAR.VALUE,RE.NAME,RE.VALUE,(RBAR.VALUE*100)/

RE.VALUE||'%''radio"FROMV$SYSSTATRBAR,V$SYSSTATREWHERERBAR.NAME

=Jredobufferallocationretries,ANDRE.NAME='redoentries,;

這個比率小于1%才好,否則增加logbuffer的大小

2、log_checkpoint_interval

0racle8.1版本后log_checkpoint_interval指的是兩次checkpoint之間操作系統(tǒng)數(shù)據(jù)

塊的個數(shù)。checkpoint時Oracle把內(nèi)存里修改過的數(shù)據(jù)塊用DBWR寫到物理文件,用LGWR

寫到日志與操縱文件。

從性能優(yōu)化來說log_checkpoint_interval=redologfilesizebytes/512bytes

3、logcheckpointtimeout

0racle8.1版本后log_checkpoint_timeout指的是兩次checkpoint之間時間秒數(shù)。

Oracle建議不用這個參數(shù)來操縱,由于事務(wù)(transaction)大小不是按時間等量分布的。用

log_checkpoint_interval參數(shù)操縱會好一些。禁用此參數(shù)或者者按默認的900。

altersystemarchivelogcurrent;

第二個存檔日志目的地能夠通過初始化參數(shù)LOGARCHEVEDUPLEXDEST設(shè)定。

LOG_ARCHEVE_DEST與LOG_ARCHEVE_DUPLEX_DEST都能夠存檔所有的聯(lián)機重作日志文件。另一

個初始化參數(shù)LOG_ARCH1VE_M1N_SUCCEED_DEST假如設(shè)置了的話,能夠決定一個重作日志組務(wù)

必被成功存檔到的存檔日志目的地數(shù),在一個目的地滿或者其介質(zhì)有錯時,該參數(shù)能夠防止

Oracle被凍結(jié)。要確保這兩個目的地被配置在兩個分離的磁盤/操縱器上,避免I/O沖突對

數(shù)據(jù)庫性能的影響。

一些參數(shù)

v$parameter

查看系統(tǒng)當前使用的所有參數(shù)

SETpagesize9000

SETheadOFF

SETtermOFF

SELECTDECODE(isdefault,'TRUE','#')||DECODE(isdefault,'TRUE’,

RPAD(name,43),RPAD(name,45))II'='IIvalueFROMv$parameterORDERBYname;

查看所有參數(shù)是否已被init.ora重新設(shè)定

SELECTname,isspecifiedFROMv$obsolete_parameter;

查看過時參數(shù)與強調(diào)參數(shù)

SELECTkspponm,DECODE(ksppoflg,1,'Obsolete',2,'Underscored')FROMx$ksppo

ORDERBYkspponm;

查看當前系統(tǒng)中的所有隱臧參數(shù)(以sys身份登錄)

SELECTksppinm,ksppstvl,ksppdescFROMx$ksppix,x$ksppcvyWHEREx.inst_id

=userenv(JInstance,)andy.instid=userenvC,Instance,)andx.indx=y.indxand

x.ksppinmlikeJ%_&par%>orderbytranslate(x.ksppinm,

用戶參數(shù)

select*fromv$fixedtablewherenamelike'%NLS%';

SELECT*FROMV$NLS_PARAMETERS;

ALTERSESSIONSETNLS_DATE_FORMAT=,YYYY-MM-DDHH24:MI:SS';

最常被修改的參數(shù):

Shared_pool_size分配給共享池的內(nèi)存字節(jié)數(shù)隨著用戶的需求,能夠按時增加此值

Rollback_segments數(shù)據(jù)庫啟動時獲取的一個或者多個當事務(wù)處理量增加或者減少

時,能夠從該回滾段名列表中增加或者刪除回滾段名

Processes可同時訪問數(shù)據(jù)庫的最大進程數(shù)量

session=l.i*process+5,通常而言,session與process是對應(yīng)的,5是Oracle

后臺進程的session,10%是提供給recursivesession使用的。

db_b1ock_buffers見SGA介紹中的有關(guān)內(nèi)容

shared_pool_size見SGA介紹中的有關(guān)內(nèi)容

log_buffer見SGA介紹中的有關(guān)內(nèi)容

sort_area_size

針對每個session,排序首先會使用sort_area_size,假如不足則會使用臨時表空間。

實際上就是外排序過程,把要排序的對象分割為內(nèi)存能夠容納的小段(sortrun),然后每個

sortrun都放到sortarea里面去排序,排序結(jié)果作為中間信息放在臨時表空間的臨時段內(nèi),

由于分段排序的結(jié)果當然不可能是最終要求的排序結(jié)果,因此還要通過一個merge的過程,

才會得到最終排序結(jié)果,原理大概是比較每個sortrun的第一名,取出領(lǐng)先者,然后該sort

run的第二名頂上,繼續(xù)上述過程直到取完。

因此建議:sortarea_size所能容納記錄數(shù)至少大于排序記錄數(shù)的平方根

5.open_cursor見皿介紹中的有關(guān)內(nèi)容

6.database_writers

許多DBA有個錯誤的概念,認為此參數(shù)受CPU數(shù)量的限制,實際并非如此。提示:假如

工作在一個能夠支持多進程的操作系統(tǒng)上,需做的第一件事就是改變這個參數(shù)的值。

重新啟動數(shù)據(jù)庫,使用startup命令,Oralce將會按照下列順序在缺省目錄中搜索參數(shù)

文件:

spfile${ORACLE_S1D}.ora

缺省目錄UNIX:${ORACLE_HOME}/dbs/NT:${0RACLEJI0ME}\database

spfile.ora

缺省目錄UNIX:${ORACLE_HOME}/dbs/NT:${ORACLE_HOME}\database

init${ORACLESID},ora

缺省目錄UNIX:${ORACLE_HOME}/dbs/

NT:${ORACLE_HOME}\databaseor${ORACLE_HOME}\admin\db_name\pfile\

創(chuàng)建了spfile,重新啟動數(shù)據(jù)庫,Oracle會按順序搜索以上目錄,spfile就會自動生效。

startuppfile=,E:\Oracle\admin\eyglen\pfile\init.ora);

createspfilefrompfile;

然后我們能夠使用ALTERSYSTEM方式將修改固定到SPFILE.

ALTERSYSTEMSETlog_archive_start=FALSESCOPE二spfile;

空間管理

主體思想一直圍繞著內(nèi)部段的擴展。不僅僅影響到空間大小,自由塊太分散的話會影響

性能(I/O,及擴展時間等)

空閑表(主空閑表、進程空閑表、事務(wù)空閑表),可能存在于表頭塊中

表空間

droptablespace***includingcontents;

注:LMT是segment中extent的管理,ASSM是thefreespaceofsegment的管理。

在0racle8I的版本中,Oracle推出了一種全新的表空間管理方式:本地化管理的表空

間。所謂本地化管理,就是指Oracle不再利用數(shù)據(jù)字典表來記錄Oracle表空間里面的extent

的使用狀況,而是在每個表空間的數(shù)據(jù)文件的頭部加入了一個位圖區(qū),在其中記錄每個

extent的使用狀況。每當一個extent被使用,或者者被釋放以供重新使用時,Oracle都會

更新數(shù)據(jù)文件頭部的這個記錄,反映這個變化。

Oracle之因此推出了這種新的表空間管理方法,這種表空間組織方法的優(yōu)點:

1.本地化管理的表空間避免了遞歸的空間管理操作。而這種情況在數(shù)據(jù)字典管理的表空

間是經(jīng)常出現(xiàn)的,當表空間里的區(qū)的使用狀況發(fā)生改變時,數(shù)據(jù)字典的表的信息發(fā)生改變,

從而同時也使用了在系統(tǒng)表空間里的回滾段。

2.本地化管理的表空間避免了在數(shù)據(jù)字典相應(yīng)表里面寫入空閑空間、已使用空間的信

息,從而減少了數(shù)據(jù)字典表的競爭,提高了空間管理的并發(fā)性

3.區(qū)的本地化管理自動跟蹤表空間里的空閑塊,減少了手工合并自由空間的需要。

4.表空間里的區(qū)的大小能夠選擇由Oracle系統(tǒng)來決定,或者者由數(shù)據(jù)庫管理員指定一

個統(tǒng)一的大小,避免了字典表空間一直頭疼的碎片問題。

5.從由數(shù)據(jù)字典來管理空閑塊改為由數(shù)據(jù)文件的頭部記錄來管理空閑塊,這樣避免產(chǎn)生

回滾信息,不再使用系統(tǒng)表空間里的回滾段。由于由數(shù)據(jù)字典來管理的話,它會把有關(guān)信息

記在數(shù)據(jù)字典的表里,從而產(chǎn)生回滾信息。

由于這種表空間的以上特性,因此它支持在一個表空間里邊進行更多的并發(fā)操作,并減

少了對數(shù)據(jù)字典的依靠。

關(guān)于表空間中的每一個空間(一個或者多個extent),我們務(wù)必明白:

1、這個可用空間位于什么數(shù)據(jù)文件

2、這個空間的尺寸是多大

3、假如它在用了,是哪一個段占用的這個空間

直到8i之前,所有的表空間都是使用字典管理模式,為了確保能儲存以上的信息,ORACLE

用了兩個數(shù)據(jù)字典表:UET$(已使用的區(qū)間)或者FET$(空閑空間):當一個段被刪除的時候,

ORACLE就移動UET$中相應(yīng)的行到FET$,這個過程的發(fā)生是連續(xù)的,而且可能發(fā)生等待.當

并發(fā)性很高的時候,數(shù)據(jù)字典的爭用就來了。另外有一個問題就是,當表的空間很不連續(xù)或

者表空間有大量的碎片引起這兩個表的增大,那么也就會引起數(shù)據(jù)庫性能上的下降。

表空間分段:

氣泡(bubble):一個連續(xù)的自由空間塊;蜂窩(honeycomb):一系列看起來相連的塊。

蜂窩由氣泡構(gòu)成(氣泡間有邊界),去掉邊界,蜂窩并成一個大的氣泡。氣泡與蜂窩多是由于

擴展段的釋放而產(chǎn)生。過多的小的氣泡會導(dǎo)致DDL操作時多次掃描SYS.FET$,并花時間合并

可用空間,影響性能。

讓我們看一下當一個行被從一個應(yīng)用程序中插入到表中時發(fā)生的一系列動作:

1)查表的自由列表,考慮在哪能夠放一個新行。假如沒有自由塊可用,需要分配一個新

的擴展段。

2)Oracle掃描SYS.FET$表,為空間中的擴展段定位自由空間。

3)第一次掃描找出能夠供新的擴展段使用的氣泡。新擴展段的大小計算使用大于擴展段

所需塊數(shù)的、下一個可被5整除的數(shù)。比如,假如一個擴展段包含23塊,則得到的數(shù)是25

塊。然而,假如需要的是5塊或者更小,就不必這樣計算,一旦塊數(shù)確定,第一次掃描就尋

找塊數(shù)恰好滿足需要的氣泡。

4)假如沒有找到恰好合適的,那么Oracle掃描大些的氣泡。假如一個大的氣泡所擁有

的塊數(shù)比所需要的塊數(shù)多5塊或者5塊以上(當然是在取了約數(shù)以后),那么氣泡中的自由空

間分成兩部分,一部分滿足擴展段的需要,另一部分仍作為自由空間。新的(小一些的)的

自由空間氣泡包含去掉所需的塊數(shù)后剩下的塊數(shù)(5塊或者多于5塊)。比如,假如需要的

塊數(shù)是25,但找到了一個32塊的氣泡,那么Oracle占用其中的25塊分配給擴展段并保持

剩下的7塊形成一個分開的氣泡,仍然保留在原處。另外一種情況,找到了一個28塊的氣泡,

那么只是把此氣泡供擴展段使用。換句話說,假如多余的塊數(shù)少于5就不產(chǎn)生分割操作。

5)假如所有現(xiàn)有的氣泡都太小,不足以滿足擴展段的需要(即沒有找到大小相等的也沒

有找到大于數(shù)據(jù)塊數(shù)的氣泡),那么進行第三次掃描尋找是否有能夠合并的蜂窩能提供所需的

空間。在合并以后,再次進行第3步與第4步。

6)假如前面的幾步都沒有找到能夠供擴展段使用的氣泡,那么Oracle檢查AUTOEXTEND

功能是否已被使能(后面全面介紹這一選項)。假如是的,再檢查數(shù)據(jù)文件是否是可擴展的。

7)假如AUTOEXTEND沒有被使能或者者在磁盤上(數(shù)據(jù)文件所在的磁盤)沒有足夠的空

間來擴大該數(shù)據(jù)文件,Oracle返回"0RAT650-55:Unabletoextend"錯誤消息,引起應(yīng)用

失敗。

預(yù)防措施:

1)將大小相同而且增長率相似的段應(yīng)該儲存在相同的表空間集合中,保證釋放的氣泡能

夠高效地被別的段重新使用。

2)理想情況下,一個表空間中的所有段應(yīng)該有相同的存儲參數(shù)(對每一個段有相同的

IN1T1AL/NEXT值)。假如不能做到這一點,要保證不一致段的存儲參數(shù)要互為倍數(shù)。為所有

的表空間指定DEFAULTSTORAGE參數(shù)。

3)一旦可能,指定PCTINCREASE=O。當由于沒有定義增長模式而不可能指定該值時,

用100作為PCTINCREASE的可能值。在任何情況下,不要用如1、5等的隨機值,以防止生成

奇數(shù)大小的擴展段。

4)周期性顯式地合并應(yīng)用程序的表空間。不要配置SMON來自動合并表空間,由于它需

要在表空間的DEFAULTSTORAGE語句中指定一個大于0的PCTINCREASE的值。

識別表空間段情況、重構(gòu)特定文件:

1)識別表空間中的擴展段、氣泡、蜂窩:

SETLINES132

SETPAGES500

COLUMN“FIL」D”FROMAT999HEADING“FIL|ID”

COLUMN“FIL”FORMATA55HEADING“FIL-NAME”

COLUMN“SEGMENT”FROMATA55

COLUMN“STARTBLK”FROMAT999999HEADING“STARTBLK”

COLUMN**#BLOCKSwFORNIAT999,999HEADING“#:BLKS”

SELECTD.FILE_IDMFIL_ID>,,D.FILE_NAME“FIL”,SEGMENT_TYPE||4,OWNER

||,,'||SEGMENT_NAME“SEGMENT”,E.BLOCKED“STARTBLK”,

E.BLOCKS“#BLOCKS”

FROMDBA_EXTENTSE,DBA_DATA_FILESD

WHEREE.TABLESPACE_NAME=UPPER(,&&TBLSPC_NAME,)

ANDI).TABLESPACENAME=E.TABLESPACENAMEANDD.FILEID=E.FILEID

UNION

SELECTS.FILE_ID(<FIL_IDW,D.FILE_NAME“FIL”,'FREECHUNK'"SEGMENT”,

S.BLOCK_ID“STARTBLK”,S.BLOCKS“#BLOCKS”

FROMDBA_FREE_SPACES,DBA_DATA_FILESD

WHERES.TABLESPACE_NAME=UP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論