分类目录归档:Oracle

使用VMware Workstation配置Oracle RAC共享存储磁盘

一般情况下,我们在虚拟机上安装部署Oracle RAC数据库学习环境时,我们习惯使用Oracle VirtualBox这个虚拟机软件,因为这个软件是Oracle公司自己出的,特别是在配置RAC数据库时所涉及到的共享存储的配置非常简单,只需要点几下鼠标选择下一步就可以配置成功。但是由于VirtualBox这款虚拟机软件在虚拟系统的全屏及快照等方面还没有VMware Workstation做的完善,因此很多人还是习惯使用VMware Workstation这款软件,根据笔者自身的使用体会,VMware Workstation占用Windows系统资源太大,而且VMware Workstation在配置RAC数据库时共享存储层面的设置比较繁琐复杂,因此在很多情况下使用VMware Workstation在部署Oracle RAC数据库总是遇见各种莫名奇妙的错误,导致安装部署失败。鉴于这种情况,很多人退而求其次使用VMware Server去搭建Oracle RAC数据库学习环境,笔者也曾使用过VMware Server去搭建Oracle RAC,从切身体会来讲,使用上很不便。该篇文档介绍如何使用VMware Workstation这款软件去配置Oracle RAC数据库所涉及到的共享存储磁盘问题。

#环境信息
VMware® Workstation 10.0.1 build-1379776
#前提环境准备
已经安装好两台虚拟Linux系统分别为rac1和rac2
#添加新的磁盘作为RAC共享磁盘(添加多少块磁盘及每块磁盘容量根据数据量进行规划这里只做演示)
#这里演示添加14块虚拟磁盘每个磁盘大2.5GB,磁盘名字分别为asmdisk1~asmdisk14
#在添加磁盘的过程中关闭虚拟机

在rac1节点虚拟机上点击“编辑虚拟机设置”,在弹出的界面点击“添加”,在弹出的界面选择“磁盘”点击“下一步”出现下图,依次按照图示操作

点击“完成”之后,等该磁盘创建完成之后,在虚拟机的主界面上点击刚添加的这块磁盘“磁盘2”

在弹出的界面上选中“磁盘2”,在右侧点击“高级”弹出如下界面

这里将磁盘2的SCSI选择1:0后选择确定,第一块共享磁盘添加完毕,依次按照上面相同步骤添加asmdisk2~asmdisk14,每个磁盘添加完后均需要修改SCSI对应的号,以下为添加每块磁盘对应的SCSI号:
磁盘2  asmdisk1  SCSI 1:0
磁盘3  asmdisk2  SCSI 1:1
磁盘4  asmdisk3  SCSI 1:2
磁盘5  asmdisk4  SCSI 1:3
磁盘6  asmdisk5  SCSI 1:4
磁盘7  asmdisk6  SCSI 1:5
磁盘8  asmdisk7  SCSI 1:6
磁盘9  asmdisk8  SCSI 1:8
磁盘10 asmdisk9  SCSI 1:9
磁盘11 asmdisk10 SCSI 1:10
磁盘12 asmdisk11 SCSI 1:11
磁盘13 asmdisk12 SCSI 1:12
磁盘14 asmdisk13 SCSI 1:13
磁盘15 asmdisk14 SCSI 1:14

这里说明一下,为什么将新添加的14块磁盘asmdisk1~asmdisk14的SCSI用1:0~1:14来标记,原因从下图可以看出:

由于安装系统时分配的那块磁盘默认使用了SCSI 0:0,这块磁盘是本地磁盘(非共享),所以我们后面添加的14块磁盘由于是要用作共享磁盘,因此只能使用新的SCSI通道,这里选择了SCSI 1

下面在rac2节点上添加刚才rac1节点上创建好的这些磁盘,步骤和上面一样,只需要在选择磁盘时选择“使用现有的虚拟磁盘”,然后依次浏览asmdisk1~asmdisk14磁盘进行添加


所有的磁盘添加完毕后,还是和rac1节点上一样,修改每块磁盘的SCSI对应的号,和rac1节点保持相同

做完以上步骤,还需要编辑两个节点的虚拟机配置文件,使用文本编辑器打开rac1.vmx文件(这个是虚拟机节点的配置文件),rac1.vmx配置文件中关于添加的14块磁盘的内容按照如下进行调整修改

scsi1:0.present = “TRUE”
scsi1:0.fileName = “F:\11g_OCM\sharedisk\asmdisk1.vmdk”
scsi1:0.mode = “independent-persistent”
scsi1:0.deviceType = “disk”
scsi1:0.redo = “”

