ImageVerifierCode 换一换
格式:DOCX , 页数:55 ,大小:139.35KB ,
资源ID:8507161      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8507161.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ORACLE学习资料精品docx.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ORACLE学习资料精品docx.docx

1、ORACLE学习资料精品docx第一章数据库启动 2第二章表空间 18第三章表 25第四章索引 32第五章备份与恢复 33第六章数据库优化 40第七章PL/SQL语言 44RedHat Linux AS4 安装 ORACLE 10g 46第一章数据库启动ORACLE的运行机制我们从一个用户请求开始讲,ORACLE的完整的工作机制是怎样的,首先一个用户进程发出一 个连接请求,如果使用的是主机命名或者是本地服务命中的主机名使用的是机器名(非IP地 址),那么这个请求都会通过DNS服务器或HOST文件的服务名解析然后传送到ORACLE监听 进程,监听进程接收到用户请求后会采取两种方式来处理这个用户请

2、求,下面我们分专用服 务器和共享服务器分别采用这两种方式时的情况来讲:专用服务器模式下:一种方式是监听进程接收到用户进程请求后,产生一个新的专用服务器 进程,并且将对用户进程的所有控制信息传给此服务器进程,也就是说新建的服务器进程继 承了监听进程的信息,然后服务器进程给用户进程发一个RESEND包,通知用户进程可以开 始给它发信息了,用户进程给这个新建的服务器进程发一个CONNECT包,服务器进程再以A CCEPT包回应用户进程,致此,用户进程正式与服务器进程确定连接。我们把这种连接叫做 HAND-OFF连接,也叫转换连接。另一种方式是监听进程接收到用户进程的请求后产生一个 新的专用服务器进程

3、,这个服务器进程选用一个TCP/IP端口来控制与用户进程的交互,然 后将此信息回传给监听进程,监听进程再将此信息传给用户进程,用户进程使用这个端口给 服务器进程发送一个CONNECT包,服务器进程再给用户进程发送一个ACCEPT包,致此,用 户进程可以正式向服务器进程发送信息了。这种方式我们叫做重定向连接。HAND-OFF连接 需要系统平台具有进程继承的能力,为了使WINDOWS NT/2000支持HAND-OFF必须在HKEY_L OCAL_MACHINESOFTWAREORACLEHOMEX 中设置 USE_SHARED_SOCKET共享服务器模式下:只有重定向连接的方式,工作方式是监听进

4、程接收到用户进程的请求后 产生一个新的调度进程,这个调度进程选用一个TCP/IP端口来控制与用户进程的交互,然 后将此信息回传给监听进程,监听进程再将此信息传给用户进程,用户进程使用这个端口给 调度进程发送一个CONNECT包,调度进程再给用户进程发送一个ACCEPT包,致此,用户进 程可以正式向调度进程发送信息了。可以通过设置MAX_DISPIATCHERS这个参数来确定调度 进程的最大数目,如果调度进程的个数已经达到了最大,或者已有的调度进程不是满负荷, 监听进程将不再创建新的调度进程,而是让其中一个调度进程选用一个TCP/IP端口来与此 用户进程交互。调度进程每接收一个用户进程请求都会在

5、监听进程处作一个登记,以便监听 进程能够均衡每个调度进程的负荷,所有的用户进程请求将分别在有限的调度进程中排队, 所有调度进程再顺序的把各自队列中的部分用户进程请求放入同一个请求队列,等候多个0 RACLE的共享服务器进程进行处理(可以通过SHARED_SERVERS参数设置共享服务器进程的 个数),也就是说所有的调度进程共享同一个请求队列,共享服务器模式下一个实例只有一 个请求队列,共享服务器进程处理完用户进程的请求后将根据用户进程请求取自不同的调度 进程将返回结果放入不同的响应队列,也就是说有多少调度进程就有多少响应队列,然后各 个调度进程从各自的响应队列中将结果取出再返回给用户进程。以上

6、我们讲完了用户与ORACLE的连接方式,下面我们要讲ORACLE服务器进程如可处理用户 进程的请求,当一个用户进程发出了一条SQL语名:UPDATE TABBLEA SET SALARY=SALARY* 2;首先,服务器进程把这条语句的字符转换成ASCII等效数字码,接着这个ASCII码被传 递给一个HASH函数,并返回一个HASH值,服务器进程将到SHARED POOL的共享PL/SQL区 去查找是否存在同样的HASH值,如果存在,服务器进程将使用这条语句已高速缓存在SHAR ED POOL中的已分析过的版本来执行,如果不存在,服务器进程将对该语句进行语法分析, 首先检查该语句的语法的正确性

