2013年(16)
分类: Oracle
2013-04-27 14:39:52
当用户需要连接一个oracle数据库时可以分为几种情况
先来看下oracle官方教材的连接示意图,
1、 在数据库所在主机直接连接数据库,也就是在本地连接访问,这种情况我们在服务器端只需要启动数据库就可以了,不需要启动监听程序(lsnrctl),甚至连net配置文件都不需要的。
2、 远程访问数据库,就是通过网络访问,通过网络一般都是使用TCP/IP协议的,这时服务端的监听就是必须的了,但是在客户端是不是一定必须有oracle的客户端软件呢?答案是否定的,一般我们在安装一个oracle客户端的时候的目的是什么呢?你肯定会说是为了配置tnsnames.ora文件啊,对了,实质上也就是需要这个文件来解析你连接串中的那个服务名,如:
这里的testbilling就是服务名,他在tnsnames.ora文件中是这样的
testbilling =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = testbilling)
)
)
其实只需要用文件中的连接串就可以直接连接的,不需要安装oracle的客户端,如
把连接串写成一行贴进去就行,这只是这种工具的用法,其他类似的,也有用J/ODBC连的也是不需要oracle客户端的。说这些不是鼓励不使用客户端,还是用的方便先,只是介绍下网络访问oracle数据库的机制。
当用户连接上数据库后,服务器进程会产生一个会话,在主机上也会有相应的进程,我们需要关心下数据库到底有哪些用户连接了,产生了哪些会话,以及相应的如何结束这些会话(这关系到如何解锁)
涉及到的系统视图有
v$session,v$process,v$lock
1、查询某session的sid,serial#以及spid
select a.username,a.sid,a.serial#,b.pid,b.spid
from v$session a,v$process b
where a.paddr=b.addr;
3、 如何杀掉某session
alter system kill session ‘sid,serial#’;
4、 如果温柔的杀不掉怎么办,在第一条中还可以查出spid,在操作系统环境下使用
kill spid
5、 如何查出数据库目前的锁
SELECT s.username,decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid AND l.id1 = o.object_id(+) AND s.username is NOT Null;