2009年5月6日星期三

在windows server 2003上配置DHCP服务器

一、DHCP常用术语
作用域:作用域是一个网络中的所有可分配的IP地址的连续范围。作用域主要用来定义网络中单一的物理子网的IP地址范围。作用域是服务器用来管理分配给网络客户的IP地址的主要手段。
超级作用域:超级作用域是一组作用域的集合,它用来实现同一物理子网中包含多个逻辑IP子网。超级作用域只包含一个成员作用域或子作用域的列表。超级作用域并不用于设置具体的范围。子作用域的各种属性需要单独设置。
排除范围:排除范围是不用于分配的IP地址序列。它保证在这个序列中的IP地址不会被DHCP服务器分配给客户机。
地址池:在用户定义了DHCP范围及排除范围后,剩余的地址组成了一个地址池,地址池中的地址可以动态地分配给网络中的客户机使用。
租约期:租约期是DHCP服务器指定的时间长度,在这个时间范围内客户机可以使用所获得的IP地址。当客户机获得IP地址时,租约被激活。在租约到期前客户机需要更新IP地址的租约,当租约过期或从服务器上删除则租约停止。
保留地址:用户可以利用保留地址创建一个永久的地址租约。保留地址保证子网中的指定硬件设备始终使用同一个IP地址。
选项类型:选项类型是DHCP服务器给DHCP工作站分配服务租约时分配的其他客户配置参数(不仅仅是分配IP地址)。经常使用的选项包括默认网关的IP地址,WINS服务器及DNS服务器的IP地址。DHCP管理器允许设置应用于服务器上所有范围的默认选项。大多数选项都是通过RFC2132预先设定好的。但用户可以根据需要利用DHCP管理器定义及添加自定义选项类型。
选项类:选项类是服务器进一步分级管理提供给客户的选项类型的一种手段。当服务器上添加一个选项类,该选项类的客户可以在配置时使用特殊的选项类型。在WINDOWS2000以上的版本中,客户机在与服务器对话时也能够声明类ID,而对于早期的DHCP客户机不支持类ID。选项类包括两种类型:服务商类和客户类。

二、DHCP工作原理
如果客户机被设置成从DHCP服务器获得IP地址,客户机利用机器上的DHCP客户服务来配置它的IP地址和其他配置信息。DHCP客户机使用两种不同的方法与服务器进行通信并获得配置信息。
1、第一次启动登录网络时的初始化租约过程。当DHCP客户机启动登录网络时: DHCP客户机在本地子网中首先发送DCHP discover(DHCP租约)信息,此信息以广播的形式发送,因为客户机现在不知道DHCP服务器的IP地址。 DHCP服务器收到DHCP客户机广播的DHCP discover信息后,它向DHCP客户机发送DHCP offer(DHCP 租约提供)信息,其中包括一个可租用的IP地址。 注:如果没有DHCP服务器对客户机的请求作出反应,则客户机无法获得IP地址,初始化失败。客户机从微软保留的B类网段169.254.0.0中挑选一个IP地址作为自己的IP地址,子网掩码为255.255.0.0。DHCP客户机利用ARP广播来确认自己所挑选的IP地址是否已背网络上的其他设备使用,如该IP地址已经被使用,则客户机再挑选另一个IP地址重新测试,最多可以重试10个IP地址。如果客户机挑选的169.254.0.0网段中的IP地址未被其他设备使用则它将这个地址分配给网卡使用。但客户机将在后台每隔5分钟发送4次DHCP discover信息,直到它收到DHCP offer 信息。 一旦客户机收到DHCP offer信息,它发送DHCP租约选择信息到服务器表示它将使用服务器所提供的IP地址。 DHCP服务器在收到DHCP租约选择信息后,即发送DHCP positive(DHCP 确认)信息,以确定此租约成立,且此信息中还包含其他DHCP选项信息。 客户机收到确认信息后,利用其中的信息配置它的TCP/IP属性,并加入到网络中。 注:当客户机请求的是一个无效的或重复的IP地址,则DHCP服务器会发送DHCP negative(DHCP拒绝)信息,客户机收到DHCP negative信息后,初始化失败。(客户机也可以主动发起请求,要求使用某一IP配置信息,而不用等待服务器分配给客户机IP配置信息。)
2、DHCP客户机更新租约的过程。客户机重新启动或租期到达50%时,客户机都需要更新租约,过程如下: 如果在启动客户机时租约仍然有效,客户机直接向提供租约的服务器发送请求,要求更新及延长现有地址的租约。 如果DHCP服务器收到请求,它发送DHCP确认信息给客户机,更新客户机的租约。 如果客户机无法与提供租约的服务器取得联系,则客户机尝试PING在租约中设置的默认网关。如果成功的PING到默认网关,则客户机认为它仍然在同一个网络中,它将继续使用现有的租约。在租期达到50%时,它在后台继续尝试更新租约,客户机一直等到租期到达87.5%时,客户机进入一种重新申请的状态,它向网络上所有的DHCP服务器广播DHCP discover 请求以更新现有的地址租约。如果无法成功的PING到默认网关,则客户机认为它已经被移动到一个没有DHCP服务的网络中,客户机则利用前面所说的自动分配IP的功能给自己分配一个IP地址,并继续会每隔5分钟发送4次DHCP discover信息。 如果有服务器响应客户机的请求,那么客户机使用该服务器提供的地址信息更新现有的租约。 如果租约过期或无法与其他服务器通信,客户机将无法使用现有的地址租约。 客户机返回到初始启动状态,利用前面所述的步骤重新获取IP地址租约
注:如果客户机正常关机时,会释放DHCP租约,非正常关机,是不会发送释放消息的。
3、DHCP/BOOTP中继代理 如果DHCP服务器与客户机分别位于不同的网段上,则用户的路由器必须符合RFC1542的规定,即必须具备DHCP/BOOTP Relay Agent(DHCP 中继)的功能。 Relay Agent 中继代理是一个把某种类型的信息从一个网段转播到另一个网段的小程序。DHCP Relay Agent是一个硬件或程序,它能够把DHCP/BOOTP广播信息从一个网段转播到另一个网段上。 工作过程: DHCP客户机在子网上广播DHCP discover消息,广播是将消息以UDP数据包的形式通过67端口发出的。 当中继代理接收到这个消息后,它检查包含在这个消息报头中的源IP地址,如果IP地址为0.0.0.0则中继代理用接收到广播的接口的IP地址替换它,然后将其转发到DHCP服务器所在的子网A上。 当在子网A中的DHCP服务器收到这个消息后,它开始检查消息中的网关IP地址是否包含在DHCP范围内,从而决定它是否可以提供IP地址租约。 如果DHCP服务器含有多个DHCP范围,消息中的网关IP地址被用来确定从哪个DHCP范围中挑选IP地址并提供给客户机。 DHCP服务器将它所提供的IP地址租约(DHCP offer)直接发送给中继代理,中继代理将这个租约利用广播的形式转发给DHCP客户机。
注意:如果为了提高容错性而在同一网段上使用两台DHCP服务器,在分配IP地址范围时要注意考虑到DHCP服务器平衡使用的因素,一般采用80/20的规则,即将所有可用的IP地址范围按8:2的比率分开,一台DHCP服务器提供80%的IP地址租约,另一台提供其他20%的IP地址租约。

例如:服务器 分配的地址范围 排除的地址范围服务器1 192.168.111.1~192.168.111.254 192.168.111.201~192.168.111.254服务器2 192.168.111.1~192.168.111.254 192.168.111.1~192.168.111.200
注意:在设置保留地址时,注意MAC地址的填写格式是数值之间没有任何分隔符。注意:如果在设置保留地址时,网络上有多台DHCP服务器存在,用户需要在其他服务器中将此保留地址 排除,以便其他客户机可以获得保留地址。
注意:WINSERVER2003的DHCP服务器中用户可以针对不同的对象设置选项,用户针对的对象包括默认服务器选项、作用域选项、类选项、保留客户选项。 服务器选项:这些选项的设置映像DHCP控制台窗口下该服务器下所有的作用域中的客户和类选项。 作用域选项:这些选项的设置,只影响该作用域下的地址租约 类选项:这些选项的设置,只影响被指定使用该DHCP类ID的客户机 保留客户选项:这些选项的设置只影响指定的保留客户。 它们的优先级: 保留客户选项>类选项>作用域选项>服务器选项

2009年3月30日星期一

database and instance startup and shutdown

oracle数据库在运行期间总存在一个与之对应的实例。当用户在服务器上启动数据库时,oracle将为数据库分配被称为系统全局区SGA的内存区,并启动一个或多个oracle进程。SGA与oracle进程被统称为oracle实例。构成实例的内存区及进程负责对数据库进行管理,并为用户提供服务。
当一个实例启动后,oracle将令此实例与指定的数据库共同工作。当数据库与实例关联后被称为已挂载的数据库(mounted database)。已挂载的数据库可以被打开(open),供授权用户访问。
在同一个服务器上可以同时运行多个实例,每个实例和一个与之相关的数据库共同工作。在应用了RAC的大型集群系统(cluster system)中,一个数据库可以挂载到多个实例上。
只有DBA能够执行启动实例及打开数据库的操作。当数据库处于打开状态时,DBA还能够执行停止(shutdown)操作令数据库进入关闭状态。当数据库处于关闭状态后,其中的数据不能被访问。
oracle将赋予满足以下条件的用户 管理员权限:
1、用户的操作系统权限,允许他以管理员的身份连接数据库
2、用户被授予了SYSDBA或SYSOPER权限,且数据库使用密码文件(password file)来对数据库管理员进行验证
当用户以SYSDBA权限连接数据库时,其所处的方案(schema)由SYS用户所有。而用户以SYSOPER权限连接数据库时,将处于public schema,SYSOPER权限是SYSDBA权限的一个子集。

在启动实例时,oracle需要读取初始化参数文件(initialization parameter file)或服务器参数文件(server parameter file)。这两个文件包含了一组供实例及数据库使用的配置参数。服务器参数文件能够持续地(persistent)存储系统的初始化参数。在实例运行期间对初始化参数所做的修改能够保存到服务器参数文件中,供下次实例启动时使用。
绝大多数的初始化参数的作用可以被分为以下三类:1、用于命名的参数,例如为文件命名
2、用于设限的参数,例如设定一个最大值
3、用于设定容量的参数,例如设定SGA的大小,这种参数被称为变量参数(variable parameter)
而其他的初始化参数则用于进行以下设定:
1、实例启动后与那个数据库共同工作
2、SGA中的内存结构能够使用多少内存
3、重做日志用完后进行何种操作
4、数据库控制文件的存储位置及文件名
5、数据库的撤销表空间名称

DBA可以通过调整变量参数(variable parameter)的值来提高数据库系统的性能。有些初始化参数可以在实例运行时使用ALTER SESSION或ALTER SYSTEM 语句动态地修改。如果没有使用服务器参数文件(server parameter file, spfile),使用ALTER SYSTEM语句对初始化参数的修改只对当前实例有效。管理员必须手工修改初始化参数文件(initialization parameter file)才能使这些修改在下次实例启动时仍然有效。我们可以使用DBCA自动创建一个初始化参数文件。

启动数据库并使其可以为所有用户提供服务需要三个步骤:
1、启动实例
2、挂载(mount)数据库
3、打开(open)数据库
我们可以通过SQL*PLUS的STARTUP语句或企业管理器(Enterprise Manager)来执行这三个步骤。

在Oracle启动实例时,首先需要从服务器参数文件或初始化参数文件中读取初始化参数,之后创建存储数据库信息的共享内存区SGA,最后创建后台进程。此时,构成实例的内存区及进程还没有和数据库产生关联。
管理员可以使实例以限制模式(restrited mode)启动,也可以将当前运行的实例切换到限制模式。运行在限制模式下的实例只允许具有RESTRICTED SESSION系统权限的用户连接到数据库

Oracle将数据库挂载(mount)到实例,以便实例和数据库共同工作。在挂载数据库时,实例首先需要找到并打开数据库控制文件(control file)。控制文件的名称及位置信息记录在参数文件的CONTROL_FILES参数中。接着oracle将读取控制文件获取数据库的数据文件(datafile)名及重做日志文件(redo log file)名。
此时,数据库还没有被打开,只有DBA才能访问数据库。当数据库处于挂载状态时,管理员可以进行维护操作。此时数据库的常规操作都是被禁止的。
spfile是实例的参数文件,control file是数据库的参数文件

备用数据库(standby database)是一个与主数据库(primary database)完全相同的副本,他能在发生灾难时保证系统的持续可用性(availablity)。备用数据库永远处于恢复模式(recovery mode)。为了构造一个备用数据库,DBA必须使用ALTER DATABASE语句使一个数据库以备份模式(standby mode)挂载,并将主数据库中产生的归档重做日志(archived redo log)加载到此数据库中。用户可以将一个备份数据库以只读模式(read-only mode)打开,作为临时的报表查询数据库。备份数据库不能以可读写状态(read/write mode)打开。

克隆数据库(clone database)是专供按时间点(point-in-time recovery)表空间功能使用的数据库副本。当用户按时间点恢复表空间时,需要将克隆数据库挂载(mount)并将其中的表空间恢复到期望的时间,之后将克隆数据库中被恢复的表孔吉爱你的元数据及数据文件复制到主数据库(primary database)

将已挂载的数据库打开就可以使此数据库正常工作。当管理员打开数据库时,oracle将打开所有联机的数据文件(datafile)及重做日志文件。如果数据库上次停止时某个表空间处于脱机状态,那么打开数据库时此表空间及相关的数据文件将依旧处于脱机状态。如果oracle在打开数据库时找不到所需的数据文件或重做日志文件,系统将返回错误信息。管理员必须从备份中恢复损坏或缺失的文件后,才能打开数据库。
如果数据库上次关闭时发生了异常情况(DBA终止了数据库实例或出现电源故障等),oracle将在数据库再次打开时自动地执行恢复操作。

当DBA打开数据库时,实例将请求一个或多个撤销表空间(undo tablespace)。DBA在实例启动时通过UNDO_MANAGEMENT初始化参数决定数据库运行于自动撤销管理模式(automatic undo management mode)或手工撤销管理模式(manual undo management mode)。可选的参数值为AUTO或MANUAL。当此值为AUTO时,实例将运行在自动撤销管理模式下。参数模式为MANUAL。
1、如果用户正使用撤销表空间(undo tablespace),那么数据库就运行在自动撤销管理模式下。oracle 建议采用此模式
2、如果用户正使用回滚段(rollback segment)管理撤销空间,那么数据库运行手工撤销管理模式下

DBA能够以只读模式打开数据库,防止数据被用户事务修改。在只读模式下,只有只读事务才能访问数据库,只读事务不能向数据文件及重做日志文件写入信息。
在只读模式下,其他文件(例如控制文件、操作系统监控文件audit trail、跟踪文件trace file 及告警日志alert log)依然可以被写入。用于排序操作的临时表空间依然可用。但是用户不能在只读模式下将永久表空间(permanent tablespace)脱机。作业队列(job queue)在只读模式下无法使用。
在只读模式下,依旧可以执行数据库恢复,也可以执行改变数据库状态的操作(只要此类操作不产生重做数据即可)。例如,在只读模式下:
1、可以令数据文件联机或脱机
2、可以恢复脱机的数据文件与表空间
3、控制文件可以用于记录数据库状态变化

关闭一个数据库及相关实例需要三个步骤:
1、关闭数据库
2、卸载数据库
3、停止实例

当DBA关闭数据库时,oracle将SGA内的数据库数据及恢复数据分别写入数据文件及重做日志文件。之后,oracle关闭所有联机的数据文件及重做日志文件。(脱机表空间的脱机数据文件已经处于关闭状态,当用户再次打开数据库时,脱机的表空间及其中的数据文件将保持脱机状态)此时数据库已经处于关闭状态,不能执行一般操作。在数据库已经关闭但仍然挂载时,控制文件还是处于打开状态。
在紧急情况下,DBA可以终止一个处于打开状态的数据库的实例,以便立即关闭(close)并完全停止(shutdown)一个数据库。这个过程很快,因为将SGA区内各缓存的数据写入磁盘的步骤被省略了。数据库重新打开时oracle将自动执行恢复操作。

当数据库被关闭后,oracle将卸载数据库,使之与实例分离。此时,实例依旧存在于计算机的内存中。数据库被卸载后,oracle将关闭数据库的控制文件。

停止实例是停止数据库的最后一个步骤,当DBA停止实例时,SGA将被从内存中清除,后台进程将被终止。
在异常情况下,可能出现实例停止(shutdown)不完全的情况:内存中可能依然存在未被清除的内存结构,或者某些后台进程未被终止。如果系统中存在未被完全清除的实例,此实例再次启动时将会出错。在此种情况下,DBA可以采用两种方法强制启动实例,第一种方法是彻底清除之前的实例(removing the remnants of the previous instance) 并启动新实例。第二种方法就是在SQL*PLUS或企业管理器中执行SHUTDOWN ABORT语句。

2009年3月28日星期六

进程结构process architecture

每个连接到Oracle的用户需要运行两个模块才能访问Oracle实例:
1、应用程序或Oracle工具:数据库用户需要运行数据库应用程序(如一个预编译的程序)或Oracle工具(例如SQL*PLUS),向Oracle数据库服务器提交SQL语句。
2、Oracle数据库服务器模块:为用户提供服务的Oracle数据库程序,负责解释执行应用程序提交的SQL语句。
这两种模式都是以进程的形式运行的。

Oracle系统中的各种进程可以被分为两大类:
1、执行应用程序或Oracle工具代码的用户进程(user process)
2、执行Oracle数据库服务器代码的Oracle进程(oracle process)。其中包括服务进程(server process)和后台进程(background process)。

当用户运行一个应用程序或oracle工具时,Oracle将创建一个用户进程(user process)来运行用户的应用程序。