scsi1:1.present = “TRUE”
scsi1:1.fileName = “F:\11g_OCM\sharedisk\asmdisk2.vmdk”
scsi1:1.mode = “independent-persistent”
scsi1:1.deviceType = “disk”
scsi1:1.redo = “”

scsi1:2.present = “TRUE”
scsi1:2.fileName = “F:\11g_OCM\sharedisk\asmdisk3.vmdk”
scsi1:2.mode = “independent-persistent”
scsi1:2.deviceType = “disk”
scsi1:2.redo = “”

scsi1:3.present = “TRUE”
scsi1:3.fileName = “F:\11g_OCM\sharedisk\asmdisk4.vmdk”
scsi1:3.mode = “independent-persistent”
scsi1:3.deviceType = “disk”
scsi1:3.redo = “”

scsi1:4.present = “TRUE”
scsi1:4.fileName = “F:\11g_OCM\sharedisk\asmdisk5.vmdk”
scsi1:4.mode = “independent-persistent”
scsi1:4.deviceType = “disk”
scsi1:4.redo = “”

scsi1:5.present = “TRUE”
scsi1:5.fileName = “F:\11g_OCM\sharedisk\asmdisk6.vmdk”
scsi1:5.mode = “independent-persistent”
scsi1:5.deviceType = “disk”
scsi1:5.redo = “”

scsi1:6.present = “TRUE”
scsi1:6.fileName = “F:\11g_OCM\sharedisk\asmdisk7.vmdk”
scsi1:6.mode = “independent-persistent”
scsi1:6.deviceType = “disk”
scsi1:6.redo = “”

scsi1:8.present = “TRUE”
scsi1:8.fileName = “F:\11g_OCM\sharedisk\asmdisk8.vmdk”
scsi1:8.mode = “independent-persistent”
scsi1:8.deviceType = “disk”
scsi1:8.redo = “”

scsi1:9.present = “TRUE”
scsi1:9.fileName = “F:\11g_OCM\sharedisk\asmdisk9.vmdk”
scsi1:9.mode = “independent-persistent”
scsi1:9.deviceType = “disk”
scsi1:9.redo = “”

scsi1:10.present = “TRUE”
scsi1:10.fileName = “F:\11g_OCM\sharedisk\asmdisk10.vmdk”
scsi1:10.mode = “independent-persistent”
scsi1:10.deviceType = “disk”
scsi1:10.redo = “”

scsi1:11.present = “TRUE”
scsi1:11.fileName = “F:\11g_OCM\sharedisk\asmdisk11.vmdk”
scsi1:11.mode = “independent-persistent”
scsi1:11.deviceType = “disk”
scsi1:11.redo = “”

scsi1:12.present = “TRUE”
scsi1:12.fileName = “F:\11g_OCM\sharedisk\asmdisk12.vmdk”
scsi1:12.mode = “independent-persistent”
scsi1:12.deviceType = “disk”
scsi1:12.redo = “”

scsi1:13.present = “TRUE”
scsi1:13.fileName = “F:\11g_OCM\sharedisk\asmdisk13.vmdk”
scsi1:13.mode = “independent-persistent”
scsi1:13.deviceType = “disk”
scsi1:13.redo = “”

scsi1:14.present = “TRUE”
scsi1:14.fileName = “F:\11g_OCM\sharedisk\asmdisk14.vmdk”
scsi1:14.mode = “independent-persistent”
scsi1:14.deviceType = “disk”
scsi1:14.redo = “”

同时添加如下参数到rac1.vmx配置文件
disk.EnableUUID = “FALSE”
disk.locking = “FALSE”
diskLib.dataCacheMaxSize = “0”
diskLib.dataCacheMaxReadAheadSize = “0”
diskLib.dataCacheMinReadAheadSize = “0”
diskLib.dataCachePageSize= “4096”
diskLib.maxUnsyncedWrites = “0”
scsi1.shared = “TRUE”
scsi1.present = “TRUE”
scsi1.virtualDev = “lsilogic”
scsi1.sharedBus = “VIRTUAL”

按照同样的方法使用文本编辑器打开rac2.vmx文件(这个是虚拟机节点的配置文件)进行修改调整完成这些操作之后,在VMware Workstation层面的共享磁盘配置基本上就完成了

再往下就是在系统中如何进一步配置共享磁盘给RAC使用,无论是使用asmlib或是udev均可,但是这里需要提到一点,使用asmlib的话,添加的14块磁盘必须进行分区才可以被创建成ASM磁盘被RAC使用,但是使用udev可以直接绑定裸盘即可。

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