7、,接着对语句中涉及的表、索引、视图等对象进行解析,并 对照数据字典检查这些对象的名称以及相关结构,并根据ORACLE选用的优化模式以及数据 字典中是否存在相应对象的统计数据和是否使用了存储大纲来生成一个执行计划或从存储 大纲中选用一个执行计划,然后再用数据字典核对此用户对相应对象的执行权限,最后生成 一个编译代码。ORACLE将这条语名的本身实际文本、HASH值、编译代码、与此语名相关联 的任何统计数据和该语句的执行计划缓存在SHARED POOL的共享PL/SQL区。服务器进程通 过SHARED POOL锁存器来申请可以向哪些共享PL/SQL区中缓存这此内容,也就是说被SHA RED POO

8、L锁存器锁定的PL/SQL区中的块不可被覆盖,因为这些块可能被其它进程所使用。 在SQL分析阶段将用到LIBRARY CACHE,从数据字典中核对表、视图等结构的时候,需要将 数据字典从磁盘读入LIBRARY CACHE,因此,在读入之前也要使用LIBRARY CACHE锁存器来 申请用于缓存数据字典。生成编译代码之后,接着下一步服务器进程要准备开始更新数据,服务器进程将到DB BUFF ER中查找是否有相关对象的缓存数据,下面分两个可能进行解释:如果没有,服务器进程将在表头部请求一些行锁,如果成功加锁,服务器进程将从数据文件 中读这些行所在的数据块放入DB BUFFER中空闲的区域或者覆盖已

9、被挤出LRU列表的非脏数 据块缓冲区,并且排列在LRU列表的头部,如果这些非脏数据缓冲区写完也不能满足新数据 的请求时,会立即触发DBWN进程将脏数据列表中指向的缓冲块写入数据文件,并旦清洗掉 这些缓冲区,来腾出空间缓冲新读入的数据,也就是在放入DB BUFFER之前也是要先申请D B BUFFER中的锁存器,成功锁定后,再写入DB BUFFER,然后服务器程将该语句影响的被读 入DB BUFFER块中的这些行的ROWID及将要更新的原值和新值及SCN等信息逐条的写入RED 0 LOG BUFFER,在写入REDO LOG BUFFER之前也是先请求REDO LOG BUFFER块的锁存器,成

10、 功锁定之后才开始写入,当写入达到REDO LOG BUFFER大小的三分之一或写入量达到1M或 超过二秒后或发生检查点时或者DBWN之前发生,LGWR将把REDO LOG BUFFER中的数据写入 磁盘上的重做日志文件,已被写入重做日志文件的REDO LOG BUFFER中的块上的锁存器被释 放,并可被后来写入的信息所覆盖,REDO LOG BUFFER以循环的方式工作。当一个重做H志 文件写满后,LGWR将切换到下一个重做|志文件,如果是归档模式,归档进程还将前一个 写满的重做I I志进程写入归档H志文件,重做I I志文件也是循环工作方式。写完所有的RED 0 LOG BUFFER之后,服

11、务器进程开始改写这个DB BUFFER块头部的事务列表并写入SCN,然 后COPY包含这个块的头部事务列表及SCN信息的数据副本放入回滚段中,我们将回滚段中 的副本称为数据块的“前映像”。(回滚段可以存储在专门的回滚表空间中,这个表空间由一 个或多个物理文件组成,并专用于回滚表空间,回滚段也可在其它表空间中的数据文件中开 辟。)然后改写这个DB BUFFER块的数据,并在其头部写入对应的回滚段地址,如果对一行 数据多次UPDATE而不COMMIT则在回滚段中将会有多个“前映像”,除第一个“前映像”含 有SCN信息外,其它的每个“前映像”的头部还含有SCN信息和“前前映像”的回滚段地址。 一次U

12、PDATE操作只对应一个SCNo然后服务器进程在脏数据列表中建立一条指向此缓冲块 的指针。接着服务器进程会从数据文件读入第二个块重复以上读入,记日志,建立回滚段, 修改,放入脏列表的动作,当脏数据列表达到一定长度时,DBWN进程将脏数据列表中指向 的缓冲块全部写入数据文件,也就是释放加在这些DB BUFER块上的锁存器。其实ORACLE 可以一次从数据文件中读入几个块放入DB BUFFER,可以通过参数DB FILE MULTIBLOCK READ_COUNT来设置一次读入的块的个数。如果要查找的数据已缓存,则根据用户的SQL操作类型决定如何操作,如果是SELECT则查 看DB BUFFER块

