小知识总结一.docx
《小知识总结一.docx》由会员分享,可在线阅读,更多相关《小知识总结一.docx(14页珍藏版)》请在冰豆网上搜索。
小知识总结一
Oracle小知识总结一
Oracle小知识总结
(一)
Oracle是一个庞大的系统,里面的知识点很多,在学习的时候,看到一些知识点,就贴了下来,尽不知中贴了这么多,就先做个小结吧。
里面有的知识点已经单独拿出来写成单篇的了。
有的还没有进行整理。
好记性不如烂笔头,不过我用的不是笔。
这里面大部分内容都是我泡CSDN论坛的时候整理的,现在要忙其他的事,就很少去了。
泡论坛的那段时间,是我进步最快的时间,所以如果想在Oracle上有所发展的朋友,建议也可以去论坛泡泡。
看到自己会的知识点,就帮别人解答,不会的就自己研究学习,一段时间下来,会有很大的进步。
而且还能认识很多朋友。
实在是一举两得的事。
1.每天的800到2300每隔5分钟执行一个sql语句的JOB
--建立一个存储过程
CREATEORREPLACEPROCEDUREp_jobtestISv_hhVARCHAR2
(2);
BEGINv_hh:
=to_char(SYSDATE,'hh24');
IFv_hh='08'ANDv_hh='22'THEN
--你的sql语句
NULL;
ENDIF;
END;
/
--提交一个JOBDECLAREv_jobnoNUMBER;
BEGINdbms_job.submit(v_jobno,
'p_jobtest;',
trunc(SYSDATE,'mi')+1/1440,
'trunc(SYSDATE,''mi'')+5/1440');
END;
/
2.RMAN中的list命令显示的信息是从控制文件里获取的,如果使用rm等命令手工的删除备份文件,这个动作不会同步到控制文件,造成不一致,这种不一致会导致使用rman时报错。
可以使用delete删除这些过期的记录,在用就不会报错了。
RMANcrosscheckcopy;
RMANlistcopy;
RMANdeleteexpiredcopy;
3.触发LGWR进程的条件有:
1.用户提交
2.有1/3重做日志缓冲区未被写入磁盘
3.有大于1M的重做日志缓冲区未被写入磁盘
4.3秒超时
5.DBWR需要写入的数据的SCN大于LGWR记录的SCN,DBWR触发LGWR写入。
4.触发DBWR进程的条件有:
1.DBWR超时,大约3秒
2.系统中没有多余的空缓冲区来存放数据
3.CKPT进程触发DBWR5.每隔3秒钟ckpt会去更新控制文件和数据文件,记录checkpoint执行的情况。
当发生checkpoint时,会把SCN写到四个地方去。
三个地方于controlfile内,一个在datafileheader。
6.触发CheckPoint(检查点条件有很多,比如:
1.通过正常事务处理或者立即选项关闭例程时(shutdownimmediate或者Shutdownnormal),
2.当通过设置初始化参数
LOG_CHECKPOINT_INTERVAL,
LOG_CHECKPOINT_TIMEOUT,
FAST_START_IO_TARGET强制时;
3.当数据库管理员手动请求时
ALtersystemcheckpoint;
altertablespace.offline;
4.每次日志切换时;
altersystemswitchlogfile1.altersystemswitchlogfile也将触发完全检查点的发生。
2.alterdatabasedatafile.offline不会触发检查点进程。
7.RECOVERDATABASEUNTILCANCEL和RECOVERDATABASEUNTILCANCELUSINGBACKUPCONTROLFILE;区别
1)RECOVERDATABASEUNTILCANCEL==OPENDATABASERESETLOG
==DATAFILEHEADERSCN一定会小于CONTROLFILE的DATAFILESCN
如果你有进行RESTOREDATAFILE,则该RESTORE的DATAFILEHEADERSCN一定会小于目前CONTROLFILE的DATAFILESCN,此时会无法开启数据库,必须进行mediarecovery。
重做archivelog直到该datafileheader的SCN=currentscn8.建表前判断表是否存在的存储过程。
在Oracle中没有droptable.ifexists语法。
所以我们可以在创建表之前用如下存储过程来判断。
createorreplaceprocedureproc_dropifexists(
p_tableinvarchar2
)isv_countnumber(10);
beginselectcount(*)
intov_countfromuser_objectswhereobject_name=upper(p_table);
ifv_count0thenexecuteimmediate'droptable'||p_table||'purge';
endif;
end;
9.表属性中pctused,和pctfree作用
表示数据块什么时候移入和移出freelist。
pctused:
如果数据块的使用率小于pctused的值,则该数据块重新加入到fresslist中。
pctfree:
如果数据块的使用率高于pctfree的值,则该数据块从freelist中移出。
10.oracle表空间大小没有限制,根存储空间而定。
oracle9i或以下,单个数据文件最大32G(对于8K的数据块),整个数据库最多有64K个数据文件.单个表空间的数据文件数量没有具体的限制,也应该是在64K以下.oracle10g以上,引入了bigfiletablespace,bigfiletablespace只有一个数据文件,最大为4G*8k=32Tdatabasefilesize:
Operatingsystemdependent.Limitedbymaximumoperatingsystemfilesize;typically222(2的22次方)or4Mblocks11.Oracle利用现有的表创建一张新表,只要表结构相同createtabledavidasselect*fromall_userswhere11;12.循环插入数据declareiinteger;beginforiin1.100000loopinsertintotestvalues(i);endloop;commit;end;13.开发人员通常习惯赋予所有用户DBA权限,查看权限Select*FromUser_Role_PrivsSelect*FromUser_Sys_Privs14.看数据文件大小,单位是Mselectround(bytes/(1024*1024),0)total_spacefromdba_data_filesselectsum(bytes/(1024*1024))total_spacefromdba_data_files15控制文件大小selectsum(block_size*file_size_blks)/1024/1024fromv$controlfile16.建立表空间CREATETABLESPACEdata01DATAFILE'/oracle/oradata/db/DATA01.dbf'SIZE500MUNIFORMSIZE128k;#指定区尺寸为128k,如不指定,区尺寸默认为64k删除表空间DROPTABLESPACEdata01INCLUDINGCONTENTSANDDATAFILES;修改表空间大小alterdatabasedatafile'/path/NADDate05.dbf'resize100M
查看表空间:
selecttablespace_name,file_name,sum(bytes)/1024/1024table_sizefromdba_data_filesgroupbytablespace_name,file_name;17.有没有被lock,可以通过这2张dynamicview来确定:
v$locked_object,V$session可以把该session杀掉。
selectsid,serial#fromv$sessionwhereusername='XXXX'把得到的sid,serial#号替换到下面的语句中:
altersystemkillsession'SID,SERIAL#'18.PL/SQLoracle查询前10条信息SELECT*FROMtableWHEREROWNUM11select*from(select*fromtableorderbydesc)whererownum=5==selecttop5*fromtable;19.查看表上是否存在的索引select*fromuser_indexeswheretable_name='yourtablename'createindexIX_Tablename_columnontablename(column)20.selectid,id2,round((id/id2)*100,2)||'%'percentfromtest;21.查询表的行数selectcount(*)fromtable_name;全表扫描,会自已找表有索引列并且该列为非空的因为只有非空才能确保记录数是全的),走INDEX_FFS.selectcount
(1)fromtable_name;不走索引,效率要高,但在表中有非空索引时也是走INDEX_FFS的22.用function来查看当前session的trace文件的文件名如下createorreplacefunctiongettracenamereturnvarchar2isv_resultvarchar2(200);beginSELECTd.VALUE||'/'||LOWER(RTRIM(i.INSTANCE,CHR(0)))||'_ora_'||p.spid||'.trc'intov_resultFROM(SELECTp.spidFROMv$mystatm,v$sessions,v$processpWHEREm.statistic#=1ANDs.SID=m.SIDANDp.addr=s.paddr)p,(SELECTt.INSTANCEFROMv$threadt,v$parametervWHEREv.NAME='thread'AND(v.VALUE=0ORt.thread#=TO_NUMBER(v.VALUE)))i,(SELECTVALUEFROMv$parameterWHERENAME='user_dump_dest')d;returnv_result;endgettracename;运行SQLselectgettracename()fromdual;即可GETTRACENAME()---F:
\DEVELOPER\ORACLE\PRODUCT.2.0\ADMIN\ORCL\UDUMP/orcl_ora_3800.trc23.selectcasewhen(ab)thenaelsebendfromTableA;selectgreatest(a,b)fromtb24.TRUN