连接(connection)与会话(session)这两个概念均与用户进程(user process)密切相关,但两者有有不同的含义:
连接是用户进程和oracle实例间的通信通道(communication pathway)。这个通信通道是通过进程间的通信机制(interprocess communication mechanisms)(在同一个计算机上运行用户进程和oracle进程)或网络软件(network software)(当数据库应用程序与oracle服务器运行在不同的计算机上时,就需要通过网络来通信)建立的。
会话是用户通过用户进程与oracle实例建立的连接(这里的连接与上面的连接不同,主要指用户和数据库间的联系)。Oracle数据库中的同一个用户可以同时创建多个会话。
当系统没有运行在共享服务模式下时,oracle为每个用户会话创建一个服务进程(server process)。而当系统运行在共享服务模式下时,多个用户会话可以共享同一个服务进程。

Oracle进程主要分为两种:服务进程(server process)和后台进程(background process)

服务进程:oracle需要创建服务进程(server process)来处理连接到实例的用户进程提交的请求。当应用程序与oracle服务器运行在同一计算机时,某些用户进程可以和服务进程合并为一个进程,以便减少系统开销。但是当应用程序与oracle服务器运行在不同的计算机时,用户进程必须通过一个服务进程与oracle通信。
为用户应用程序创建的服务进程(或用户/服务进程合并后的服务进程部分)可以完成以下工作:
1、解析、运行应用程序提交的SQL语句
2、如果数据在SGA中不存在,则将所需的数据块从磁盘上的数据文件读入SGA的数据缓存区(shared database buffer)
3、以应用程序能理解的形式返回SQL语句的执行结果

后台进程:为了实现为多用户提供服务且保证系统性能,在一个多进程oracle系统(multiprocess oracle system)中,存在多个被称为后台进程的oracle进程。
一个Oracle实例中可以包含多种后台进程,这些进程不一定全部出现在实例中。系统中运行的后台进程数量众多,用户可以通过V$BGPROCESS视图查询关于后台进程的信息。Oracle实例中可能运行的常见后台进程有:
数据写入进程DBWn
日志写入进程LGWR
检查点进程CKPT
系统监控进程SMON
进程监控进程PMON
恢复进程RECO
作业队列进程
归档进程ARCn
队列监控进程QMNn
1、数据写入进程DBWn
数据写入进程(database writer process)的功能是将数据缓存区的内容写入数据文件。DBWn负责将数据缓冲区(database buffer cache)内修改过的缓存区(即dirty buffer)写入磁盘。当系统中数据修改操作比较频繁时,DBA可以配置额外的数据写入进程(DBW1到DBW9及DBWa到DBWj)来提高数据写入的性能。
注意:buffer 与cache的区别
注意:在单处理器系统(uniprocessor system)中,额外的数据写入进程并不能提高系统性能。

2、日志写入进程LGWR
日志写入进程(log writer process)负责对重做日志进行管理,一一将重做日志缓冲区(redo log buffer)内的数据写入磁盘上的重做日志文件中。LGWR进程将上次写入之后进入缓冲区的所有重做条目(redo entry)写入磁盘中。
注:重做日志缓冲区是一个循环使用的缓冲区(circular buffer)。LGWR进程将重做日志缓冲区一组连续的缓冲区写入磁盘。LGWR进程写入的内容有:
提交记录(commit record)(当用户进程提交一个事务时的提交记录)
重做日志缓冲区
注:当发生下列情况下,LGWR也会将重做日志写入磁盘:
每三秒写入一次;当重做日志缓冲区的使用容量超过总容量的三分之一;当DBWn进程向磁盘写入脏缓冲区时(且相关的重做日志还没有写入磁盘)

3、检查点进程CKPT
当一个检查点事件发生时,oracle需要更新所有数据文件的文件头来记录检查点事件的详细信息。这个工作是由CKPT进程来完成的。但是将数据块写入数据文件的不是CKPT进程,而是DBWn进程。

4、系统监控进程SMON
实例启动时如有需要,系统监控进程(system monitor process)将负责进行恢复(recovery)工作。此外SMON还负责清除系统中不再使用的临时段(temporary segment),以及为数据字典管理的表空间(dictionary managed tablespace)合并相邻的可用空间扩展(extent)。在实例恢复过程中,如果由于文件读取错误活所需文件爱你处于脱机状态而导致某些异常终止的事务未被恢复,SMON将在表空间活文件恢复联机状态后再次恢复这些事务。SMON将定期检查系统中是否存在问题。系统内的其他进程需要服务时也能够调用SMON进程。

5、进程监控进程(PMON)
当一个用户进程失败后,进程监控进程(process monitor process)将对其进行恢复。PMON进程将清除相关的数据缓冲区(database buffer cache)并释放被此用户进程所使用的资源。
PMON进程会周期性的对调度器(dispatcher)和服务进程(server process)进行检查,重新启动停止运行的进程(不包括oracle有意停止的进程)。PMON进程还负责将实例和调度器进程的信息注册到网络监听器(network listener)
同SMON一样,PMON进程也会定期地检查系统中是否有问题需要处理,当系统内的其他进程需要服务时也能够调用PMON进程。

6、恢复进程RECO
恢复进程(recovery process)是在分布式数据库环境(distributed database configuration)中自动地解决分布式事务(distributed transaction)错误的后台进程。一个节点(node)上的RECO进程能够连接到出现了不可信的分布式事务(in-doubt distributed transaction)的数据库。当RECO进程重新连接到与不可信的事务相关的数据库后,它将负责对此事务进行处理,并从相关数据库的活动事务表(pending transaction table)中移除和此事务有关的数据。
如果RECO进程无法连接到远程数据库,她将在一定时间间隔后尝试再次连接。每次重新连接间的时间间隔会以指数级的方式增长。只有实例允许分布式事务时才会启动RECO进程。实例中不会限制并发的分布式事务的数量。

7、作业队列进程
作业队列进程(job queue process)的功能是进行批处理(batch processing)。这种进程用于运行用户的作业(job)。这种进程能够提供作业调度服务(schedular service),在oracle实例中调度PL/SQL语句及存储过程。用户只需提供作业的开始时间及调度间隔,作业队列进程就能够按用户的设定调度作业。
作业队列进程可以被动态管理,这样用户需要时就能够使用更多的作业队列进程。当一个作业队列进程进入空闲状态(idle)后,其使用的资源将被释放。

8、归档进程ARCn
归档进程(archiver process)发生在日志切换(log switch)时将重做日志文件复制到指定的存储设备中。只有当数据库运行在ARCHIVELOG模式下,切自动归档功能被开启时,系统才会启动ARCn进程。
一个oracle实例中,最多可以运行10个ARCn进程(0-9)。如果当前所有的ARCn进程不能满足工作负载的需要,LGWR进程会启动新的ARCn进程。当LGWR进程启动新的ARCn进程时,告警日志(alter log)会进行记录(但是最多只能运行10个ARC进程)。

9、队列监控进程QMNn
队列监控进程(queue monitor process)是提供oracle工作流高级队列(oracle streams advanced queuing)使用的可选的进程,用于监控消息队列。队列监控进程和作业队列进程(job queue process)与其他oracle后台进程的区别在于,这两类进程出错不会导致整个实例出错。

2009年2月24日星期二

RPM常用命令

RPM是一个很强大的包管理工具,能被用来建立、安装、查询、检查、升级、或者删除独立的软件包。包一般有两种,一种包含可以直接安装的被封装了的软件的二进制文件;一种包含源码以及编译成二进制包的必须的编译方法(recipe 制作法)
下面这些基本模式必须被选择:
1、查询:Query;2、检查:Verify;3、签名检查:Signature Check;4、安装/升级/刷新:Install/Upgrade/Freshen;5、卸载:Uinstall 6、初始化数据库Initialize Database;7、 重建数据库Rebuild Database;8、 放弃 Resign; 9、添加签名Add Signature; 10、设置所有者和组Set Owners/Groups;11、显示查询标签 Show Querytags;12、显示配置 Show Configuration。
一、如何安装或升级一个安装包
1、rpm -i package.rpm
这里的-i安装参数,package.rpm是你要安装的RPM。我们还可以增加参数,比如:
rpm -ivh package.rpm,其中-v指的是详细信息(verbose 详细的),-h指的是哈希标记。它会在解包的过程中在屏幕上输出#,然后安装这个包。我们可以可以使用--percent取代-h。
2、rpm -Uvh new-package.rpm
注意:这里的-U升级选项,只是简单的删除旧的包,安装新的包。-Uvh也可以用于安装包,如果这个包不存在,那么会在系统中安装新的包。
3、rpm -Uvh --oldpackage Samba-old-version.rpm
这里的--oldpackage选项,表示Samba包是一个比较已经安装的包要旧。这个命令会移除已经安装好的包,然后安装这个比较旧的包。
二、如何移除一个包,查询相关联的包
1、rpm -e package
-e是个擦除参数,会将包package.rpm移除。
2、rpm -q --whatrequires kernel
这里例子中,会输出依存于kernel的包
三、查询一个已经安装了的包
1、rpm -q yum
这里的-q参数,表示我们在运行一个查询。如果这个yum包已经被安装,那么上面这个命令会返回一个true(Shell变量$?=0),也可以使用带版本号的全名:
rpm -q yum-2.0.4-2
2、rpm -qa
使用-a,来查询系统中已经安装了的所有包,通过管道符,可以查询某个包是否被安装:
rpm -qa grep -i python
grep命令中的-i选项,表示大小写不敏感。
3、rpm -qpi vnc-server-4.0-0.beta4.3.2.i386.rpm
其中-p参数表示查询的是一个RPM包,-i用来表示查询模式,这里代表info。
四、列出安装包依存的包
1、rpm -qpR package.rpm
-R参数代表Requires。-p表示查询的是一个包
2、rpm -qR kernel
查询一个已经安装了的包,R代表requires。
五、查找某个目录是由哪个包创建的
1、rpm -qf /usr/bin/smbmount
这个命令经常用在查询某个程序是那个RPM包的一部分,或者当我们只知道需要的文件或程序,但是不知道包是哪个的时候。
六、列出RPM包将要安装的文件
1、rpm -ql cpp
这个命令用来查询被安装了的包cpp中的内容。-l表示列表list。
2、rpm -qpl cpp-3.3.2-1.i386.rpm
-p表示查询的是一个RPM包。
七、模拟运行某个RPM命令的时候,会发生什么
rpm -ivh --test new-kernel.rpm
可以为某个命令添加--test,来测试运行这个命令时会发生什么。当我们要进行危险的(critical)升级或安装时,可以用这个来查看在安装的过程中会发生什么问题。
通过使用上面的命令,我们可以发现在安装新内核的过程中会发生什么问题(比如空间的可用性、依赖性问题等)。如果什么都没发生,可以尝试添加-w参数。如果所有都没有问题,我们能够看到Preparing这样的输出。
八、安装一个新的内核,同时保留已经被安装的旧的那个
rpm -Uvh --repackage new-kernel.rpm
其中--repackage是一个备份选项,这样我们就可以重新安装在升级进程中,被移除的旧版本的包。上面的命令就是升级内核,并且将现在已经安装的内核进行备份。
备份通常存在/var/spool/repackage目录下,如果新安装的内核有问题,我们可以使用下面的命令,将内核恢复到以前的版本:
rpm -Uvh --oldpackage /var/spool/repackage/old-kernel.rpm
注:--repackage用来将包进行备份,常用在当我们要升级或移除一个包的时候。例如下面的例子:
rpm -Uvh --repackage new-package.rpm
rpm -e --repacakage new-package.rpm
备份包通常保存在/var/spool/repackage目录下。然后我们可以使用下面的命令来进行恢复旧版本:
rpm -Uvh --oldpackage /var/spool/repackage/old-package.rpm
九、从一个SRPM中使用rpmbuild命令创建一个RPM包
当我们想在一个默认的包中,进行自定义的一些修改的时候(比如编译参数、文件路径、版本等)特别有用。为了做到这些,我们首先安装想使用的RPM的源码。这些文件一般以src.rpm结尾。
安装了以后,我们可以对这些.spec文件做一些修改。然后开始建造RPM包。注意:任何在.spec文件上的改变或错误都会影响整个建造进程。要对多个%define条目进行注意,甚至也要留意那些以#注释掉的注释部分(代码中的这些变得可用)。文件.spec通常在/usr/src/redhat/SPECS目录中。
使用命令:
rpmbuild -ba path/to/package.spec
上面的命令会在目录/usr/src/redhat/RPMS/arch中创建RPM包,这里的arch会根据系统和建造进程配置的不同而不同。如果一切顺利,我们就可以安装这个被生成的包了。

2009年2月21日星期六

Linux下,安装oracle 10gR2的准备工作(二)