13、的头部是否有事务,如果有,将从回滚段读取,如果没有则比较SELECT的 SCN与DB BUFFER块头部的SCN如果比自己大,仍然从回滚段读取,如果比自己小则认这是 一个非脏缓存,可以直接从这个DB BUFFER块中读取。如果是UPDATE则即使在DB BUFFER 中找到一个没有事务,而且SCN比自己小的非脏缓存数据块,服务器进程仍然要到表的头部 对这条记录申请加锁,加锁成功则进行后续动作,如果不成功,则要等待前面的进程解锁后 才能进行动作。只有当SQL语句影响的所有行所在的最后一个块被读入DB BUFFER并且重做信息被写入RED 0 LOG BUFFER (仅是指重做日志缓冲,而非重做日

14、志文件)之后,用户才可以发出COMMIT, COMMIT触发LGRW,但并不强制立即DBWN来释放所有相应的DB BUFFER块上的锁,也就是说 有可能出现已COMMIT,但在随后的一段时间内DBWN还在写这条语句涉及的数据块的情形, 表头部的行锁,并不是在COMMIT -发出就马上释放,实际上要等到相应的DBWN进程结束才 会释放。一个用户请求锁定另一个用户已COMMIT的资源不成功的机会是存在的,从COMMIT 到DBWN进程结束之间的时间很短,如果恰巧在这个时间断电,由于COMMIT已触发LGWR进 程,所以这些未来得及写入数据文件的改变会在实例重启后由SMON进程根据重做日志文件 来前

15、滚。如果未COMMIT就断电,由于DBWN之前触发LGWR,所有DBWN在数据文件上的修改 都会被先一步记入重做日志文件,实例重启后,SMON进程再根据重做日志文件来回滚。如果用户ROOLBACK,则服务器进程会根据数据文件块和DB BUFFER中块的头部的事务列表 和SCN以及回滚段地址找到回滚段中相应的修改前的副本,并且用这些原值来还原当前数据 文件中已修改但未提交的改变。如果有多个“前映像”,服务器进程会在一个“前映像”的 头部找到“前前映像”的回滚段地址,一直找到同一事务下的最早的一个“前映像”为止。 一旦发出了 COMMIT,用户就不能ROOLBACK,这使得COMMIT后DBWN进

16、程还没有全部完成的 后续动作得到了保障。下面我们要提到检查点的作用,当一个全部检查点发生的时候,首先让LGWR进程将REDO L OG BUFFER中的所有缓冲(包含未提交的重做信息)写入重做H志文件,然后让DBWN进程 将DB BUFFER中所有已提交的缓冲写入数据文件(不强制写未提交的)。然后更新控制文件 和数据文件头部的SCN,表明当前数据库是一致的,如果在发生检点之前断电,并且当时有 一个未提交的改变正在进行,实例重启之后,SMON进程将从上一个检查点开始核对这个检 查点之后记录在重做日志文件中已提交的和未提交改变,因为DBWN之前会触发LGWR,所以 DBWN对数据文件的修改一定会被

17、先记录在重做日志文件中。因此,断电前被DBWN写进数据 文件的改变将通过重做H志文件中的记录进行还原,叫做回滚,如果断电时有一个已提交, 但DBWN动作还没有完全完成的改变存在,因为已经提交,提交会触发LGWR进程,所以不管 DBWN动作是否已完成,该语句将要影响的行及其产生的结果一定已经记录在重做日志文件 中了,则实例重启后,SMON进程根据重做日志文件进行前滚。由此可见,实例失败后用于 恢复的时间由两个检查点之间的间隔大小来决定,我们可以通个四个参数设置检查点执行的 频率,LOG_CHECKPOINT_IMTERVAL决定了两个检查点之间写入重做I I志文件的系统物理块的 大小,LOG_C

18、HECKPOINT_TIMEOUT决定了两个检查点之间的时间长度,FAST_START_IO_TARGE T决定了用于恢复时需要处理的块的大小,FAST_START_MTTR_TARGET直接决定了用于恢复的 时间的长短。SMON进程执行的前滚和回滚与用户的回滚是不同的,SMON是根据重做H志文 件进行前滚或回滚,而用户的回滚一定是根据回滚段的内容进行回滚的。在这里我们要说一 下回滚段存储的数据,假如是delete操作,则回滚段将会记录整个行的数据,假如是upda te,则回滚段只记录被修改了的字段的变化前的数据(前映像),也就是没有被修改的字段是 不会被记录的,假如是insert,则回滚段只

