Windows NT平台正在迅速占领中低端市场,你准备好了吗?
在Oracle最早在80年代中期进入数据库市场的时候,Oracle选择的主要平台就是Digital公司的VAX小型机系统,在开发完VAX上面的VMS版本的Oracle以后,再把Oracle移植到别的平台的操作系统上,比如DG-OS, MVS, Unix等。如果你在87年左右就开始使用Oracle,相信你那个时候用的应该是VMS系统。
在80年代晚期开始,Oracle的主要市场转向了开放系统Unix。在90年代中期到现在,绝大多数的Oracle系统都运行在Unix系统上,很多程序员都不得不艰难的从VMS转向到Unix平台。
时间走向了2000年,我们逐渐看到了另外一个发展方向-虽然没有向当时从VMS转向Unix那么明显:虽然Unix仍然占据着高端市场,但是越来越多的中低端用户开始转向Windows系统。我们不应该忽视这个现象的存在,应该开始接触和学习Oracle在Windows平台上的管理。
在这篇文章里面,我向大家介绍Oracle在Unix平台和在Windows平台上有哪些区别,以及在Windows平台上管理Oracle的常见问题。我们希望读者有一定的Unix和Windows操作系统基础知识。
Oracle在Windows系统上的体系结构
Oracle一直对数据库的可移植性非常重视,实际上它也确实做的非常好。每个平台上的Oracle都有一致的操作方法和特性。在几乎所有平台上,都可以看到oracle的存在。在各个不同的平台上,从Intel的Windows95上的Oracle,到IBM的S/MVS上的Oracle,Oracle都是同样的一套通用的体系结构:
? 一块公共内存区域,称为SGA。里面存放数据块缓冲,SQL缓冲区,字典缓冲区,重做日志缓冲区等。如果配置成MTS结构的话,还有会话信息。
? 一些数据库后台进程,比如dbwr, lgwr, pmon, smon, arc0等。如果有分布式业务,并行数据库,作业队列等,还有一些别的相关的后台进程。
? Oracle数据库用来存放表,索引,回滚段等数据的数据文件。
? 重做日志文件,记录在实例失败的时候回滚所需要的信息。
? 一些Server进程,用来服务来自客户进程的请求。如果配置成了共享服务器,那么就是Dispatcher(调度进程)和一些共享的Server进程为客户请求服务。
? 一个Listener,用来监听来自外部客户机的请求。
数据文件和日志文件一般都是用操作系统的文件系统上的文件或者使用操作系统的裸分区来实现,在不同操作系统都是一样的。但是Oracle的内存结构和进程结构在Windows平台上和别的平台有些区别。
在Unix下面,每个Oracle进程都是一个单独的Unix进程,包括Oracle后台进程和Oracle Server进程。SGA存在于Unix的共享内存段里面。
下面这幅图表现了Unix下面Oracle的体系结构:
但是NT平台上的Oracle有些区别。Oracle充分利用了NT对线程的良好支持。下面的附图2里,我们可以比较一下Unix上的Oracle和NT上的Oracle的区别:
在几乎所有操作系统里面,一个进程是不允许操作别的进程的内存空间的,因此在Unix下面要配置共享内存。但是在NT里面,因为整个Oracle就是一个单独的进程,每个Oracle的进程在OS都表现为Oracle进程的线程,因此不同线程允许操作共同的内存空间。
在NT平台上,每个Oracle实例都是一个NT进程。在这个进城里面,包括了所有的Oracle进程,每个Oracle进程实际上以线程的形式出现。
NT平台上的Oracle采用NT的多个线程/一个进程地方式来实现Oracle。但是单个进程的模式决定了一个Oracle实例能够使用内存的数量。在NT4.0里面,每个进程能够寻址4GB的虚拟空间,但是有2G是保留作为操作系统预留的,Oracle最多也只能够使用2GB内存。
一眼看去,2G内存对于大多数进程应该是够用了,但是记住:这里Oracle不但要存放SGA,还要存放所有的会话信息等。在NT4里面,有两个办法可以考虑:使用NT企业版,这样,可以设置操作系统只保留1GB空间,Oracle可以寻址3Gb,或者使用Alpha版本的NT系统。
Oracle的多线程服务器模式可以让很多个Client进程和少数共享Server进程通信,这样就大大减少了Oracle的服务器进程,从而减少了对内存的需求。NT平台的Oracle8开始支持多线程服务器。如果进一步采用Connection Pool和Concentrating技术,可以更加减少对内存的需求。
在Windows2000里面,应用程序的可寻址空间达到了32GB,这对于绝大多数的Oracle应用,都是足够了。
启动和关闭
在Unix环境下,我们通常使用dbstart/dbshut, svrmgrl 或者sqlplus来启动/关闭。在Oracle启动的时候,Oracle启动实例,Mount数据库,Open数据库,然后Oracle会自动daemonize ,成为后台进程,和登陆会话脱离,这样,当用户注销掉之后,Oracle仍旧继续运行。
但是在Windows平台下,需要用户注销之后,Oracle仍旧能够运行,Oracle必须注册成为NT的一个服务。NT下面的Oracle主要包含下面这些关键服务:
? OracleServicesid. 这个服务定义了NT机器上的一个Oracle实例。一般格式是OracleService%SID%。比如我的SID是ABC,那么相应的服务名字就是OracleServiceABC。只有启动这个服务,才能够进一步启动Oracle实例,Mount和Open数据库。但是也可以设置成实例自动Open数据库。
? OracleStartsid. 这个只是在Oracle8版本里面才出现的。在Oracle8i里面,这个服务和OracleServiceSid合并了。启动这个服务相当于就是执行了一个启动数据库的脚本。
? OracleTNSListener.这个时Oracle的监听进程。一般一个默认Listener就够用了。如果设置了别的listener 名字,就会产生相应的服务。
如果希望Oracle能够自动启动,可以设置相应服务属性为Auto。
net start OracleServiceGDB1
net start OracleStartGDB1
net start OracleTNSListener80
我们可以通过oradim这个工具来创建,删除,编辑,启动和停止OracleService服务。
但是我们一般建议使用svrmgrl或者sqlplus来关闭相应的服务。这是因为在低版本的Oracle里面,在NT一个级别停止Oracle服务,相当于在Oracle里面执行了shutdown abort,这是很不规范的操作。虽然绝大多数情况下,Oracle也都是能够自动恢复的,但是这个不是Oracle推荐的关闭数据库的方法。
从Oracle8和8i开始,Oracle添加了注册表参数:ora_shutdown或者ora_<sid_shutdown,Ora_shutdown_type, Ora_shutdown_timeout等参数来控制从NT级别关闭数据库默认采取得方式。比如我们设定了ora_<sid_shutdowntype=I, ora_<sid_shutdow_timeout=30,那么Oracle会先使用shutdown immediate来关闭 ,如果过了30秒还没有关闭成功,NT使用shutdown abort来关闭数据库。
多个Oracle版本共存时候的考虑
在Unix下面管理多个版本的Oracle相对容易,我们只需要把不同的Oracle软件安装到不同的Oracle_HOME下面,然后切换的时候,指定环境变量$ORACLE_HOME就可以了。
在NT下面,其实也差不多。不同的是NT默认使用注册表下面的键值:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ORACLE_HOME来记录信息。
如何进行备份
和Unix上面的Oracle备份一样,我们同样有很多种可选的备份方案:冷备份,OS 热备份,exp备份,Rman备份等。对于exp和冷备份,在Unix和NT上没有什么区别。
NT的备份工具可以备份到磁带,Oracle的ocopy只能够备份到磁盘。因此如果使用OS备份,一般都需要有个中转地,让Oracle先备份到磁盘另外一个空间,再通过NT只待得备份工具拷贝到磁带上去。
或者可以用Rman和相应的备份软件(如Oracle捆绑的Legato)等实现直接备份到磁带。
定期实行备份
在Unix下面,我们通过crontab来实现定期的作业管理,同样,在Windows下面,我们也可以实现,通过AT或者计划任务。我们可以决定是只执行一次,还是一直执行等。
At的基本命令格式是:
At 时间 [/every:date] [/next:date] 时间是24小时格式的,date可以是每个月的1-31或者每星期的M,T,W,TH,F,S,SU。
例如,我们希望系统能够在每天下午三点进行归档:
at 15:00 /every:m,t,w,th,f,s,su cmd /c
c:\bin\archive.bat c:\logs\archive.log
当然,要实现定期执行程序,我们必须把Windows的Schedule Service服务启动。
进行性能检查
监视数据库的性能,诊断性能问题和性能上的瓶颈,从而对数据库进行性能优化,这是DBA的主要职责之一。虽然理论上来讲,在NT上和Unix上面进行性能调优的方法一样,但是实际使用的工具还是不一样的。
在Unix下面,我们一般通过vmstat, sar, top等工具来检查系统的整体性能和单独进程的情况。在NT下面,我们一般通过NT自带的进程管理器合性能监视器来检查服务器的整体性能。
NT的性能监视器可以检查系统范围内很多的总体情况,比如总体的CPU使用,内存使用,网络使用,磁盘等信息。也可以检查某个单独线程的信息。
作为NT平台上的Oracle DBA,必须对进程管理器和性能监视器非常熟悉。
Oracle还自己提供了接口,利用NT的性能监视器来管理和监视Oracle数据库的性能。
监控每个线程使用的CPU资源
虽然在NT的进程管理器里面可以看到究竟哪些进程占用了过多的资源,但是无法深入进程,看究竟是那个线程占用了过多的资源。