ORACLEDBA日常笔记Word下载.docx
- 文档编号:17861670
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:60
- 大小:94.63KB
ORACLEDBA日常笔记Word下载.docx
《ORACLEDBA日常笔记Word下载.docx》由会员分享,可在线阅读,更多相关《ORACLEDBA日常笔记Word下载.docx(60页珍藏版)》请在冰豆网上搜索。
我们把这种连接叫做HAND-OFF连接,也叫转换连接。
另一种方式是监听进程接收到用户进程的请求后产生一个新的专用服务器进程,这个服务器进程选用一个TCP/IP端口来控制与用户进程的交互,然后将此信息回传给监听进程,监听进程再将此信息传给用户进程,用户进程使用这个端口给服务器进程发送一个CONNECT包,服务器进程再给用户进程发送一个ACCEPT包,致此,用户进程可以正式向服务器进程发送信息了。
这种方式我们叫做重定向连接。
HAND-OFF连接需要系统平台具有进程继承的能力,为了使WINDOWSNT/2000支持HAND-OFF必须在HKEY_LOCAL_MACHINE>
SOFTWARE>
ORACLE>
HOMEX中设置USE_SHARED_SOCKET。
共享服务器模式下:
只有重定向连接的方式,工作方式是监听进程接收到用户进程的请求后产生一个新的调度进程,这个调度进程选用一个TCP/IP端口来控制与用户进程的交互,然后将此信息回传给监听进程,监听进程再将此信息传给用户进程,用户进程使用这个端口给调度进程发送一个CONNECT包,调度进程再给用户进程发送一个ACCEPT包,致此,用户进程可以正式向调度进程发送信息了。
可以通过设置MAX_DISPIATCHERS这个参数来确定调度进程的最大数目,如果调度进程的个数已经达到了最大,或者已有的调度进程不是满负荷,监听进程将不再创建新的调度进程,而是让其中一个调度进程选用一个TCP/IP端口来与此用户进程交互。
调度进程每接收一个用户进程请求都会在监听进程处作一个登记,以便监听进程能够均衡每个调度进程的负荷,所有的用户进程请求将分别在有限的调度进程中排队,所有调度进程再顺序的把各自队列中的部分用户进程请求放入同一个请求队列,等候多个ORACLE的共享服务器进程进行处理(可以通过SHARED_SERVERS参数设置共享服务器进程的个数),也就是说所有的调度进程共享同一个请求队列,共享服务器模式下一个实例只有一个请求队列,共享服务器进程处理完用户进程的请求后将根据用户进程请求取自不同的调度进程将返回结果放入不同的响应队列,也就是说有多少调度进程就有多少响应队列,然后各个调度进程从各自的响应队列中将结果取出再返回给用户进程。
以上我们讲完了用户与ORACLE的连接方式,下面我们要讲ORACLE服务器进程如可处理用户进程的请求,当一个用户进程发出了一条SQL语名:
UPDATETABBLEASETSALARY=SALARY*2;
首先,服务器进程把这条语句的字符转换成ASCII等效数字码,接着这个ASCII码被传递给一个HASH函数,并返回一个HASH值,服务器进程将到SHAREDPOOL的共享PL/SQL区去查找是否存在同样的HASH值,如果存在,服务器进程将使用这条语句已高速缓存在SHAREDPOOL中的已分析过的版本来执行,如果不存在,服务器进程将对该语句进行语法分析,首先检查该语句的语法的正确性,接着对语句中涉及的表、索引、视图等对象进行解析,并对照数据字典检查这些对象的名称以及相关结构,并根据ORACLE选用的优化模式以及数据字典中是否存在相应对象的统计数据和是否使用了存储大纲来生成一个执行计划或从存储大纲中选用一个执行计划,然后再用数据字典核对此用户对相应对象的执行权限,最后生成一个编译代码。
ORACLE将这条语名的本身实际文本、HASH值、编译代码、与此语名相关联的任何统计数据和该语句的执行计划缓存在SHAREDPOOL的共享PL/SQL区。
服务器进程通过SHAREDPOOL锁存器来申请可以向哪些共享PL/SQL区中缓存这此内容,也就是说被SHAREDPOOL锁存器锁定的PL/SQL区中的块不可被覆盖,因为这些块可能被其它进程所使用。
在SQL分析阶段将用到LIBRARYCACHE,从数据字典中核对表、视图等结构的时候,需要将数据字典从磁盘读入LIBRARYCACHE,因此,在读入之前也要使用LIBRARYCACHE锁存器来申请用于缓存数据字典。
生成编译代码之后,接着下一步服务器进程要准备开始更新数据,服务器进程将到DBBUFFER中查找是否有相关对象的缓存数据,下面分两个可能进行解释:
如果没有,服务器进程将在表头部请求一些行锁,如果成功加锁,服务器进程将从数据文件中读这些行所在的数据块放入DBBUFFER中空闲的区域或者覆盖已被挤出LRU列表的非脏数据块缓冲区,并且排列在LRU列表的头部,如果这些非脏数据缓冲区写完也不能满足新数据的请求时,会立即触发DBWN进程将脏数据列表中指向的缓冲块写入数据文件,并且清洗掉这些缓冲区,来腾出空间缓冲新读入的数据,也就是在放入DBBUFFER之前也是要先申请DBBUFFER中的锁存器,成功锁定后,再写入DBBUFFER,然后服务器程将该语句影响的被读入DBBUFFER块中的这些行的ROWID及将要更新的原值和新值及SCN等信息逐条的写入REDOLOGBUFFER,在写入REDOLOGBUFFER之前也是先请求REDOLOGBUFFER块的锁存器,成功锁定之后才开始写入,当写入达到REDOLOGBUFFER大小的三分之一或写入量达到1M或超过三秒后或发生检查点时或者DBWN之前发生,LGWR将把REDOLOGBUFFER中的数据写入磁盘上的重做日志文件,已被写入重做日志文件的REDOLOGBUFFER中的块上的锁存器被释放,并可被后来写入的信息所覆盖,REDOLOGBUFFER以循环的方式工作。
当一个重做日志文件写满后,LGWR将切换到下一个重做日志文件,如果是归档模式,归档进程还将前一个写满的重做日志进程写入归档日志文件,重做日志文件也是循环工作方式。
写完所有的REDOLOGBUFFER之后,服务器进程开始改写这个DBBUFFER块头部的事务列表并写入SCN,然后COPY包含这个块的头部事务列表及SCN信息的数据副本放入回滚段中,我们将回滚段中的副本称为数据块的“前映像”。
(回滚段可以存储在专门的回滚表空间中,这个表空间由一个或多个物理文件组成,并专用于回滚表空间,回滚段也可在其它表空间中的数据文件中开辟。
)然后改写这个DBBUFFER块的数据,并在其头部写入对应的回滚段地址,如果对一行数据多次UPDATE而不COMMIT则在回滚段中将会有多个“前映像”,除第一个“前映像”含有SCN信息外,其它的每个“前映像”的头部还含有SCN信息和“前前映像”的回滚段地址。
一次UPDATE操作只对应一个SCN。
然后服务器进程在脏数据列表中建立一条指向此缓冲块的指针。
接着服务器进程会从数据文件读入第二个块重复以上读入,记日志,建立回滚段,修改,放入脏列表的动作,当脏数据列表达到一定长度时,DBWN进程将脏数据列表中指向的缓冲块全部写入数据文件,也就是释放加在这些DBBUFER块上的锁存器。
其实ORACLE可以一次从数据文件中读入几个块放入DBBUFFER,可以通过参数DB_FILE_MULTIBLOCK_READ_COUNT来设置一次读入的块的个数。
如果要查找的数据已缓存,则根据用户的SQL操作类型决定如何操作,如果是SELECT则查看DBBUFFER块的头部是否有事务,如果有,将从回滚段读取,如果没有则比较SELECT的SCN与DBBUFFER块头部的SCN如果比自己大,仍然从回滚段读取,如果比自己小则认这是一个非脏缓存,可以直接从这个DBBUFFER块中读取。
如果是UPDATE则即使在DBBUFFER中找到一个没有事务,而且SCN比自己小的非脏缓存数据块,服务器进程仍然要到表的头部对这条记录申请加锁,加锁成功则进行后续动作,如果不成功,则要等待前面的进程解锁后才能进行动作。
只有当SQL语句影响的所有行所在的最后一个块被读入DBBUFFER并且重做信息被写入REDOLOGBUFFER(仅是指重做日志缓冲,而非重做日志文件)之后,用户才可以发出COMMIT,COMMIT触发LGRW,但并不强制立即DBWN来释放所有相应的DBBUFFER块上的锁,也就是说有可能出现已COMMIT,但在随后的一段时间内DBWN还在写这条语句涉及的数据块的情形,表头部的行锁,并不是在COMMIT一发出就马上释放,实际上要等到相应的DBWN进程结束才会释放。
一个用户请求锁定另一个用户已COMMIT的资源不成功的机会是存在的,从COMMIT到DBWN进程结束之间的时间很短,如果恰巧在这个时间断电,由于COMMIT已触发LGWR进程,所以这些未来得及写入数据文件的改变会在实例重启后由SMON进程根据重做日志文件来前滚。
如果未COMMIT就断电,由于DBWN之前触发LGWR,所有DBWN在数据文件上的修改都会被先一步记入重做日志文件,实例重启后,SMON进程再根据重做日志文件来回滚。
如果用户ROOLBACK,则服务器进程会根据数据文件块和DBBUFFER中块的头部的事务列表和SCN以及回滚段地址找到回滚段中相应的修改前的副本,并且用这些原值来还原当前数据文件中已修改但未提交的改变。
如果有多个“前映像”,服务器进程会在一个“前映像”的头部找到“前前映像”的回滚段地址,一直找到同一事务下的最早的一个“前映像”为止。
一旦发出了COMMIT,用户就不能ROOLBACK,这使得COMMIT后DBWN进程还没有全部完成的后续动作得到了保障。
下面我们要提到检查点的作用,当一个全部检查点发生的时候,首先让LGWR进程将REDOLOGBUFFER中的所有缓冲(包含未提交的重做信息)写入重做日志文件,然后让DBWN进程将DBBUFFER中所有已提交的缓冲写入数据文件(不强制写未提交的)。
然后更新控制文件和数据文件头部的SCN,表明当前数据库是一致的,如果在发生检点之前断电,并且当时有一个未提交的改变正在进行,实例重启之后,SMON进程将从上一个检查点开始核对这个检查点之后记录在重做日志文件中已提交的和未提交改变,因为DBWN之前会触发LGWR,所以DBWN对数据文件的修改一定会被先记录在重做日志文件中。
因此,断电前被DBWN写进数据文件的改变将通过重做日志文件中的记录进行还原,叫做回滚,如果断电时有一个已提交,但DBWN动作还没有完全完成的改变存在,因为已经提交,提交会触发LGWR进程,所以不管DBWN动作是否已完成,该语句将要影响的行及其产生的结果一定已经记录在重做日志文件中了,则实例重启后,SMON进程根据重做日志文件进行前滚。
由此可见,实例失败后用于恢复的时间由两个检查点之间的间隔大小来决定,我们可以通个四个参数设置检查点执行的频率,LOG_CHECKPOINT_IMTERVAL决定了两个检查点之间写入重做日志文件的系统物理块的大小,LOG_CHECKPOINT_TIMEOUT决定了两个检查点之间的时间长度,FAST_START_IO_TARGET决定了用于恢复时需要处理的块的大小,FAST_START_MTTR_TARGET直接决定了用于恢复的时间的长短。
SMON进程执行的前滚和回滚与用户的回滚是不同的,SMON是根据重做日志文件进行前滚或回滚,而用户的回滚一定是根据回滚段的内容进行回滚的。
在这里我们要说一下回滚段存储的数据,假如是delete操作,则回滚段将会记录整个行的数据,假如是update,则回滚段只记录被修改了的字段的变化前的数据(前映像),也就是没有被修改的字段是不会被记录的,假如是insert,则回滚段只记录插入记录的rowid。
这样假如事务提交,那回滚段中简单标记该事务已经提交;
假如是回退,则如果操作是是delete,回退的时候把回滚段中数据重新写回数据块,操作如果是update,则把变化前数据修改回去,操作如果是insert,则根据记录的rowid把该记录删除。
下面我们要讲DBWN如何来写数据文件,在写数据文件前首先要找到可写的空闲数据块,ORACLE中空闲数据块可以通过FREELIST或BITMAP来维护,它们位于一个段的头部用来标识当前段中哪些数据块可以进行INSERT。
在本地管理表空间中ORACLE自动管理分配给段的区的大小,区的分配信息存储在组成表空间的数据文件的头部,而数据字典管理的表空间用户可以在创建时决定区的大小,并且区的分配信息是存储在数据字典中的,只在本地管理的表空间中才能选用段自动管理,采用自动段空间管理的本地管理表空间中的段中的空闲数据块的信息就存放在段的头部并且使用位图来管理,采用手动管理的本地管理表空间中的段和数据字典管理的表空间中的段中的空闲数据块的管理都使用位于段头部的空闲列表来管理,空闲列表的工作方式:
首先一个空的数据块被加入空闲列表,当其中空闲空间小于PCTFREE设置的值之后,这个块从空闲列表删除,当这个块中的内容降至PCTUSED设置的值之下后,这个数据块被再次加入空闲列表,位于空闲列表中的数据块都是可以向其中INSERT的块,当一个块移出了空闲列表,但只要其中还有保留空间就可以进行UPDATE,当对其中一行UPDATE一个大数据时,如果当前块不能完全放下整个行,只会把整个行迁移到一个新的数据块,并在原块位置留下一个指向新块的指针,这叫行迁移。
如果一个数据块可以INSERT,当插入一个当前块装不下的行时,这个行会溢出到两个或两个几上的块中,这叫行链接。
如果用户的动作是INSERT则服务器进程会先锁定FREELIST,然后找到空闲块的地址,再释放FREELIST,当多个服务器进程同时想要锁定FREELIST时即发生FREELIST的争用,可以在非采用自动段空间管理的表空间中创建表时指定FREELIST的个数,默认为1,如果是在采用自动段空间管理的表空间中创建表,即使指定了FREELIST也会被忽略,因为此时将使用BITMAP而不是FREELIST来管理段中的空闲空间。
如果用户动作是UPDATE服务器进程将不会使用到FREELIST和BITMAP,因为不要去寻找一个空闲块,而使用锁的队列。
下面来讲一下ORACLE锁的机制,ORACLE分锁存器和锁两种。
锁存器是用来保护对内存结构的访问,比如对DBBUFFER中块的锁存器申请,只有在DBWN完成后,这些DBBUFFER块被解锁。
然后用于其它的申请。
锁存器不可以在进程间共享,锁存器的申请要么成功要么失败,没有锁存器申请队列。
主要的锁存器有SHAREDPOOL锁存器,LIBRARYCACHE锁存器,CACHEBUFFERSLRUCHAIN锁存器,CACHEBUFFERSCHAINS锁存器,REDOALLOCATION锁存器,REDOCOPY锁存器。
ORACLE的锁是用来保护数据访问的,锁的限制比锁存器要更宽松,比如,多个用户在修改同一表的不同行时,可以共享一个表上的一个锁,锁的申请可以按照被申请的顺序来排队等候,然后依次应用,这种排队机制叫做队列(ENPUEUE),如果两个服务器进程试图对同一表的同一行进行加锁,则都进入锁的申请队列,先进的加锁成功,后面的进程要等待,直到前一个进程解锁才可以加锁,这叫做锁的争用,而且一旦加锁成功,这个锁将一直保持到用户发出COMMIT或ROOLBACK命令为止。
如果两个用户锁定各自的一行并请求对方锁定的行的时候将发生无限期等待即死锁,死锁的发生都是由于锁的争用而不是锁存器的争用引起的,ORACLE在遇到死锁时,自动释放其中一个用户的锁并回滚此用户的改变。
正常情况下发生锁的争用时,数据的最终保存结果由SCN来决定哪个进程的更改被最终保存。
两个用户的服务器进程在申请同一表的多个行的锁的时候是可以交错进入锁的申请队列的。
只有其中发生争用才会进行等待。
创建表时指定的MAXTRANS参数决了,表中的一个数据块最多可以被几个事务同时锁定。
CMD乱码
在CMD中用CHCP936(简体中文)和CHCP950(繁体中文)设置。
启动监听程序
在CMD中输入:
Lsnrctlstart,lsnrctlstatus可以查看监听程序的状态。
查看当前数据库的SID
selectinstance_name,host_namefromv$instance;
怎么查看数据库版本
可select*fromv$version
包含版本信息,核心版本信息,位数信息(32位或64位)等
至于位数信息,在linux/unix平台上,可以通过file查看,如
file$ORACLE_HOME/bin/oracle
解决ORA-12560:
TNS:
协议适配器错误
造成ORA-12560:
协议适配器错误的问题的原因有三个:
⑴监听服务没有起起来。
windows平台个一如下操作:
开始---程序---管理工具---服务,打开服务面板,启动oraclehome92TNSlistener服务。
⑵databaseinstance没有起起来。
windows平台如下操作:
开始---程序---管理工具---服务,打开服务面板,启动oracleserviceXXXX,XXXX就是你的databaseSID.
⑶注册表问题。
regedit,然后进入HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0将该环境变量ORACLE_SID设置为XXXX,XXXX就是你的databaseSID.或者右几我的电脑,属性--高级--环境变量---系统变量--新建,变量名=oracle_sid,变量值=XXXX,XXXX就是你的databaseSID.或者进入sqlplus前,在commandline下输setoracle_sid=XXXX,XXXX就是你的databaseSID.
经过以上步骤,就可以解决问题。
解决ORA-01034
一般是$ORACLE_HOME或者ORACLE_SID没有设置正确。
如何解决Oracle10gR2的ORA-06512OLAP错误
在Oracle10gR210.2.0.1的Dataguard备用库启动后报错,对应的跟踪文件中,输出的具体信息:
Errorinexecutingtriggersondatabasestartup
***2007-08-0911:
22:
15.869
ksedmp:
internalorfatalerror
ORA-00604:
erroroccurredatrecursiveSQLlevel1
ORA-12663:
Servicesrequiredbyclientnotavailableontheserver
ORA-36961:
OracleOLAPisnotavailable.
ORA-06512:
at"
SYS.OLAPIHISTORYRETENTION"
line1
atline15
提示显示,在数据库启动过程中,执行了一个和OLAP有关的Trigger,出现了错误。
检查数据库,得到以下两个相关Trigger:
SQL>
selecttrigger_name,statusfrom
dba_triggerswheretrigger_namelike'
%OLAP%'
;
TRIGGER_NAMESTATUS
--------------------------------------
OLAPISTARTUPTRIGGERENABLED
OLAPISHUTDOWNTRIGGERENABLED
我们可以通过禁用这两个Trigger,以此防止OLAP在数据库启动和关闭时的检验,这样就可以屏蔽这个错误信息。
Metalink上有几个Bug和这个错误相关,Bug号4630695是其中之一,目前,这个Bug在Oracle11g中已经得到更正。
ORA-04031:
unabletoallocate4096bytesofsharedmemory
ORA-04031出现的问题有以下几个可能性:
1.没有绑定编量造成shared_pool碎片过多,同时shared_pool_size太小
(1)这个情况是比较常见的。
(2)第二种情况通常会建议使用绑定变量,或者用简单的加大shared_pool,临时的解决方法就是altersystemflushshared_pool。
2.Large_pool,Java_pool太小造成的
(1)这个通过错误信息的提示很容易判断(Ora-04031cannotallocate..memeoryin[large_pool])
(2)解决方法就是简单的加大Large_poolorJava_pool
3.过度的开CURSOR而不关闭。
目前,此问题发生的越来越多,特别是在JAVA的运行环境中,屡见不鲜。
加大Shared_pool或者flushshared_pool往往只能延迟问题出现的时间,而无法避免此问题。
判断方法:
selectcount(*)fromv$open_cursor;
select*fromv$sysstat
wherename='
openedcursorscurrent'
假如出来的值特大(以万为单位)时,基本就可以确定是这个原因了。
解决这个问题的方法就是检查程序,看是否没有正常的关闭cursor(对于JAVA来说,就是没有关闭Statement)。
或者selectsql_textfromv$open_cursor,看看都是哪些cursor没关闭,再去检查车程序。
也有的程序使用了保持一定量的cursor一直open,从而避免cursor过多次的开启,来提高性能。
对于这种情况,则应该选择适当的shared_pool_size和控制keep_opening的cursor的量。
另外,Oracle参数session_cached_cursors也有可能过大,解决的方法就是把它降低到适当的值。
Linux下启动OEM
$ORACLE_HOME/bin/emctlstartdbconsle
更改数据库的归档模式
startupmount
alterdatabasearchivelog
10g之前还要设置初始化参数log_archive_start=true
手工归档:
archivelogstart
确定归档日志的路径:
altersystemsetlog_arc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ORACLEDBA 日常 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)