19、记录插入记录的rowido这样假如事务提交,那 回滚段中简单标记该事务已经提交;假如是回退,则如果操作是是delete,回退的时候把回 滚段中数据重新写回数据块,操作如果是update,则把变化前数据修改回去,操作如果是i nsert,则根据记录的rowid把该记录删除。下面我们要讲DBWN如何来写数据文件,在写数据文件前首先要找到可写的空闲数据块,OR ACLE中空闲数据块可以通过FREELIST或BITMAP来维护,它们位于一个段的头部用来标识 当前段中哪些数据块可以进行INSERT在本地管理表空间中ORACLE自动管理分配给段的区 的大小,区的分配信息存储在组成表空间的数据文件的头部,而

20、数据字典管理的表空间用户 可以在创建时决定区的大小,并且区的分配信息是存储在数据字典中的,只在本地管理的表 空间中才能选用段自动管理,采用自动段空间管理的本地管理表空间中的段中的空闲数据块 的信息就存放在段的头部并且使用位图来管理,采用手动管理的本地管理表空间中的段和数 据字典管理的表空间中的段中的空闲数据块的管理都使用位于段头部的空闲列表来管理,空 闲列表的工作方式:首先一个空的数据块被加入空闲列表,当其中空闲空间小于PCTFREE 设置的值之后,这个块从空闲列表删除,当这个块中的内容降至PCTUSED设置的值之下后, 这个数据块被再次加入空闲列表,位于空闲列表中的数据块都是可以向其中INS

21、ERT的块, 当一个块移出了空闲列表,但只要其中还有保留空间就可以进行UPDATE,当对其中一行UP DATE 一个大数据时,如果当前块不能完全放下整个行,只会把整个行迁移到一个新的数据 块,并在原块位置留下一个指向新块的指针,这叫行迁移。如果一个数据块可以INSERT, 当插入一个当前块装不下的行时,这个行会溢出到两个或两个几上的块中,这叫行链接。如 果用户的动作是INSERT则服务器进程会先锁定FREELIST,然后找到空闲块的地址,再释放 FREELIST,当多个服务器进程同时想要锁定FREELIST时即发生FREELIST的争用,可以在非 采用自动段空间管理的表空间中创建表时指定FRE

22、ELIST的个数,默认为1,如果是在采用 自动段空间管理的表空间中创建表,即使指定了 FREELIST也会被忽略,因为此时将使用BI TMAP而不是FREELIST来管理段中的空闲空间。如果用户动作是UPDATE服务器进程将不会 使用到FREELIST和BITMAP,因为不要去寻找一个空闲块,而使用锁的队列。下面来讲一下ORACLE锁的机制,ORACLE分锁存器和锁两种。锁存器是用来保护对内存结构 的访问,比如对DB BUFFER中块的锁存器申请,只有在DBWN完成后,这些DB BUFFER块被 解锁。然后用于其它的申请。锁存器不可以在进程间共享,锁存器的申请要么成功要么失败, 没有锁存器申请

23、队列。主要的锁存器有SHARED POOL锁存器,LIBRARY CACHE锁存器,CACH E BUFFERS LRU CHAIN 锁存器,CACHE BUFFERS CHAINS 锁存器,REDO ALLOCATION 锁存器, REDO COPY锁存器。ORACLE的锁是用来保护数据访问的,锁的限制比锁存器要更宽松,比 如,多个用户在修改同一表的不同行时,可以共享一个表上的一个锁,锁的申请可以按照被 申请的顺序来排队等候,然后依次应用,这种排队机制叫做队列(ENPUEUE),如果两个服务 器进程试图对同一表的同一行进行加锁,则都进入锁的申请队列,先进的加锁成功,后面的 进程要等待,直到前

24、一个进程解锁才可以加锁,这叫做锁的争用,而且一旦加锁成功,这个 锁将一直保持到用户发出COMMIT或ROOLBACK命令为止。如果两个用户锁定各自的一行并请 求对方锁定的行的时候将发生无限期等待即死锁,死锁的发生都是由于锁的争用而不是锁存 器的争用引起的,ORACLE在遇到死锁时,自动释放其中一个用户的锁并回滚此用户的改变。 正常情况下发生锁的争用时,数据的最终保存结果山SCN来决定哪个进程的更改被最终保 存。两个用户的服务器进程在申请同一表的多个行的锁的时候是可以交错进入锁的申请队列 的。只有其中发生争用才会进行等待。创建表时指定的MAXTRANS参数决了,表中的一个数 据块最多可以被几个事

