Chinaunix首页 | 论坛 | 博客
  • 博客访问: 33624
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2016-09-13 19:19
文章分类
文章存档

2016年(11)

我的朋友

分类: Oracle

2016-09-13 19:20:20

原文地址:pl/sql执行sql 几种方式 作者:cissdy

plsql很方便我们执行sql。下面就简单介绍我常用的几种(当然每次svn的分支也可以ant脚本自动执行某个文件下的所以sql文件)

首先打开plsq的命令窗口

1)执行sql文件(可以把需要执行的sql放一个文件中)

输入 @''  

在单引号中输入sql文件的路径既可,比如D:\db下的jbpm.oracle.sql文件,见下图(sql文件内容是select * from system_menu r where r.menu_name='销售订单' ;)

.

 

 

2)导入dmp文件。导入dmp文件前先删除对应的user(下面以test_user为例)

drop user test_user cascade;
$ impdp  directory=data_pump_dir schemas=test_user dumpfile=date.DMP REMAP_SCHEMA=test_user:test_userTABLE_EXISTS_ACTION=replace logfile=imp.log;
alter user test_user identified by 123456;

 

 

3)当需要重新从正式版到数据到测试版时,我们需要重启测试版服务器或者kill掉应用程序服务器(比如tomcat)的session连接

v$session 这张表可以查找到连接 oracle 数据库的应用程序基本信息。因此可以通过该表来kill掉相应程序的session

如果你想kill到连接到用户 test_user ,可以执行下面的sql: select * from v$session r where r.USERNAME=‘test_user’ ;

然后kill对应的session'就行了,参考下面的截图:

.

 

比如你要kill 第一条;就执行下面的sql :  alter system kill session '21,77' ;   //因为sid, serial#.这2列很唯一的。

 

 

下面补充一些连接oracle的应用程序信息和oracle 操作 session 情况。       

 1.查找到连接 oracle 数据库的应用程序基本信息。

 

select sid, serial#,  
username, --连接用户名  
program, --应用程序名
machine, --机器名
osuser, --操作系统用户
logon_time --登录时间
from v$session;

   2.如何查看session级的等待事件?

当我们对数据库的性能进行调整时,一个最重要的参考指标就是系统等待事 件。$system_event,v$session_event,v$session_wait这三个视图里记录的就是系统级和session级的等待 事件,通过查询这些视图你可以发现数据库的一些操作到底在等待什么?是磁盘I/O,缓冲区忙,还是插锁等等。

通过如下sql你可以查询你的每个应用程序到底在等待什么,从而针对这些信息对数据库的性能进行调整。
Select s.username,s.program,s.status,se.event,se.total_waits,se.total_timeouts,se.time_waited,se.average_wait
from v$session s, v$session_event se
Where s.sid=se.sid And se.event not like 'SQl*Net%' And s.status ='ACTIVE'And s.username is not null

 

3.oracle中查询被锁的表并释放session
SELECT A.OWNER,A.OBJECT_NAME,B.XIDUSN,B.XIDSLOT,B.XIDSQN,B.SESSION_ID,B.ORACLE_USERNAME, B.OS_USER_NAME,B.PROCESS, B.LOCKED_MODE, C.MACHINE,C.STATUS,C.SERVER,C.SID,C.SERIAL#,C.PROGRAM
FROM ALL_OBJECTS A,V$LOCKED_OBJECT B,SYS.GV_$SESSION C
WHERE ( A.OBJECT_ID = B.OBJECT_ID ) AND (B.PROCESS = C.PROCESS ) ORDER BY 1,2

释放session Sql:
alter system killsession'sid,serial#'
alter systemkillsession'379,21132'
alter systemkillsession'374,6938'

4.查看占用系统io较大的session
SELECT se.sid,se.serial#,pr.SPID,se.username,se.status,se.terminal,se.program,se.MODULE,se.sql_address,st.event,st.p1text,si.physical_reads,si.block_changes
FROM v$session se, v$session_wait st,v$sess_io si,v$process pr
WHERE st.sid=se.sid  AND st.sid=si.sid AND se.PADDR=pr.ADDR AND se.sid>6 AND st.wait_time=0 AND st.event NOT LIKE '%SQL%' ORDER BY physical_reads DESC

5.找出耗cpu较多的session
select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value
from v$session a,v$process b,v$sesstat c
where c.statisti=12 and c.sid=a.sid and a.paddr=b.addr order by value desc
     6.另外oracle是否运行可以用sql语句查出:

select   status   from  v$instance; 
其中,status可能返回三种值:open(数据库打开),mount(数据库已经加载,但还没有打开),started(数据库进程已经启动,但是还没有加载),这个数据字典可以在数据库没有打开的情况下查询,但是需要用sys用户执行

阅读(1321) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~