欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    DBA-I 第一章 ORACLE体系结构(二).docx

    • 资源ID:44323783       资源大小:1.03MB        全文页数:19页
    • 资源格式: DOCX        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    DBA-I 第一章 ORACLE体系结构(二).docx

    ORACLE体系结构(二)我们前面学习了ORACLE如何实现客户的请求并连接到实例。客户端请求通过LISTENER审核,LISTENER会指示ORACLE分配一个服务器进程,并在客户端进程和服务器进程间建立了连接会话。我们称专有连接会话,ORACLE实例提供的是专有服务。就是所谓的dedicate模式。默认情况下就是dedicate模式。ORACLE除了提供专有连接会话,还提供了共享连接会话,ORACLE实例也提供了共享服务。我们接下来学习ORACLE提供的共享式服务器是怎么样实现的,有什么优势。共享服务器大家可能是第一次接触,有点不太好理解,这个不着急,现阶段只要初步了解下可以了。我举个例子:你们谁安装的的oracle是在linux环境下的?你建立一个sqlplus会话,看看是不是多出一个oracle的OS进程oracle   11787 11760  0 14:53 pts/0    00:00:00 rlwrap sqlplus future/futurefang我们看到,专有模式下。新建一个会话,就多出了一个进程。但是共享模式和这个不一样,你开很多个会话在服务器上表现为1个进程。就是1个进程多个会话一起用,就是共享服务器的特点。那我再问下大家,共享模式下,新开一个会话,进程一定不会增加吗?不一定的,有可能还是会增加。比如我们假设一个共享服务器管理10个会话,现在已经有10个了,再连一个就是11个,哪么还是会增加一个进程的。共享服务器模式的主要优势就是节约内存。好,有了上面的经验,我们来看看共享模式的特点。先看下书店的书柜陈列图我们前面讲的都是专有服务模式的连接。我们再来看共享服务器模式下,静安图书分店是如何服务的。当小丽发出一个请求,要批发1000本中国机械出版社2009年后出版的经济类书,并通过轮船运到宁波自己的公司,并按日期进行排序捆绑存放存入小丽公司的仓库。如果采用共享服务模式,那涉及下面几个动作:店里为小丽(用户进程1)分配了售货员小英(服务器进程1)为她服务小英帮小丽取了这1000本中国机械出版社2009年后出版的经济类书小英并按出版日期排完序,并进行包装。并反馈给小丽检查是否按自己规定的顺序包装。小英将包装后的书放到司机小思(服务器进程2)货车里,这样司机小思来服务小丽,帮这批货运道码头。司机小思将货开往码头这时售货员小英可以为小勇(用户进程2)去卖书。也就是一个售货员小英跟小勇建立了会话,并进行服务。小英可以服务多个不同会话的任务(一、小丽批发经济类书。二、小勇买书),而不需要小英一直为小丽服务,所以也不需要等待小丽在请小英下一个动作前无所事事。这时小英既知道小丽的情况,也知道小勇的情况。对应于ORACLE就是一个服务器进程可以有多个会话(SESSION),多个会话信息需要让一个服务器共享,所以叫共享服务器进程。司机小思帮忙把货搬到船上,他的任务结束,开车回书店。船长小川(服务器进程3)将货运到宁波。司机小宁(服务器进程4)将货运到小丽宁波的公司。小丽这次的批发任务共有四个人帮它完成(为了简化,这里省略了ORACLE调度器参与的角色),这些人都是受静安书店的委托服务于小丽。而每个服务器进程都会在执行完任务后反馈给客户会话信息上图对应于ORACLE就是一个会话可以由多个服务器进程来完成。而在专有服务模式下,那小英要一直为小丽服务,一直到把货运到小丽公司为止,它们建立的会话就结束了,而且进程也随之消亡。在这期间小英要既当营业员、司机、船长,而且这期间小丽要有事情要处理,比如去银行转帐,那么小英只有等待小丽回来才能继续工作,而不能去服务其他顾客,这很显然大量浪费了小英的效率。在ORACLE模式下,专有模式会话进程和服务器进程一一对应,服务器进程要服务到结束,最后一起消亡。 而在共享服务模式下,那小英在卖完书后,即使小丽这个时候去收银台交费,小英也不需要等待她,马上可以去处理新的客户小勇,这样售货员的效率就提高了。即使小丽又要重新需要小英处理问题,如小丽拿了收银凭据,小英就要停下小勇的服务,把小丽的书给她,并输入电脑,再回头处理小勇的工作。在ORACLE模式下,共享模式,用户进程不需要服务器进程处理的的时候,服务器进程可以服务别的用户进程,当原来的用户进程继续请求这个服务器进程时,可以打断后一个用户进程,继续处理前一个用户进程的工作。这里小丽再次找小英时,她们已经彼此认识,已经是朋友了,不需要再重新打交道,重新建立信任关系,节约了之间沟通的成本。那小英知道了小丽的姓名,任务起始时间,结束时间,当前的状态,任务的目的等。也同样知道了小勇相应的信息。这些是会话信息,会话信息对于所有的进程可以共享的。开始备课上节课 我们开始DBA-I的第一节课给大家整体介绍了下Oracle 服务器的体系结构及其主要组件,我们简单回顾下。第一个问题:ORACLE SERVER由什么组成?ORACLE服务由一个实例和一个数据库组成。ORACLE SERVER的概念是,一个ORACLE SERVER就是一个DATABASE 库文件加上一个INSTANCE,按我们图书馆的例子就是上海图书馆的静安书城店提供的就是一个ORACLE SERVER。第二个问题:ORACLE实例(INSTANCE)由什么组成?主内存结构(SGA)+后台进程那RAC的概念是什么?RAC的概念就是多个实例关联一个数据库。ORACLE SERVER = 1个DB + 1个INSTANCEINSTANCE = MEMORY + PROCESSRAC = N个ORACLE SERVER = 1个DB + N个INSTANCE第三个问题:分别简述下SGA,PGA,UGA是什么?第四个问题:我们知道ORACLE的物理结构指的是OS里直接能查看到的文件。那ORACLE DB有哪几种物理文件? Control files Data files Redo log files第五个问题:简单说下专有服务器和共享服务器的区别?专有服务器一个服务器进程专门服务一个用户进程,即使用户进程空闲,服务器进程还是继续等待随时为该会话服务,不能去干其他事情。专有模式会话进程和服务器进程一一对应,服务器进程要服务到结束,最后一起消亡。共享服务器一个服务器进程可以服务多个用户进程,一个用户进程也可以被多个服务器进程服务。共享模式,用户进程不需要服务器进程处理的的时候,服务器进程可以服务别的用户进程,当原来的用户进程继续请求这个服务器进程时,可以打断后一个用户进程,继续处理前一个用户进程的工作。大家结合我们图书馆 小丽买书,售货员小丽,司机小思,船长小川,司机小宁为小丽服务的例子 再理解下。我们上节课讲到,在共享服务模式下,那小英在卖完书后,即使小丽这个时候去收银台交费,小英也不需要等待她,马上可以去处理新的客户小勇,这样售货员的效率就提高了。即使小丽又要重新需要小英处理问题,如小丽拿了收银凭据,小英就要停下小勇的服务,把小丽的书给她,并输入电脑,再回头处理小勇的工作。这是小丽再次找小英时,她们已经彼此认识,已经是朋友了,不需要再重新打交道,重新建立信任关系,节约了之间沟通的成本。那小英知道了小丽的姓名,任务起始时间,结束时间,当前的状态,任务的目的等。也同样知道了小勇相应的信息。这些是会话信息,会话信息对于所有的进程可以共享的。所以这里涉及进程中共享的信息如下:会话信息:这次任务起始时间,结束时间,当前的状态,排序的反馈信息、任务的目的等。CURSOR信息: CURSOR是什么?还有如小丽批发这1000本书的方法等在也是可以让另一个售货员共享的,什么意思呢?就有点类似 管理中的专人负责的特点,你只负责某一件事情,整体类似于流水线的概念。这在ORACLE中通过SQL语句实现,并将执行计划记录下来,我们称共享SQL 区,放在共享池中。但是对于每发送一个语句,在专有模式,相对于服务器进程是私有的,所以我们称私有SQL区,输入进程内存。但是对于共享服务模式,一个会话的信息可以让所有的进程共享,那么属于会话生命周期里,这个私有SQL区可以是共享的,也可以是执行完后隐式关闭。我们后面会学到SESSION CACHE CURSOR。私有SQL区或者称CURSOR,一个SQL就会对应一个CURSOR,在CURSOR关闭时释放。CURSOR(私有SQL 区)这里有两个部分搜索1000本书方法(执行计划)有些称为固定部分,如小丽的姓名(绑定变量),这些信息在整个会话中可以不马上释放你既可以指定我不想要这些信息(一些程序的显式关闭游标),如procdure 中close cursor也可以让它自动去除这些信息(默认的SQL语句执行完就关闭游标),如select * from tab;当前取书已经到第999本了。这些是运行时状态的信息,等SQL语句执行完就释放掉了。注意,每个会话会限制CURSOR数(任务数),如小丽刚才的会话总共有四个服务器进程服务的四个任务。如果每次执行完一个CURSOR(任务)后不马上释放这些CUROSR(任务)信息,那么超过open_cursors数后会抛出open cursor数超出错误,否则会占过多的资源。比如静安店最多服务一个客户的子任务(CURSOR)数是3,比如卖书、司机运货到码头、书通过船运到宁波,而且每个任务做完后登记的信息没有清除,那么小宁要完成第四次子任务时候就不允许。这是因为怕一个大任务中小任务的信息太多造成大量内存使用。(特别是程序的循环操作,循环open cursor一个SQL一千次,不执行close就会发生上述问题)所以对于应用程序代码,要仔细考虑CURSOR的释放机制。而上面的这些CURSOR信息在共享服务模式是共享的,属于 UGA,并存放在SGA中,在有大池的情况下存放在大池。还有一部分内存是完全私有的,比如有些局部变量作为程序的栈空间,还有些私有工作空间,如排序区,HASH JOIN区,位图合并区等,它们是在执行的时候调用全局区的,我们称为CGA(Call Global Area) 调用全局区,执行完就释放。为了减少资源使用,CGA执行完就释放,是运行时状态,别的进程是无法看到的,还有象栈空间调用完就释放的都是私有信息。但是执行结束后如果需要反馈给用户会话的数据,如SELECT的FETCH,则需要保留区的数据提供用户反馈信息,这些信息保存在哪里? 是不是CGA?注意CGA属于PGA。如我们排序区可以设置保留空间,这样这些SQL执行完排序完后,不马上释放给操作系统,而是释放给UGA,最后FETCH反馈给SELECT的用户。CGA属于PGA与其他的全局区不同,CGA(Call Global Area 调用全局区)的存在是瞬间的。它只存在于一个调用过程中。 而UGA可能属于PGA或者SGAPGA是一段包含一个Oracle服务或后台进程的数据和控制信息的内存。PGA的大小依赖与系统的配置。在专用服务(Dedicated Server)模式下,一个服务进程与一个用户进程相关,PGA就包括了堆空间和UGA。而UGA(User Global Area 用户全局区)由用户会话数据、游标状态和索引区组成。在共享服务(MTS)模式下,一个共享服务进程被多个用户进程共享,此时UGA是Shared Pool或Large Pool的一部分(依赖与配置)。此时UGA属于SGAUGA根据连接模式的区别而有所区别大家设想一下,一个CGA的返回要怎么返回给用户?放在UGA里。我们排序区可以设置保留空间,这样这些SQL执行完排序完后,不马上释放给操作系统,而是释放给UGA,最后FETCH反馈给SELECT的用户。而共享服务模式UGA是共享内存,所以保留区排序在没有FETCH前可以使用,但是FETCH后仍然不会保留这段内存,它还是会被释放的。我们将在第1章的后面几节详细讲。这些私有部分,就象售货员的私密信息,都会涉及到实际的数据,如HASH 表,所以其它售货员永远不会知道。否则就象中介公司的业务员互相之间知道了客户的详细信息,还可能存在互相撬客户的情况。但是小丽的情况,售货员小英(服务器进程1)和司机小勇、小宁(服务器进程2,4)和船长小川(服务器进程3)都知道。所以小丽的信息是共享的,所以在共享服务模式,UGA是在SGA里。共享服务模式,也就是进程与会话之间是n:m的关系。在共享模式下,一个进程可以服务多个会话,一个会话可以由多个进程服务。好比一辆的士可以服务多个人,而一个人也可以坐多辆的士。在共享下uga不是pga的子堆,是SGA的子堆,但是uga不会并发,因为单个会话不可能在同时有多个活动进程服务它。uga始终属于会话的,一个会话永远是顺序执行的,所以不会冲突。所以虽然共享但不会有latch的冲突。我们小丽的生命周期是把这货运到码头,然后运到宁波,这个会话才结束,而这期间有售货员进程,司机进程和船长进程可以为其它用户服务。关于共享服务模式,我们会在体系架构(三)用的士的例子来详细举例,另外DBA II的第五章将介绍共享服务器的配置。SGA的构成我们已经了解了什么是SGA,什么是PGA,那我们分别来详细展开这两大组件,来了解这些组件各自的作用,和它的构成。首先我们来学习SGA,一个实例只有一个SGA。我们看到,SGA是由多个功能不同的共享内存组件构成。前面四个子组件是SGA必备组件,在10G,11G会多出流池等。我们这里只说个SGA大概的组成,每个小的组件在之后会详细分析。第一个组件:共享池,用来存放SQL解析树和字典对象定义的共享区域。第二个组件,数据库高速缓存区,用来存放业务数据的共享内存区域。第三个组件,REDO日志缓存区,用来记录数据库的每个改动向量,其中包括系统的改动和UNDO的改动(UNDO其实也是一次REDO)。第四个组件,其它共享资源,如LOCK,ENQUEUE,LATCH,统计数据。除了前3个组件是资源外,锁也是资源前3个组件的共享资源并发冲突可以用LATCH来管理,那LATCH本身也是种资源,还需要专门管理LATCH的LATCH来管理。另外,在9I还有其它2组可选的组件,分别是大池和JAVA池,他们都跟共享池的功能类似,是它的替代品,用来实现某些特殊的请求。比如大池是用于存放对那些复杂的程序包分析、RMAN、UGA、异步IO等相关的数据,而JAVA池是用来存放JAVA存储过程的分析信息。那我们要搭建一个实例该如何规划这个实例的内存呢?就象我们要开一家静安书店,我们需要指定一个开业筹备的方案,设置好各职能部门及所需要的门面。这个筹备方案就是我们以后讲到的初始化参数。实例启动必须先划分内存,店要开业就必须要买下门面,那我们数据库该如何设置内存大小呢?特别是SGA。SGA的设置在9I,ORACLE需要你先划分一个SGA的最大大小限额SGA_MAX_SIZE,用于划出最大多少的内存给ORACLE共享内存使用。该参数只能通过文本参数修改或SPFILE的设置,并在重起后生效。10g实现SGA的自动管理,并设置了sga_target。我们称自动内存管理为ASMM,在11G,可以把PGA和SGA作为一个整体进行自动管理。SGA也会使用到虚拟内存,在有些平台甚至可以固定在物理内存内。我们知道一个进程使用的物理内存,会需要相应大小的虚拟内存,所以要设置合理的虚拟内存大小,以支持系统正常运转。通常情况:如果4G的物理内存,配置4G或者8G虚拟内存就可以。内存分配需要按照颗粒大小来分配。比如颗粒是16M,原来总内存是32M,你把32M改为40M,那实际上会变成32M+16M=48M。所以必须按照步长进行分配内存。如果SGA小于128M,那么步长是4M,否则是16M我们可以用下面的字典来查当前系统的步长V$SGA_DYNAMIC_COMPONENTS我们了解了SGA的分配和SGA主要的几大组件,我们就需要深入了解几大组件的作用及它们间是如何配合的。先看看SGA的几大组件共享池数据缓冲区PGA&UGA处理内存的机制我们还是用前面图书馆的例子来全面了解ORACLE处理这些内存的机制。我们来举个例子,静安书店刚开业,小丽要买某一本书“CBO基础”,而且必须是最新上架的书。因为小丽希望买到的是最新的“CBO基础”,否则估计已经被很多人翻旧了。有一个刚进静安书店的A售货员接到了小丽的服务,她们建立了买卖的会话关系。而且由于书店刚开业,A售货员第一次上班,从来不知道该如何去找这本书,A售货员脑子里不记得该如何去找这个书,那A售货员只能通过有限的知识去获取最快的方法找到这本书。她可以有几种选择:从书架的第1本书开始,按书架的编号顺序找,直到找到第1本“CBO基础”,然后再继续找第2本“CBO基础”,然后按时间排序,直找到书架最后一本书。从店里的前台电脑里有一本书的检索目录,是按书名拼音排序的,用它来快速定位这本书,由于检索目录是按书名排序的,选取出来的书还要按日期排序,然后选出最新的一本“CBO基础”。但是决定哪种选择来获取“CBO基础”,这个工作不是由A售货员来做,A售货员首先会把这个请求交给店里的一个检索员,让他决定这本书小丽有没有权限买让检索员评估哪种方法能更快的拿到“CBO基础”这就类似于SQL的语意分析、语法分析、CBO分析。检索员负责管理检索室,检索室是我们关注的焦点。当确定了检索方法后,这时检索员会把小丽提出的请求和检索的方法做上记录(电脑检索目录),并存放在检索室的柜架上。检索员柜架为按一定的方式来放,尽量让刚检索的或者频繁检索的请求和方法放在最外面,便于以后当检索室满了后不容易被检索员作为侯选T出去。这时检索员告诉A售货员,说你还是在电脑里用检索目录搜索快,这时A售货员会把书名,检索的方法的地址等记下来作为小丽这次请求的会话信息。然后A售货员开始执行,并记录执行的状态信息,比如取到第几本书了,这就是运行时的CURSOR信息到这个会话。执行完后,A售货员把最新的一本“CBO基础”书给小丽。这时小丽可以决定结束这次会话的所有请求,也可以不结束,而去处理别的事情。好,这是我们第1段故事,从这段故事里我们能跟ORACLE关联上哪些知识点呢? 我们前面提到的买某一本书“CBO基础”就是提交了一个SQL语句 检索员是CBO 电脑检索目录是索引 检索员存放检索方式信息按最近最多执行顺序排列,对应就是LRU A售货员服务器进程 小丽是用户进程 检索室是LIBRARY CACHE,是shared_pool_size的一部分,一些语句解析信息 小丽有没有权限买等的信息是语意分析时存放在ROW CACHE里 小丽会话信息里有要买的书名(绑定信息),检索的方法的地址,检索到第几本书等信息。这是私有CURSOR。 检索室的搜索方法,书名等信息是LIBRARY CACHE里的子cursor,就是共享cursor。我们用ORACLE的概念关联到图书馆,我们就可以接着第2、3段故事了解内存是如何运作的。第2段故事这时如果小王要买一本“经济学概论”,也需要最新上架的新书。如果小王被指派给新来的B售货员,那B售货员去找检索员查找检索室里有没有该检索的方法。前面小丽使用过的检索方法正好可以被使用,即使她们买的书名不同,但是书名被绑定了,也就是小王要买一本“书”,而没有用特定的书名提交给检索员。这就是绑定成一个通用的变量名,在ORACLE中是用一个变量代替。这样,检索员完全可以决定用小丽的检索方法给小王共享,因为他们的目的看上去完全一样。(但是这时未必能真的用到小丽的方法,如可能搜索员发现小王的权限跟小丽不一样,书店连卖都不会卖给他)。这时如果可以用小丽的检索方法,B售货员为小王生成会话信息,记录书名“经济学概论”,检索方法的地址等。这里是UGA。然后一样开始执行,我们发现要找到最新的书,是需要基于时间,而时间字段没有索引,所以必须排序,这排序是私有的区域部分,属于PGA,部分属于UGA。我们把排序放到一个临时的房间,我们称排序库。比如排序需要100本书,如果排序的结果不需要反馈,那么排序完就从排序库释放了。但如果排序的结果要反馈给用户,如想显示排在最早出版的20本书是哪几本,则需要在排序库排完后需要保留到另一个房间,我们称为保留排序库,来实现用户的FETCH。我们也可以在每完成20本排序后,先把排序库里这20本移到保留排序库,反馈这20本给小王看,反馈完后从保留排序库清除。然后再从排序库选择下20本书排序从排序库取出,存入排序保留库,反馈给小王查看排序结果,一直这样循环,直到最后排序完100本书,小王有看了这100本书的顺序后,排序库和保留排序库数据都被清除。这个排序库就是SORT_AREA _SIZE,它是属于PGA,而保留排序区属于反馈给用户会话的(小王),它就是SORT_AREA_RETAINED_SIZE,属于UGA部分。这里我们发现B售货员还是去找了检索员。这个小王买书搜索的过程我们叫软解析。第3段故事再看下面的情况,如果在小丽买完“CBO基础”后,到麦当劳吃完饭,想起来还要买最新上架的书“备份与恢复”,而且也要买最新的。在专有模式下,会话没有结束,那A售货员一直要为小丽服务。但这时会发生什么情况呢?A售货员接到小丽第2次请求后,发现她要买最新上架的书“备份与恢复”,这时她脑子里想起来应该怎么去检索这本书了,因为她还尚存了前面为小丽怎么检索“CBO基础”的方法的记忆。所以不需要麻烦检索员了,因为她脑子里还存有前一本书怎么检索的记忆,这个记忆就叫session_cache_cursor。属于这个会话的记忆,如果你设置了session_cache_cursor,那么某个任务提交了3次以上就会把执行计划拷到UGA,而不光是指针。也就是某人买最新上架书如果执行过次一上,那么A售货员会记住前面3次检索员是如何做的。第4次就不需要检索员告诉我了,我自己脑子里已经记得该怎么做了。这大大提高了检索速度,因为检索员很忙,你最好不要麻烦她。私有的对象不会冲突,共享的对象(象检索员)最容易并发冲突。那如果在共享管理模式下更复杂点,小丽可能发现A售货员帮另一个用户处理请求,而C售货员来帮她买最新上架的书“备份与恢复”,这时小丽可以告诉它原来这个检索是怎么做的,而不需要C售货员去找检索员的麻烦。不检查检索员,直接使用会话私有CURSOR信息去执行,我们在ORACLE称为软软解析(soft soft parse)。好,这些内容虽然超出了书本内容,如果对这个过程还是不能理解,通过后面的学习,会加深印象。那结合我们这3段故事,我们来看这几个主要的共享内存区域。共享池图例 1共享池是用来存放最近常使用的SQL语句的解析信息和最近常使用的对象定义。解析信息就是检索室里的检索方法,我们由library cache来存放该用户请求的对象权限、表、索引、用户名等字典信息,并在语意分析阶段进行判断,这些信息是存放在data dictionary cache。整个共享池由shared_pool_size来规定大小,并可以动态修改。可以用alter system set命令来实现,在10g可以实现动态管理。第一章ORACLE体系结构(二)完

    注意事项

    本文(DBA-I 第一章 ORACLE体系结构(二).docx)为本站会员(飞****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开