25、务同时锁定。CMD乱码在CMD中用CHCP 936 (简体中文)和CHCP 950 (繁体中文)设置。启动监听程序 在CMD中输入:Lsnrctl start , Isnrctl status可以查看监听程序的状态。查看当前数据库的SIDselect instance_name, host_name from v$instance;怎么查看数据库版本可 select * from v$version包含版本信息,核心版本信息,位数信息(32位或64位)等至于位数信息,在1 inux/unix平台上,可以通过file查看,如 file $0RACLE_H0ME/bin/orac1e解决ORA-1

26、2560: TNS:协议适配器错误造成0RA-12560: TNS:协议适配器错误的问题的原因有三个:监听服务没有起起来。windows平台个一如下操作:开始 程序 管理工具 服务,打开服务面板,启动oraclehome92TNSlistener服务。database instance没有起起来。windows平台如下操作:开始 程序管理工具 服务,打开服务面板,启动oracleserviceXXXX, XXXX就是你的database SID. 注册表问题。regedit,然后进入 HKEY_LOCAL_MACHINESOFTWAREORACLEHOMEO 将该环 境变量ORACLE_SID

27、设置为XXXX, XXXX就是你的database SID.或者右几我的电脑,属性一 高级一环境变量-一系统变量一新建,变量名=oracle_sid,变量值=XXXX, XXXX就是你的dat abase SID.或者进入 sqlplus 前,在 command line 下输 set orac 1 e_sid=XXXX, XXXX 就是你 的 database SID.经过以上步骤,就可以解决问题。解决 ORA-01034一般是$0RACLE_H0ME或者ORACLE_SID没有设置正确。如何解决 0raclel0gR2 的 ORA-06512 OLAP 错误在OraclelOgR2 10.

28、 2. 0. 1的Dataguard备用库启动后报错,对应的跟踪文件中,输出的具 体信息:Error in executing triggers on database startup* 2007-08-09 11:22:15. 869ksedmp: internal or fatal error0RA-00604: error occurred at recursive SQL level 1ORA-12663: Services required by client not available on the serverORA-36961: Oracle OLAP is not avail

29、able.ORA-06512: at SYS. OLAPIHISTORYRETENTION,line 1ORA-06512: at line 15提示显示,在数据库启动过程中,执行了一个和OLAP有关的Trigger,出现了错误。检查数据库,得到以下两个相关Trigger:SQL select trigger_name, status fromdba_triggers where trigger_name like %OLAP%;TRIGGER_NAME STATUSOLAPISTARTUPTRIGGER ENABLEDOLAPISHUTDOWNTRIGGER ENABLED我们可以通过禁用这

30、两个Trigger,以此防止OLAP在数据库启动和关闭时的检验,这样就 可以屏蔽这个错误信息。Metal ink上有几个Bug和这个错误相关,Bug号4630695是其中之 一,目前,这个Bug在Oraclellg中已经得到更正。ORA-04031: unable to allocate 4096 bytes of shared memoryORA-04031出现的问题有以下几个可能性:1.没有绑定编量造成shared_pool碎片过多,同时shared_pool_size太小(1)这个情况是比较常见的。(2)第二种情况通常会建议使用绑定变量,或者用简单的加大shared_pool,临时的解决

31、 方法就是 alter system flush shared poolo2.Large_pool, Java pool 太小造成的(1)这个通过错误信息的提示很容易判断(0ra-04031 cannot allocate . memeory in 1 arge_pool)(2)解决方法就是简单的加大Large_pool or Java_pool3.过度的开CURSOR而不关闭。目前,此问题发生的越来越多,特别是在JAVA的运行环境中,屡见不鲜。加大Shared_poo1或者flush shared_pool往往只能延迟问题出现的时间,而无法避免此问题。判断方法:select count (*

32、) from v$open_cursor ;select * from v$sysstatwhere name = opened cursors current,;假如出来的值特大(以万为单位)时,基本就可以确定是这个原因了。 解决这个问题的方法就是检查程序,看是否没有正常的关闭Cursor(对于JAVA来说,就是 没有关闭 Statement) o 或者 select sql_text from v$open_cursor,看看都是哪些 cursor 没关闭,再去检查车程序。也有的程序使用了保持一定量的cursor 一直open,从而避免cursor过多次的开启,来提高 性能。对于这种情况,则应该选择适当的shared_pool_size和控制keep_opening的curso r的量。另外,Oracle参数session_cached_cursors也有可能过大,解决的方法就是把它降低到适 当的值。Linux 下启动OEM$ORACLE_HOME/bin/emctl start dbconsle更改数据库的归档模式SQLstartup mountSQLalter database archi

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1