锁清楚缓存altersystemflushbuffer_cache清楚缓存createuseruser_nameidentifiedby密码createuseruser_nameidentifiedby密码defaulttablespacetablespace_nametemporarytemp_name;指定用户默认的表空间指定临时表空间一般要指定alteruseruser_nameaccountunlock解锁grenttouser_name权限Cdropuserusernamecascade;(删除用户和用户下的所有对象,注意关键值cascade)createuserusernameidentifiedbypasswddefaulttablespaceuserstemporary创建user使用表空间锁的概述:.数据库较之excel之类的东西最大的一个不同,就是支持并发.而锁,则是实现数据库并发控制的一个非常重要的技术.对于一张表来说,它分为两部分,一部分是数据,一部分是它的元数据(也就是我们平时说说的相关数据字典),我们在删除表(droptable)截断表(truncatetable)的时候是没有删除数据的,是修改数据字典,也就是元数据.所以我们保护一张表,既要保护数据,又要保护元数据.因此,锁可以分为保护元数据的锁--TM锁,和保护数据的锁--TX(表级锁和行级锁).可以大概的得知两种锁的信息.TM是同步访问对象用的,TX是和事务有关的.论:当对表进行创建索引操作时,会伴随出现LMODE=4的S锁.根据上面的各种操作所对应的锁的表格,发现S锁和任何dml操作都是冲突的!我们对此就要非常注意了,尤其是在生产上,当在一个很大的表上进行索引创建的时候,任何对该表的DML操作都会被夯住!!!//查询导致死锁的用户和软件还有T-SQL语句,记录时间、计算机名称selectusername,sql_text,lockwait,status,machine,program,logon_timefromv$session,v$sqlwherev$session.SQL_ID=v$sql.SQL_IDorderbylogon_timedesc【注释】:通过sql_Text列,您可以查看到被锁定的表是谁--//根据用户分组会话selectt.USERNAME,count(*)fromv$sessiontgroupbyt.USERNAME;--//查找某一用户正在执行的sql_id值select*fromv$sessiontwheret.USERNAME='BUDGET'andt.SQL_IDisnotnull;--//查找对应sql_id的对应sql语句selectm.SQL_TEXTfromv$sessiont,v$sqlareamwheret.USERNAME='BUDGET'andt.sql_id=m.SQL_ID;--//select*fromv$sqlareatwheret.SQL_ID='g92sy7kwt6mrq';---//查询死锁对象select*fromv$locked_object;查询哪些锁(1)selectb.object_name,a.*fromv$locked_objecta,dba_objectsbwherea.OBJECT_ID=b.object_id;selectsid,serial#fromv$sessionwheresid=seesion_id;(2)selectobject_name,c.sid,c.serial#fromv$locked_objecta,dba_objectsb,v$sessioncwherea.object_id=b.object_idanda.session_id=c.sid;杀掉会话altersystemkillsession'sid,serial#';altersystemkillsession'704,54269';杀掉会话:----方法一:SQLSELECTpid,spidFROMV$PROCESSWHEREADDRIN(SELECTPADDRFROMV$SESSIONwhereusername='SYS');PIDSPID----------------------1713657ps-ef|grep13657kill-913657---方法二:SQLSELECTsid,serial#FROMV$SESSIONWHEREsidin(SELECTdistinctsidFROMV$MYSTAT);SIDSERIAL#--------------------163713894altersystemdisconnectsession'1637,13894'immediate;查看是否kill掉selectusername,statusfromv$sessionwheresid=524;selectused_ublkfromv$transaction;-------——————————————————————————-KillSession经验总结在Oracle的日常维护中,经常出现以下两种情况需要我们DBAkillsession:App应用能及时跑完。2.App的应用跑到一半,突然决定不跑了,需要DBA把他们的sessionkill掉。以下是我经常采用的killsession的方法:1.在数据库层面用语句altersystemkill'sid,serial#'2.在某些特殊情况下,方法1无法使用,便在OS层面执行kill-9采用以上方法经常碰到的问题是:对于那些已经跑了很久的session,不是一下子就能kill掉的,有时要等很久,此时就只能傻傻的在那等,当App那边的人问“session消失了吗?如果没有消失,还要等多久?”等等之类的问题的时候,总是无法给他们确切的1.altersystemkill'sid,serial#'这条语句会做什么?每当执行以下语句时:A105024@O02DMS1altersystemkillsession'524,24148';Systemaltered.总是能很快的返回Systemaltered的结果,很多人误以为此时session已经被killed了,其实不然,该语句只是发出一个命令,告诉这个session:你被killed掉了,如果此时session为空闲状态,它可以马上结束,但是如果此时session正在做一个事务,它在结束前需要将事务回滚,并释放锁。因此,对于那些需要长时间回滚才能被kill掉的session来说,在执行altersystemkillsession之后,它的状态变成KILLED,比如:selectusername,statusfromv$sessionwheresid=524;SIDSTATUS-------------------------524KILLED2.KILLED状态的session还要多少时间才能消失?如果去评估KILLED状态的session还要多少时间才能消失呢?我们可以查询v$transcation中的USED_UBLK,比如used_ublks当前值为500,1分钟后剩下400,那么你可以估计该session大概还需要400/(500-400)=4分钟的时间才能结束,以下是一个实际中的例子:selectused_ublkfromv$transaction;USED_UBLK----------22621rowselected.SQL/USED_UBLK----------14301rowselected.SQL/USED_UBLK----------11031rowselected.一直监控USED_UBLK的值,只要它不等于0,该session还是处于KILLED的状态:selectusername,statusfromv$sessionwheresid=524;SIDSTATUS-------------------------524KILLEDselectused_ublkfromv$transaction;USED_UBLK----------10481rowselected.SQL/USED_UBLK----------4891rowselected.SQL/norowsselected没有USED_UBLK返回,说明回滚已经结束。3.为什么USED_UBLK的值已经为0了,session还是显示killed的状态?这是因为必需得等到client端收到ORA-00028错误之后,session才会消失,换句话说,即使session已经回滚完毕,但如果client端还没有确认,session还是保持在killed的状态,如:selectused_ublkfromv$transaction;norowsselected虽然USED_UBLK已经为0了,但是session还是killed的状态:selectusername,statusfromv$sessionwheresid=524;SIDSTATUS-------------------------524KILLED在client端,尝试任何执行语句,都会出现ORA-00028:SQLselectinstance_namefromv$instance;selectinstance_namefromv$instance*ERRORatline1:ORA-00028:yoursessionhasbeenkilled此时session才会消失:selectusername,statusfromv$sessionwheresid=524;norowsselected4.kill-9与altersystemkillsession的区别altersystemkillsession的原理是让session自己把自己kill掉,也就是session自己回滚;而kill-9是让pmon清理session。kill-9的速度看起来比altersystemkillsession要快一些,这是因为pmon会做一些并行的处理,让回滚更快一些,但是kill-9不建议使用,因为:1.在OS层面直接kill进程,存在未知的风险;2.容易误操作,如果万一把Oracle的关键进程(如smon)kill掉,会造成数据库宕机的事故;3.无法监控事务回滚进度。所以,不到万不得已的情况下,尽量不要用kill-9。————————————————————————————————查看日志情况COLgroup#FOR999999;COLmember#FOR999;COLlogfilepathFORa50;COLMBFOR999,999,999;SELECTl.thread#,l.group#,l.membersASmember#,lf.MEMBERASlogfilepath,bytes/1024/1024MB,sequence#,l.statusFROMv$logl,v$logfilelfWHEREl.group#=lf.group#ORDERBYthread#,group#,members;————————————————————-——————————————————1、查看锁SELECTp.spid,a.serial#,c.object_name,b.session_id,b.oracle_username,b.os_user_nameFROMv$processp,v$sessiona,v$locked_objectb,all_objectscWHEREp.addr=a.paddrANDa.process=b.processANDc.object_id=b.object_id2.查看是哪个进程锁的SELECTsid,serial#,username,osuserFROMv$sessionwhereosuser='tangpj'3.杀掉这个进程al