1.kill session
--oracle
select t2.username,t2.sid,t2.serial#,t2.logon_time ,vs.SQL_TEXT
from v$locked_object t1,v$session t2 ,v$sql vs
where t1.session_id=t2.sid
and vs.sql_id=t2.sql_id
order by t2.logon_time;
alter system kill session '446,1599'; --'sid,serial'
补充:昨日在一张视图view上建立物化视图,执行慢后来放弃,之后重新编译改视图一直假死,drop也是假死,报ora-04021错,使用上面的语句并未发现有死锁存在,于是查看等待事件(猜想死锁只产生在有事务时,如果有等待查询时间,同时编译并不会在上述代码中查出,但这时就会导致编译时无法锁定对象,然后才报ora-04021错)
select t2.username,t2.sid,t2.serial#,t2.logon_time,vs.SQL_TEXT
from v$session t2 ,v$sql vs where vs.sql_id=t2.sql_id
发现有很多查询事件,使用
ALTER SYSTEM DISCONNECT SESSION '215,2149' IMMEDIATE;
ALTER SYSTEM DISCONNECT SESSION 杀掉专用服务器(DEDICATED SERVER)或共享服务器的连接会话,它等价于从操作系统杀掉进程。它有两个选项POST_TRANSACTION和IMMEDIATE, 其中POST_TRANSACTION表示等待事务完成后断开会话,IMMEDIATE表示中断会话,立即回滚事务。
但是发现这个代码也无法立即杀死,只是做个mark,于是使用kill -9 在服务器端杀
select 'kill -9 '|| p.spid
from v$session s, v$process p
where s.paddr = p.addr
and s.SID=XXX and s.SERIAL#=XXX;
将执行的结果在服务端运行
2.同义词
假如a用户访问b用户下的表空间数据需要加前缀才能访问,为了去掉前缀,使用同义词,同义词大概的意思就是取一个别名,这个别名指向b.tablename
同义词分为两种,一种是public公有的,一种是私有的,顾名思义公有的即使是在a下面建立的同义词,其他的用户访问b的改表也不需要加前缀就可以访问。
(1)授权创建同义词的权限给a用户
GRANT CREATE PUBLIC SYNONYM TO a;
(2)切换为b用户,查出所有的b用户下的表同义词语句
select 'create public synonym '|| table_name || ' for b.' || table_name || ';' from user_tables;
如下:
(3)切换到a用户,将建立同义词的语句拷出执行
执行后同义词便建立好了,可以直接访问表名了
附:
--普通用法如下所示:
CREATE [OR REPLACE] [PUBLIC] SYNONYM [ schema.] 同义词名称 FOR [ schema.] object [ @dblink ];
--专有(私有)同义词
CREATE SYNONYM SYSN_TEST FOR TEST;
--公共同义词
CREATE PUBLIC SYNONYM PUBLIC_TEST FOR TEST;
--如果要创建一个远程的数据库上的某张表的同义词,需要先创建一个Database Link(数据库连接)来扩展访
--问,然后再使用如下语句创建数据库同义词:create synonym table_name for table_name@DB_Link;
3.查询临时表空间的占用sql
SELECT se.username,
sid,
serial#,
sql_address,
machine,
program,
tablespace,
segtype,
contents
FROM v$session se, v$sort_usage su
WHERE se.saddr = su.session_addr
通过alter system kill session 'xxx,xxx' immediate