




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Oracle系统架构基本概念2Outline
Oracle系统架构概观Overview
OracleInstance
OracleDatabase
OtherProcesses
漫谈OracleInstance
存储器结构BackgroundProcesses
漫谈OracleDatabaseStructuresPhysicalDatabaseStructuresLogicalDatabaseStructures3Oracle系统架构概观关于Oracle系统架构,是非常重要的基础观念,正所谓「君子务本,本立而道生」,有了踏实的基础观念之后,才能在往后学习Oracle的路上,无往不利4计算机系统OverviewOracleServer主要是由OracleInstance与Database所组成,透过ServerProcess与UserProcess之间的交互运作,借以达成使用者交付执行的工作。
OracleServerOracleInstanceDatabaseUserProcessesServerProcessesPGA
Query5例如,使用者可能想要在OracleServer上查询一笔人事资料,使用者将相关的SQL叙述输入系统中,此时系统会产生相对应的UserProcess与ServerProcess,由ServerProcess负责向OracleServer沟通,并将符合使用者所需的资料,从OracleServer送至UserProcess,以完成该使用者下达的request。6OracleInstance(Oracle数据库引擎)Oracle数据库中的任何动作都和它有关,是OracleDB的心脏地带。OracleInstance主要包含:
backgroundprocess(背景处理程序)是一群常驻的服务常式(serviceroutine),执行I/OProcess与非OracleProcess的监控管理,针对目前的使用者所提出的request执行一些一般性的工作。每一个Process专责于一至两项的工作SystemGlobalArea(SGA;系统全域区)用来存放数据库系统相关信息的一块共享存储器资料区域,让backgroundprocess得以利用这些系统信息,以提供适当的服务,处理外部的userrequest。7由于OracleInstance掌控着处理OracleDatabase所有运作的相关信息。因此,当要存取或操作OracleDatabase里的资料时,必须先启动OracleInstance,才能对OracleDatabase的内容加以处理。
当OracleInstance启动时,计算机系统会先配置一块存储器空间给SGA(SystemGlobalArea),并且载入相关的backgroundprocess。
8OracleDatabaseOracleDatabase可分为两个部份来说明:实体结构逻辑结构
9实体结构OracleDatabase的实体结构部份是由一个个的档案所组合,主要的档案包括Datafiles(资料档)RedoLogfiles(重置日志档)-onlineControlfiles(控制档)另外尚有:Passwordfile(密码档)Parameterfile(起始参数档)ArchivedRedoLogfiles(重置日志封存档)-offline10ControlfilesDatafilesArchivedlogfilesParameterfilePasswordfileRedologfilesDatabase11逻辑结构OracleDatabase的逻辑结构部份,主要有Tablespace(表格空间)Segment(区段)Extent(延伸区块)Block(区块)12OtherProcesses不属于OracleInstance内的Process皆称为OtherProcess。是User和应用程序要连接OracleDBServer的重要桥梁。如UserProcess、ServerProcess等主要是反应使用者下达的request(即SQL叙述),将其转化为OracleServer能看得懂的相关指令,从OracleDatabase里抓取资料,以反映使用者需求的资料。在ServerProcess中还有一个相当重要的资料结构-PGA(ProgramGlobalArea):PGA是一个memorybuffer,存放相关ServerProcess的资料与控制信息。当ServerProcess被呼叫启动后,OracleServer会为其建立一个所属的PGA,使用者下达的SQL叙述,就是存放在这里的。
13漫谈OracleInstance14第一部份我们曾谈到所谓的OracleInstance可分为:SGA(SystemGlobalArea)Background
Processes
两部份,并做了概略的说明。现在就分别针对SGA与BackgroundProcesses做更完整深入的说明。
15存储器结构SGA是OracleServer在系统上所建立的一块存储器区块,OracleServer利用这块存储器结构,协同Oracle的各种Processes来完成使用者所交付的工作。SGA主要是由几种不同的资料区块所组成-DatabaseBufferCacheRedoLogBufferSharedPoolLargePoolJavaPool其它(如:Cursors…等)SGADatabaseBufferCacheRedoLogBufferSharedPoolLargePoolJavaPoolOthers16DatabaseBufferCache(数据库缓冲快取区)数据库系统撷取资料时的一个快取空间,其用途在于有效减少存取资料时造成的磁碟读写动作。(到硬盘从事I/O是很耗时的工作!!)我们可以透过设定DB_BLOCK_BUFFERS这个参数值来设定DatabaseBufferCache的大小。在Oracle的DatabaseBufferCache中,尚有一些sub-caches:DB_CACHE_SIZEDB_KEEP_CACHE_SIZEDB_RECYCLE_CACHE_SIZE我们可以透过DB_CACHE_ADVICE这个参数,藉由statistics的方式来对不同的cachesize做预设。指令:Altersystemsetdb_cache_advice=on17Oracle用所谓的LRU(LeastRecentlyUsed)算法来管理这块存储器空间。LRU:当这块存储器空间满载时,OracleServer将只保留最近有被使用过的资料,最不常用的资料则写回磁碟中,并将该资料所占用的存储器空间释放出来。由于DatabaseBufferCache关系着OracleServer的I/O动作频繁与否,因此如何管理及设定DatabaseBufferCache的大小,对于OracleServer的效能调校,是相当重要的一项课题。18RedoLogBuffer(重置日志缓冲区)当数据库的内容有所异动时,RedoLogBuffer会记录其相关异动的情形:做了什么改变改变后的旧资料与新资料经过一定的时间周期或者是RedoLogBuffer满载时,OracleServer会将RedoLogBuffer的内容写到RedoLogFile里,以追踪整个数据库的使用情形。当OracleServer不幸当掉的话,就能利用这些记录下来的信息,进行数据库的复原(Recovery)。有关RedoLogBuffer的大小设定,可以透过设定参数LOG_BUFFER,改变RedoLogBuffer的大小。
19SharedPool(共享区)当使用者将SQL、PL/SQL等操作指令送至Oracle数据库后,系统会先解析(Parse)语法是否正确。解析时,下列两项资料将会放入SharedPool中:解析时所需要用到的相关信息解析后的结果当有不同的使用者执行相同的SQL指令,就可以共享SharedPool中解析好的结果,以加速SQL指令执行的速度。SharedPool内包含数种不同的区域,主要有下列两类:DataDictionaryCache–存放解析时所需要的相关信息,以供查询之用LibraryCache–存放各类指令解析后的结果,以供重覆使用SharedPool亦是采LRU的存储器管理算法。SharedPool的大小设定,是由SHARED_POOL_SIZE这个参数来控制
20LargePool(大型区)
LargePool是Oracle针对一些需要大量存储器空间的数据库处理与运算工作所提供的一个额外选项,它可以让SGA配置一个较大的存储器空间,提供给处理Oracle的backup/restore、I/O、执行Oracle复原管理程序RMAN、…
等。透过指定LARGE_POOL_SIZE这个参数,设定LargePool的大小。
21JavaPool(Java区)当使用者有使用Java时,OracleServer利用这块存储器空间,存放及Parse所使用的JavaCode,借以提供Oracle与Internet更高的整合性。透过指定JAVA_POOL_SIZE这个参数,来改变JavaPool的大小。22BackgroundProcessesOracleServer所提供的Processes可分为两类:ServerProcesses
用以服务ClientProcesses,根据ClientProcesses的需求,由OracleServer动态配置所产生的,用以服务ClientProcesses的需求不被包含在OracleInstance里在ServerProcesses里,尚包含另一个重要的存储器结构-PGA(ProgramGlobalArea),存放着ClientProcesses与ServerProcesses间的重要信息BackgroundProcesses用来管理OracleServer所需的一些系统常式,诸如数据库的I/O、OracleProcesses的管理等包含于OracleInstance中23主要的BackgroundProcesses共有五个,只要有这五个BackgroundProcesses,OracleServer就可以正常地运作了,分别是:DatabaseWriter(DBWR)LogWriter(LGWR)SystemMonitor(SMON)ProcessMonitor(PMON)CheckpointProcess(CKPT)其它尚有Archiver(ARCH)、Recoverer(RECO)、Dispatcher(Dnnn)、Lock(LCKn)、JobQueue(SNPn)及QueueMonitor(QMNn)等BackgroundProcesses,它们主要是提供OracleServer更进阶的管理。如ARCH,它可以提供比LGWR更强的数据库回复能力。
24DatabaseWriter(DBWR)DBWR主要是负责管理DatabaseBufferCache,将DatabaseBufferCache中修改过的资料,整批写入DataFile里,透过系统整批写入的方式,可以提高整个系统的执行效率。当使用者执行DML指令修改相关资料栏位,并执行commit指令时,Oracle本身并不是直接将修改过的资料直接写入DataFile里,而是当DatabaseBufferCache的内容即将满载或是经过一定的时间区隔(检查点Checkpoint;CKPT),才将资料写入DataFile中。藉由减少相关的I/O动作,以提高系统执行效能。使用write-ahead
的技术
25InstanceSGADatabasebuffer
cacheDBWnControlfilesDatafiles
RedologfilesDatabase26由于在大型在线交易(OLTP)
系统,其数据库异动情况可能十分频繁。因此:一个OracleServer可以有一个以上的DBWRBackgroundProcesses,可以依实际系统硬件与作业系统的特性,设定DB_WRITER_PROCESSES参数值,以获得整个数据库系统的最佳执行效能。当设定DB_WRITER_PROCESSES的内容值后,系统上有关DBWR的名称将会变为DBWn,n可为0~9,如DBW0、DBW1、DBW2等。(系统预设只会启动一个DBWn,即DBW0)。然而,在单一处理器的服务器系统,配置额外的DBWn并无太多的实质帮助。27LogWriter(LGWR)LGWR主要是负责将RedoLogBuffer的内容值,写入online的RedoLogFile中。它与DBWR的运作方式不同点在于:DBWR在DatabaseBufferCache即将满载或是经过一定的时间区隔,才会将资料写入DataFile中,且是在有需要的时候才会对相关档案做存取的动作LGWR是在数据库的内容有异动且已被确认(commit)时,如insert、update、delete等,就会被触发,将异动的情形记录到onlineRedoLogFile中。因此,当数据库crash时,就可以根据onlineRedoLogFile内容,对数据库进行还原的动作。LGWR一样可以透过设定LGWR_IO_SLAVES这个参数值,提供异步I/O模式的功能。
28LGWR之动作时机:当使用者确认(commit)某交易时,LGWR会遵循Write-aheadProtocol(先期写入协定),将Redologbutter内的资料异动记录写入。下列几种情况:自动周期性地动作,如:间隔时间为3秒(Checkpoint;CKPT)重置日志缓冲区之剩余空间不到2/3当DBWn回写资料档时,必要的时候LGWR也会动作(Write-aheadProtocol)29InstanceSGADBWnRedologbufferControlfilesDatafiles
RedologfilesLGWRDatabase30何谓Write-ahead?在DBWn回写资料至DataFile之前,RedoLogBuffer内相关资料都必须完成写入动作(即写入RedoLogFile)。若DBWn发现某些重置纪录尚未写入RedoLogFile时,它会通知LGWR前来处理。等到LGWR将RedoLogBuffer的纪录写入完毕时,DBWn才会开始写入资料档。31为何要把RedoLogFile称为onlineRedoLogFile?因为Oracle把RedoLogFile分为两部份:onlineRedoLogFilearchiveRedoLogFile这两个都是负责记录、追踪整个数据库的异动情形。不同的是,archiveRedoLogFile是onlineRedoLogFile的备份资料档,由另一个BackgroundProcess-Archiver(ARCH)负责管理。在预设的情况下,ARCH是不会启动的,而是由LGWR记录数据库的异动情形,将这些记录资料写到onlineRedoLogFile里。如果OracleServer不幸挂了,此时的数据库仅能复原onlineRedoLogFile里有记录的资料。可是,其他的呢?这时候就要靠ARCH将onlineRedoLogFile备份出来。32SystemMonitor(SMON)如果是因为停电或是其它因素导致Oracle数据库不正常被关闭,下一次启动数据库时将由SMON进行必要的数据库修复动作。主要的工作有:执行一些数据库必要的修复工作
(如果有需要的话,SMON会使用onlineRedoLogFile的内容)。定时清除数据库系统中一些不必要的残余物件,例如上次系统交易进行一半的资料或暂时性区间。执行整个系统储存空间的管理,对于Tablespace上破碎的Extent,它会将这些较小的Extents予以合并,整理出一个较大的空间,以供系统日后的使用。33InstanceSGASMONControlfilesDatafiles
RedologfilesInstanceSGASMONDatabase34ProcessMonitor(PMON)当某个UserProcess异常中止时,PMON会执行程序修复(ProcessRecovery)的动作,就是把已经失效的UserProcesses给赶出存储器,并释放该存储器空间,留待系统日后使用释放该Process之前使用的系统资源,避免Deadlock发生。
PMON和SMON一样,都是由Oracle数据库系统周期性自动执行,检查整个数据库系统的运作情形。35InstanceSGAPMONPGAarea36Checkpoint(CKPT)在一个指定的时间区间里,DBWR会对所有在DatabaseBufferCache所做的异动,将其结果写入到相关的DataFiles以及RedoLogFiles、ControlFiles,这样的动作,就称为产生(设定)一个checkpoint事件。CKPTBackgroundProcess就是扮演着一个通知者的角色,经过一定的时间后,负责通知DBWR执行Checkpoint的动作。CKPT会在适常时候产生一个Checkpoint事件,其意义为:确保DatabaseBufferCache内经常被异动的资料也能够定期被写入硬盘的DataFile。(∵LRU算法)万一Oracle需要进行InstanceRecovery时,就不需要Checkpoint之前的Redorecord,可缩短数据库动新启动的时间。37InstanceSGADWW0RedoLogBufferLGWRInstanceSGADBWnLGWRCKPTControlfilesDatafiles
Redologfiles38执行Checkpoint的时间区间,可以透过设定LOG_CHECKPOINT_INTERVAL这个参数,改变checkpoint的区间。然而,在设定LOG_CHECKPOINT_INTERVAL时,要注意的是:这个值设得太小的话,会造成系统额外I/O的负担设得太大,超过onlineRedoLogFileswap的时间时,LOG_CHECKPOINT_INTERVAL的值又会变得没有意义因为Oracle会在swaponlineRedoLogFile时,做一次checkpoint的动作。
39Summary纵观以上的说明,现在我们可以勾勒出整个OracleInstance的整个架构图:系统存储器大致上的配置情形有DatabaseBufferCache、RedoLogBuffer、SharedPool、LargePool、JavaPool…等。在BackgroundProcesses部份,计有DBWR、LGWR、SMON、PMON、CKPT…等。BackgroundstructuresMemorystructuresSGARedolog
bufferDatabase
buffercacheSharedpoolDBWRSMONPMONCKPTLGWROthersDataDictionary
cacheLibrarycacheInstance40InstanceSGARedolog
buffercacheSharedpoolDataDict.
cacheLibrarycacheDBWRSMONPMONCKPTLGWROthersUser
processServer
processPGAControlfilesDatafiles
ArchivedlogfilesParameterfilePasswordfileRedologfilesDatabaseDatabase
buffercache41漫谈OracleDatabaseStructures42第一部份曾谈到所谓的OracleDatabase可分为:逻辑结构实体结构两部份,并做了概略的说明。如果您有心成为一个顶尖的OracleDBA,那么不仅要对以上两结构内的各个项目如数家珍般熟悉,还要了解其内部运作与相互关系才行。现在就分别针对这两部份做深入的说明。43逻辑结构(LogicalDatabaseStructures)逻辑数据库结构是Oracle所提供的一种抽象化的数据库管理概念,透过一个「Mapping」的机制,管理OraclePhysicalDatabaseStructures。由外至内,我们可以看到:整个Database是由一个以上的Tablespace(表空间)组成;每个Tablespace存在着许多的Segment(区段);每个Segment内含许多的Extent(延伸区块);最后,则是构成整个OracleDatabase的最小逻辑单位-block(区块)。
4445Tablespace(表空间)
Oracle数据库允许DBA自行规划各种用途的资料表空间(Tablespace),以便存放不同型态的资料与数据库物件。例如:存放Oracle系统信息的「资料辞典」(datadictionary)可放在SYSTEM表空间;使用者所存放的相关资料可存放在USER表空间;所有资料表的索引(Index)则可单独存放在INDX表空间。SYSTEM为Oracle数据库预设的表空间;USER与INDX则是由DBA自行规划建置的。46一般来说,Oracle数据库至少应规划出五个以上的资料表空间,如下图所示:47OracleServer其他相关的逻辑结构,均是经由Tablespace做统一集中的管理。Tablespace依其可存取的状态,分为两种状态:on-line(在线)off-line(离线)再以其可存取的模式区分,可分为两种式read-only(唯读)read-write(读写)透过其存取状态的控制以及存取模式的切换,将可使整个数据库的管理更为方便。48Tablespace的特性OracleDatabase是由数个Tablespace所构成。一个Tablespace在同一时间点上,仅能类归于一个Database。即,Database与Tablespace之间的关系,是呈现一对多的关系。除了SYSTEMTablespace与存在作用中(active)的RollbackSegment的Tablespace外,其余的Tablespace均可在Database尚在执行的时候,将其选择性的off-line或on-line,以利数据库的管理。Tablespace能够随意切换其存取模式-read-only及read-write模式。49Block(区块)OracleDatabase逻辑空间概念中最小的逻辑空间单位,有关OracleServer对储存空间所执行的配置(allocate)、读取(read)及写入(write),均是以此为单位,进行数据库的种种操作。且在新建Oracle数据库时就必须明确地定义。Oracle的区块大小通常是数倍于“作业系统的磁碟读写区块”(O.S.blocks)表示,Oracle在存取资料时是以自身的block为最小读取单位,而不是以O.S.block为单位。它的参数设定透过参数DB_BLOCK_SIZE设定之。必须将DB_BLOCK_SIZE设定为O.S.blocks的整数倍。50Extent(延伸区块)虽然资料区块是Oracle最小的资料读写单位,但值得注意的是:Oracle在“配置”储存空间时,并不是以资料区块为单位,而是改采「延伸区块」的方式来配置空间。它是由许多连续的blocks所组成。一个Extent的相关信息,仅能存在于同一个Datafile中。51好处:减少数据库空间配置的动作假定您准备在Oracle数据库内存放80KB的资料:当执行DDL指令建立数据库物件时(例如:CREATETABLE…),Oracle会先配置出一连串的Blocks(即:Extent),其大小可为单一Block(假设8KB)的5倍。当这些资料区块全部存满资料后,视实际需要再配置第二个Extent(大小还是40KB)。只要两次的空间配置动作就可以存放80KB的资料。反例如果Oracle每次只配置8KB的Block让您存放资料,总共需要10次空间配置动作才能放满80KB的资料,比较没有效率由此可见,Extent的确有其存在的必要性。52Segment(区段)Segment是仅次于Tablespace的逻辑空间单位。依照不同的资料处理性质,您可能需要在表空间内划分出不同Segment,以存放不同资料。依其储存、管理资料型态的不同,可大致分为:Datasegment(资料区段)Indexsegment(索引区段)Temporarysegment(暂时性区段)Rollbacksegment(退回区段)53从Oracle数据库的「逻辑层面」来看,我们知道:资料是存放在每个Block内,资料读写动作也将以Block为单位。空间配置的动作则是引用Extent的概念。一个Extent由一连串的Blocks所构成。依实际资料量多寡,资料(或数据库物件)由多个Extent所组成。Tablespace内可划分不同的Segment;而每个Segment内又包含许多Extents。在每个Oracle数据库内可规划不同的Tablespace,用以存放不同型态的资料。54实体结构(PhysicalDatabaseStructures)OracleServer实体结构概观图如下:整个OracleDatabase的实体结构,主要由三大部份所组成:ControlfilesDatafilesRedologfiles其它Passwordfile、Parameterfile则是关于OracleServerSecurity及数据库启动设定档Archivedlogfiles则与DatabaseRecovery息息相关ControlfilesDatafiles
ArchivedlogfilesParameterfilePasswordfileRedologfilesOracleDatabase55数据库的启动顺序如下:56Passwordfile(密码档)
PasswordFile是由DBA建立的,储存那些可以管理Oracle的登入密码。可以用一个叫做ORAPWD的工具建立它。
ORAPWD需要输入三个参数:FILE-这是PasswordFile的储存地方。PASSWORD-密码,留意这个密码也会同时成为SYS的密码,如果之后您用SYS登入,发出ALTERUSER的变更密码指令,那就会同时变更PasswordFile和SYS的密码。ENTRIES-设定PasswordFile有多少个用户,即该数据库最多可拥有多少个Administrators。如果之后要增加这个数目,就要先把PasswordFile删除,然后再建立,这个动作是有风险的。57Parameterfile(参数档)启动OracleServer时,OracleServer会先配置一块存储器空间,供OracleInstance及Backgroundprocesses使用。在这之前,OracleServer会先读取Parameterfile内的相关设定,做为配置存储器空间与Backgroundprocesses时的设定值。Parameterfile是一个文字档,一般均是使用文字编辑器编辑该档,修改OracleInstance的设定值。前两部份提及的许多参数,如:DB_BLOCK_BUFFERS、LOG_BUFFER、SHARED_POOL_SIZE等,均可以在Parameterfile中设定。参数名称没有大小写之分,只是一般而言,均是以小写字母为主。在改变Parameterfile的相关设定时,要重新启动Oracle的相关服务,所做的改变才能反映在系统中。58有关Parameterfile的Initializationparameters,依其使用时机、方式,大致可归纳成以下几类:指定档案所在位址及名称,如CONTROL_FILES指定DatabaseControlFile的相关信息。设定区间限制,如LOG_CHECKPOINT_INTERVAL设定DatabaseCheckpoint的时间间隔。指定有效的容量大小,如DB_BLOCK_BUFFERS设定DatabaseBufferCache记忆空间的大小。这类参数又称为VariableParameter。59起始参数档包含以下主要内容:SGA相关的组态设定其他各起始参数之名称与设定值ControlFile的名称与存放路径RedoLogFile之相关设定60Controlfile(控制档)
一个OracleDatabase至少要有一个Controlfile,记载着用来对整个OracleDatabase实体结构maintain与verify的相关信息,如:Databasename。Datafiles、Redologfiles的名称与所在位置。Database建立的Timestamp。每当数据库被启动时,Oracle会在Instance启动后立刻读取ControlFile内容,待所有数据库实体组成档案之所在信息都收集完毕,数据库才会被开启。61Controlfile掌控着所有OracleDatabase实体档案结构的相关信息,新增、删除、修改Datafiles或Redologfiles,OracleServer均会自动维护Controlfile的内容信息。为了避免控制档毁损导致数据库系统停摆,建议在实务应用上至少配置两个ControlFile,存放在不同实体硬盘,并以mirror(映射)
的方式,提供数据库备援的机制。62Parameterfile也有类似的系统信息-DB_NAME。Parameterfile主要是给OracleInstance看的,透过CONTROL_FILES的指定,让Instance(存储器)与Database(实体的档案结构)能够彼此结合,提供数据库的相关服务。因此,Parameterfile必须要搭配适当的Controlfile,否则将造成系统不可预期的错误。63Datafile(资料档)
DataFiles包含在数据库中的实际资料(ActualData)。一个OracleDatabase至少会有一个以上的Datafile来存放资料。数据库的资料大致上可以分为两类:数据库逻辑结构信息(资料字典)资料字典包含数据库逻辑结构的配置信息,诸如Tables、Columns、Indexes、Tablespaces等。使用者资料64一般说来,Datafile有以下几个特点:一个Datafile仅能对应一个Tablespace。Datafile有其属性设定的集合如Auto-extend的设定:当Datafile的容量不足时,OracleServer会自动配置一额外的空间供其使用。一个Tablespace可包含一或多个Datafile
一个Segment只能存在于同一个Tablespace中;而一个Tablespace可能包含一个以上的Datafile,因此,Segment是得以展延(Span)在其Tablespace所属的Datafile内。6566Datafile虽然是OracleServer用来存放大量资料的实体档案结构,但它并不是以直接存取Datafile的模式,达成资料存取的目的,它是以类似Buffer的机制,间接存取Datafile,以提高系统的整体运作效能。读取资料
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论