作者归档:Lynn

关于Lynn

Oracle DBA is my Occupation dream, Focus on Oracle, Love the life! I hope I can make a difference in this industry.

Windows下杀oracle会话进程方法

在Windows上使用orakill结束oracle会话的线程,由于oracle在Windows平台采用了单进程多线程的实现方式,unix/linux上的server process在windows上实际是一个thread。我们知道,在unix平台上,有时使用alter system kill的方式杀死一个用户会话后,可能会标记为killed而不是立即释放该会话所占有的所有资源,或者由于某些原因,某些会话处于假死状态,这时可能要在os级别强行kill对应的process。但在windows上,进程管理器中只能看到一个oracle进程,而无法看到并且杀死具体的线程。这种情况下,我们当然可以借助第三方的线程管理工具来实现我们杀某个指定线程的目的,但实际上,oracle本身也是提供了这种的工具的。这就是orakill工具。orakill的用法很简单,两个参数,第一个是oracle_sid,第二个是线程号,也就是oracle的v$process中的spid,请看下面实例。

1)查oracle所有会话进程线程信息
SET pagesize 100
SET linesize 100
COLUMN Program format a20
SELECT s.sid AS “Sid”, s.serial# AS “Serial#”, p.spid AS “ThreadID”,s.osuser AS “OSUser”, s.program AS “Program”
FROM v$process p, v$session s
WHERE p.addr = s.paddr(+)
ORDER BY s.sid;

2)查oracle系统会话进程线程信息
Select vb.name NAME, vp.program PROCESSNAME, vp.spid THREADID, vs.sid SID
From v$session vs, v$process vp, v$bgprocess vb
Where vb.paddr <> ’00’ and
vb.paddr = vp.addr and
vp.addr = vs.paddr;

3)查oracle非系统会话进程线程信息
SELECT s.sid AS “Sid”, s.serial# AS “Serial#”, p.spid AS “ThreadID”,s.osuser AS “OSUser”, s.program AS “Program”
FROM v$process p, v$session s
WHERE p.addr = s.paddr(+)
and s.sid not in (select vs.sid SID
From v$session vs, v$process vp, v$bgprocess vb
Where vb.paddr <> ’00’ and
vb.paddr = vp.addr and
vp.addr = vs.paddr)
ORDER BY s.sid;

4)使用orakill工具杀掉oracle非系统会话
SELECT ‘orakill tdb ‘||p.spid AS “ThreadID”
FROM v$process p, v$session s
WHERE p.addr = s.paddr(+)
and s.sid not in (select vs.sid SID
From v$session vs, v$process vp, v$bgprocess vb
Where vb.paddr <> ’00’ and
vb.paddr = vp.addr and
vp.addr = vs.paddr)
ORDER BY s.sid;

SQL> SELECT 'orakill tdb '||p.spid AS "ThreadID"
  2  FROM v$process p, v$session s
  3  WHERE p.addr = s.paddr(+)
  4  and s.sid not in (select vs.sid SID
  5  From v$session vs, v$process vp, v$bgprocess vb
  6  Where vb.paddr &lt;&gt; '00' and
  7  vb.paddr = vp.addr and
  8  vp.addr = vs.paddr)
  9  ORDER BY s.sid;
ThreadID
------------------------------------
orakill tdb 492
orakill tdb 2416
orakill tdb 1952
orakill tdb 360
orakill tdb 1204
orakill tdb 2656
orakill tdb 2244
orakill tdb 2020
orakill tdb 1512
orakill tdb 3948
orakill tdb 3744
orakill tdb 2192
orakill tdb 1612
orakill tdb 1240
orakill tdb 600
orakill tdb 1668
---其中tdb为数据库实例名

关于kill session的研究请参考eygle博客:http://www.eygle.com/faq/Kill_Session.htm

Oracle RAC节点间配置NTP同步

Oracle RAC节点间通信对时间的一致性要求比较高,在10g时我们通常借助于NTP或是使用crontab调用脚本去执行节点间时间同步。在11g Clusterware引入一个新的进程CTSS,该进程主要负责集群的时间管理,确保每个节点的集群时间一致,如果系统的NTP进程运行,则CTSS进程处于observer模式,否则NTP进程没有运行,CTSS运行于ACTIVE模式。该文档只要演示如何使用NTP来进行RAC节点间的时间同步。

这里我们使用RAC节点1作为NTP Server,节点2作为Client与节点1进行时间同步:
rac1的IP:192.0.2.101  NTP服务端
rac2的IP:192.0.2.102  NTP客户端
 
NTP配置过程如下:
1)配置NTP服务器之前确认服务器已装好NTP所需的rpm包
[root@rac1 ~]# rpm -qa|grep ntp
ntp-4.2.2p1-9.el5_3.2
chkfontpath-1.10.1-1.1
 