六、配置内核参数
具体需要的参数参见:http://download.oracle.com/docs/cd/B19306_01/install.102/b15660/pre_install.htm#sthref264
输入命令查看内核参数的值:/sbin/sysctl -a
如果内核参数的值与要求的值不通,可以使用下面的方法来进行修改:
使用文本编辑器,创建或编辑/etc/sysctl.conf,对相应的值进行修改。
注:如果当前值比要求的值要大,那就使用较大的值
当我们指定了/etc/sysctl.conf文件中参数的值,重启系统后,该值仍然存在(they persist)
为oracle用户设定shell限制
为了提高系统中软件的性能,我们必须为oracle用户增加shell限制:
最大数量的打开文件说明词(the maxmum number of open file discriptors),在limits.conf文件中的条目(item)是nofile,硬限制(hard limit)是65536
对某一个用户的最大可用进程数(maximum number of processes available to a single user),在limits.conf文件中的条目是nproc,硬限制为16384
为了增加这些shell限制:
将下面这几行添加到/etc/security/limits.conf文件中:
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
在/etc/pam.d/login文件中,添加或修改以下行:
session required /lib/security/pam_limits.so
session required pam_limits.so
根据oracle用户的默认shell,将下面的内容,添加进默认的shell启动文件:
添加进文件/etc/profile
fi [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh"]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi

七、确定需要的软件目录
1、oracle基础目录(oracle base directory)
oracle基础目录是oracle软件安装的最高级的目录,类似在WINDOWS环境下的C:/ORACEL目录,在linux环境下,建议使用跟下面这个类似的目录:
/mount_point/app/oracle_sw_owner
在这个例子中:
mount_point是将要包含oracle软件的文件系统的挂载点目录
oracle_sw_owner是oracle软件拥有者的系统用户名,例如oracle
注:women可以为多个安装使用同一个oracle基础目录,或者我们可以为每个安装创建单独的目录。但是如果在同一个系统中,使用不同的用户名进行安装,每个用户必须创建单独的oracle基础目录。下面的例子可以同时存在同一系统中:
/u01/app/oracle
/u01/app/orauser
/opt/oracle/app/oracle
注:不管我们是创建一个oracle基础目录还是使用一个已经存在的,我们必须将ORACLE_BASE环境变量的值设定为该目录的完全路径。
2、oracle存盘目录(oracle inventory directory)
oracle存盘目录(oraInventory)存储了系统中安装的所有软件的目录,它被所有oracle软件共享,所有oracle软件都会请求这个 目录。第一次安装时,OUI会提示指定这个目录,oracle建议使用路径:oracle_base/oraInventory
OUI会为自动创建我们指定的目录,并为它分配正确的用户、组和权限。
注:所有的oracle软件都会依赖这个目录,应该经常备份这个目录。此外除非已经完全删除了所有oracle软件,否则不要删除这个目录
3、oracle主目录(oracle home directory)
oracle主目录,是我们选择安装某个oracle产品的目录。我们必须将不同的oracle产品或者相同oracle产品的不同版本安装到不同的目录 中。当我们运行OUI的时候,它会提示我们指定一个目录。这个目录必须是oracle基础目录的子目录。oracle要求我们使用类似下面的目录作为 oracle主目录:oracle_base/product/10.2.0/db_1
OUI会创建我们指定的目录,并且为其设置正确的用户、组、权限。
注:在安装的过程中,我们不能将一个已经分配了权限的已经存在的目录,作为oracle的主目录。如果我们这么做了,在安装的过程中,会由于用户所有权限的问题发生错误。

八、确认或创建oracle基础目录
我们可以选择创建一个oracle基础目录,即使其他oracle基础目录已经存在
1、确认一个已经存在的oracle基础目录
已经存在的oracle基础目录可能不是我们建议的目录,如果确认有一个已经存在的oracle存盘目录或者oracle主目录,我们就可以使用下面的方法确认到oracle的基础目录:
确认一个已经存在的oracle存盘目录,输入下面的命令来查看oraInst.loc文件的内容:
more /var/opt/oracle/oraInst.loc
如果oraInst.loc文件存在,那么这个命令的输出类似下面:
inventory_loc=/u01/app/oracle/oraInventory
inst_group=oinstall
inventory_loc参数指定了oracle存盘目录(oraInventory),oraInventory目录的父目录就是一个典型的oacle基础目录。在这个例子中,/u01/app/oracle就是一个基础目录。
确定已经存在的oracle主目录
输入下列命令来查看oratab文件的内容:
more /etc/oratab
如果oratab文件存在,它还包含类似下面的这些行:
*:/u03/app/oracle/product/10.2.0/db_1:N
*:/opt/orauser/infra_904:N
*:/oracle/9.2.0:N
每一行的目录路径指定了一个oracle主目录。如果某个你想使用的oracle软件拥有者的名字,在某个目录路径的末尾,那这个路径就是一个可用的路径。如果我们打算以oracle用户进行安装,那么我们可以使用下面这两个目录中的一个:
/u03/app/oracle
/oracle
注:如果可能,选择类似第一个的路径(/u03/app/oracle),这个符合规范。
在决定使用一个已经存在的oracle基础目录进行安装以前,必须确认它满足以下条件:
它不应该与操作系统在同一个文件系统中
它必须有足够的磁盘空间:如果基础目录只安装软件文件,它至少应该有3G;如果这个目录同时装有软件文件和数据文件,那么要求至少为4G。
注:在生产数据库中,不建议将数据文件和软件文件装到通一个目录下。
使用命令:df -h oracle_base_path,来查看文件系统中的剩余空间。
如果我们想使用一个已经存在的oracle基础目录,我们可以配置oracle的用户环境,并将ORACLE_BASE环境变量的值指向我们选择的目录。
如果oracle基础目录不存在,我们想创建一个,那么按照下面的介绍。
2、创建一个oracle基础目录
在创建以前,首先要确认有足够的磁盘空间,具体需求按照上面所述。
确认合适的文件系统:
使用df -h 命令查看每个被挂在的文件系统上的剩余磁盘空间
找到一个有合适空闲空间的文件系统,这个文件系统必须是一个本地的文件系统或者一个集群文件系统或者是一个在一个被确认(certified)NAS设备上的NFS文件系统。
记录你想使用的文件系统的挂载点的名字。
创建oracle基础目录,指定正确的拥有者,并且赋予合适的权限:
使用下面的命令来创建要求的子目录,并且确定合适的拥有者、组、以及权限:
mkdir -p /mount_point/app/oracle_sw_owner
chown -R oracle:oinstall /mount_point/app/oracle_sw_owner
chmod -R 755 /mount_point/app/oracle_sw_owner
例如:指定挂载点为/u01,oracle软件的所有者的用户名为oracle,那么我们建议的目录路径为:/u01/app/oracle
然后当配置oracle的用户环境变量时,将ORACLE_BASE环境变量指向我们创建的oracle基础目录。

九、选择数据库文件和恢复文件的存储选项
oracle数据库文件包括:数据文件、控制文件、重做日志文件、服务器参数文件和密码文件
对所有的安装而言,我们必须为数据库文件选择存储选项。如果我们想使用为安装使用自动备份功能,那么我们还必须为我们想使用的恢复文件(即flash recovery area),不必为每个文件类型使用相同的存储选项(即可以使用相同的,也可以使用不同的)。
数据库文件支持的存储选项有:文件系统(file system)、自动存储管理(automatic storage management)、裸设备(raw device)
恢复文件支持的存储选项有:文件系统、自动存储管理,但是不支持裸设备
选择存储选项时的建议:
我们可以为每个文件类型选择它所支持的储存选项的任意组合
oracle建议我们为数据库文件和恢复文件选择自动存储管理

十、为数据库文件和恢复文件创建目录
1、选择文件系统来放置数据库文件
如果选择将数据库文件放到文件系统中:
OUI建议的默认路径是oracle基础目录的子目录,为了提高可用性和可靠性,建议使用一个做过RAID的设备。
如果想使用多个文件系统,那么需要为连接到数据库的每个单独的物理磁盘选择文件系统
如果想在安装过程中创建一个预配置的数据库,那么我们选择的这个文件系统必须至少有1.2GB的剩余空间。对生产数据库而言,必须根据实际需要选择空间的大小,以满足实际需要
为了优化性能,我们选择的文件系统必须在一个只被数据库使用的物理设备上。
此外,还必须保证oracle用户拥有对这个目录的写权限。
2、选择文件系统来放置恢复文件
只有在安装过程中启用了自动备份,我们才必须为恢复文件选择一个存储区域。
为了防止由于磁盘的损坏导致数据库文件和恢复文件都不可用,我们建议将数据库文件和恢复文件放到不通的物理磁盘上。
我们选择的文件系统必须有至少2GB的空余磁盘。
这个磁盘空间需求,是为flash 恢复区域分配的默认磁盘限额,是由DB_RECOVERY_FILE_DEST_SIZE初始化参数指定的。
如果你选择自定义安装类型或者增强型数据库配置选项,那么我们可以指定不同的磁盘配额值。在创建了数据库以后,我们可以使用oracle企业管理网格控制活数据库控制指定不同的值。
OUI为flash恢复区域分配的默认路径,建议选择oracle基础目录的子目录,在生产环境下不应该选择默认路径。
oracle用户必须有向我们指定的路径中写文件的权限。
3、创建需要的目录
为数据库文件和恢复文件,在单独的文件系统上创建目录,最好是在oracle 基础目录下:
使用df -h命令来查看每个被挂载的文件系统的剩余磁盘空间
对数据库文件而言,可以选择一个至少有1.2GB剩余磁盘空间的单独的文件系统,或者选择几个文件系统,这几个文件系统的剩余磁盘空间的总和为1.2GB。
对恢复文件而言,选择一个至少2.4GB剩余空间的文件系统。
如果想在一个文件系统中,安装不止一种类型的文件,那么将这些需要的磁盘空间加起来(即需要1.2G+2.4G)
记录我们想使用的文件系统的目录的挂载点
输入类似下面的命令,来创建需要的子目录,并为其设置合适的用户、组、以及权限:
数据库文件目录:
mkdir /mount_point/oradata
chown oracle:oinstall /mount_point/oradata
chmod 775 /mount_point/oradata
恢复文件目录(flash recovery area):
mkdir /mount_point/flash_recovry_area
chown oracle:oinstall /mount_point/flash_recovery_area
chmod 775 /mount_point/flash_recovery_area

Linux下,安装oracle 10gR2的准备工作(一)

一、检查硬件需求
至少有1024MB的物理内存
SWP空间的大小:
如果内存为1024MB到2048MB大小,则SWAP空间至少为1.5倍的内存大小
如果内存为2049MB到8192MB大小,则SWAP空间至少与内存大小相同
如果内存大于8192MB,那么SWAP空间至少为内存的0.75倍
/tmp目录下至少有400MB的磁盘空间
为oracle预留1.5GB到3.5GB磁盘空间,根据安装类型不同
为使用文件系统存储的预配置的数据库保留1.2GB的磁盘空间
这步中用到的命令有:
1、查看物理内存大小:grep MemTotal /proc/meminfo
2、查看配置的SWAP空间的大小:grep SwapTotal /proc/meminfo
3、查看/tmp目录下,可用的磁盘空间:df -k /tmp
如果/tmp目录下的磁盘空间不够,可以使用以下步骤:从/tmp目录中删除不必要的文件以满足空间需求;在设置oracle用户的环境时,设置TMP和TMPDIR环境变量;扩展包含/tmp目录的文件系统
4、查看系统中的空闲磁盘空间:df -k
5、查看处理器的类型,以安装正确的版本:grep "model name" /proc/cpuinfo

二、检查软件需求
1、查看操作系统的版本:cat /etc/issue
2、产看操作系统的内核版本:uname -r
3、查看需要的安装包时候已经被正确的安装:rpm -q package_name

三、检查网络配置
一般情况下,安装数据库的电脑已经被连接到了网络,有本地的存储,有显示器,有CD-ROM或者DVD驱动器。
1、配置名字解析
当我们运行OUI(oracle universal installer)的时候,如果名字解析没有被设置,可能会报错。为了避免这个错误,在开始安装前,我们要确定,主机名仅仅通过/etc/hosts文件来被解析
为了确认主机名只通过/etc/hosts文件来解析:
通过检查nsswitch.conf文件中的主机文件条目,来查看/etc/hosts文件时候被用于名字解析:
cat /etc/nsswitch.conf | grep hosts
使用hostname命令来确认,主机名已经被设置:hostname;命令的输出应该类似:myhost.mycount.com
使用domainname命令,来确认域名没有被动态设置:domainname;使用这个命令应该不输出任何结果
确认主机文件包含完整主机名(fully qualified host name),可以使用如下命令:cat /etc/hosts | grep 'eval hostname'
这个命令的输出应该包含一个本地主机的完整主机名。例如:
192.168.100.16 myhost.us.mycompany.com myhost
127.0.0.1 localhost localhost.localdomain
如果主机文件中没有包含完整主机名,那么打开这个文件,做必要的修改。
2、在多网卡的电脑上安装(installing on multihomed computers)
因为改电脑上绑定了多个IP,每个IP地址对应了一个主机名,此外,我们可以为主机名设置别名。默认情况下,OUI使用ORACLE_HOSTNAME环境变量的设置来寻找主机名,如果在多网卡的电脑上安装oracle,同时没有设置ORACLE_HOME,这个时候,OUI会将/etc/hosts文件中的第一个条目作为主机名。
注:必须保证,客户端能够通过主机名或者是主机名的别名来访问到电脑,可以通过从客户端电脑上使用短名字(仅仅主机名)和全名(主机名和域名)来ping服务器,这个两种都应该是成功的。
使用下面的方法来设置ORACLE_HOSTNAME环境变量:
例如,如果完整主机名(fully qualified hostname)是somehost.us.acme.com,那么输入下面的命令:
ORACLE_HOSTNAME=somehost.us.acme.com
export ORACLE_HOSTNAME
注:如果一个电脑只有一个IP地址,但是有多个别名,名字解析服务会将这些别名中的任何一个解析到同一个电脑上,在这种电脑上安装数据库之前,将ORACLE_HOSTNAME环境变量设置成我们想使用的主机名。

四、创建需要的操作系统用户组和用户
根据是否是第一次在这个系统上安装数据库,我们可能需要创建几个用户组和用户:
OSDBA用户组(dba):如果是第一次在这个系统上安装数据库,我们必须创建这个用户组,它定义了拥有数据库管理权限(SYSDBA权限)的用户账户。这个组的默认名字是dba。如果我们想自定义组名,而不是使用默认的组名,我们必须选择自定义安装类型,来安装软件,或者使用一个不是dba用户组(即非默认用户组)的用户,来打开OUI。在这种情况下,OUI会提示你指定这个组的组名。
OSOPER用户组(oper):这是一个可选的组,如果我们想创建一个拥有某些被限制了的数据库管理权限(SYSOPER权限)的用户组。默认情况下,OSDBA用户组中的成员也拥有OSOPER权限。
没有权限的用户(unprivileged user):必须确认有无权限用户nobody的存在,并且在安装完成以后,必须保证这个nobody用户拥有外部工作的运行能力(the nobody user must own the extenal jobs executable)
接下来创建安装时使用的操作系统用户组和用户:
oracle目录组(the oracle inventory group oinstall):如果第一次安装数据库,那必须创建这个用户组。这个用户组通常的名字是oinstall,这个组拥有oracle的详细目录(inventory),这是安装到系统中的所有oracle软件的目录(catalog)
注:如果系统中已经安装了oracle软件,已经存在的oracle目录组必须是我们用来安装新oracle软件的主要用户组。
oracle软件拥有着用户(一般是oracle):第一次安装oracle软件时,必须创建这个用户。这个用户是在安装过程中,所有安装软件的所有者。这个用户必须将oracle目录组作为自己的主组,它也必须使用OSDBA和OSOPER组作为自己的非主组(secondary group)
注:在第一次安装完成以后,我们可以使用相同的oracle目录组来进行别的oracle软件的安装,也可以创建别的用户组来进行安装。我们可以为系统中的每个数据库创建一个用户组,也可以为系统中的所有数据库创建同一个用户组来进行安装。
1、创建oracle目录组(oracle inventory group)
在系统中第一次安装oracle软件时,OUI会创建oraInst.loc文件,这个文件定义了oracle目录组的名字以及oracle目录的路径(oracle inventory directory)。使用命令:more /etc/oraInst.loc来检查oracle目录组是否存在。如果这个命令的输出显示了oinstall组名,那么这个组已经存在。如果oraInst.loc文件已经存在,那么这个命令的输出类似:
inventory_loc=/u01/app/oracle/oraInventory
inst_group=oinstall
inst_group参数的值显示了oraclen inventory 组的名字是oinstall
如果oraInst.loc文件不存在,使用下面命令创建oracle inventory用户组:
/usr/sbin/groupadd oinstall
2、创建OSDBA用户组
在下面情况(circumstances)下,我们必须创建一个OSDBA用户组:
不存在OSDBA用户组,例如这是我们第一次安装数据库软件
OSDBA用户组存在,但是我们想在一个新的安装过程中,给操作系统的另一个用户组数据库管理权限。
如果OSDBA用户组不存在,我们需要创建一个用户组,使用下列命令,除非dba用户已经存在,否则应该使用dba作为OSDBA用户组的组名:/usr/sbin/groupadd dba
3、创建OSOPER用户组(可选)
如果我们想创建一个用户部分数据库管理权限(a limited set of database administrative privilege (SYSOPER operator privilege))的用户组时,我们可以创建OSOPER用户组。对大部分的安装而言,只创建OSDBA组,是比较有效率的。如果我们想使用OSOPER用户组,一般在下面情况下,需要创建OSOPER用户组:
如果一个OSOPER用户组不存在,例如,这是第一次在系统上安装数据库软件
如果一个OSOPER用户组存在,但是我们想在一个新的ORACLE安装过程中,给别的用户组数据库操作权限。
如果需要一个新的OSOPER用户组,使用下列命令创建,同样的,应该使用oper作为组名,除非这个名字已经被占用:/usr/sbin/groupadd oper
4、创建oracle软件拥有者用户
在下列情况下,我们必须创建oracle软件拥有者用户:
如果oracle软件拥有者用户不存在,例如这是我们第一次安装
如果oracle软件拥有者用户存在,但想在一个新的oracle安装过程中使用不同的用户。
为了检查oracle软件拥有者用户oracle是否存在,输入命令:id oracle
如果oracle用户存在,那么这个命令的输出会类似下面的情况:
uid=440(oracle) gid=200(oinstall) groups=201(dba),202(oper)
如果用户存在,决定是否想使用已经存在用户或者重新创建一个oracle用户。如果想使用已经存在的用户,确定这个用户的主组是oracle inventory用户组,并且这个用户是OSDBA和OSOPER用户组的一员。
注:在修改一个已经存在的用户的时候,要确认不要产生其他的问题。
创建一个oracle软件拥有者用户:
如果该用户不存在,我们需要创建一个新的oracle软件拥有者用户,尽量使用oracle作为用户名,除非已经存在。
创建oracle用户,输入以下命令:
/usr/sbin/useradd -g oinstall -G dba[,oper] oracle
注:因为oper是可选的。这个命令可以为:
/usr/sbin/useradd -g oinstall -G dba oracle 或
/usr/sbin/useradd -g oinstall -G dba,oper oracle(多个值时,用逗号进行分隔)
注:-g选项制定主组。-G指定非主组(secondary group)
为oracle用户设定密码:passwd oracle
修改oracle软件拥有者用户
如果oracle用户存在,但是它的主组不是oinstall,或者它不是OSDBA或者OSOPER组的一员,我们可以使用命令来进行修改:
/usr/sbin/usermod -g oinstall -G dba[,oper] oracle
五、确认用户nobody的存在
1、在安装软件前,确认nobody用户的存在:
使用命令:
id nobody
来确认该用户是否存在,如果这个命令的输出中有关于这个用户的信息,那么不必创建这个用户
2、如果nobody用户不存在,那么使用下面的命令来创建:
/usr/sbin/useradd nobody

2009年2月19日星期四

内存结构memory architecture

oracle在内存中存储以下信息:
程序代码
已连接的会话(session)信息,包括当前活动(active)的及非活动的会话
程序执行过程中所需的信息(例如:某个查询的状态)
需要在oracle进程间共享并进行通信的信息(例如锁信息)
数据文件内数据的缓存(例如:数据块data block及重做日志条目redo log entry)
oracle中的基本内存结构包括:
系统全局区system global area SGA:此区域由所有的服务进程(server process)和后台进程(background process)共享。
程序全局区program global area PGA:此区域是每个服务进程和后台进程所私有的,即每个进程都有一个属于自己的PGA。
oracle的基本内存结构还包括软件代码区(software code area)
一、系统全局区概述overview of the system global area
系统全局区(system global area SGA)是一组包含了oracle数据库数据及实例控制信息的共享的内存结构。当多个用户并发地连接到同一个实例后,这些用户将共享此实例SGA中的数据。因此SGA也被称为共享全局区(shared global area)
oracle实例是由SGA及oracle进程两部分组成的。当用户启动实例时,oracle将自动地为SGA分配内存,当用户关闭实例时,由操作系统负责回收内存。每个实例都有自己的SGA。
SGA是可读写的。当用户连接到一个多进程数据库实例(multiple-process database instance)后能够读取此实例SGA中的信息,有些进程在oracle执行期间可以向SGA中写入信息。
SGA中包含以下数据结构:
数据缓存区database buffer cache
重做日志缓冲区redo log buffer
共享池shared pool
JAVA池java pool
大型池large pool (可选的)
数据流池streams pool
数据字典缓存区data dictionary cache
其他杂项信息
SGA中还包含了数据库及实例的状态信息,供后台进程使用。这部分内容被称为固定SGA(fixed SGA)。用户数据不会存储在这个区域内。SGA中还包含需要在oracle进程间进行交换的信息(例如锁信息)
如果数据库运行在共享服务模式(shared server architecture)下,SGA中还要包含请求与应答队列,以及PGA中的一些信息。
1、初始化参数SGA_MAX_SIZE the SGA_MAX_SIZE Initialization Parameter
SGA中包含了多个内存组件(component),每个组件都可以被看作一个内存池,用于满足特定类型的内存分配请求。所有SGA组件都是以预设的雷杜(granule)为单位进行内存的分配(allocate)和回收(deallocate)的。oracle通过记录每个SGA组件使用的粒度单位的数量来掌握整个SGA的内存使用情况。
粒度单位的大小是由整个SGA的容量决定的。
用户可以设定oracle数据库实例的SGA能够使用的内存总数量。oracle在启动一个实例之初只会为此实例分配最小所需的内存,而在实例运行期间可以通过扩展各个SGA组件来为实例提供更多内存,SGA所使用内存的上限由SGA_MAX_SIZE初始化参数决定。在实例初始化时,如果初始化参数文件(initialization parameter file)或服务器参数文件(server parameter file)中的SGA_MAX_SIZE的值小于oracle为SGA组件分配的内存之和(为SGA各组件分配的内存数量是依据参数文件中的显式(explicitly)设定值或系统默认值),oracle将忽略SGA_MAX_SIZE参数。
注:为了优化系统性能,整个SGA的容量应该与实际需要的内存数量相符,如果系统内存太小,SGA会需要使用虚拟内存(virtual memory),数据库的系统性能将显著下降。因为此时操作系统需要对SGA中的部分内容进行分页(page)(即在磁盘上进行读写操作)。SGA中各个内存组件的容量会对数据库系统的性能有所影响。
SGA容量是由多个初始化参数决定的。主要参数有:
DB_CACHE_SIZE:标准容量数据块(standard block)使用的缓存区的容量
LOG_BUFFER:重做日志缓冲区(redo log buffer)的容量,以字节(byte)为单位
SHARED_POOL_SIZE:存储共享SQL及PL/SQL的内存容量,以字节为单位
LARGE_POOL_SIZE:大型池(large pool)的容量,默认值为0
JAVA_POOL_SIZE:JAVA池(Java pool)的容量
2、共享全局区自动管理
在oracle 10g中,只需要使用SGA_TARGET参数指定实例可以使用的SGA总量即可,oracle能够自动地将内存分配给SGA的各个子组件,以提高内存使用效率。
注:在10g中,SGA_TARGET参数涵盖了SGA的全部内存,在启动时,如果SGA_TARGET参数的值超过了SGA_MAX_SIZE,后者将会被忽略。
注:SGA_TARGET参数不能动态设置,只能在数据库启动时设置。
3、修改及查询SGA内存组件容量adding granules(粒度) and tracking component size
可以使用ALTER SYSTEM 语句修改初始化参数中的相关值来改变SGA中各组件占用的SGA容量。oracle将用户设定的值向上(增大)修正为与其最接近的16M的倍数,并增加或减少内存组件中的粒度单位(granule),使其容量达到用户设定的要求。我们应该保证系统具备足够的内存以满足内存分配请求。只要当前SGA内存容量小于SGA_MAX_SIZE参数的限制,oracle就能为SGA分配更多的内存。
SGA各个内存组件当前使用的粒度单位的大小可以通过V$SGAINFO视图进行查询。各个内存组件当前容量及最近一次修改变量操作的类型和时间可以通过V$SGA_DYNAMIC_COMPONENTS视图进行查询。oracle还维护着一个先进先出的缓冲区(circular buffer),其中记录了最近400次调整SGA内存组件容量的操作。可以通过V$SGA_RESIZE_OPS视图来查询这个缓冲区。
注:如果为内存组件设置的容量不是粒度单位(granule)的整数倍,oracle会将其向上(增大)修正为与其最接近的粒度单位的整数倍。
三、程序全局区概述overview of the program global areas
程序全局区(program global area PGA)是供服务进程(server process)存储数据及控制信息的内存区域。这是一种在服务进程启动时由oracle创建的非共享的内存区。只有服务进程才能访问属于它的PGA,而对PGA的读写操作是由oracle代码实现的。一个oracle实例中为所有服务进程分配的PGA内存也被称为此实例的合计PGA(aggregated PGA)。
1、PGA的内容
PGA内存中存储的内容依据实例服务进程的模式有所不同。但是通常来说,PGA中包含以下内容
私有SQL区(private SQL area):私有SQL区中包含绑定信息(bind information)及运行时内存结构(runtime memory structure)等数据。每个提交了SQL语句的会话都会有一个私有SQL区。每个提交了相同的SQL语句的用户都有自己的私有SQL区,但它们使用同一个共享SQL区(shared SQL area)。即多个私有SQL区可以和同一个共享SQL区相联系。
2、SQL工作区
对于复杂的查询来说(例如,决策支持系统的查询decision-support queries),运行时区域(run-time area)的大部分容量均供需要占用大量内存的操作创建工作区(work area)只用。这些操作包括:
需要进行排序的操作(order by/group by/rollup/window function)
哈希连接(hash-join)
位图融合(bitmap merge)
位图创建(bitmap create)
用户可以对工作区的容量进行控制与调优。一般来说,更大的工作区能够显著提高SQL操作的性能,但是会消耗更多的内存。最理想的情况是,工作区能够容纳SQL语句的全部输入数据及额外的控制内存结构。否则语句的响应时间将增加,因为部分输入数据必须放入临时磁盘区。在极端情况下,如果工作区容量远小于输入数据,那么输入数据需要在临时磁盘区与工作区间多次交换。这会显著地增加SQL操作的响应时间。
3、专用服务模式下的PGA内存管理PGA memory management for dedicated mode
SQL工作区所占的容量可以被统一地且自动的管理。我们只需要设定PGA_AGGREGATE_TARGET初始化参数就能设定一个oracle实例使用的全部PGA容量。此参数的值针对整个实例,oracle将保证所有数据库服务进程使用的全部PGA内存不超过此参数限制。
设定了PGA_AGGREGATE_TARGET参数后,专用服务模式下创建的全部会话所使用的工作区的容量将会被自动地调整。
oracle提供了固定视图(fixed view)供用户查询PGA内存的统计信息。在设置了PGA_AGGREGATE_TARGET参数后,oracle开始收集关于PGA的统计信息。
与工作区内存分配及相关使用的统计信息可以从以下动态性能视图(dynamic performance view)中查询:V$SYSTAT,V$SESSTAT,V$PGASTAT,V$SQL_WORKAREA,V$WORKAREA_ACTIVE
V$PROCESS视图中的以下三列记录了分配给oracle进程使用的PGA内存的情况:PGA_USED_MEM,PGA_ALLOCATED_MEM,PGA_MAX_MEM
注:专用服务器(dedicated server)与共享服务器(shared server)所分配的工作区都可以采用自动PGA内存管理模式。
四、软件代码区software code areas
软件代码区是用于存储可运行的或正在运行的程序代码的内存空间。oracle系统程序的代码也存储在软件代码区,但其在此区域内的位置与用户程序完全不同,系统程序代码所在的位置更独立,且保护更严密。
软件代码区是只读的。

2009年2月12日星期四

数据字典data dictionary

数据字典是oracle数据库的一个重要组成部分,这是一组用于记录数据库信息的表(这个表是read-only的)。数据字典中包含:
数据库中所有方案对象(schema object)的定义(包括表table、视图view、索引index、簇index、同义词synonyms、序列sequence、过程procedure、函数function、包package、触发器trigger等等)

数据库为一个方案对象分配了多少空间,以及该对象当前使用了多少空间。
列的默认值
完整性约束(integrity constraint)信息
数据库用户名
每个用户被授予(grant)的权限(privilege)与角色(role)
监控(audit)信息,例如那个用户对某个方案对象进行了访问或更新操作
数据库中的其何使用数据字典
数据字典有三个主要用途:
oracle利用数据字典来获取关于用户、方案对象、及存储结构(storage structure)的信息
每当数据库中执行了DDL语句后,oracle将对数据字典进行修改
所有oracle用户都可以使用数据字典来获取关于数据库的信息
一、oracle如何使用数据字典
数据字典基表中的数据是oracle正常工作所必须的。因此,只有oracle才能增加或修改数据字典中的信息。当用户对数据库进行升级(upgrade)或降级(downgrade)的操作时,oracle提供了修改数据字典的脚本。
注:任何用户都不应该删除或修改数据字典表内的数据
在数据库运行期间,oracle通过数据字典内的信息来确定方案对象(schema object)是否存在,以及用户是否具备相应的权限。oracle会持续地更新数据字典,以便反映在数据库结构、监控、授权和数据等方面的变化。
例如:当用户创建了名为parts的表,则数据字典中将会增加记录这个新表,及相关列,数据段(segment),数据扩展(extent)的数据,并记录用户对此表的权限(privilege)信息。当数据字典再次被查询时,用户就能够看到这些信息。
二、如何使用数据字典how to use the data dictionary
所有数据库用户都可以参考数据字典视图提供的信息。用户可以使用SQL语句来访问数据字典视图。有些视图可以供所有oracle用户使用,而有些只有DBA才能访问。
只要数据库处于打开(open)状态,用户就可以使用数据字典。因为数据字典存储在SYSTEM表空间内,此表空间在数据库被打开后总是联机(online)的。
数据字典视图可以被分为多组。大多数情况下,一组视图由三个包含相似信息的视图构成,其中的区别在于视图名称的前缀:
前缀是USER,表明是用户视图(用户方案(schema)内的对象)
前缀是ALL,扩展的用户视图(用户可访问的对象)
前缀是DBA,DBA视图(所有用户方案内的对象)
同一组中各视图所包含的列是完全相同的,但有以下除外:
使用USER前缀的视图通常没有OWNER列。对于USER视图来说,这列的值等于提交查询的用户名
有些以DBA为前缀的视图包含管理员所需的额外列
二、动态性能表dynamic performance table
在数据库运行过程中,oracle将维护一组虚拟表(virtual table)用于记录数据库的当前状态(current database activity)。这组表被称为动态性能表(dynamic performance table)。
动态性能表并不是真正的表,大多数用户不应访问其中的信息,但是数据库管理员可以对其进行查询,或在其上创建视图并将访问权限授予其他用户。这些视图有时被称为固定视图(fixed view),因为数据库管理员不能将其修改或移除。
动态性能表由SYS用户所拥有,他们的名字都是以V_$开头。这些表上创建有视图,而视图上创建有公共同义词。这些同义词的名字都是以V$开头,例如,V$DATAFILE视图包含了数据库文件的信息,V$FIXED_TABLE视图包含了数据库所有动态性能表及视图的信息。
三、数据库对象元数据database object metadata
DBMS_METADATA包为用户提供了获取数据库对象完整定义的接口。此包可以通过XML或SQL DDL的形式提供定义信息。此包具备两类接口:
1、用于进行编程的灵活且完善的接口(A flexible,sophisticated interface for programmatic control)
2、用于随机查询(ad hoc querying)的简化接口
他概要信息
与数据库内的其他数据相同,数据字典也是以表及视图的形式组织的。一个数据库全部的数据字典表与数据字典视图都存储在该数据库的SYSTEM表空间内。
数据字典不仅是oracle数据库的基础组成部分,它也为所有用户--从终端用户,到应用程序设计者,再到数据库管理员--提供了一个重要的工具。数据字典可以通过SQL语句进行访问。由于数据字典是只读的,用户只能对这些表和视图执行查询操作(select语句)。
数据字典由以下两种结构组成:
1、基表
基表(base table)用于存储相关的数据库信息。只有oracle才能读这些表。用户很少直接访问它们,因为这些表是规范化的(normalized),且其中的大部分数据的含义是普通用户无法理解的。
2、用户访问视图user-accessible views
用户访问视图(user-accessible view)用于对数据字典基表内存储的数据进行汇总与展示。这些视图利用连接(join)及WHERE子句简化基表中的数据,将其解码(decode)为用户可理解的信息,例如用户名、表名等。大多数用户只能访问这些视图,而不能访问基表。
oracle中的SYS用户拥有数据字典中的所有基表(base table)及用户访问视图(user-accessible view)。其他oracle用户不应修改(UPDATE、DELETE或INSERT)SYS方案中的对象定义以及数据,否则将危害数据库的数据完整性(data integrity)。安全管理员必须严格控制此帐户。
注:修改或操作数据字典表中的数据可能会给数据库的运行带来不可恢复的损害。

依赖性 dependencies among schema objects

某些类型的方案对象可以在其定义中引用其他对象。例如:视图的定义就是一个引用了其他表或视图的查询;一个过程中也可以包含引用了其他数据库对象的SQL语句。如果一个对象的定义中引用了其他对象,那么这个对象被称为依赖对象(dependent object),此对象所引用的对象被称为被引用对象(referenced object)。
如果用户修改(alter)了一个被引用对象(referenced object)的定义,则相应的依赖对象(dependent object)是否能够正常工作将取决于修改该的类型。例如:如果用户移除(drop)了一个表,那么所有基于此表的视图将失效。
oracle能够自动地记录对象间的依赖关系,以便降低依赖性管理的复杂程度,减轻数据库管理员和用户的工作负担。例如,一个表被多个过程所引用,当用户修改了被引用表(referenced table)的定义后,oracle将在依赖过程(dependent procedure)下一次被引用时自动地将其重新编译(recompile)。
为了管理方案对象间的依赖关系,oracle需要记录所有的方案的状态(status):
有效的(valid)已经通过编辑,可以在被引用时直接使用
无效的(invalid)必须在使用之间进行编译。对于过程(procedure)、函数(function)、包(package)来说,这意味着对其进行编译。对于视图来说,这意味着此视图必须使用被引用对象(referenced object)当前在数据字典中的定义信息(current definition)重新进行语法分析。
只有依赖对象(dependent object)可以处于无效(invalid)状态。表(table)、序列(sequences)和同义词(synonyms)总是处于有效状态(valid)。
如果一个视图(view)、过程(procedure)、函数(function)或包(package)处于无效状态,oracle会尝试对其进行重新编译,但是这个过程可能会发生错误。例如,当编译一个视图时,此视图的基表(base table)有可能不存在,或访问基表的权限不存在;当编译一个包时,有可能出现PL/SQL或SQL语法错误、或访问被引用对象(referenced object)的权限不存在。在编译时发生此类问题的方案对象(schema object)将保持无效状态。
oracle能够自动地跟踪数据库中发生的特定变化,并在数据字典中记录相关的方案对象的最新状态。
状态记录时一个递归过程。被引用对象(referenced object)的状态变化不仅对导致其直接依赖对象(directly dependent object)的状态变化,同时会影响其间接依赖对象(indirectly dependent object)的状态。
例如:当一个存储过程引用了一个视图的时候,这个存储过程间接的引用了此视图的基表。
一、解析方案对象的依赖性(resolution of schema object dependencies)
当一个方案对象(schema objcet)在SQL语句中被直接引用或被此语句中的依赖对象(dependent object)所引用(或间接引用)时,oracle均会在需要时对其状态进行检查。SQL语句中被直接或间接引用的对象的状态决定了oracle的后续操作。
如果SQL语句中所有的被引用对象(referenced object)均处于有效状态,则oracle无需进行其他工作就可以直接执行SQL语句。
如果SQL语句中引用的任何视图、PL/SQL程序结构(过程procedure、函数function、包package),oracle将自动地尝试编译这些对象。如果所有的无效的被引用对象(referenced object)都能被成功编译,则oracle将在编译后执行SQL语句。如果一个方案对象不能被成功编译,那么它将继续保持无效状态。oracle回滚执行失败的SQL语句并返回一个错误信息。事务(transaction)中已经成功的操作由用户决定是进行提交还是回滚。
如果一个方案对象在处于无效状态之后被用户替换(replace)掉,则oracle不会对其进行重新编译。这项优化错误减少了不必要的重新编译操作。
1、编译视图及PL/SQL程序结构
当满足以下条件时,视图及PL/SQL程序结构可以被编译并置为有效状态:
视图或PL/SQL程序结构的定义必须正确。SQLj及PL/SQL语句的语法结构必须正确。
所有被引用对象(referenced object)及其结构必须满足定义的要求。例如:如果视图的定义查询(defining query)中引用了某列,那么此列必须存在于基表(base table)中。
视图或PL/SQL程序结构的所有者必须具备访问引用对象的权限。例如:过程中的一个SQL语句向某个表中插入一条数据,那么此过程的所有者必须具备对被引用表(referenced table)的INSERT权限。
注:如果一个视图所引用的基表或其他视图被修改(alter)、重命名(rename)或移除(drop)后,此视图将被置为无效状态,但是这个视图的定义仍被保存于数据字典内,相关的权限信息,引用此视图的同义词(synonyms)、对象,及其他视图也都会被保留(虽然视图处于无效状态,但是这个视图的定义还是存在的)。
当用户需要使用一个处于无效状态的视图时,oracle会在运行时自动重新编译此视图。而当一个视图被替换(replace)后,其有效性由以下条件决定:
视图的定义查询中所引用的全部基表(base table)必须存在。如果视图所引用的一个基表被重命名(rename)或被移除(drop),视图将被置为无效状态且不可用。引用无效视图的语句将会失败。只有当基表恢复原名或重建视图才能被成功编译。
如果基表被修改或重建(re-created)后保留了原来的全部列,但是某些列的数据类型发生了变化,那么大部分依赖视图能够被成功地重新编译。
如果视图的基表被修改或重建后保留了原来的全部列,那么此视图的状态仍为有效。如果重建的基表中不再包含视图所引用的列,那么此视图的状态将被置为无效。如果视图时使用SELECT * FROM table形式的语句定义的,常会导致上述情况中的后者出现,因为在视图创建时其定义查询(defining query)将被扩展到基表的所有字段并永久存储于数据字典中。
二、解析方案对象名称
在SQL语句中引用的方案对象名称可由多段(piece)组成,各段之间使用“.”分隔。以下内容描述了oracle如何就解析对象名称:
1、oracle首先验证SQL语句中所引用的对象名称的首段。例如在hr.employees中,hr位首段。如果引用的名称只由一段构成,则此段就被看作时首段。
a、oracle首先在当前方案中搜索名称与对象名首段相符的对象。如果不存在则进入到步骤b。
b、oracle搜索名称与对象名称首段相符的公有同义词(public synonym)。如果不存在,则进入到步骤c。
c、oracle搜索名称与对象名称首段相符的方案,如果找到这样一个方案,则返回步骤b,使用对象名称的第二段在方案中搜索相符的对象。如果方案中不存在相符的对象,或引用的对象名称只由一段构成,则oracle将返回一个错误。
注:如果在步骤c中没有找到相符的方案,那么引用的对象名称也不能被验证,oracle将返回一个错误。
2、如果数据中存在语句中所引用的方案对象,这个方案对象还必须具备对象名称剩余段所代表的内容。例如:当引用名称为hr.employees.department_id时,如果hr代表方案名称,employees代表表名,那么department_id必须与employees表中的某个列名称相符;如果employees代表包名称,那么包内必须存在名为department_id的公有常量、变量、过程或函数。
三、共享SQL的依赖性管理
oracle 除了需要管理方案对象的依赖性,还需要管理共享池(shared pool)中各个共享SQL区(shared SQL area)的依赖性。如果用户创建、修改或移除了表、索引、同义词或序列,或者重新编译了包、或包声明,那么所有依赖共享SQL区都将被置为无效。当一个基于无效共享SQL区的游标继续执行时,oracle将重新对SQL语句进行语法分析,并生成新的共享SQL区。
四、本地及远程依赖性管理
监控数据库内的依赖性以及进行必要的重编译都是由oracle自动地执行的。本地依赖性管理(local dependency management)是指oracle管理一个单一数据库内各个对象间的依赖关系。例如:某过程内的一个SQL语句引用了相同数据库中的一个数据表。
远程依赖性管理(remote dependency management)是指oracle管理一个分布式环境内的各种依赖关系。例如:一个oracle forms触发器可以依赖于一个数据库内的方案对象;在一个分布式数据库内,一个本地视图的定义查询可以引用一个远程表。
1、本地依赖性管理
oracle使用数据库内部的依赖性关系表(dependency table)来管理所有的本地依赖性,依赖关系表用于记录每个方案对象的依赖对象(dependent object)。当用户修改了一个被引用对象(referenced object),oracle就会使用依赖关系表确定此对象的所有依赖对象,并将它们全部置为无效状态。
例如:假设存储过程UPDATE_SAL引用了JWARD.employees表。当JWARD.employees表的定义被修改后,所有引用此表的对象都将被置为INVALID,包括存储过程UPDATE_SAL。此存储过程必须经过重新编译并置为有效状态后才能再次运行。同样,当一个用户所拥有的对象权限(DML privilege)被撤销(revoke)后,此用户方案内的所有依赖对象也将被置为无效状态。但在后面这种情况中,由于使对象无效的原因使授权(authorization)被撤销,因此可以通过重新授权(reauthorization)使对象恢复有效状态,此时无需对无效对象进行重新编译操作。
2、远程依赖性管理
oracle还要管理应用程序与数据库间的依赖关系,以及分布式数据库间的依赖关系。例如:oracle forms应用程序可以使用一个引用了数据表的触发器;本地的存储过程也可能调用分布式数据库系统中的远程过程。数据库系统必须能够管理此类对象间的依赖关系。oracle根据对象的不同而选择不同的机制来管理远程依赖性。

2009年2月8日星期日

方案对象schema object

方案是一个逻辑数据(logical structures of data)(或称为方案对象(schema object))的集合。每个数据库用户拥有一个与数据库用户同名的方案,且只有这一个方案。方案对象可以通过SQL语句创建和操作。方案对象包含以下对象类型:
簇(cluster)
数据库链接(database link)
数据库触发器(database trigger)
维度(dimension)
外部过程库(external procedure library)
索引(index)和索引类型(index type)
Java类(Java class),Java资源(Java resource),及Java源程序(Java source)
物化视图(materialized view)及物化视图日志(materialized view log)
对象表(object table),对象类型(object type),及对象视图(object view)
操作符(operator)
序列(sequence)
存储(在服务器端)的(stored)函数(function),过程(procedure)及包(package)
同义词(synonym)
表及index-organized table
视图(view)
还有一些类型的对象也存储于数据库中,且可由SQL语句创建或操作,但是他们不属于任何方案(schema):contexts、目录(directory)、用户配置(profile)、角色(roles)、表空间、用户(user)
方案对象(schema object)是一种逻辑数据存储结构(logical data storage structure)。oracle在逻辑上将方案对象存储于数据库的表空间,而方案对象的数据在物理上存储于此表空间的一个或多个数据文件中。因此方案对象不一定与磁盘上存储这些方案对象的数据的物理文件(physical file)一一对应(即可能两个对象的数据存储在一个物理文件中)。用户可以对表、索引、及簇等对象的磁盘空间分配进行设定。
方案(schema)与表空间之间没有必然联系。同一个表空间可以包含不同方案的对象,而同一方案的对象也可以存储在不同表空间中。
一、表概述
表(table)是oracle数据库中最基本的数据存储结构。数据在表中以行(row)和列(column)的形式存储。用户在定义表时,需要设定表名,还需要设定表内各列的列名(column name)、数据类型(datatype)、及宽度(width)。有些数据类型的宽度是固定的,例如DATE类型,而对于NUMBER类型的列来说,则需要定义精度(precision)及数值范围(scale)。数据行是一条记录(single record)各列信息的集合。
用户可以为一个表的各列数据的值设定规则。这些规则被称为完整性约束(integrity constraint)。例如NOT NULL完整性约束,它要求各行的此列必须包含值。
用户可以设定表内某些列的数据在存储到数据文件之前首先进行加密(encryption)。加密可以防止未经授权的用户绕过数据库访问控制机制,使用操作系统工具直接查看数据文件的内容。
在用户创建(create)表后,就可以使用SQL语句向其中插入(insert)数据,或使用SQL语句查询(query),删除(delete),或更新(update)表内的数据。
二、视图概述
视图(view)用于展现整理后(tailored)的一个或多个表或其他视图中的数据。视图将一个查询的结果作为一个表来使用。因此视图可以被看到是存储查询(stored query)或一个虚拟表(virtual table)。大多数情况下,只要能够使用表就能使用视图来实现。
例如:如果管理员希望用户只能查询其中的5列及特定的数据行,就可以创建此表的视图供用户访问。
由于视图来源于表,因此两者有许多相似之处。例如,用户定义的视图和表一样,最多包含1000列。用户可以查询(query)视图,遵从某些限制(restriction)时还可以对视图进行更新(update)、插入(insert)、删除(delete)等操作。所有对视图数据的修改最终都会被反映到视图的基表(base table)中,这些修改必须服从基表的完整性约束(integrity constraint),并同样会触发定义在基表上的触发器(trigger)。
用户即可以在视图上显式地定义触发器(trigger),也可以在视图所引用的基表上定义触发器。oracle还支持在视图上定义逻辑约束(logical constraint)。
三、索引概述
索引是数据库中一种可选的数据结构,它通常与表或簇相关。用户可以在表的一列或数列上建立索引,以提高在此表上执行SQL语句的性能。oracle的索引提供了更为迅速地访问表数据的方式。正确地使用索引能够显著的减少磁盘的I/O。
用户可以为一个表创建多个索引,只要不同索引使用的列或列的组合(combination of columns)不同即可。

事务

事务是由一个或多个SQL语句组成的逻辑操作单位(logical unit of work)。事务具有原子性(atomic)。一个事务内所有SQL语句对数据库产生的影响,要么全部被提交(commit)(作用到数据库中),要么全部回滚(roll back)(将对数据库的修改撤销)。
一个事务开始于用户提交第一条可执行(executable)的SQL语句,结束于之后进行的提交(commit)或回滚操作。使用COMMIT或ROLLBACK语句能够显式地(explicitly)结束事务,而提交一个DDL语句可以隐式地(implicitly)结束事务。
如果发生问题,导致事务中的一条或两条SQL语句不能执行,那么整个事务必须回滚,这样才能保证完整性。
1、语句的执行与事务控制(statement execution and transaction control)
一个成功执行的SQL语句与一个提交的事务是有区别的。一个SQL语句成功执行表明此语句:解析正常、是有效的SQL语法结构、作为一个独立的语句运行无误(例如:在一个多行更新(multirow update)操作中所有数据行都被成功修改)。
但是包含此语句的事务被提交之前,整个事务都可以被回滚,事务内所有语句对数据库的修改都可以被撤销。尽管发生了回滚,事务内的SQL语句却是成功执行的。
提交(commit)意味着用户显示地(explicitly)或隐式地(implicitly)要求将事务中对数据的修改永久地记录到数据库当中。当用户执行COMMIT语句时即为显式的提高叫操作,当数据库应用程序正常结束或一个数据定义语句(data definition language)成功执行后将发生隐式的提交操作。事务被提交后,事务内SQL语句的对数据的修改将被永久地记录到数据库中,其他用户将能够看到这些改变。在事务提交后执行的查询就能看到变化后的数据了。
用户可以在开始一个事务时,使用SET TRANSACTION ... NAME语句为此事务命名。这有助于用户监控长时间运行的事务,以及处理不可信的分布式事务(in-doubt distributed transaction)。
2、语句级回滚statement-level rollback
如果在一个SQL语句在执行过程中发生了错误,那么此语句对数据库产生的影响都将被回滚。回滚后就如同此语句从未执行过,这种操作被称为语句级回滚。
在语句执行过程中,任何发生的错误都将会导致语句级回滚,例如同一个表中插入数据造成主键(primary key)值重复即为此类错误。一个造成死锁(deadlock)(访问相同数据而产生的竞争)的SQL语句也会导致语句级回滚。而在SQL语句解析(parsing)的过程中发生的错误(例如语法错误),因为此语句还没有执行,所以不会产生语句级回滚。
一个SQL语句执行失败只会使此语句所做的数据修改无效,而不会导致当前事务中此语句之前的语句所做的数据修改无效。如果执行失败的是DDL语句那么此语句之前隐式执行提交操作不会被撤销。
3、可恢复的空间分配问题
当一个持续时间较长的数据库操作在执行过程中遭遇空间分配失败时,oracle可以将此操作暂时性挂起(suspend),并在空间分配问题解决后恢复(resume)其执行。当发生空间分配问题时,oracle数据库不会立即 给执行此操作的用户返回错误提示,而是等待管理员解决此问题。当空间分配问题被纠正后,挂起的操作就可以自动地恢复执行。
注:只有在客户端使用ALTER SESSION语句的语法显式地将会话设定为可恢复(resumable)后,SQL语句才能运行在可恢复模式下(resumable mode)。
当满足以下条件时,运行于可恢复的空间分配模式下的语句将被挂起(suspend):无可用空间、达到最大的数据扩展(maximum extent)限制、超出空间配额(space quota)限制
在不可恢复的空间分配模式下,以上条件将导致运行错误,并使SQL语句回滚。
当语句被挂起将导致所在事务同时被挂起。事务所使用的所有资源在语句挂起期间都将被保留。
当产生错误的条件消除后(例如,管理员进行了处理,或其他查询使用的排序空间(sort space)被释放),被挂起的语句将自动地恢复执行。

2009年2月6日星期五

表空间、数据文件和控制文件

数据库(database)、表空间(tablespace)及数据文件(datafile)之间的联系与区别:
一个oracle数据库是由一个或多个表空间构成的,表空间是逻辑存储单元,这些表空间共同用于存储数据库中的数据。
oracle数据库中的每个表空间由一个或多个数据文件构成,数据文件是物理文件,这些文件由数据库所在的操作系统管理。
数据库的数据实际存储在构成各个表空间的数据文件中。
注:表空间由一个或多个数据文件组成。数据文件只能属于一个表空间。属于一个表空间的对象(object,例如表、索引等)可以跨越多个数据文件。

一、表空间
数据库是由一个或多个被称为表空间的逻辑单元构成的。表空间内的逻辑存储单位为段,段又可以继续划分为数据扩展,数据扩展是由一组连续的数据块构成的。
1、大文件表空间bigfile tablespace
在oracle中,用户可以创建大文件表空间,这样oracle数据库使用的表空间可以由一个单一的大文件构成,而不是若干小数据文件。这使得oracle可以发挥64位系统的威力,创建、管理超大的文件。在64位系统中,oracle的数据库的存储能力被扩展到了8EB(1EB=1024PB,1PB=1024TB,1TB=1024GB)。
数据库默认创建的是小文件表空间,即oracle中传统的表空间类型。数据库中SYSTEM和SYSAUX表空间在创建时总是使用传统类型。
2、SYSTEM表空间
每个oracle数据库都包含一个名为SYSTEM的表空间,它在数据库创建时,由oracle自动创建。只要数据库处于开启(open)状态,SYSTEM表空间就一定是联机(online)状态。
管理员可以创建本地管理(locally managed)的SYSTEM表空间,或将已有的数据字典管理(dictionary managed)的SYSTEM表空间转换为本地管理,来发挥本地管理表空间的优势。
如果数据库中的SYSTEM表空间为本地管理的。那么此数据库中就不能创建数据字典管理的表空间。我们可以通过可移动表空间(transportable tablespace)功能向其中添加数据字典管理的表空间,但是这个表空间只能是只读的。
注:如果一个表空间为本地管理的,则不能将它转换为数据字典管理的。
SYSTEM表空间总是为整个数据库存储数据字典表。数据字典表存储在编号为1的数据文件中。
3、SYSAUX表空间
SYSAUX表空间是SYSTEM表空间的一个辅助性空间。在10g数据库创建,或从低版本升级到10g时,一定会创建SYSAUX表空间。
此外,SYSAUX表空间还被用来集中存储所有不应放在SYSTEM表空间的数据库元数据。使用SYSAUX表空间可以减少默认创建的表空间的数量。
在正常的数据库操作中,不允许移除、重命名SYSAUX表空间。SYSAUX表空间也不支持可驿动表空间功能。
4、撤销表空间undo tablespace
撤销表空间(undo tablespace)是一个特殊的表空间,只用于存储撤销信息(undo information)。用户不能在撤销表空间中创建段(例如表或索引)。一个数据库中可以没有撤销表空间,也可以有多个。在自动撤销管理模式(automatic undo management mode)下,每个实例有且仅有一个撤销表空间。oracle在撤销表空间内自动地创建和维护撤销段(undo segment),对撤销数据(undo data)进行管理。
5、默认的临时表空间
如果SYSTEM表空间是本地管理的,用户必须在创建数据库时定义一个默认的临时表空间(temporary tablespace)。本地管理的SYSTEM表空间不能作为默认的临时存储空间。
如果SYSTEM表空间是数据字典管理的,窃创建数据库时没有定义默认的临时表空间,那么oracle会将SYSTEM表空间作为默认的临时存储空间使用。此时用户在ALERT.LOG文件中会发现一条警告:建议创建默认的临时表空间,以后的oracle版本将会需要。
6、在数据库中使用多个表空间
一个小型数据库可能只需要使用SYSTEM表空间,但是oracle建议用户至少创建一个额外的表空间来存储用户数据,使之与系统的数据字典信息(data dictionary information)分离。这使得用户在进行数据库管理操作时更灵活,并减少由于数据字典对象(dictionary object)与用户方案对象(schema object)处于同一数据文件而导致竞争。
7、表空间内的空间管理
表空间内为各个方案对象(schema object)分配空间的单位是数据扩展。oracle采用两种方式监控表空间内,空间的已用/可用情况:
本地管理的表空间(locally managed tablespace):通过位图(bitmap)管理数据扩展
数据字典管理的表空间(dictionary managed tablespace):通过数据字典管理数据扩展
当用户创建表空间时,需要选择空间管理方式。在此之后,用户还可以通过DBMS_SPACE_ADMIN PL/SQL包改变管理方式。
注:当用户在创建表空间时没有指定数据扩展的管理方式,默认使用本地管理。
8、多种数据块容量
oracle支持在数据库中使用多种数据块容量(multiple block size)。SYSTEM表空间使用标准数据块容量(standard block size)。这个容量在数据库创建时被设定,可以为任何有效值。用户可以使用DB_BLOCK_SIZE初始化参数(initialization parameter)设定标准数据块容量。数据块容量的合法值(legitimate value)范围是2K到32K。
在初始化参数(initalization parameter file)或服务器参数文件(server parameter file)中,用户可以为数据缓存(buffer cache)内的不同子缓存区(subcache)设定不同的数据块容量(block size)。子缓存区也可以在实例(instance)运行时配置。此外用户还可以创建使用不同数据块容量的表空间。但是SYSTEM表空间及绝大多数表空间还是使用标准数据块容量(standard block size)。
注:一个分区对象(partitioned object)的所有分区(partition)所在的表空间必须使用相同的数据块容量。
多种数据块容量功能主要用于从OLTP数据库向企业级数据仓库(enterprise data warehouse)迁移(transporting)表空间时使用。这有助于在拥有不同数据块容量的数据库间迁移数据。
9、联机/脱机表空间
数据库管理员可以在数据库处于开启(open)状态时,将除SYSTEM表空间之外的任何表空间联机(online)(可访问)或者脱机(offline)(不可访问)。SYSTEM表空间在数据库处于开启状态时总是处于联机状态,因为oracle需要使用其中的数据字典。
表空间通常处于联机状态,以便数据库用户访问其中的数据。但是数据库管理员可以在对表空间进行维护、备份或恢复操作时,令表空间脱机(offline)。
10、只读表空间
使用只读表空间(read-only tablespace)的主要目的是为了避免对静态且容量大的数据库内容进行备份和恢复操作。oracle不会更新只读表空间内的数据,因为这类表空间的数据文件可以放置正在CD-ROM或WORM之类的只读介质(read-only media)上。
注:用户只能将一个表空间联机到创建它的数据库,因此只读表空间(read-only tablespace)技术不适合用于存档(archiving)。
只读表空间不能被修改。如果需要更新一个只读表空间,首要要使表空间可读写。在更新后,还可以将表空间恢复到只读状态。
因为只读表空间不能被修改,只要没有将只读表空间置于可读写状态,就无需对其进行重复的备份操作。当用户需要恢复数据库时,也没必要恢复只读空间。
11、排序操作使用的临时表空间
用户可以为排序操作(sort operation)指定一个或多个专用的临时表空间(temporary tablespace),这可使排序操作所需的空间管理工作更高效。使用专用的临时表空间进行排序,可以有效地避免频繁的排序空间分配与回收而造成的空间管理操作(space management operation)。一个SQL语句可以同时使用多个临时表空间(temporary tablespace)进行排序。例如当用户为一个大表创建索引时所需的排序操作就可以在多个临时表空间上进行。
所有会用到排序(sort)的数据库操作,例如连接(join),创建索引,排序(order by),计算汇总(group by),及手机优化器(optimizer)所需的统计信息,都可以利用临时表空间。在RAC(real application cluster)环境中使用临时表空间带来的性能提升更加显著。
12、在数据库之间移动表空间
用户可以利用可移动表空间(transportable tablespace)将oracle数据库的一部分移动到另一个数据库中,这种操作还可以跨平台。用户可以在数据库间复制表空间,即首先克隆一个表空间再加入到另一个数据库;用户也可以在数据库间移动表空间,即从一个oracle数据库移出一个表空间,并放入另一个数据库。
通过可移动表空间(transportable tablespace)迁移数据与使用export/import相比,速度可以提高几个数量级。因为使用可移动表空间技术只需复制数据文件,并整合表空间元数据(tablespace metadata)即可。用户在使用可移动表空间时还可以同时迁移索引数据,因此数据被移动后无需重建索引。
用户可以跨平台移动表空间(跨平台移动表空间并不支持所有平台,但支持大多数平台),跨平台移动表空间的用途有:
使内容提供者(content provider)向其在不同平台上使用oracle的客户发送结构化数据(structured data)变得简单、高效。
简化了从数据仓库环境(data warehouse enviroment)向数据集市环境(data mart enviroment)发布数据的工作。数据集市通常运行在更小的平台上。
在异构的集群(heterogeneous cluster)中共享只读表空间(read only tablespace)。
在不同平台间迁移数据库
二、数据文件datafile
oracle数据库中每个表空间都是由一个或多个物理数据文件构成的。一个数据文件只能由一个数据库的一个表空间使用。
oracle为表空间创建数据文件时,分配的磁盘空间总和为用户指定的存储容量加上管理开销所需的文件头空间。当数据文件被创建后,oracle所在的系统负责清除文件的数据及授权信息,并将它分配给oracle使用。如果文件很大,这个过程会消耗较长时间。oracle数据库中的第一个表空间总是SYSTEM表空间,因此oracle在创建数据库时总是将第一个数据文件分配给SYSTEM表空间。
1、数据文件的内容
当一个数据文件首次被创建时,为其分配的磁盘空间被格式化为oracle格式,此时其中尚不包含任何用户数据。oracle将使用这些空间存储属于(与此数据文件对应的)表空间的段,这些空间专为oracle使用。随着表空间内数据增长,oracle使用数据文件中的可用空间为段分配新的数据扩展。
属于一个表空间的各个方案对象(schema object)的数据,在物理上,存储于构成此表孔吉爱你的一个或多个数据文件中。需要注意的是,并不是一种类型的方案对象需要存储在特定的数据文件中,相反,一个数据文件可以存储表空间内各种类型的方案对象。oracle为表空间内的方案对象分配空间时可以使用一个或多个数据文件。也就是说,方案对象是可以跨数据文件的。除非使用表分布(striping)技术(数据可以分布存储在多个磁盘上),否则数据库管理员和用户都不能控制方案对象使用哪个数据文件。
2、数据文件的容量
用户可以在数据文件被创建后改变其容量,也可以在创建时设定数据文件随表空间内方案对象(schema object)的增长而动态增长。这个功能可以减少表空间内数据文件的数量,从而简化数据文件的管理操作。
注:当然用户使用的操作系统中也要有足够的空间供数据文件扩展。
3、脱机数据文件
除了SYSTEM表空间之外,用户可以随时将任何表空间置为联机(online)或脱机(offline)状态。此时一个表空间的所有数据文件也被作为一个整体同时被置为联机或脱机状态。
4、临时数据文件
本地管理的临时表空间使用临时的数据文件(临时文件),这样的文件与普通数据文件类似,但有以下区别:
临时文件总是被设置为NOLOGGING模式。
用户不能将临时文件设置为只读
用户不能使用ALTER DATABASE语句创建临时文件
介质恢复(media recovery)不能使识别临时文件,BACKUP CONTROLFILE不会产生与临时文件有关的信息,CREATE CONTROLFILE不能设置与临时文件有关的信息
当用户创建临时文件或改变其容量时,oracle并不保证按照用户指定的文件容量为其分配磁盘空间。在某些文件系统中(例如UNIX)磁盘块(disk block)并不会在文件创建或改变容量时分配,而是在其被使用之前才分配。
注:这样会使得临时文件创建与改变容量操作执行更快,但是随着临时文件的使用可能会导致磁盘空间不足。
临时文件(tempfile)信息可以从DBA_TEMP_FILES数据字典及V$TEMPFILE动态性能视图(dynamic performance view)中查询,但是不存在于DBA_DATA_FILES或V$DATAFILE视图中。
三、控制文件
数据库控制文件(control file)是一个二进制文件,供数据库启动及正常工作时使用。在数据库运行过程中,控制文件会被oracle修改,因此数据库处于开启(open)状态时,控制文件必须可写。如果控制文件因故不能访问,数据库也将无法正常工作。
每个控制文件只能供一个oracle数据库使用。
1、控制文件的内容
控制文件中包含了其所属数据库的信息,实例的在启动、及正常工作期间都需要存取这些信息。控制文件的内容只能由oracle修改,数据库管理员或用户都不应编辑控制文件。
控制文件主要包含以下内容:
数据库名(database name)
数据库创建时的时间戳(timestamp)
属于此数据库的数据文件及重做日志文件(redo log file)的名称与存储位置
表空间信息
脱机的数据文件(datafile offline ranges)
日志离世信息(the log history)
归档日志(archived log)信息
备份集(backup set)与备份块(backup piece)信息
数据文件与重做日志的备份信息
数据文件复制信息
当前的日志序列号(log sequence number)
检查点(checkpoint)信息
数据库名和数据库创建时间戳都来源于数据库创建过程。数据库名既可以来自DB_NAME初始化参数中的设定值,也可以来自CREATE DATABASE语句中的指定值。
每当添加、重命名、或移除数据库中的数据文件及重做日志文件时,控制文件就会更新以反映这些数据库物理结构变化。进行这些记录的目的是:
oracle可以藉此在数据库启动(startup)时识别打开的数据文件和重做日志文件
oracle可以藉此在恢复数据库时识别当前可用及需要恢复的文件
因此,用户每次更改数据库的物理结构后(使用ALTER DATABASE语句),一定要及时备份控制文件。
控制文件还被用于保存检查点信息。每隔三秒钟,检查点进程(checkpoint porcess,CKPT)将会在控制文件中记录重做日志(redo log)检查点的位置(checkpoint position)信息。当数据库恢复时,重做日志中此点之前的重做条目(redo entry)都无需恢复,因为这些数据已经被写入数据文件中。
注:这里的数据库恢复,是指类似服务器突然断电,导致缓存中的数据没有写入数据文件,当数据库再启动时,控制文件会根据检查点,使用重做条目,来对数据库进行恢复,这样做可以减少恢复数据库所用的时间,不用从一开始进行恢复。如果保存完整的重做日志,则可以恢复到任何时候的数据库状态。
2、多重控制文件
如同重做日志文件(redo log file)一样,oracle也可以为一个数据库同时维护多个完全相同的控制文件。通过在不同磁盘上为一个数据库存储多重控制文件(multiple control file),可以有效地避免控制文件的单点脆弱性(single point of failure)。当一个包含控制玩呢间的磁盘发生故障时,如果oracle试图访问这个控制文件就会导致当前的实例出现故障。但如果其他磁盘中存在此控制文件的备份,实例就可以被立即重新启动而无需进行数据库恢复。
如果一个数据库的所有控制文件永久丢失了,那么实例将中止且需要进行介质恢复(media recovery)。如果没有当前控制文件的副本而必须使用较早的备份,那么介质恢复过程将会比较复杂。因此oracle强烈建议用户遵循以下规则:
在每个数据库中使用多重控制文件(multiple control file)
将控制文件的副本存储在不同的物理磁盘上
使用操作系统的镜像功能(operatin system mirroring)
监控备份工作

数据块、数据扩展和段

一、数据块data block
oracle以数据块(data block)的形式管理数据库的数据文件中的存储空间。数据块是数据库使用的最小数据单元。每个操作系统都有一个块大小(block size,根据每个操作系统而不同)。oracle请求数据时使用的是oracle数据块的整数倍,不是操作系统的块。
标准的块大小,是由初始化参数中的DB_BLOCK_SIZE来指定的。此外,我们可以最多指定5个非标准的块大小。
注:指定的块大小最好是操作系统的块大小的整数倍,以避免不必要的I/O操作。oracle数据块是oracle能使用、分配的最小存储单元。
数据块的结构(format):
1、header(common and variable):头部包含了块的大致信息,比如块地址和段类型(例如是数据段还是索引段)
2、table directory:数据块的这个部分包含了在这个块中拥有行(rows)的那个表的信息
3、row directory:数据块的这个部分包含了在这个块中实际存储的行的信息(包括在行数据区域row data area中每个行片row piece的地址)
注:在一个数据块的开销中分配了row directory以后,除非这个行被删除,否则这个空间是不会被回收(reclaim)的
4、overhead 开销:data block header、table directory和row directory综合起来被称为开销overhead。开销中的有些值是大小固定的。但是数据块的总开销是变量。平均来讲,数据块的开销为84-107字节
5、row data:数据块的这个部分包含了表或者索引数据。行可以跨越多个数据块
6、free space:空闲空间存储新插入的行,或者当某个行的进行更新时,可能需要的额外空间
二、数据扩展extent
数据扩展是数据库存储空间分配的逻辑单元,它是由一些列连续的数据块组成的。一个或多个数据扩展轮流组成一个段(segment)。当在一个段中已经存在的空间全部被使用后,oracle会将一个新的数据扩展分配给这个段。
三、段segment
一个段segment是一系列的数据扩展(extent),其中存储了表空间(tablespace)内各种逻辑存储结构的数据。例如,对每个表,oracle分配了一个或多个数据扩展来组成那个表的数据段;对每隔索引,oracle分配了一个或多个数据扩展来组成它的索引段。
1、数据段data sgement
在oracle数据库中的一个数据段包含了下面这些中的数据:
非分区表或非簇表
分区表的一部分
一个簇表
当用户使用CREATE语句创建表或者簇的时候,oracle会创建相应的数据段。表或簇的存储参数用来决定相应的数据段的数据扩展如何被分配。用户可以使用CREATE或ALTER语句直接设定这些存储参数。这些参数会影响与对象(object)相关的数据段的存储和访问(retrieval)效率。
2、索引段index segment
oracle数据库中每个非分区索引(nonpartitioned index)有一个索引段来容纳它所有的数据。对一个分区索引(partitional index)而言,每个分区有一个索引段来容纳它的数据。
我们可以使用CREATE INDEX语句,来为每个索引或每个分区的索引创建索引段。在这个语句中,我们可以设索引段的存储参数以及索引段应该存储在那个表空间。索引段的存储参数将会影响数据的存储和访问效率。
注:表的数据段与其相关的索引段不一定要存储在同一表空间中,可以将两者存储在不同的磁盘上,来提高效率。因为在两个磁盘上,因此可以同时进行两者的操作。
3、临时段temporary segement
当处理查询时,oracle经常需要为SQL语句的解析(parsing)和执行(execution)的中间结果(intermediate stage)准备临时空间。oracle会自动分配称为临时段的磁盘空间。例如:当进行排序操作的时候就需要使用临时段。当排序操作可以在内存中执行,或可以利用索引执行时,不必创建临时段。
以下语句的执行可能会使用临时段:
CREATE INDEX
SELECT ... ORDER BY
SELECT DISTINCT ... (DISTINCT 清楚的、明确的)
SELECT ... GROUP BY
SELECT ... UNION (UNION 结合)
SELECT ... INTERSECT (INTERSECT 交叉)
SELECT ... MINUS
有些不能使用索引的关联操作(unindexed join),或者需要在子查询间建立相互关系(correlated subquery),也有可能需要使用临时段。
oracle可以为临时表(temporary table)及其索引分配临时段,临时表中的数据只在会话(session)或事务(transaction)的运行期内存在。
4、自动撤销管理automatic undo management
oracle中保存了用于恢复对数据库操作的信息。例如事务中所有操作的记录。oracle可以利用撤销信息完成以下工作:
回滚(rollback)一个活动的事务
恢复(recover)一个已经结束的事务
提供读完整性(read consistency)
恢复语句的逻辑错误(当执行了一个逻辑错误的语句后,oracle可以进行撤销操作)
自动撤销管理是基于撤销表空间的。用户使用撤销表空间来管理撤销信息,这样就不用创建多个大小不一的回滚段。
自动撤销管理消除(eliminate)了管理回滚字段的复杂性(complexity),使用户只需专注于控制撤销信息的保存期限。oracle强烈建议用户使用撤销表空间,避免使用回滚段。系统能够自动调整撤销信息在撤销表空间内的保存时间,以供需要使用撤销信息的查询使用。如果正在使用的撤销表空间中有足够的空降,用户可以为为UNDO_RETENTION(retention 保留)参数设定一个最低阀值(low threshold value),这样系统中的撤销信息至少在此值指定的时期内被保留。
用户可以使用V$UNDOSTAT视图来监视撤销表空间的使用情况,并对其进行配置以提高效率。V$UNDOSTAT能够显示各种与撤销空间及相关事务有关的统计信息,例如当前实例(instance)中使用了多少撤销空间。

2009年2月1日星期日

参数及参数文件

在oracle数据库中,有一系列的初始化参数用来进行数据库约束和资源限制,这些参数通常存储在一个参数文件中,在数据库实例启动时读取并加载。
一、初始化参数的分类
按照得出方式不同,初始化参数可以分为3类:推导参数、操作系统依赖参数和可变参数。
1、推导参数(Derived Parameters)
推导参数通常来自于其他参数的运算,依赖其他参数得出。所以这类参数通常不需要修改。如果强制修改,那么修改值会覆盖推导值。
2、操作系统依赖参数
某些参数的有效值或者取值范围依赖或者受限于操作系统。如db_cache_size参数,设置oracle使用的内存大小,该参数的最大值就要受限于物理内存。这一类参数通常被称为操作系统依赖参数。
3、可变参数
可变参数通常可以调整,有些设置的是限制条件,如OPEN_CURSORS;有的参数是设置容量,如DB_CACHE_SIZE等。这类参数通常可以为DBA或最终用户调整,从而产生限制或性能变化。
初始化参数通常还有一些其他分类方式:
按照修改方式划分,初始化参数又可以分为静态参数和动态参数。静态参数只能在参数文件中修改,在重新启动后才能生效;动态参数可以动态调整,调整后通常可以立即生效。
按照获取方式不同,初始化参数又可以分为显式参数和隐含参数:
显式参数可以通过v$parameter查询得到;而隐含参数通常以"_"开头,必须通过查询系统表才能获得这些参数(不建议修改隐含参数)。
二、参数文件
参数文件是一个包含一系列参数及参数对应值的操作系统文件,它有以下两种类型:
初始化参数文件(Initialization Parameters Files):oracle 9i之前oracle一直采用pfile方式存储初始化参数,该文件为文本文件。
服务器参数文件(Server Parameter Files):从oracle 9i开始,oracle引入了spfile文件,该文件为二进制格式。
在9i以前,oracle使用pfile存储初始化参数设置,参数文件的修改需要手工进行,这些参数在实例启动时被读取,通过pfile的修改需要重起实例才能生效;从9i开始,oracle引入spfile文件,使用spfile,用户可以通过ALTER SYSTEM或者ALTER SESSION来修改参数,而不再需要通过手工修改。对于动态参数,所有更改可以立即生效,同时用户可以选择更改只应用于当前实例还是同时应用到spfile。对于静态参数,只能将变更应用到spfile文件,这些变更在数据库重启后生效。
所有对spfile的修改都可以通过命令行完成。(oracle备份恢复体系)
1、pfile和spfile
第一次启动数据库时需要pfile,然后可以根据pfile创建spfile,此后用户可以不再需要pfile。
注:当使用DBCA自定义创建数据库时,在最后一个步骤,可以选择“生成数据库创建脚本”,通过这个脚本,可以研究oracle是怎样创建的数据库,也可以通过脚本执行,按步骤手工创建数据库。
2、spfile的创建
从9i开始,缺省情况下,oracle使用spfile启动数据库。其实spfile必须由pfile创建,新创建的spfile在下一次启动数据库时生效。
CREATE SPFILE需要SYSDBA或者SYSOPER权限,具体语法如下:
CRESTE SPFILE[='SPFILE-NAME'] FROM PFILE[='PFILE-NAME']
缺省情况下,spfile创建到以下系统缺省目录。
对于unix,目录为$oracle_home/dbs
对于NT,目录为$oracle_home\database
如果spfile已经存在,那么创建会返回错误:ORA-32002:无法创建已由例程使用的SPFILE。可以通过这个来判断当前是否使用了spfile文件。
随着spfile的引入,oracle同时引入了一个视图用以记录spfile的参数设置信息,这个视图是v$spparameter。
注:运行期间,spfile并不锁定,所以spfile可能会意外丢失,如果发生类似情况,oracle会不允许使用create spfile from pfile缺省命令来重建spfile(因为ORA-32002错误而失败),通常可以创建一个自定义名称的spfile文件,然后重命名为缺省名称即可。
3、spfile的搜索顺序
使用startup命令重新启动数据库,oracle会按照以下顺序在缺省目录中搜索参数文件。
(1)spfile$oracle_sid.ora,其缺省目录如下:
unix:$oracle_home/dbs/
NT:%oracle_home%\database
(2)spfile.ora,其缺省目录如下:
unix:$oracle_home/dbs/
NT:%oracle_home%\database
(3)init$oracle_sid.ora,其缺省目录如下:
unix:$oracle_home/dbs/
NT:%oracle_home%\database
创建了spfile,重新启动数据库,oracle会按顺序搜索以上目录,spfile就会自动生效。
注:可以修改默认目录。
4、使用pfile/spfile启动数据库
如果想使用pfile启动数据库,则可以在启动时指定pfile或者删除spfile:
SQL>startup pfile="E:\oracle\admin\test\pfile\init.ora";
不能以同样的方式指定spfile,但是可以创建一个包含spfile参数的pfile文件,将spfile参数的值指向spfile。spfile是一个自oracle 9i引入的初始化参数,类似IFILE参数。spfile参数用于定义非缺省路径的spfile文件。
可以在pfile连接到spfile文件,同时在pfile中定义其他参数,如果参数重复设置,后读取的参数将取代先前的设置。
在RAC(real application clusters 真正应用集群)系统中经常使用,由于在RAC中,用户通常需要把spfile存储在共享磁盘上,所以常规的做法就是通过定义pfile文件,在pfile文件中对spfile文件进行重定向。
注:通过在pfile中调用spfile,使用后设置的参数覆盖spfile中的参数设置,是解决spfile中参数设置错误的一种方法。
5、修改参数
可以通过alter system或者导入导出来更改spfile的内容。
从oracle9i开始,alter system命令增加了一个新的选项scope。scope参数有3个可选值:memory、spfile和both。
memory:只改变当前实例运行,重新启动数据库后失败。
spfile:只该改变spfile的设置,不改变当前实例运行,重新启动数据库后生效。
both:同时改变实例及spfile,当前更改立即生效,重新启动数据库后仍然有效。
针对RAC环境,alter system还可以指定SID参数,对不同实例进行不同设置。
完整命令:
alter system set = scope = memory spfile both [sid=]
注:对于静态参数,只能指定scope=spfile进行修改。通过scope=spfile修改的参数,虽然对当前实例无效,但是其参数值可以从v$spparameter视图中查询得到。
注:不带scope参数和scope=both实际上是等价的。如果修改静态参数,那么需要指定spfile参数,不能指定both参数,否则数据库将会报错。
在RAC环境中,如果不指定SID名称,或者指定为“*”,那么修改缺省的对所有实例都生效。
注:在RAC环境中,不同实例的undo_tablespace设置是不同的,当修改一个实例的undo表空间时,一定要注意指定相应的实例,以避免修改错误。
如果不慎错误地修改了参数导致数据库无法启动,我们可以通过spfile创建pfile文件,然后修改pfile中的参数(将错误修改的参数再改正回来),再由pfile创建spfile的方式解决,最后由spfile正常启动数据库。
注:由于spfile是一个二进制文件,所以不能通过手工方式修改,手工修改会导致spfile损坏,使得该spfile不能启动数据库。
6、重置spfile中设置的参数
恢复某个参数为缺省值:
alter system parameter sid='sid*'
注:该命令通常用于RAC环境中,在单实例环境中,需要指定sid='*',reset一个参数,oracle将从spfile文件中删除该参数。
7、导出spfile文件
spfile文件可以导出为文本文件,可以使用导出、创建过程可以向spfile中添加参数。
create pfilei='e:\test.ora' from spfile;
注:对于单机数据库,导出的文件中,每个参数以一个"*"开头,这意味着该参数可以影响所有的实例;而对于并行环境(RAC),可以看到不同实例的参数设置可以不同,这时可以用实例名称来替换"*"。
生成了pfile之后,可以使用这个pfile,或者手动修改其中的参数以启动数据库(用修改后的pfile生成spfile,然后启动数据库)。

2009年1月31日星期六

oracle数据库的启动

oracle数据库的启动主要包含3个步骤:
1、启动数据库到nomount状态
2、启动数据库到mount状态
3、启动数据库到open状态
一、启动数据库到nomount状态
在启动的第一步骤,oracle首先寻找参数文件(pfile或spfile),然后根据参数文件中的设置,创建实例,分配内存,启动后台进程。只要有了一个参数文件,就可以根据这个参数文件启动实例。在这一步骤中,不需要任何控制文件或数据文件的参与。
在创建数据库时,如果在这一步骤出现了问题,通常可能是系统配置(内核参数等)存在问题,我们需要检查是否分配了足够的系统资源等。
注:oracle选择参数文件的顺序:1、spfile$oracle_sid.ora;2、spfile.ora;3、init$oracle_sid.ora;(以10g为例,具体版本可能不同)
在启动过程中,参数文件的位置是不能改变的。但是在UNIX或LINUX系统中,我们可以使用符号链接来进行重定位。
在参数文件中,至少需要确定db_name这个参数。设置了这个参数后,数据库实例就可以启动。
注:在使用RMAN(Recovery Manager)时,存在特殊的情况:oracle允许在不存在参数文件的情况下启动一个实例,此时数据库的db_name会被缺省命名为DUMMY。
在实例创建以后,oracle就可以逐步导航,完成数据库的加载、打开等工作。
二、启动数据库到mount状态
启动到nomount状态以后,oracle就可以从参数文件中获得控制文件的位置信息。oracle缺省会创建3个控制文件,这3个控制文件的内容完全一致,是oracle为了安全而采用的镜像手段。通常我们应该将3个控制文件放到不同的物理磁盘上,避免因为介质故障而同时损坏3个控制文件。我们可以在参数文件中修改控制文件的存储路径。
在mount数据库的过程中,oracle需要找到控制文件并锁定控制文件,如果控制文件丢失,会报错。
因为oracle的3个(缺省的)控制文件内容完全相同,如果只丢失了其中1~2个,可以复制完好的控制文件,更改为相应的名称,就可以启动数据库;如果丢失了所有的控制文件,那么就需要恢复或重建控制文件来打开数据库。
启动到mount状态,数据库还必须具有的另一个重要的文件:口令文件。这个文件位于$oracle_home/dbs目录下,缺省的名称为orapw$sid。
口令文件中存放sysdba/sysoper用户的用户名及口令。
在数据库没有启动前,数据库内建用户是无法通过数据库本身来验证身份的(必须启动了数据库以后才可以验证数据库内建用户)。通过口令文件,oracle可以实现对用户的身份认证,在数据库未启动之前登录,进而启动数据库。
oracle缺省查找orapw$sid文件,如果该文件不存在,则继续查找orapw文件,如果两者均不存在,则数据库将会出现错误。
如果口令文件丢失,通过orapwd工具即可重建,所以在通常的备份策略中可以不必包含口令文件。
通常在UNIX/linux平台下,$oracle_home/dbs目录下,还会存在另一个文件,该文件的命名规则为lk$sid,lk指的是lock,该文件在数据库启动时创建,用于操作系统对数据库的锁定。当数据库启动时获得锁定,数据库关闭时释放。
有时候在系统异常时,可能数据库已经关闭,但是锁定并未释放,或者因为后台进程未正常停止等原因,会导致下次数据库无法启动。
三、启动数据库到open阶段
由于控制文件中记录了数据库中的数据文件、日志文件的位置信息、检查点信息等重要的信息,所以在数据库的open阶段,oracle可以根据控制文件中记录的这些信息找到这些文件,然后进行检查点及完整性检查。
如果不存在问题,就可以启动数据库,如果存在不一致或文件丢失则需要进行恢复。实际上在数据库open的过程中,oracle进行的检查中包括以下两项:
1、第一次检查数据文件头中的检查点计数(checkpoint cnt)是否和控制文件中的检查点计数(checkpoint cnt)一致。此步骤检查用以确认数据文件是来自同一版本,而不是从备份中恢复而来(因为checkpoint不会被冻结,会一直被修改。)
2、如果检查点计数检查通过,则数据库进行第二次检查。第二次检查数据文件头的开始SCN和控制文件中记录的该文件的结束SCN是否一致。如果控制文件中记录的结束SCN等于数据文件头的开始SCN,则不需要对那个文件进行恢复。
对每个数据文件都完成检查后,打开数据库,锁定数据文件,同时将每个数据文件的结束SCN设置为无穷大。
注:仅在open阶段,oracle才会尝试打开并锁定数据文件,如果丢失或出现问题,则会给出错误提示。
在数据库出现问题的时候,提示中给出的可能是不完整信息,二警报日志中则记录了完整的错误过程和错误号。所以当数据库出现故障时,应该优先检查alert_sid.log,从中发现关于故障的详细信息。
注:在启动日志中,可能会有这样一行:
database characterset is ZHS16GBK
在每次数据库的启动过程中,oarcle都需要判断控制文件中记录的字符集和数据库中的字符集是否相符。如果相符,则记录如上一行日志;如果不相符,则以数据库中的字符集为准更新控制文件中的字符集记录。

2009年1月15日星期四

逻辑卷管理器(LVM)

逻辑卷管理是一个相对比较新的UNIX磁盘和文件系统。与直接处理物理磁盘分区相比,逻辑卷管理(LVM)将磁盘空间分成逻辑分区。在普通的磁盘分区和逻辑分区之间的区别类似(analogous)于物理文件系统与UNIX逻辑文件系统之间的区别。一个逻辑分区可以跨越多个物理磁盘,但是可以被透明的访问,就像是只有一个磁盘。
使用逻辑卷管理器的优点:
1、它们为磁盘分区提供了更高的扩展性
2、逻辑卷的大小可以根据需要修改,即便是在操作系统运行的过程中
3、逻辑卷可以跨越多个磁盘
4、一般支持磁盘镜像,这样可以提供更高的数据安全
最简单的理解逻辑卷管理的方式是从下往上看系统的结构:
一、磁盘、物理卷和卷组
系统体系结构的最底层是物理磁盘本身。LVM可以将一个物理磁盘格式化为一个物理卷,用于存储数据等用途。每个物理卷能够分成不连续的块(discrete chunks),这些不连续的块叫做物理分区或物理范围(physical extents)。
注:这里的物理分区与普通的磁盘分区是不同的,物理分区或物理范围以空间块的方式进行分配,块的大小为4MB(即这些物理分区只能是4MB的整数倍)。
物理卷能够组合(combine)成一个卷组。一个卷组就是被当成一个大存储区域的一系列磁盘的集合(这些磁盘能够被当成一个大存储区域来看待)。物理卷与在普通UNIX分区表下面的物理磁盘相似,物理卷是一个能够被分成几个独立的文件系统的单个的存储区域。
二、逻辑卷
逻辑卷与普通UNIX磁盘分区是等价的(逻辑卷在LVM中的地位,跟普通UNIX磁盘分区在系统中的地位是相似的)。一个逻辑卷可以做成一个文件系统,或者可以被用作置换空间设备、一个引导设备等等。一个逻辑卷由一系列物理分区/物理空间组成。逻辑卷是从一个卷组中被分配的。一个卷组中的物理分区的分配是任意的,虽然一些LVM可能要求一个逻辑卷必须从一个特定的物理卷中被分配。逻辑卷可能是任意大小,当然必须是一个给定的卷组中物理分区大小的组合。

2009年1月11日星期日

配置Cisco语音VLAN

以Catalyst 2960交换机为例,IP电话为Cisco7960 IP电话。
语音VLAN功能使访问端口能够承载从IP电话来的IP语音流量。当交换机连接到Cisco 7960 IP电话的时候,电话使用层三IP优先级和层二服务类型值(CoS,Class of service)发送语音流量。层三IP优先级和层二服务类型值默认都被设置为5。因为如果数据不平稳发送的话,IP电话的通话质量会非常差,因为交换机要支持基于IEEE802.1p CoS的QoS。CoS用一种可预见的方式,用分类和整形来从交换机中发送网络流量。
Cisco 7960IP电话是一个可配置的设备。我们可以配置IP电话使用IEEE802.1p优先级来标记转发流量。我们可以配置交换机信任或者重写由CiscoIP电话分配的流量优先级。
一、Cisco IP电话语音流量
我们可以配置一个连有IP电话的访问端口使用一个VLAN来传递语音流量,用另一个VLAN来传递数据流量,这里的数据流量是由连在IP电话上的设备产生的。我们可以配置交换机上的访问端口发送CDP,用以命令相连的IP电话使用下面的方式,将语音流量发送给交换机:
1、在语音VLAN中,用层二CoS优先级值标记
2、在访问VLAN中,用层二CoS优先级值标记
3、在访问VLAN中,不标记(即,没有层二CoS优先级值)
注:在所有的配置中,语音流量载有层三IP优先级值(语音流量的默认值为5,语音控制流量的默认值为3)
二、Cisco IP电话数据流量
交换机也可以处理从设备发送的被标记的数据流量(以IEEE802.1Q或IEEEE802.1p帧的形式)。这个设备是连接到IP电话上的访问端口的。我们可以配置交换机上的层二访问端口发送CDP包,来命令连接的IP电话的访问端口,配置成以下模式:
1、信任模式,所有从IP电话的访问端口接收到的流量,可以通过IP电话,不需要被改变。
2、非信任模式,所有从IP电话访问端口收到的以IEEE802.1Q或IEEE802.1P帧的格式封装的数据,都会被附加一个层二CoS值(这个值是可以被配置的)。默认的层二CoS值是0。
默认情况下IP电话上的访问端口是非信任模式。
注:所有从连接到IP电话上的设备发送的 未标记流量,通过电话时不会有任何改变,不管电话上的访问端口是信任模式还是非信任模式。
三、配置语音VLAN
默认情况下,语音VLAN功能是被禁用的。当语音VLAN功能启用后,所有未标记流量根据默认的端口优先级被发送。此外,被IEEE802.1p或者802.1Q标记的流量的CoS值是不被信任的。交换机会重写CoS值(也可以使用mls qos cos trust来,信任这些流量的CoS值)。
在Catalyst交换机上,信任配置指定信任数据报中的原有分类。例如,当交换机配置为信任DSCP的时候,如果它接收到DSCP值为46的数据包后,那么它接受原来的DSCP值,并将其内部DSCP值设置为46.尽管有入站分类配置,但交换机仍然可以通过策略和出站标记等方法修改出站帧的DSCP和CoS值。(内部DSCP值才是真正影响包的优先顺序的)
Catalyst交换机可信任入站帧的DSCP、IP优先级或CoS值。在信任CoS或IP优先级的时候,Catalyst交换机将入站数据包的CoS或IP优先级映射到一个内部DSCP值。(CoS和IP优先级都有8个等级0-7)
当Catalyst交换机在端口上信任入站数据包的CoS时,它会将CoS值映射到DSCP值。当入站接口的QoS配置为不信任时,交换机将所有入站数据包的内部DSCP都设置为0。
交换机根据内部DSCP来确定出站帧的策略、出站策略、拥塞管理、拥塞避免以及CoS和DSCP值。
配置步骤:
1、首先要在交换机的访问端口上配置语音VLAN。Trunk端口不支持语音VLAN。
注:Trunk端口上不支持语音VLAN,就算是配置了命令,也不能起作用。 2、交换机上的语音VLAN必须存在并且已经被激活。而且语音VLAN中的IP电话可以正确的传输数据。可以使用show vlan命令来查看,VLAN是否存在。

3、在启用语音VLAN以前,建议使用mls qos 全局配置命令,来在交换机上启用QoS。然后在接口配置模式下,使用mls qos trust cos命令来配置接口为信任状态。如果使用自动QoS功能,这些设置会自动被配置。
4、在连接到Cisco IP电话的交换机端口上启用CDP,来将配置发送给IP电话,默认情况下,CDP在所有交换机端口上都是启用的。
5、当配置了语音VLAN以后,端口快速功能自动被启用。但是,当禁用语音VLAN时,端口快速功能不会被自动禁用。
6、如果Cisco IP电话和连接到IP电话的设备在同一个VLAN中,那么它们必须使用相同的IP子网。下面这些情况,标明它们在相同的VLAN中:
它们都使用IEEE802.1p或者它们都使用未标记的帧;
IP电话使用IEEE802.1p封装帧,设备使用未标记的帧;
IP电话使用未标记的帧,设备使用IEEE802.1p封装帧
IP电话使用IEEE802.1Q封装帧,并且语音VLAN和访问VLAN相同
7、如果IP电话与连接到IP电话上的设备在相同的VLAN和相同的子网中,但是使用不同的帧类型,它们之间也是不能通信的。因为在相同子网内的流量是不会被路由的(路由能够消除帧类型的不同)
8、我们不能在语音VLAN中配置静态安全MAC地址
9、语音VLAN端口也可以同时是下列端口类型:
动态访问端口,可以在VMPS客户端上配置动态访问端口
IEEE802.1x认证端口
注:如果某个交换机上的访问端口配置了语音VLAN,而且这个端口上连接有一个Cisco IP电话,此时如果我们在这个端口上启用IEEE802.1x,这个电话如果在30秒内没有数据,那么就会失去与交换机的连接(自动断开)。
被保护端口
一个SPAN或者RSPAN会话的源端口或目的端口
安全端口
注:我们我们在一个也配置了语音VLAN的端口上,启用端口安全,我们必须将这个端口上的最大安全地址数设置为在访问VLAN上允许的最大安全地址数加二。当这个端口连接到IP电话,这个电话需要最多两个MAC地址。这个电话地址可能通过语音VLAN学习到,也可能通过访问VLAN学习到。将一个PC连接到电话,需要额外的MAC地址。

2009年1月10日星期六

DHCP中继代理

运行Cisco IOS软件的路由器包括DHCP服务器和中继代理软件。任何可以在客户端和服务器之间转发DHCP包的主机都可以称为DHCP中继代理。默认情况下,Cisco IOS DHCP服务器和中继代理都是开启的。可以通过检查配置文件,查看它们是否被禁用。如果它们被禁用,会在配置文件看到no service dhcp命令。使用servcie dhcp 命令可以重新启用这个功能。
只有配置了ip helper-address 命令,Cisco IOS DHCP relay 代理功能才能在某个端口被启用(中继代理是配置在端口上的,这个端口是与DHCP客户端直接相连的路由器的端口)。这个命令可以使DHCP广播转发到配置好的DHCP服务器。
当DHCP服务器和客户端不在同一个物理网段的时候,使用DHCP中继代理来在客户端和服务器之间转发DHCP请求和回复。中继代理的转发与普通的IP路由转发是有区别的。IP数据包能够在网络之间透明的转发。中继代理收到DHCP消息然后重新生成一个新的DHCP消息,然后从另一个端口转发出去。中继代理会设置网关地址(在DHCP包的giaddr字段),如果被配置了,还可以在包中增加中继代理信息选项(选项82),然后将包转发到DHCP服务器。在移除了选项82后,从服务器返回的数据包会被转发回客户端。
注:这个网关地址是指与客户端直接相连的路由器的接口地址,即客户端所在网段的网关。
另外,移除选项82是在服务器上移除。
一、配置DHCP中继代理将包转发给DHCP服务器
因为DHCP客户端不知道他们与那个网络相连,DHCP客户端会使用UDP广播来发送他们的初始化DHCPDISCOVER信息。如果在一个物理网段(在一个广播域中)上的客户端中不包括一个DHCP服务器,UDP广播通常是不会被转发的,因为路由器默认不会转发广播流量。
我们可以通过配置接收广播的路由器接口,使它将特定类型的广播转发给一个helper地址。我们可以在一个端口上设置多个helper地址。
当一个路由器转发这些地址分配/参数请求信息时,它就是一个DHCP中继代理。Cisco路由器通过在接口配置模式下,使用ip helper-address命令,能够完成DHCP中继代理的功能。
DHCP客户端在本地LAN上广播请求IP地址和其他配置属性,DHCP中继代理接收到这个广播,重新生成一个新的DHCP消息,然后从另一个端口发送出去。中继代理会将配置了ip helper-address命令的接口的IP地址,填充到DHCP数据包中giaddr(IP地址网关)区域。giaddr区域包含的这个IP地址,会帮助DHCP决定那个子网应该接收这个请求,以及标识合适的IP地址串(即帮助DHCP服务器决定应该使用那个子网池中的IP地址来响应这个请求,这个子网池是giaddr区域中的IP地址所在的子网)。DHCP中继代理通过IP单播,发送本地广播给DHCP服务器,这个DHCP服务器是端口配置模式下,由ip helper-address指定的IP地址。
注:DHCP服务器会优先选择DHCP中继代理所在的子网的IP地址,分配给客户端,此外,DHCP中继代理是配置在端口上的。
router(config)#interface type number
router(config-if)#ip helper-address address

注:当采用ip helper-address命令的时候,需要确认在UDP广播数据包需要经历的任何外出接口上都没有配置ip directed-broadcast命令。通过使用no ip directed-broadcast命令,可以使得路由器和交换机能够防止将定向广播转换为物理广播。自从Cisco IOS版本12.0以来,禁用定向广播是一种默认启用的安全措施。
(这个命令是必需的)转发UDP广播,包括BOOTP和DHCP的UDP广播。这里address参数,可以指定一个DHCP服务器地址。如果其他DHCP服务器都在目的网段上,也可以使用该网段的网络地址作为address,使用网络地址能够使其他DHCP服务器回应DHCP请求。
如果有多个DHCP服务器,可以为每个服务器配置一个helper地址
二、为DHCP中继代理配置支持中继代理信息选项
DHCP自动分配地址是基于IP地址的,这个IP地址可能是网关IP地址(DHCP数据包giaddr区域),也可能是入口的IP地址。在某些网络中,需要用其他的信息,来进一步决定应该分配那个IP地址。通过使用中继代理信息选项(选项82),当把来自客户端的DHCP包转发给DHCP服务器时,Cisco IOS中继代理可以将关于它自己的额外信息包括到中继代理信息中。
通过使用ip dhcp relay information option命令,Cisco IOS可以支持这个功能。中继代理会自动地将电路标识子选项(circuit identifier suboption)和远程IP子选项添加到中继代理信息选项中,然后将包含中继代理信息的DHCP包转发给DHCP服务器。、
DHCP服务器能够使用这些信息来为每个服务器提供网络中的服务提供者(subscriber)分配IP地址,进行访问控制,设置QoS以及安全策略(或者其他属性分配策略)。
注:当从DHCP服务器回复的DHCP包转发回DHCP客户端时,在中继代理(这里的中继代理就是指客户端所在网段的中继代理端口,因为后面中继代理直接用单播将DHCP包发送给DHCP服务器,途中经过的其它中继代理时,其他中继代理所采取的策略,在下面设置)那里,将中继代理选项(选项82)剥除(不是在DHCP服务器端剥除),完成策略,将DHCP包转发给主机,最后完成IP地址分配。
1、中继代理信息重新转发策略
一个中继代理可能会收到从其他DHCP中继代理那里发送的已经包含中继信息的消息。默认情况下,从前一个中继代理那里收到的中继信息会被替换。如果这个设置不适合我们的网络,我们可以在全局配置模式下,使用命令:ip dhcp relay information policy {drop | keep | replace}来修改。
为了使重新转发策略能够正确执行,必须要先禁用中继代理信息检查。可以在全局配置模式下,使用ni ip dhcp relay information check命令。
配置步骤:
router(config)#ip dhcp relay information option
启用系统插入DHCP中继代理信息选项(选项82)的功能,在把BOOTREQUEST消息的过程中。者功能默认是禁用的。
router(config)#ip dhcp relay information check
这个配置是可选的。配置这个命令可以使该路由器,检查包含在转发的BOOTREPLY信息中的中继代理信息选项,是否可用。
默认情况下,如果从DHCP服务器哪里接收到可用的DHCP回复包,DHCP中继代理就检查选项82区域。如果收到一个不可用的消息,中继代理就丢弃它。当中继代理收到一个可用的消息的时候,中继移除选项82区域,然后转发这个DHCP包。如果被禁用,可以使用ip dhcp relay information check命令来重新启用这个功能。
router(config)#ip dhcp relay information policy {drop | keep | replace}
这个配置也是可选的,这个命令可以为中继代理制定转发策略(即,当一个消息中已经包含中继信息时,中继代理应该怎么做)。
router(config)#ip dhcp relay information trust-all
这个配置是可选的,将路由器上所有的接口,配置为信任DHCP中继信息选项的源。默认情况下,如果网关地址被设置为0,而且包汇总的中继代理信息选项已经存在,这种情况下,中继代理就会丢弃这个包。可以使用ip dhcp relay information trust-all命令来跳过这个行为,接受这种包。
如果在客户端和中继代理之间有交换机,而且这个交换机可能会插入选项82。这个时候,这个命令就相当有用。可以使用这个命令来保证这些包不会被丢弃。
此外,我们还可以配置中继代理信息选项的贡献者标识符子选项:
1、enable
2、configure terminal
3、ip dhcp relay information option
4、interface type number
5、ip dhcp relay information option subscriber-id string
配置DHCP中继代理支持MPLS VPNs:
1、enable
2、configure terminal
3、ip dhcp relay information option vpn
4、interface type number
这里的接口指的是VPN连入的接口。
5、ip helper-address vrf vrf-name [global] address
使用Smart中继代理转发,将DHCP广播的网关地址配置一个备用地址
1、enable
2、configure terminal
3、ip dhcp smart-relay
要使得这个功能有作用,首先要保证中继代理接口上有两个IP地址。在请求IP地址时,首先使用主要IP地址,填充DHCP包的giaddr区域,然后发送请求,如果请求没有回应,则使用备用IP地址填充DHCP包的giaddr区域,然后继续发送请求。
注:如果中继端口的主IP地址为192.168.1.0段,则DHCP服务器返回的IP地址也为192.168.1.0段。同样的,如果备用IP地址为10.0.0.0段,则返回的是10.0.0.0段的IP地址(giaddr的作用)。


三、DHCP中继代理排错
show ip route dhcp
显示被Cisco IOS DHCP服务器和中继代理添加的所有路由
show ip route dhcp ip-address
显示被Cisco IOS DHCP服务器和中继代理添加的某个IP地址的路由
show ip route vrf vrf-name dhcp
显示被Cisco IOS DHCP服务器和中继代理添加的名字为vrf-name的vrf路由
clear ip route [vrf vrf-name] dhcp [ip-address]
移除为在unnumbered端口上的DHCP客户端添加的路由表上的路由。

2009年1月9日星期五

DHCP服务器配置(二)

五、配置手动绑定
地址绑定是在主机MAC地址和IP地址的映射。客户端的IP地址可以手动分配,也可以通过DHCP服务器的地址池自动分配。
手动绑定就是指:手动将IP地址映射到DHCP数据库中的主机的MAC地址。这些手动绑定的信息,存储在DHCP服务器的NVRAM中。手动绑定是特殊的地址池。手动绑定没有数量的限制,但是我们只能给每个主机池配置一个手工绑定(手动绑定是一个特殊的地址池,只有一个IP地址)。
自动绑定是将IP地址自动映射到在DHCP数据库中存储的主机的MAC地址。自动绑定存储在一个远端主机,数据库代理中。为了便于管理,这个绑定以TXT文本的形式保存(绑定与自动分配是有区别的,所有的绑定,不管是自动绑定还是手动绑定,都需要统计所有主机的MAC地址,只有当主机的MAC地址在数据库中存在时,DHCP服务器才会给它分配IP地址。而自动分配不需要统计MAC地址,就可以获取IP地址)。
所有的DHCP客户端会在DHCP数据包中发送客户端标识符(DHCP选项61)。为了配置手动绑定,我们必须在DHCP池配置模式下,使用client-identifier命令,用合适的十六数标识DHCP客户端。
配置手动绑定,首先要创建主机池,然后指定客户端的IP地址和客户端标识或者硬件地址。
按照下列步骤,配置手动绑定:

1、创建DHCP服务器上的地址池,并指定一个名字
router(config)#ip dhcp pool name
输入这个命令后,会进入DHCP池配置模式,提示符变为:dhcp-config
2、指定客户端的IP地址以及子网掩码
router(dhcp-config)#host address [mask /prefix-length]
3、指定具有哪些唯一标识符的客户端可以使用这个池。这个命令用于DHCP请求
router(dhcp-config)#client-identifier unique-identifier
DHCP客户端需要客户端标识符。客户端标识符是以点分十六进制的形式指定。比如01b7.0813.8811.66,其中01表示以太网媒体类型。
4、指定具有哪些硬件地址的客户端可以使用这个池。这个命令用于BOOTP请求(可选)

router(dhcp-config)#hardware-address hardware-address type
这里的type值用于确定硬件平台所用的协议。可以使用字符串,也可以使用数值。字符串的选项有:ethernet和ieee802;值的选项有:1标识10mb Ethernet,6标识IEEE802。如果没有指定类型,默认类型是Ethernet
5、指定具有那些名称的客户端可以使用这个池
router(dhcp-config)#client-name name
用任意的标准ASCII码字符串来指定客户端的名字。这里的客户端的名字不能包含域名。比如如果一个客户端的名字为mark,它所在的域为cisco.com,这里输入的名字应该为mark,而不应该是mark.cisco.com
6、我们可以使用debug ip dhcp server packet命令来查看,客户端是否被正确指定了IP地址。
注:这里的地址池,可以只有一个IP地址,并且给它指定一个客户端标识,此时,这个就是手动绑定。如果地址池是一个地址段,而且指定了多个客户端标识,那么这个就是自动绑定。
注:主机标识大部分情况下使用的是硬件地址,也可以修改,根据客户端操作系统不同,修改方式也不同。
六、配置DHCP服务器引导文件

引导文件用于为客户端存储引导镜像。这里的引导镜像就是客户端用来装载的操作系统。在DHCP池配置模式下,使用下列命令可以为DHCP客户端指定一个引导镜像:
router(dhcp-config)#bootfile filename
指定用作引导镜像的文件的名字,这个用于客户端从网络启动系统(无盘工作站?)。
七、配置Ping包的数量
默认情况下,在将池中的某个IP地址分配给发出请求的客户端的时候,DHCP服务器会Ping两次这个IP地址。如果Ping没有响应,DHCP服务器就会假定这个IP地址没有被使用(有极大的可能),因此将这个地址分配给发出请求的客户端。在全局配置模式下,可以使用下列命令,来改变在分配某个IP地址之前,Ping这个IP地址的次数:
router(config)#ip dhcp ping packets number
默认情况是Ping两次,可以将count这个参数设为0来彻底关闭DHCP服务器的Ping操作
八、配置Ping包的Timeout值
默认的timeout值为500毫秒,在全局模式下,使用下面的命令:
router(config)#ip dhcp ping timeout milliseconds
来修改timeout的值
九、激活某个端口的DHCP客户端功能
在端口配置模式下,使用下面的命令:
router(config-if)#ip address dhcp [client-id interface_name ] [hostname host_name]
指定该端口通过DHCP来获取IP地址(acquire 获取)
十、配置DHCP服务器选项输入和自动配置
Cisco IOS DHCP服务器能够自动的配置选项,来回应用户设备(customer premises equipment CPE)后面的本地主机的DHCP请求。这些自动配置的选项比如有:DNS或者WINS地址等。(例如当用户使用路由器做NAT时,这个路由器同时也会有DHCP的功能,如果不使用自动配置,则每次改变DNS的地址,都需要在做了NAT的路由器上重新配置分配给DNS地址。此外,客户端设备不会自动通过DHCP请求获取到DNS等的信息,大概可以这么理解)
以前,网络管理员需要在每个启用了这个功能的设备上手动配置Cisco IOS DHCP服务器。Cisco IOS DHCP服务器能够允许配置信息自动更新。网络管理员可以指定一个或多个中央DHCP服务器来更新地址池中特定的DHCP选项爱那个。远端服务器可以从中央服务器那里请求或者输入这些选项属性。
注:输入的这些信息,不是路由器配置的一部分,不会存储在NVRAM中,类比VTP中的客户端,接收到的VLAN信息不会存储在NVRAM中,重新开机时会丢失这些信息。
1、配置中央路由器,指定更新DHCP地址池中特定的DHCP选项:
router(config)#ip dhcp pool name
为DHCP服务器地址池创建一个名字,进入DHCP池配置模式。
router(dhcp-config)#network network-number [mask /prefix-length]
router(dhcp-config)#dns-server address [address2 ... address8]
2、配置需要在DHCP服务器数据库中输入DHCP选项的远端路由器
router(config)#ip dhcp pool name
这里的名字,指的是:这个路由器用于分配IP地址的地址池的名字,它分配给它后面的设备IP地址
router(dhcp-config)#network network-number [mask /prefix-length]
这里的IP地址也是用于分配给本地的设备的IP地址。与主DHCP服务器无关
router(dhcp-config)#import all
将DHCP选项参数插入到DHCP服务器数据库
router(dhcp-config)#exit
router(config)#interface type number
进入端口配置模式,这个端口是与中央DHCP服务器相连的端口(即接收中央DHCP服务器更新的端口)
router(config-if)#ip address dhcp [client-id interface name] [hostname host-name]
指定这个端口通过DHCP接收IP地址
这样配置完成之后,只需要在中央服务器上修改DNS等的配置,远端路由器下面的客户端通过DHCP服务器所获取的DNS地址也会自动改变。不然的话,我们需要的在每个路由器上都要修改DNS地址。
十一、配置DHCP服务器确认在BOOTREPLY信息中的中继代理信息选项生效
在全局配置模式下使用命令:
router(config)#ip dhcp relay information check
来指定DHCP路由器检查在被转发的BOOTREPLY信息中的中继代理信息是否可用
十二、配置中继代理信息的转发策略
即当DHCP服务器发现,一个被转发的信息中已经包含了中继信息时,它应该怎么做。
在全局配置模式下,使用命令:
router(config)#ip dhcp relay information policy {drop |keep |replace}
决定一个电缆调制解调器终端系统上的中继信息转发策略
十三、启用DHCP Smart-Relay功能
默认情况下,DHCP Smart-Relay功能是禁用的,在全局配置模式下使用命令:
router(config)#ip dhcp smart-relay
来允许DHCP中继代理将网关地址(DHCP包的giaddr字段)改变为备用地址,当从DHCP服务器那里接收不到DHCPOFFER时。
十四、DHCP服务器的监视和管理
1、router#clear ip dhcp binding {address *}
删除DHCP数据库中的自动地址绑定。使用address参数,删除指定地址的自动绑定。使用*则清除所有的自动绑定
2、router#clear ip dhcp confilct {address *}
清除来自DHCP数据库的一个地址冲突
3、router#clear ip dhcp server statics 将所有DHCP服务器的计数器置为0
4、router#clear ip route [vrf vrf-name] dhcp [ip-address]
vrf虚拟路由和转发技术
移除由Cisco IOS DHCP服务器添加到路由器表中的路由,或者是移除在unnumbered端口上的中继代理
启用DHCP服务器debug
router#debug ip dhcp server {events |packets | linkage}
显示DHCP服务器信息:
1、router#show ip dhcp binding [address]显示所有由这个DHCP服务器创建的所有绑定的列表。使用show ip dhcp binding命令可以显示主机IP地址的租约释放时间和日期,也可以用这个命令来显示已经分配了的IP地址
2、router#show ip dhcp conflict [address]显示由这个DHCP服务器所记录的所有地址冲突的列表
3、router#show ip dhcp database [url] 显示DHCP数据库中最近的活动情况
4、router#show ip dhcp server statistics 显示服务器统计信息和消息的发送接收情况
5、router#show ip dhcp import 显示我们输入到DHCP服务器数据中的选项参数。被插入的选项参数不是路由器配置的一部分,不会被保存在NVRAM中(类似VTP中的客户端,接收到的VLAN信息不会存储在NVRAM中)
6、router#show ip route [vrf vrf-name] dhcp [ip-address] 显示被Cisco IOS DHCP服务器添加到路由表中的路由和中继代理