2009年2月21日星期六

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)不同即可。