2)然后再把服务器的系统时钟与硬件时间同步一下
[root@rac1 ~]# date
Wed May  6 18:14:42 CST 2015
[root@rac1 ~]# hwclock
Wed 06 May 2015 06:14:46 PM CST  -0.644785 seconds
[root@rac1 ~]# clock –systohc
 
3)编辑rac1节点的配置文件(添加如下内容)
[root@rac1 ~]# vi /etc/ntp.conf
server 192.0.2.101 prefer
restrict 192.0.2.0 mask 255.255.255.0 nomodify notrap noquery
broadcastdelay 0.008
 
4)编辑rac2节点ntp.conf文件(添加如下内容)
[root@rac2 ~]# vi /etc/ntp.conf
server 192.0.2.101 prefer 
broadcastdelay 0.008 
 
5)分别在rac1/rac2节点上修改NTPD参数文件(RAC安装时需要检测的-x参数,参考MOS Doc ID 1056693.1)
[root@rac1 ~]# cat /etc/sysconfig/ntpd
# Drop root to id ‘ntp:ntp’ by default.
OPTIONS=”-x -u ntp:ntp -p /var/run/ntpd.pid”
SYNC_HWCLOCK=yes
[root@rac2 ~]# cat /etc/sysconfig/ntpd
# Drop root to id ‘ntp:ntp’ by default.
OPTIONS=”-x -u ntp:ntp -p /var/run/ntpd.pid”
SYNC_HWCLOCK=yes
 
6)添加NTP服务器地址或者主机名
[root@rac1 ~]# cd /etc/ntp
[root@rac1 ntp]# ls
keys  ntpservers  step-tickers
[root@rac1 ntp]# cat ntpservers
#This file contains a list of ntp servers to show in the system-config-date user interface.
#It is not recommended that you modify this file by hand.
 
#clock.redhat.com
#clock2.redhat.com
rac1.oracle.com
 
[root@rac2 ~]# cd /etc/ntp
[root@rac2 ntp]# ll
total 20
-rw——- 1 root root  73 May 19  2009 keys
-rw-r–r– 1 root root 186 Jul  8  2009 ntpservers
-rw-r–r– 1 root root   0 May 19  2009 step-tickers
[root@rac2 ntp]# cat ntpservers
#This file contains a list of ntp servers to show in the system-config-date user interface.
#It is not recommended that you modify this file by hand.
#clock.redhat.com
#clock2.redhat.com
rac1.oracle.com
 
7)注意查看step-tickers内容,如果step-tickers错误也会导致ntp不同步
[root@rac1 ntp]# more step-tickers
[root@rac2 ntp]# more step-tickers
 
8)在rac1/rac2上执行chkconfig使NTP服务开机启动
[root@rac1 ~]# chkconfig ntpd on
[root@rac2 ~]# chkconfig ntpd on
 
[root@rac1 ~]# service ntpd restart
Shutting down ntpd:                                        [  OK  ]
ntpd: Synchronizing with time server:                      [FAILED]
Starting ntpd:                                             [  OK  ]
 
9)确保该端口以udp方式开放
[root@rac1 ~]# netstat -an|grep 123
udp        0      0 192.168.0.101:123           0.0.0.0:*                              
udp        0      0 192.0.2.101:123             0.0.0.0:*                              
udp        0      0 127.0.0.1:123               0.0.0.0:*                              
udp        0      0 0.0.0.0:123                 0.0.0.0:*                              
udp        0      0 fe80::20c:29ff:fe93:274:123 :::*                                   
udp        0      0 ::1:123                     :::*                                   
udp        0      0 fe80::20c:29ff:fe93:26a:123 :::*                                   
udp        0      0 :::123                      :::*                                   
unix  3      [ ]         STREAM     CONNECTED     43123  @/tmp/dbus-McFa70uJsL
 
10)查看ntp状态
[root@rac1 ~]# ntpstat
unsynchronised
  time server re-starting
   polling server every 64 s
 
11)在rac2节点启动ntp服务
[root@rac2 ~]# service ntpd restart
Shutting down ntpd:                                        [  OK  ]
ntpd: Synchronizing with time server:                      [FAILED]
Starting ntpd:                                             [  OK  ]
 
12)切换至事先配好互信关系的grid用户来验证两节点时间
[grid@rac1 ~]$ sh ssh.sh
Wed May  6 18:52:19 CST 2015
Wed May  6 18:52:19 CST 2015
Wed May  6 18:52:19 CST 2015
Wed May  6 18:52:19 CST 2015

经过验证,RAC两个节点时间已同步,但是也需要注意,生产环境下,应该考虑使用单独的Server作为NTP时间同步服务器。