一、ORACLE的基本概念
数据字典属于名为SYS的ORACLE用户。数据字典永远不会被直接访问。为了便于访问数据字典和获取数据库中对象的相关信息,我们通过数据字典视图来完成。
.USER_视图:允许用户获取其模式中对象的相关信息;
.ALL_视图: 允许用户获取其拥有的或可被访问的对象的相关信息。
.DBA_视图: 提供数据库中所有对象的完整信息。
DBA的职责:
1.评估并决定服务器硬件的规模;
2.安装ORACLE软件与补充资料;
3.计划与设计数据库结构;
4.创建数据库;
5.为了保护数据的安全,能够备份数据和采用其他方法;
6.创建与维护数据库用户;
7.实现应用程序与数据库设计;
8.还原与恢复数据库;
9.监视与调整数据库性能。
二、安装ORACLE
OFA:Optimal Flexible Architecture,最优灵活体系结构;
OFA的目标是:通过在任意平台和文件系统中更易于查找Oracle文件,从而更容易管理Oracle数据库。OFA提供了一种标准的目录结构,从而就使安装的所有Oracle软件看上去较为相似,从而降低了数据库管理员的学习曲线。ORACLE并不强制要求使用OFA却强烈推荐使用这种结构。OFA既不会自动在多个磁盘之间展开Oracle文件,也不会为Oracle可执行文件提供命名约定,这种体系结构只是将若干ORACLE数据文件,重做日志文件,控制文件及其他文件放入一个数据库实例;
OCS: Oracle Consulting Service,Oracle 顾问咨询 装载点命名模式:/pm,其中p是一个串常量,m是一个变量值。如:/ora01
装载点内采用/pm/h/u/product/v命名安装Oracle软件的目录。/pm为装载点,h表示用途的标准目录名(如app,db,home),u是目录拥有者的名称,product是个常量字符串,v指定在目录中安装的Oracle产品的版本。如:/ora01/db/oracle/product/10.20;
在目录结构之内可以创建一个admin目录,并且还可以在admin目录内创建存储oracle所使用的特定文件类型的其他子目录。这些目录的完整路径名为/pm/h/admin/d/a,其中,admin是个常量字符串,d是数据库的系统标志符(SID)或名称,a用于存储特定管理文件类型的子目录。 遵循OFA的管理目录及其描述
目录名 用途 示例
adhoc 存储数据库专用的SQL,pl/sql脚 本 /ora01/db/admin/ocp10g/adhoc arch 存储已归档的重做日志文件 /ora01/db/admin/ocp10g/arch adump 存储审计文件(需首先设置AUDIT_FILE_DEST) /ora01/db/admin/ocp10g/adump bdump 存储后台进程跟踪文件和警告日志文件 (使用BACKGROUND_DUMP_DEST设置) /ora01/db/admin/ocp10g/bdump cdump 存储核心堆积文件 (使用CORE_DUMP_DESC设置) /ora01/db/admin/ocp10g/cdump create 存储用于创建数据库的脚本 /ora01/db/admin/ocp10g/create exp 建议存储使用EXPORT实用程序或 ORACLE Data Pump创建的数据库导出文件 /ora01/db/admin/ocp10g/exp logbook 存储数据库历史与状态日志文件 /ora01/db/admin/ocp10g/logbook pfile 存储用于启动数据库的参数文件 /ora01/db/admin/ocp10g/pfile udump 存储用户进程跟踪文件 (使用USER_DUMB_DEST设置) /ora01/db/admin/ocp10g/udump
文件命名 /pm/q/d。pm是装载点,q是一个字符串常量,这个字面值指示包含ORACLE数据库数据的字典,而d是数据库的名字,来源于DB_NAME或ORACLE_SID环境变量 runInstaller -responsefile respfile [-silent][-nowelcome] -nowelcome命令行选项告知在启动时不显示欢迎界面。-silent可选项告诉不用通知用户在安装时所发生的事情,只需执行响应文件中指定的所有任务;
在安装之前,OUI会执行一系列系统检测以确保计算机配置适合安装ORACLE,并且确保安装用户以具有安装权限的用户身份进行登录;这些系统检测存储在一个名为oraparam.ini文件中。 我们可以指示使用哪个参数文件的命令行手工调用安装程序
eg: /mnt/cdrom/runInstaller -parameterFile /home/oracle/oraparam.ini
如果不希望OUI执行任何检测,则可以使用下列的命令行:
/mnt/cdrom/runInstaller -ignoreSysPrereqs
OUI(ORACLE Universal Installer)是一个基于JAVA的图形应用程序,能够在ORACLE运行的所有平台上完成相同的任务。OUI允许安装的源位置是一个URL,从而支持基于WEB的部署,OUI能够自动执行静默安装;
/etc/oratab文件包含一个在计算机上安装的数据库实例的列表及一个指示在计算机启动时数据库实例是否应当自动启动的指示器。这个文件并不包含已安装的ORACLE产品清单,ORACLE的版本特定信息或EM配置细节;
Oracle配置助手包括:iSQL*Plus Configuration Assistant(配置用于连接该数据库的Oracle Containers for Java(OC4J)实例),Oracle Net Configuration Assistant(NETCA,为该数据库设置基本的网络互联)及Oracle Database Configuration Assistant(DBCA,实际完成选择安装的数据库的配置);
在Unix的计算机上安装Oracle时,必须在启动安装过程之前创建oracle用户及oinstall组(拥有Oracle安装信息)和dba组(用于数据库管理)。
在使用WINDOWS操作系统的计算机上安装ORACLE时,必须作为本地Administrators组的一个成员登录计算机;在UNIX环境中,则需要使用oinstall组和oracle用户;
如果希望使用N-tier身份验证和数据库中的表数据,那么必须安装和购买Enterprise Edition(企业版).Standard Edition(标准版)支持其他所有的性能(RAC,多CPU支持及EMDC); ORACLE使用三种方法来存储数据文件:File System,ASM(Automated Storeage Management,自动化存储管理)及Raw Devices(裸设备)。File System包含Oracle Cluster File System和第三方磁盘存储阵列;
三、创建数据库
在创建数据库阶段尽可能只进行简单的操作,首先创建数据库并使其正常运作,然后再考虑配置数据库的问题。
ORACLE服务器的体系结构
ORACLE服务器由两个实体组成:实例(instance)和数据库。这两个实体是独立的,不过连接在一起。在数据库创建过程中,实例首先被创建,然后才创建数据库。在典型的单实例环境中,实例与数据库是一对一的关系。但实例与数据库的关系也可以是多对一的即不同计算机上的多个实例打开共享磁盘系统上的一个公用数据库,这种关系被称为RAC(Real Application Clusters,实际应用群集)。
实例由存储结构和进程组成,并且只短暂存在于RAM和CPU中。数据库由磁盘上的物理文件组成。实例的生存期是其在内存中的存在时间,我们可以启动和停止实例。
数据字典包含了描述整个服务器的元数据,它可以管理物理结构与逻辑结构之间的关系。创建数据字典是数据库创建过程中的主要部分。
一个ORACLE实例由一块被称为系统全局区(System Global Area,SGA)的共享内存以及若干进程组成。SGA至少包含共享池、数据库高速缓存区以及日志缓冲区这三种数据结构,此外还可能包含大池,JAVA池或流池。启动实例时会确定某些SGA结构的大小,而其他一些SGA结构的大小可以动态变化。创建数据库时并不会确定任何SGA结构的大小。 共享池可被进一步细分为其他一些结构:库缓存区与数据字典缓存区。库缓存区是一个内存区域,用于以解析后的形式存储最近执行的代码。数据字典缓存区存储最近使用的对象定义。
数据库高速缓存区是Oracle执行SQL的工作区域。
日志缓冲区是一个非常小的存储结构。
大池是一个可选区域。如果创建了大池,那各种进程都会自动使用大池。否则就只能使用共享池中的内存。
只有在应用程序试图运行数据库内的JAVA存储过程时,才需要使用JAVA池。JAVA池用于实例化JAVA对象所需的堆空间。JAVA池如今已被视为一种标准的存储结构。
调整SGA存储结构的大小对于性能来说至关重要。
实例除了SGA存储结构外,至少还具有5个进程:系统监视进程(system monitor,SMON),进程监视进程(process monitor,PMON),数据库写入器进程(database writer,DBWn,最多可以使用10个这样的进程),日志写入器进程(log writer,LGWR),检查点进程(checkpoint,CKPT)进程。不论实例中是否确实有会话登录甚至还未创建或打开数据库,这些进程总是在实例运行时存在。
SMON主要是打开数据库,从而支持实例与数据库间的连接。在正常运行期间,SMON能完成一系列监视与整理操作;
PMON管理用户会话,在会话出现问题时执行适当的操作;
DBWn负责数据文件的所有写入。没有任何会话能够不断地更新磁盘上的数据。会话只更新数据库高速缓存区中的数据;DBWn尽可能少和尽可能不频繁地进入写作操,因为I/O会使性能变差。
LGWR负责将应用于数据库高速缓存区中数据的所有变化写入磁盘的联机重做日志文件。与DBWn不同的是,这种写行为尽可能接近于实时完成;LGWR能够确保保存所有的用户工作,从而在数据库的数据文件受损的情况下可以应用这些变化来实现还原备份,保证不丢失任何数据;
CKPT进程确保实例不时地与数据库同步,CKPT能够控制同步情况的发生频率;
ORACLE数据库由三种文件类型组成:控制文件,联机重做日志文件及数据文件;其他外部文件包括:初始化参数文件,口令文件与归档的重做日志文件;
每个数据库都具有一个控制文件。但应该创建这个控制文件的多个副本。控制文件包含指向数据库其他文件(联机重做日志文件和数据文件)的指针,存储维护数据库完整性所需的信息。如果eovery Manager(RMAN),某些备份信息也会被存储在其中。控制文件是不可或缺的,它的维护是自动的,我们只能控制其副本的数量及存入位置。我们可以添加,删除或移动副本,但这些操作中能在停机时间进行;
每个数据库都具有至少两个联机重做日志文件。但应该为每个联机重做日志文件创建多个副本。联机重做日志将应用于数据库的所胡变化按时间顺序连续存储在一起。这样只需最少的信息就可以重新构造或重做变化。重做日志由若干组重做日志文件组成,每个文件都被称为一个成员。要运行ORACLE,需要至少两组重做日志文件,每组重做日志文件至少具有一个成员。考虑性能因素,可以创建两组以上的重做日志文件,考虑到安全性因素,可以为每组重做日志文件创建多个成员。对联机重做日志文件的调整可以在不停机的情况下“联机”执行。
在数据库创建阶段,至少必须创建两个数据文件。数据文件是数据的存储仓库。数据文件的大小与数据实际上不受限制,大小只受主操作系统和硬件性能的限制。数据文件是系统管理员可视的物理结构。在数据库生成期内的任何时候,数据文件都可能被重命名,重新分配大小,移动,添加或删除。对数据文件的某些操作必须在停机时进行。
数据库的逻辑结构:表空间与段
表段:包含信息记录;
索引段:用于快速访问任意特定记录的机制;
撤销段:用于存储颠倒或回滚不希望持久的事务可能需要的信息的一种数据结构;
从逻辑上看,表空间是一个或多个段的集合;
从物理上看,表空间是一个或多个数据文件的集合。按照关系分析,段与数据文件之间存在多对多的关系:一个表可以被分割在多个数据文件中;一个数据文件可能包含多个表。
在数据库创建阶段,必须创建许多组成数据字典的段。这些段被存储在名为SYSTEM与SYSAUX的表空间内。为了存储数据字典,在数据库创建阶段必须至少创建上述两个表空间,必须为每个表空间至少创建一个数据文件。
数据字典是元数据,它从逻辑上和物理上描述了数据库及其内容。用户定义,安全性,完整性约束,PL/SQL代码及性能监视信息(ORACLE10G特有的)都是数据字典的组成部分。数据字典被存储为SYSTEM和SYSAUX表空间内的若干段。组成数据字典的段与其他段一样,都只具有表和索引。但是数据字典的段不能被直接访问。通过DDL语言可以对数据字典进行自动维护。
参数文件:定义实例。 除DB_NAME之外,所有参数都具有默认值;除DB_BLOCK_SIZE之外,通过关闭数据库,关闭实例,编辑参数文件及再次启动数据库,所有参数都能够在数据库创建之后被改变。在创建数据库之前,必须创建一个参数文件,并且倩这个参数文件在内存中构建实例。参数文件具有两种类型:旧式的静态参数文件(通过名为init
ORACLE提供了两种不基于数据字典的身份验证方法,可以在不打开数据库甚至不存在数据库的情况下对用户身份进行验证:操作系统身份验证和口令文件身份验证。
口令文件是一个操作系统文件,该文件独立于数据库而存在,并且具有用户名与加密的口令。使用适当的语法,我们可以连接某个实例,使用口令文件中存在的一个用户/密码组合响应提示框,启动该实例,打开已有的数据库或创建新的数据库。
归档日志文件是已填满的联机重做日志文件的副本。归档日志文件能够保证不丢失数据。 DB_BLOCK_SIZE决定数据库高速缓存中缓冲区的大小。指示实例创建数据库时,该参数会被用于格式化组成SYSTEM和SYSAUX表空间的数据文件。创建数据库后,DB_BLOCK_SIZE参数再也不会发生变化。CONTROL_FILES参数是允许实例查找数据库控制文件(包括控制文件的所有副本)的指示器。
如果不重新创建数据库,那数据库字符集就是唯一不能改变的设置。
在数据库创建阶段需要指定SYSAUX表空间。如果没有指定这个表空间,ORACLE会创建一个默认的SYSAUX表空间。UNDO表空间如果没有指定,则不会创建,因为UNDO表空间是可选的。但为了性能和管理的需要,建议创建UNDO表空间。
只有在每个联机重做日志文件组具有多个成员(两个或两个以上)的情况下,才能够提供联机重做日志容错。
四、接合ORACLE数据库
DDL语言:并不直接处理数据,而是处理能够保存数据和提供对数据进行访问的对象;CREATE、ALTER和DROP,TRUNCATE是主要DDL语句;
DCL语言:控制对数据库的访问;GRANT和REVOKE是DCL语句。能够授予和取消的两种权限是系统权限和对象权限。系统权限支持用户执行关于数据库的动作。对象权限被应用于数据库中的特定对象,并且可能根据对象类型发生变化。
DML语言:直接处理数据。SELECT,UPDATE,DELETE,INSERT是主要的DML语言。还包括由COMMIT,ROLLBACK和SAVEPOINT命令组成的事务控制语言元素。UPDATE,INSERT,DELETE命令会启动一个新的事务。SELECT不会启动事务;ROLLBACK和COMMIT会结束一个事务同时启动另一个事务。
事务的ACID测试:
原子性:Atomicity.整个事务必须作为一个单元提交或者全部都不提交;
一致性:Consistency.事务必须遵循某些逻辑规则;
隔离性:Isolation.完成事务的进程必须能够绝对控制其作用的所有元素;
持久性:Durability.某个事务完成之后,数据必须保持不变,并且对于所有用户来说都是可视的。
ORACLE通过锁定指定表来控制隔离性。
共享锁:SELECT语句获得共享锁。共享锁无法阻止其他用户读取和修改表中的数据,而只能阻止其他用户修改或删除指定表的表结构。多个用户能同时获得相同数据上的共享锁;
排他锁:排他锁阻止其他用户获得正在处理的数据上的排他锁,直至COMMIT或ROLLBACK语句。
一个对象的名称必须与相同用户拥有的其他对象的名称不同。
数据库、系统与会话管理命令:
ALTER DATABASE命令用于对数据库进行全部或部分修改;
ALTER SYSTEM命令用于改变运行实例的状态,如ORACEL初始化参数的值和只允许DBA连接实例和进行其他一些操作。
ALTER SESSION命令允许用户个性其会话的属性。
有效的PL/SQL代码块吸需要BEGIN和END关键字,并且在这两关键字之间至少存在一行有效的代码;
SQL*PLUS包含的SET命令可以被保存在一个名为login.sql的文件中,启动SQL*PLUS时会执行该文件来适当配置SQL*PLUS环境;
DBA可以通过在PRODUCT_USER_PROFILE表(属于SYSTEM模式)中添加条目来限定用户在SQL*PLUS中使用的命令;
在LINUX环境中启动iSQL*PLUS,需要以oracle(ORACLE软件的拥有者)身份登录安装ORACLE软件的计算机,同时确保查找中包含$ORACLE_HOME/bin,然后执行 isqlplusctl start;如果希望在LINUX系统中停止iSQL*PLUS,则执行 isqlplusctl stop。
在WINDOWS环境中iSQL*PLUS作为一种服务来运行,通过MMC管理单元来进行启动和关闭。使用isqlplusctl命令也可以停止、启动这种服务并检查该服务的状态。
可以在WEB浏览器中输入:/isqlplus">http://
访问数据库,可以使用JAVA和JDBC;可以有计划地使用OCI的API及其他一些对象接口和API,还可以在3GL代码中编写SQL,然后使用预编译程序生成有效的运行时调用。
ORACLE Database 10g包含了一个JVM,使用这个JVM可以执行在数据库中存储的JAVA存储过程和函数。内置的JVM使用JDBC来操作数据库数据;
对编写ORACLE应用程序来说,OCI是最快速和最复杂的API。
使用WINDOWS平台的开发人员可以使用ODP.NET,OO4O,ODBC来编写访问ORACLE数据的应用程序;五、管理ORACLE进程 如果希望启动SQL*PLUS时不出现登录提示,则使用/nolog开关的命令;
lsnrctl start listener_name :启动监听器
lsnrctl stop listener_namer:关闭监听器
lsnrctl statu listener_namer:查看监听器的状态
如果没有运行侦听程序,Database Control就无法连接数据库。停止侦听程序并不会影响已经建立的会话,只是不能建立任何新的会话;
Enterprise Manager Database Control(EMDC)是Entrprise Manager Grid Control(EMGC)的替代品。EMDC被限制于每次管理一个数据库,而EMGC每次可以管理多个数据库及应用服务器。
emctl start dbconsole:启动EMDC进程;
emctl stop dbconsole:停止EMDC进程;
emctl status dbconsole:查询EMDC进程状态;
EMDC进程运行后,通过下面的URL来连接数据库: :/em">http://
EMDC中存在一个定位至iSQL*PLUS的链接; 普通用户无法启动或关闭数据库,因为普通用户依据数据字典进行身份验证,但是数据字典在数据库打开前无法被读取,从而使普通用户无法启动或创建数据库。所以普通用户必须使用作为ORACLE软件拥有组的一个成员通过操作系统进行身份验证;通过给出存在于外部口令文件的某个用户名/密码组合进行身份验证。通过在用户进程中给出使用适当语法的CONNECT命令,就可以告知ORACLE希望使用外部身份验证。如果使用EMDC,通过使用SYSOPER或SYSDBA实现。
CONNECT user/pass[@db]:标准数据字典身份验证,数据库必须已经打开,任何用户使用此语法连接数据库,就无法执行启动或关闭命令;
CONNECT user/pass[@db] as sysdba:进入外部口令文件验证用户名/口令组合。 CONNECT user/pass[@db] as sysoper:同上
CONNECT / as sysdba :使用操作系统身份验证。ORACLE会进入主机操作系统,并且查看运行SQL*PLUS的主机操作系统用户是否为拥有ORACLE软件的操作系统组的一个成员,如果通过测试则该用户就可以在不必给出口令和用户名的情况下以SYSDBA或SYSOPER身份登录ORACLE;
CONNECT / as sysoper:同上
使用后四种语法连接数据库的用户不仅能够执行数据库的启动和关闭命令,还可以在任何状态下(即使数据库还未被创建的情况)连接数据库。前三种连接语法都可以包含一个数据库连接串。
SYSOPER能执行下列命令:
STARTUP
SHUTDOWN
ALTER DATABASE [MOUNT | OPEN | CLOSE | DISMOUNT]
ALTER [DATABASE | TABLESPACE ][BEGIN | END ]
BACKUP
RECOVER
SYSDBA除以上所有命令外,还能创建数据库,执行不完全恢复及创建其他SYSOPER和SYSDBA用户;
SYSDBA和SYSOPER不是用户,而是能够被授予用户的权限。默认情况下,只有用户SYS才具有这些权限。SYS是数据库中功能最强大的用户,并且是数据字典的拥有者。
使用SYSOPER权限能够作为用户PUBLIC进行登录。PUBLIC不是标准形式的用户,而是一个名义上的用户,该用户具有管理权限,但是在默认情况下不具有查看或操纵数据的权限。
数据库与实例是分离的实体,两者相互独立存在。
数据库启动的过程是:
1.首先在内存中构建实例;
2.通过加载数据库来支持与数据库的连接;
3.打开数据库以供使用。
数据库具有以下四种状态:
SHUTDOWN:与数据库相关的所有文件都被关闭,同时实例并不存在。
NOMOUNT: 实例被构建在内存中(SGA已被创建,根据参数文件的指定启动某些后台进程),但并没有连接任何数据库。这种情况在数据库不存在时确实可能出现;
MOUNT: 实例定位并读取数据库控制文件。
OPEN: 所有数据库文件都被定位和打开,并且终端用户能够使用数据库。
执行STARTUP命令,就会依次完成上述阶段。可以在中途停止启动进程;
参数文件: spfile
在NOMOUNT状态下,ORACLE会按照上述顺序查找参数文件,使用查找到的第一个文件并忽略其他文件。如果不存在这三个文件,实例就不能启动。NOMOUNT状态下只使用参数文件和告警日志。参数文件中的参数用于在内存中构建SGA和启动后台进程。各种实体会被写入描述这个启动进程的告警日志。告警日志位于BCKGROUND_DUMP_DEST参数所指定的位置。如果已经存在告警日志,那么要写入的内容会被添加在已存在的告警文件中,否则就会创建告警日志。如果这个阶段出现了任何问题,还会在相同的位置生成跟踪文件;
一旦实例在NOMOUNT状态下启动成功,就可以通过读取控制文件转换到MOUNT状态下。此时ORACLE使用CONTROL_FILES参数定位控制文件,如果控制文件(或者控制文件的任何多元化副本)被损坏或丢失,那么数据库就不会被加载,并且还会在继续启动进程之前执行适当的动作。如果数据库加载成功,那么控制文件的所有副本都可用和相同;
在数据库加载阶段,所有数据文件和联机重做日志文件的名称与位置都从控制文件中读取,但ORACLE仍然没有试图查找这些文件,这些文件的查找在转换至OPEN状态时进行。如果任何文件丢失或损坏,那么数据库就会停留在MOUNT模式下,并且只有在执行适当的动作之后才能被打开。此外,即使所有文件都存在,这些文件在数据库被找开之前也必须同步。如果数据库的最近一次关闭是有序的(也就是说数据库高速缓存区内的所有数据缓冲区首先通过DBWn进程被转储至磁盘),那么所有数据文件和联机重做日志文件都将同步;ORACLE会知道所有已提交的事务都被安全地存储在数据文件中,并且没有任何未提交的事务被挂起等待回滚。然而,如果数据库的最近一次关闭不是有序的,那么ORACLE就必须修复损坏的文件。加载和打开数据(以及在最近一次不是有序关闭数据库的情况下完成修改)的进程为SMON。只有在成功打开数据库之后,ORACLE才允许建立会话。
数据库的关闭顺序应当与数据库打开顺序相反。在有序关闭数据期间,数据库首先被关闭,然后被卸载,最后实例被停止。在数据库关闭阶段,所有会话都会被终止:活动的事务通过PMON进程被回滚,已完成的事务通过DBWn进程被转储至磁盘,同时数据文件和重做日志文件被关闭。在数据库卸载阶段,控制文件被关闭。随后,通过解除分配SGA和终止后台进程,实例被停止下来。
shutdown [normal|transactional|immediate|abort];
normal:默认选项。不许可任何新的用户连接,但是允许继续当前的所有连接,只有所有用户自愿登录时,数据库才能真正的关闭;
通常,正常的数据库关闭是没有意义的:即使只剩下EMDC在运行,也总是存在尚未退出登录的用户;
transactional:不许可任何新的用户连接,没有存在于某个事务中的现有会话会被终止,允许当前位于某个事务中的会话在完成该事务之后终止。一旦所有会话终止,数据库就会关闭; immediate:不许可任何新的用户连接,当前的所有连接的会话都被终止。任何活动的事务都将回滚,随后数据库会被关闭;
abort:使用这个选项相当于断电;实例被立即终止。任何数据都不会被写入磁盘,任何文件句柄都不会被关闭,同时也不会采用任何有序的方式终止正在进行的事务;
shutdown abort命令不会损坏数据库,不过会使数据库处于不一致的状态。因此建议我们在数据库异常退出之后不执行诸如备份之类的某些操作。
normal,transactional,immediate关闭模式通过被称为:干净的,一致的或有序的关闭。在所有会话终止之后,PMON进程会回滚任何未结束的事务。接下来,CKPT进程发布一个检查点,从而促使DBWn进程将所有被更新的数据从数据库高速缓存区写入数据文件。同时LGWR进程也将仍然存在于内存当中的所有变化矢量转储至日志文件。随后,文件头被更新,文件句柄被关闭。这意味着数据库处于一致的状态;所有已提交的事务都位于数据文件中,不存在需要回滚的,被挂起的未提交事务,并且所有数据文件和日志文件同步。
abort关闭模式被称为无序的关闭,并且会使数据库处于不一致的状态:因为已提交的事务只存在于内存中,而DBWn进程还未将它们写入数据文件,这些事务极有可能丢失。数据文件中的未提交事务也可能尚未回滚,导致数据库出现讹误。
数据库出现讹误的定义:可能丢失了已提交的事务,也可能存储未提交的事务;数据库的讹误必须通过实例恢复来修复。
实例恢复是使ORACLE数据库不出现讹误的回滚和重做机制。ORACLE检测到需要实例恢复,就会自动执行。实例恢复无法人工启动或取消。
某个实例试图打开数据库时,SMON进程会检查数据文件和联机重做日志文件的状态。如果数据库的关闭是无序的,那么此时SMON进程显然会启动实例恢复进程。只有完成了实例恢复,数据库才能被打开。
六、管理ORACLE存储结构:
1.每个数据库都必须由一个或多个表空间组成,每个表空间必须属于并且只属于一个数据库; 2.每个表空间都必须由一个或多个数据文件组成,每个数据文件都必须属于并且只属于一个表空间;
3.每个数据文件都必须由一个或多个操作系统块组成,每个操作系统块都必须属于并且只属于一个数据文件;
4.每个表空间都可以包含一个或多个段,每个段都必须存在并且只存在于一个表空间内;
5.每个段都必须由一个或多个区间组成,每个区间都必须属于并且只属于一个段;
6.每个区间都必须由一个或多个ORACLE数据块组成,每个ORACLE数据块都必须属于并且只属于一个区间;
7.每个区间都必须被定位并且只能被定位在一个数据文件内,数据文件中的空间可以被分配为一个或多个区间;
8.每个ORACLE块都必须由一个或多个操作系统块组成,每个操作系统块都可以是并且只能是一个ORACLE数据库的部分。
ORACLE数据文件是保存ORACLE数据的操作系统文件。大多数数据文件由文件头部,区间(已分配的空间)及新社会闲空间组成。
数据文件的头部将其标识为数据库的一部分,并且存储了该数据文件的细节,包括数据文件所属的表空间及最后执行的检查点。
操作系统块是文件系统使用的最小分配单元。
数据库是用于ORACLE结构的最高和最终单元。在数据库内,表空间是最大的存储结构。在ORACLE10g中,数据库至少具有三个表空间:SYSTEM,SYSAUX及一个撤销表空间。这三个表空间在数据库创建阶段被创建。此外,应该至少为特定数据创建一个额外的临时表空间。在ORACLE10g中SYSTEM和SYSAUX表空间被视为数据库系统的一部分。
SYSTEM表空间包含数据字典,SYSTEM类型的撤销段或回滚段。如果没有SYSTEM表空间,数据库就无法运行。
SYSAUX表空间用于存储统计信息及其他信息。
创建数据库时需要遵循并且有助于改善性能的指导原则:
1.分隔参与资源争用的数据;
2.分隔具有不同存储要求的对象;
3.将不同的分区存储在不同的表空间内;
表空间可以存储永久段,临时段和撤销段这三种段中的一种,分别对应于永久对象,临时对象和用于回滚或闪回查询的撤销数据;
ORACLE表默认空间:
SYSTEM表空间:用于存储数据字典及SYS模式中的所有对象。默认情况下,对这些对象的访问被限制于SYS用户和被授予DBA角色的其他用户。每个数据库都必须具有一个SYSTEM表空间;
SYSAUX表空间:ORACLE必须的表空间。
TEMP表空间: 用于存储临时的对象及其数据。全局临时表的数据部分及不能完全在内存中执行排序时创建的排序段都是该表空间的示例。尽管没有任何要求,但是每个数据库都应当具有一个临时的表空间。如果没有创建临时的表空间,那么会默认在SYSTEM表空间内创建临时段; UNDOTBS1表空间:用于为数据库存储撤销信息。撤销指允许用户读取正在发生变化但相应事务尚未被提交的记录、并且被保留在数据库内的数据。每个数据库都需要一个撤销表空间; USERS表空间:这个默认的表空间是用于非系统用户(不是SYS或SYSTEM用户)的USER表空间。
段是数据库中要求存储的对象。视图不是段。DBA_SEGMENTS视图可以查询相应段的信息。数据库中要求存储的任何对象都被归类为段。
为表空间内的段分配空间时,每次只能分配一个区间。一个段由一个或多个区间组成,在一个段的创建阶段,至少会为该段分配一个区间。区间由邻近的数据块构成,区间可以由DBA人工管理,也可由ORACLE自动管理。一个段只能存在于一个表空间内,一个区间只能存在于一个属于指定表空间的数据文件内。区间是为某个段分配的若干邻近的数据块的集合。可以在表空间内本地管理区间,也可以对区间进行字典管理。可以使用DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL过程或EM将字典管理的表空间迁移为本地区间管理。但不能将本地区间管理转化为字典管理。
数据库块是数据库内I/O的最小单位。一个表空间及其数据文件始终只具有一个数据块容量值。创建表空间时可以指定数据块容量也可以使用数据库默认的数据块容量。不同的表空间可以指定不同的数据块容量。一旦创建了表空间,除了删除和重新创建表空间外,无法改变其指定的数据块容量。
CREATE [BIGFILE|SMALLFILE] [TEMPORARY] TABLESPACE tablespace_name DATAFILE datafile |TEMPFILE tempfile [MINIMUM EXTENT minimun_ext_size] [BLOCKSIZE blocksize] [[COMPRESS|NOCOMPRESS] DEFAULT STORAGE (default storage clause)] [LOGGING|NOLOGGING] [FORCE LOGGING] [ONLINE|OFFLINE] [EXTENT MANAGEMENT DICTIONARY | LOCAL [AUTOALLOCATE | UNIFORM SIZE size]] [SEGMENT SPACE MANAGEMENT MANUAL|AUTO] [FLASHBACK ON|OFF];
如果数据文件已经存在于磁盘中,表空间的创建操作就会失败。可以通过在指定数据文件规范中的REUSE参数解决这个问题;
DROP TABLESPACE tablespace_name [INCLUDING CONTENTS] [ CASCADE CONSTRAINTS];
如果不指定INCLUDING CONTENTS 和 CASCADE CONSTRAINTS命令,那么只有在表空间内不包含任何永久对象的情况下才能删除。删除表空间是从数据库的控制文件和数据字典中去除对这个表空间的所有引用,并没有删除数据文件。使用EM操作时可以选择是否删除数据文件。
表空间状态说明:
读/写状态:表空间可以创建或修改对象,并且对象的内容可以修改;
只读状态: 表空间无法写入;
脱机状态: 表空间内容不可用;
BIGFILE:创建的表空间只有一个数据文件,而且这个数据文件的大小限制在文件系统所允许的范围内,该表空间无法通过数据字典进行管理,必须指定本地区间管理和自动的段空间管理;
某个表空间一旦被设置为本地管理的表空间,就无法再将其转为字典管理的表空间。
要得到指定数据库中的表空间及其特征的相关信息,可以使用DBA_TABLESPACES或V$TABLESPACE视图。DBA_TABLESPACES视图提供了V$TABLESPACE视图中不存在的表空间存储特征的相关信息。
要得到数据文件的相关信息,可以查询DBA_DATA_FILES或V$DATAFILE视图。DBA_DATA_FILES会列出数据文件所属表空间的名称;V$DATAFILE视图仅列出表空间号,而该表空间号必须与V$TABLESPACE视图连接在一起才能得到表空间的名称,但V$DATAFILE视图提供了更加详细的文件状态信息。
对临时表空间而言,可以通过查询V$TEMPFILE和DBA_TEMP_FILES视图来获取临时文件及其存储特征的相关信息。
在数据库处于MOUNT(尚未打开)状态时,我们可以查询V$TABLESPACE、V$DATAFILE和V$TEMPFILE视图。
数据库具有物理的结构和逻辑的结构。从物理的角度出发,数据库由在操作系统数据块上构建的若干数据文件组成;从逻辑的角度出来,数据库由若干表空间组成,表空间包含了在区间上构建的段。数据库中最小的逻辑单元是数据库块;
表空间是数据库的物理结构和逻辑结构的链接。通过使用表空间,能够控制数据的位置,并且还能够分别管理数据库的各部分。
段是数据文件中已经分配了空间的对象。段存在不同的类型:表,索引,回滚,临时段及其他一些类型。一个段只能被分配在一个表空间内;
区间是表空间内的空间分配单元。一个区间是一组邻近的数据块,并且必须存在于一个数据文件内。属于相同段的不同区间可以们于属于相同表空间的不同数据文件内。ORACLE中,多个段不能共享一个区间;
数据库块是数据库内最小的I/O单元。数据库中所有数据块的大小在数据库创建阶段设置,并且无法改变,除非删除重新创建数据库;
表空间具有以下类型:SYSTEM的或非SYSTEM的,永久的或临时的,本地管理的或数据字典管理的。
表空间可以包含永久对象或临时对象。临时对象是针对排序操作和临时表而创建的段。
如果在数据文件定义中使用AUTOEXTEND子句,那么数据文件可以在必要时自动扩展。使用该子句时,需要确认指定NEXT值和MAXSIZE值,使文件不会占用所有可用的磁盘空间。 通过增加已有数据文件的大小和添加新的数据文件,可以增大已有的表空间的容量。通过使用ALTER TABLESPACE命令可以令某个表空间脱机或不可用。包含静态或历史数据的表空间应该通过ALTER TABLESPACE命令将其设置为只读状态。只读表空间并不需要进行常规备份,并且会阻止对数据的绝大多数修改,但可以删除位于只读表空间内的对象。
只有在字典管理表空间的情况下,才需要设置PCTFREE、PCTUSED、FREELISTS、FREELIST GROUPS参数。
七、管理数据库用户
SYS和SYSTEM用户始终会被创建且始终没有被锁定。
SYS拥有数据字典及其关联的所有对象;
SYSTEM可以访问数据库内的所有对象。
CREATE USER user_name IDENTIFIED [BY pwd | EXTERNALLY | GLOBALLY AS extname] [DEFAULT TABLESPACE tablespacename] [TEMPORARY TABLESPACE tablespacename] [ACCOUNT LOCK | UNLOCK] [PROFILE profilename |DEFAULT] [PASSWORD EXPIRE] [QUOTA num[K|M] |UNLIMITED ON tablespace [QUOTA num[K|M] |UNLIMITED ON tablespace]...];
user_name:用户名
IDENTIFIED :验证用户真实性的方法:
1. BY pwd:通过口令;
2. EXTERNALLY:使用这种方法,运行数据库的计算机操作系统会对用户名进行身份验证; 3. GLOBALLY AS extname:用户名和口令会被传至extname服务进行登录验证。需要外部身份验斑点机制。
ALTER USER user_name IDENTIFIED [BY pwd | EXTERNALLY | GLOBALLY AS extname] [DEFAULT TABLESPACE tablespacename] [TEMPORARY TABLESPACE tablespacename] [ACCOUNT LOCK | UNLOCK] [PROFILE profilename |DEFAULT] [PASSWORD EXPIRE] [QUOTA num[K|M] |UNLIMITED ON tablespace [QUOTA num[K|M] |UNLIMITED ON tablespace]...];
除用户名外,其他用户属性均可用ALTER USER来修改。
DROP USER user_name [CASCADE];
CASCADE选项会删除用户所有对象及用户拥有的表中包含的所有数据。
要删除某个模式用户,就必须指定DROP USER命令的CASCADE选项。最好是先删除该用户的对象,再删除该用户。通过查询DBA_OBJECTS视图可以查询用户所拥有的所有对象,通过查询DBA_DEPENDENCIES视图可以查看对象依赖关系。
授予系统权限: GRANT privilege[,privilege,......] TO username [,username,......] [WITH ADMIN OPTION];
对于用户来说,授予该用户的权限立刻能够使用。
一个用户被授予某个系统权限并不总是意味着该用户能够行使这个权限,可能会受到其他的限制,例如配置的定额不够造成无法在某表空间内建表等。
WITH ADMIN OPTION权限表示被授予权限的人能够将其得到的权限授予给其他人;
取消系统权限: REVOKE privilege [,privilege,......] FROM username [,username,......];
系统权限的取消不会产生级联。
通过查看DBA_SYS_PRIVS视图和USER_SYS_PRIVS视图可以查看系统权限的授予情况。 系统权限一般由DBA来授予或取消。
授予对象权限: 对象权限需要由对象的拥有者来授予或取消;
GRANT privilege [,privilege,......] | ALL [(column[,column,...])] ON objectname TO username | role |PUBLIC [WITH GRANT OPTION];
ALL指定应当授予应用于指定对象的所有权限。
WITH GRANT OPTION允许表示被授予权限的人能够将其得到的对象权限授予给其他人;
取消对象权限: REVOKE privilege [,privilege,....] |ALL [(column[,column,...])] ON objectname FROM username | role |PUBLIC [CASCADE CONTRAINTS];
对象权限的取消会产生级联。
如果用户已被授予在特定模式中某个表上的REFERENCES权限,并且使用这个权限创建了依赖于该表的,具有FOREIGN KEY 约束的一个表,那么就需要使用CASCADE CONTRAINTS选项来取消对象权限。
USER_TAB_PRIVS_MADE:某个用户授予其他用户在该用户模式对象上的对象权限; USER_TAB_PRIVS_RECD:为某个用户授予的在其他用户模式对象上的权限; ALL_TAB_PRIVS_MADE:某个用户授予其他用户在该用户模式对象与其他模式对象上的对象权限;
ALL_TAB_PRIVS_RECD:为某个用户授予的在该用户模式对象与其他模式对象上的的权限; USER_COL_PRIVS_MADE:某个用户授予其他用户在其模式中表上的列权限; USER_COL_PRIVS_RECD:为某个用户授予的,在其他模式的表上的列权限; ALL_COL_PRIVS_MADE:某个用户授予其他用户在该用户模式中表上与在其他模式中表上的列权限;
ALL_COL_PRIVS_RECD:为某个用户授予在该用户模式表上与在其他模式中表上的列权限。
角色是用于权限或其他角色的容器,并且能够进行外部身份验证。
通过EM创建某个用户时,该用户会被自动授予CONNECT角色。
CONNECT角色的权限: ALTER SESSION、CREATE CLUSTER、CREATE DATABASE LINK、CREATE SEQUENCT、CREATE SESSION、CREATE SYNONYM、CREATE TABLE、CREATE VIEW
创建角色: CREATE ROLE rolename [NO IDENTIFIED | IDENTIFIED BY pwd | EXTERNALLY |GLOBALLY];
在数据库中,每个角色的名称必须惟一且不能与用户同名,因为用户和角色都被存储在数据字典中。
修改角色: ALTER ROLE rolename [NO IDENTIFIED | IDENTIFIED BY pwd | EXTERNALLY |GLOBALLY];
为角色授予和取消权限 GRANT sys_priv[,sys_priv,...] TO role |PUBLIC [,role |PUBLIC,...] [WITH ADMIN OPTION]; GRANT ALL [PRIVILIEGES] | obj_pri[(column,column,...)][,obj_priv [(column,column,...)],...] ON [schema_name.]obj_name TO role |PUBLIC [,role|PUBLIC,...]; REVOKE sys_priv|role [,sys_priv |role_name,...] FROM role|PULBIC [,role|PUBLIC,...];
REVOKE ALL [PRIVILIEGES] | obj_priv[,obj_priv,...] ON [schema_name.]obj_name FROM role|PULBIC [,role|PUBLIC,...] [CASCADE CONSTRAINTS];
为用户授予和取消角色
GRANT role_name [,role_name,...] TO user_name |role_name|PUBLIC[, user_name |role_name|PUBLIC,...] [WITH ADMIN OPTION];
REVOKE role_name,[role_name,...] FROM user_name|role_name|PUBLIC[,user_name |role_name|PUBLIC,...];
如果取消某个用户的一个角色,除非断开与实例的连接或者禁用这个角色,否则不会立即为该用户取消该角色的权限。不过,在下次连接实例时,或者在角色已被取消后使用SET ROLE命令时,用户将无法再启用这个角色。
设置用户的默认角色
一旦为某个用户授予了一个角色,就会自动将该角色配置为默认角色。用户连接实例时会自动为用户启用该角色,并且用户也能够使用被授予给这个角色的任何权限。不过,如果希望只在用户连接实例时激活为用户授予的角色,就需要修改自动启用的默认角色集。
如果没有ALTER USER命令或EM进行指定,那么为某个用户授予的所有角色都被视为这个用户的默认角色。
ALTER USER user_name DEFAULT ROLE role_name[,role_name,...] | ALL [EXCEPT role_name[,role_name,...]] |NONE;
如果为用户授予一个需要口令的角色,并且将这个角色设置为默认角色,那么在使用为该角色授予的权限时,用户不需要输入口令。如果在指定默认角色时使用NONE,那么可以禁用被指派给用户的所有角色。此时用户只能使用直接授予的系统权限和对象权限或PUBLIC权限执行各种操作。
启用与禁用角色(DBMS_SESSION.SET_ROLE)
SET ROLE ALL [EXCEPT role_name[,role_name,...]] |NONE|role_name [IDENTIFIED BY pwd][,role_name [IDENTIFIED BY pwd,...];
删除角色:
删除角色,必须作为创建这个角色的,被授予DROP ANY ROLE系统权限的用户或作为使用WITH ADMIN OPTION被授予这个角色的用户才能操作。
DROP ROLE role_name;
配置文件是一个ORACLE对象。该对象允许DBA设置口令管理和资源限制。在创建数据库时也会创建一个DEFAULT的配置文件。该配置文件对口令、账户锁定及资源利用没有任何限制。 ORACLE只有在RESOURCE_LIMIT系统初始化参数设置为TRUE时才会实施资源限制。默认值为FALSE。
创建、更改及删除配置文件
对配置文件的修改不会应用于当前登录的用户,而是应用在用户下次连接服务器时。 CREATE[|ALTER] PROFILE profile_name LIMIT [SESSIONS_PER_USER value]--用户同时具有的最大并发会话数 [CPU_PER_SESSION value]--在一次会话中可以占用的CPU时间总量,单位为百分之一秒;一旦达到限制,用户会话就会终止并且出现一条ORACLE服务错误消息。为了重置这个限制,用户必须断开连接并进行再次连接; [CPU_PER_CALL value]--单条SQL语句可以占用的CPU时间总量,单位为百分之一秒;一旦达到这个限制,SQL语句就会终止并且没有完成的任何事务都将回滚。用户会话保持连接状态。对数据库的每次调用都会重置这个限制; [CONNECT_TIME value]--用户保持与实例连接的最长时间,以分钟为单位 [IDLE_TIME value]--用户在不执行任何数据库活动时保持与实例连接的最长时间,以分钟为单位; [LOGICAL_READS_PER_SESSION value]--用户在其会话期间允许读取的数据块数(包括来自磁盘的物理数据块及来自数据库高速缓存区的逻辑数据块)。一旦读取完这个参数所指定的数据块数,用户就需要启动另一个会话,从而能够继续访问数据库中的数据; [LOGICAL_READS_PER_CALL value]--用户执行一条SQL语句时允许读取的数据块数(包括来自磁盘的物理数据块及来自数据库高速缓存区的逻辑数据块)。一旦读取完这个参数所指定的数据块数,这条SQL语句将会终止,并且没有完成的任何事务都将回滚; [COMPOSITE_LIMIT value]--指定下列4种资源限制的加权平均值:CPU_PER_SESSION,CONNECT_TIME,LOGICAL_READS_PER_SESSION,PRIVATE_SGA。如果这4个参数的加权平均值超过了此限制,用户会话将终止。 [PRIVATE_SGA bytes [K|M] ] --在多线程服务器MTS环境中,指定用户会话在SGA中能够占用的最大字节数,如果没有使用MTS连接来连接数据库实例,可以忽略该参数。
创建配置文件后如果没有将其指定给用户,则该配置文件不会被使用。
可以为任何配置文件资源限制指定关键字UNLIMIYED,从而不会影响对资源的限制。
创建或更改一个配置文件时为所有配置都指定关键字DEFAULT,这将指派DEFAULT配置文件的各种资源限制值。如果DEFAULT配置文件对新建配置文件中一个被指定为DEFAULT的资源限制产生影响,那么二者会得到相同的限制。
DROP PROFILE profile_name [CASCADE];
如果没有指定CASCADE选项,删除一个配置文件时就会要求这个配置文件没有被指派给任何用户。如果用CASCADE选项,被指派这个配置文件的用户就会被自动指派默认的配置文件。
因为数据库中必须存在DEFAULT配置文件所以这个文件不能删除;MONITORING_PROFILE配置文件也不能被删除,因为ORACLE需要这个配置文件在数据库内执行系统监视功能。可通过查询DBA_PROFILES视图查看当前已配置的配置文件参数值。
为用户指派配置文件
在任意时间,用户都只具有一个有效的配置文件。
ALTER USER user_name PROFILE profile_name;
普通用户除可更新其用户口令外,不能对其用户账户进行任何更改。
八、管理数据库对象
模式对象是用户拥有的对象。
非模式对象与用户无关,例如表空间。在某些情况下,非模式对象是用户SYS拥有的对象,并且可以被所有用户访问。这种非模式对象包括公共的同义词与公共的数据库链接。
除数据库链接名最多可为128个字符外,模式对象名最多为30个字符;
保留字不能做为对象名;
所有对象名必须以字母打头,且只能包含字母,数字,下划线,$和#;
在双引号中封装名称就不用遵循以上原则(除长度限制外)。
命名空间定义了一组对象类型,这组对象类型内的所有名称必须通过模式与名称被惟一标识;
下列对象类型可以共享相同的命名空间:
表,视图,序列,私有同义词,独立的过程,独立的函数,程序包,物化视图,自定义类型;
以上对象类型在相同的模式下必须拥有不同的名称;
下列对象类型具有各自的命名空间:
索引,约束,群集,数据库触发器,私有的数据库链接,维。
以上对象类型在相同的模式内可与其他对象类型同名,但对于相同类型则不能同名。如:一个索引在同一模式下可能具有与某个表相同的名字,但是不能存在两个相同的索引名。
视图可以增加数据安全性,可以简化数据的显示,但不能改善性能。
DATE和TIMESTAMP均可以秒为单位来记录日期/时间值;
一个事务由两条语句组成,如果其中第一条语句执行成功,第二条语句因违反约束而失败,则第二条语句会完全回滚,但第一条语句的执行结果会保留,但不会提交;
九、操纵数据库数据
数据库事务的ACID测试:
原子性:一个事务的各个部分都必须完成,否则整个事务都不会完成;
一致性:查询的结果必须与查询开始时的状态一致;
隔离性:未完成的(也就是未提交的)事务必须不可视;
持久性:一旦使用COMMIT结束某个事务,就必须保证数据库不丢失这个事务;
执行SELECT语句的过程:一条SELECT语句分阶段执行。执行SELECT语句的服务器进程首先会查看包含所需数据的数据块是否已经位于内存和数据库高速缓存区中。如果条件成立,那么执行就会立即继续执行。如果条件不成立,服务器必须在磁盘上定位相应的数据块,并将数据块复制至数据库高速缓存区内。只要查询所需的数据块位于数据库高速缓存区内,进一步的处理如排序或聚集操作就在指定会话的PGA中完成。执行完成后,将结果集返回给用户进程。 服务器进程是将数据块从数据文件读取至数据库高速缓存区,而DBWn进程则是将数据块从数据库高速缓存区写入数据文件,这两个过程刚好相反。 ORA-1555:snapshot too old(快照过旧)的原因一般是需要回滚的数据块不再位于撤销段内。
撤销不是重做的逆过程。对于表段,索引段或撤销段的数据块的变化来说,重做可以保护所有的数据块变化。就重做而言,撤销段只是一个段,对这个段所做的任何变化都必须是持久的。
执行UPDATE操作的过程:
1.在内存中找到所需的数据块或将所需的数据块从磁盘复制到内存;
2.在DML操作影响的所有记录以及关联索引键上放置锁定;
3.生成重做。服务器进程在日志缓冲区中写入即将应用于指定数据块的变化。这个重做生成操作应用于数据块的变化和撤销块的变化。如果要更新某列,则该列的新值和旧值都会被写入日志缓冲区,如果该列是某索引键的一部分,则应用于该索引的变化以及保护索引变化的撤销块变化也会被写入日志缓存区;
4.生成重做后就可在数据库高速缓存区内完成下列更新操作:使用变化后的列更新表数据块,未变化的列则被写入撤销段数据块。从这一时刻到提交更新操作的时候,与发生变化的记录相关的其他会话中的所有查询都会被重定向至撤销数据。只有执行更新操作的会话可以在表数据块中看见更新后的记录。所有关联的索引变化同样也会应用上述原则。
执行INSERT和DELETE的过程: INSERT和DELETE与UPDATE具有相同的管理方式。其中重做生成操作完全相同,对数据块和撤销块进行的所有变化都会首先被写入日志缓冲区。二者的区别在于所生成的撤销数据量不同。插入一条记录时,生成撤销的操作只涉及为撤销块写下新的ROWID;对于DELETE来说,因为整条记录都会被入撤销块,所以在必要时通过在表中插回记录就可回滚删除操作。
回滚机制:回滚UPDATE语句时,未被更新的列会从撤销块复制回表数据块;回滚INSERT时,ORACLE会从撤销段中检索插入记录的ROWID,并将其用作在表上进行删除的键;回滚DELETE时,ORACLE会根据撤销块中的数据构造一条完整的插入语句。回滚在执行时会自己生成更多的重做,重做可能多于原有的语句。
提交操作:执行COMMIT命令时发生的所有物理操作是LGWR进程将日志缓冲区的内容写入磁盘。DBWn进程完全没有执行任何操作。这是一个非常重要的特性。
为了使某个事务持久,所需的全部工作是将组成这个事务的变化写入磁盘而不必在磁盘上写入实际的数据。如果变化以多重重做日志文件的形式存储在磁盘上,那么在出现数据库受损的事件时,通过从数据库受损前所做的备份中还原数据文件及应用重做日志中的变化,就可以恢复事务。执行COMMIT命令只涉及将日志缓冲区的内容写入磁盘及标记事务的完成。
DBWn进程与提交处理没有关系,但最终这个进程会将变化了的或脏的数据块写入磁盘。在正常运行期间,DBWn进程只会将某些脏缓冲区写入磁盘,在需要某个检查点时,DBWn进程会将所有的脏缓冲区写入磁盘。
如果多语句事务中的一条语句违反了约束,那么只有这条语句被回滚,该事务的其他语句则保持完整和未提交的状态。
Data Pump文件类型:SQL文件,日志文件及转储文件;
ORACLE目录始终属于SYS用户,为了创建目录,必须被授予适当的权限:CREATE DIRECTORY。
与其他DML操作一样,外部表路径插入操作使用了一个正规的提交。直接路径操作并不使用提交,而是简单地将高水印向上移动,从而能够包含最新写入的数据块。
Data Pump将数据上载至某个表中,并且希望使用直接路径,则如果这个表在某个群集内,那么该操作是不可能完成的;必须首先在该表上禁用插入触发器;无法进行控制,如果允许的话,Data Pump会自动使用直接路径。
十、PL/SQL编程
PL/SQL代码可以被某个用户进程调用,并且存储在数据字典内,在实例内运行。
编译PL/SQL代码时,得到的结果存储位置取决于PLSQL_CODE_TYPE.本地编译代码被存储在一个操作系统文件内,而解释代码则被存储在数据字典内。
SQL是一种面向集合的语言。
可以用EXECUTE来执行存储过程,但不能执行函数;
触发器由触发事件来运行。
十一、保护ORACLE数据库的安全
决定访问计算机系统时需要遵循的最安全原则是最小权限原则,即用户应当只具有执行其任务所需的最小权限,并且禁止所有未被特别允许的权限。在ORACLE环境中,实现这个功能的第一个步骤就是:限制CONNECT能力及为PUBLIC用户授予的权限。ORACLE遵循了最小权限原则,在默认情况下,只有SYS和SYSTEM才具有所有的权限。
通过查询DBA_USERS视图可以查看数据库的用户及用户账户的状态。EXPIRED涉及口令,表示该用户以用户名首次登录数据库时,必须提示该用户修改口令。LOCKED意味着该账户不能进行数据库连接,必须经过解锁才能被使用。
除SYS,SYSTEM,DBSNMP与SYSMAN账户,其他所有DBCA创建的用户账户均为EXPIRED&LOCKED状态。DBSNMP与SYSMAN供EM的Grid Control或Database Control使用。为了修改上述两账户的口令,就必须使用emctl实用程序。
UTL_FILE_DIR实例参数:默认为NULL。该参数允许PL/SQL通过UTL_FILE补充程序包来访问服务器的系统。UTL_FILE包具有打开并读写文件的过程,唯一的限制是ORACLE拥有者必须能够访问所列出的目录。对UTL_FILE包具有执行权限的所有用户有权访问UTIL_FILE_DIR参数中列出的所有目录。UTL_FILE_DIR参数接受一个用逗号分隔的目录列表,并且是静态的。UTL_FILE_DIR参数可以使用通配符。*表示允许所有用户访问数据库拥有者可视的目录与文件。 eg: alter system set utl_file_dir ='/oracle/tmp','/oracle/interface' scope=spfile;
REMOTE_OS_AUTHENT实例参数:默认为FALSE。该参数控制某个用户是否能够在不需要给出口令的情况下从远程计算机上连接数据库。启用远程操作系统身份验证被认为是一种不好的做法。
OS_AUTHENT_PREFIX实例参数:默认值为“OPS$”。该默认值指定了一个前缀,操作系统名在被映射为ORACLE用户名之前必须应用这个前缀。 O7_DICTIONARY_ACCESSIBILITY实例参数:控制使用ANY关键字授予对象权限的效果。默认值为FALSE。意味着ANY权限不被授予给SYS拥有的对象,从而保护了数据字典。 REMOTE_LOGIN_PASSWORDFILE实例参数:控制具有SYSDBA权限的用户是否能够通过网络连接实例。在这个参数的默认值为NONE的时候,得到SYSDBA连接的唯一方法是作为拥有ORACLE软件的操作系统组成员登录服务器的操作系统。只要服务器的操作系统是安全的,那么这种操作就绝对安全。将该参数设置为EXCLUSIVE或SHARED时,用户可以通过下列不同的方法得到SYSDBA连接:即使没有作为ORACLE软件拥有组的成员登录服务器或者需要通过网络进行连接,但是只要知道相应的口令,用户仍然能够作为SYSDBA连接实例。设置值为SHARED意味着在同个ORACLE主目录内运行的所有实例共享一个公有的口令文件,对于所有实例公有的SYS用户来说,这个主目录内只有一个口令。设置EXCLUSIVE意味着实例会寻找一个名称包含实例名的文件(在WINDOWS中为PWD
V$PWFILE_USERS视图显示了用户口令被输入口令文件的用户及这些用户是否具有SYSOPER权限或SYSDBA权限。
口令配置文件:
FAILED_LOGIN_ATTEMPTS:连续使用不正确的口令请求连接的次数达到这个限制值后,账户会被锁定。在成功进行连接之后,这个计数器会被重置;
PASSWORD_LOCK_TIME:达到FAILED_LOGIN_ATTEMPTS限制后账户被锁定的天数。如果天数不能设置成整单位,可以进行适当的算术运算;
PASSWORD_LIFE_TIME:指定提示用户修改口令之前需要经过的天数; PASSWORD_GRACE_TIME:达到PASSWORD_LIFE_TIME限制值之后可以维持成功登录的天数,即口令过期的宽限期;
PASSWORD_REUSE_TIME:可以重用某个口令之前所经过的天数; PASSWORD_REUSE_MAX:某个口令可以被重用的次数,该限制与PASSWORD_REUSE_TIME限制无关;
PASSWORD_VERIFY_FUNCTION:这个限制是一个在修改口令时会执行复杂度检查的PL/SQL函数;
审计: SYSDBA审计:AUDIT_SYS_OPERATIONS的实例参数如果设置为TRUE(默认为DEFAULT),那么作为SYSDBA或SYSOPER连接数据库的用户所发布的每条语句都会被写入操作系统的审计追踪。SYS审计记录的目的文件夹的位置,在WINDOWS操作系统下为WINDOWS APPLICATION LOG。在UNIX中,目的文件夹由AUDIT_FILE_DEST参数控制。
数据库审计:能够跟踪特定权限的使用,特定命令的执行,对特定表的访问以及登录尝试;但是不能捕获实际执行的语句。
在设置数据库审计之前,必须设置AUDIT_TRAIL实例参数。
NONE(或者FALSE):无论试图配置哪种审计,都会禁用数据库审计;
OS:审计记录会被写至操作系统的审计追踪目录下;
DB(或者TRUE):审计记录会被写入数据字典表SYS_AUD$中;
DB_EXTENDED:与DB值的作用大体相同,不过包含与生成审计记录的,具有绑定变化的SQL语句相关的信息;
设置完成AUDIT_TRAIL实例参数后,就可以使用数据库审计来捕获登录尝试,系统权限与对象权限的使用及SQL命令的执行。此外,还可以指定是否审计事件的成功或受到权限控制的失败。 eg: audit create any trigger;--对创建触发器的系统权限进行审计,相当于使用了BY ACCESS关键字,即审计会为事件的每次出现都生成一条审计记录;
audit select any table by session;--对表查询的系统权限进行审计,无论满足审计条件的频繁程度如何,将审计输出限制为每次登录只生成一条审计记录;
audit insert on ar.hz_table whenever successful;--只要在指定表插入一条记录就会生成审计记录。WHENEVER SUCCESSFUL关键字表示将审计记录限制为操作成功的记录;而WHENEVER NOT SUCCESSFUL则将审计记录限制为操作不成功的记录。默认情况下,所有操作都会被审计;
audit all on ar.hz_table ;--审计针对指定表执行的所有DDL语句;
audit session whenever not successful;--审计登录。
基于值的审计:使用触发器,在插入,更新或删除记录时,运行一个包括记录事件全部细节的PL/SQL块;但是无法跟踪SELECT语句。
细粒度审计:允许根据所访问的记录或该记录的列来跟踪对表的访问。与数据库审计或基于值的审计相比,细粒度审计更为精确,并且可以将生成的审计记录的范围限制至感兴趣的审计记录;可以被配置为只在访问特定记录或特定记录的特定列时生成审计记录,在违背审计条件时运行一个PL/SQL块。配置FGA会涉及DBMS_FGA包,为了创建一个FGA审计策略,需要使用ADD_POLICY过程。同时具有使用触发器审计和数据库审计的功能,也就是说能够捕获实际执行的语句,并且适用于SELECT和DML操作。
可以通过查询DBA_FGA_AUDIT_TRAIL视图可以查询细粒度审计的结果。 DBA_AUDIT_TRAIL视图无论使用哪一种审计,都显示了所有审计追踪条目。 DBA_AUDIT_OBJECT,DBA_AUDIT_STATEMENT,DBA_AUDIT_SESSION只能显示特定的审计记录有与其相关的列;
十二、配置ORACLE互联
ORACLE的客户/服务器实现
用户与数据库间存在许多层。用户不能直接访问数据库,其运行的进程也不能访问数据库。客户/服务器结构保证了对数据的所有访问都受服务器的控制。
用户与用户进程进行交互。用户进程是用户在其本地终端上运行的软件。
服务器进程在数据库服务器上运行,并且执行从用户进程接收到的SQL语句。
用户进程生成SQL语句,服务进程则执行这些语句;
一条SQL语句的执行经历以下4个阶段:
分析:服务器进程会理解指定SQL语句的实际含义及最佳的执行方式。分析涉及与实例的共享池的交互作用,共享池存储结构用于将SQL语句转换为实际的可执行部分;
绑定:任何变量都被扩展为字面值。随后的执行阶段需要更多地使用实例的SGA,并且还可能需要使用数据库;
执行:数据库高速缓存区内的数据会被读取或更新,同时变化被写入重做日志缓冲区。但是,如果相关的数据块不位于高整缓存区内,则服务器进程会从数据文件中读取这些数据。数据库自身在语句执行阶段最先涉及以上内容。而且到目前为止的所有操作均发生在实例内。
取出:将执行结果生成的结果集发送回用户进程,用户进程随后为了显示而格式化结果集。
ORACLE NET提供了这样的机制:启动服务器进程,从而执行代表用户进程的代码。使用这种机制能够建立一个会话。ORACLE NET负责维护这个会话,还负责用户进程与服务器进程间的通信:将SQL语句从用户进程传送至服务器进程,同时将结果从服务器进程取回至用户进程。
一个用户与一个用户进程进行交互,一个用户进程通过ORACLE NET与一个服务器进程交互。一个服务器进程与实例交互,而实例通过其后台进程与数据库交互。
ORACLE NET与通信协议
ORACLE NET是一个分层的协议,并且运行在操作系统所支持的任何通信协议之上。在10G中,ORACLE的网络支持被限制于TCP,NMP(Named Pipes,命名管理),SDP(Sockets Direct Protocol,新套接字直接协议)。此外,ORACLE还会用上述协议的安全套接字变量。所有操作系统都具有一个操作系统专有的进程间(Inter-Process Communication,IPC)协议,ORACLE NET也可使用该协议来进行用户进程与服务器进程位于相同机器上的本地连接。ORACLE NET位于操作系统所提供的任何通信协议之上的层次结构使ORACLE平台具有独立性。
侦听器在listener.ora文件中定义,该文件默认存储位置是ORACLE_HOME/network/admin目录。listener.ora文件至少必须声明侦听器的名称及其使用的协议与侦听地址。我们可以在一个文件中配置多个侦听器,这些侦听器必须具有不同的名称与地址;
侦听器创建好后,为了确认新的侦听器正在运行,可用lsnrctl应用程序检测。
数据库注册:
产生针对一个实例的服务器进程需要使用侦听器。通过数据库注册,侦听器能够查找到所连接的实例。
如果没有使用RAC,那么侦听器与实例必须在相同的计算机上运行。在RAC环境中,群集中任何计算机上的任何侦听器都能够连接任何计算机上的任何实例。
数据库注册的方法有静态注册和动态注册。对于静态注册来说,可以将一列实例硬编码在listener.ora文件中;动态注册意味着实例在启动时定位侦听器并注册到侦听器中。
在一个简单的单实例环境中,服务名与实例名往往是相同的。可以通过查询V$PARAMETER视图来查询INSTANCE_NAME和SERVICE_NAMES参数的值来确认。
如果在参数文件中没有设置SERVICES_NAMES,则该参数默认为在INSTANCE_NAME参数后面加上DB_DOMAIN参数值的组合。DB_DOMAIN默认值为NULL;
动态注册是向侦听器注册一个实例的首先方法。初始化参数LOCAL_LISTENER会告知实例其应当进行联系的,从而能够查找到注册实例的侦听器的网络地址。在实例启动时,PMON进程会使用该参数来定位一个侦听器并向其通过INSTANCE_NAME和SERVICE_NAMES参数的值。在随后的实例启动阶段的任何时间,都可以用下面的命令来重新注册:
ALTER SYSTEM register;
如果重启侦听器,或者在侦听器启动之前启动数据库实例,那么就需要使用上述命令来重新注册实例。
因为能够确保只向侦听器注册运行的实例而且实例名和服务名不存在错误,所以动态注册是比静态注册更好的选择。但动态注册很容易出错,尤其在手动编辑listener.ora文件时。此外,实例在关闭时会自动解除对侦听器的注册。
从9I开始,如果动态注册方式在默认端口1521上运行,就不需要进行任何设置。所有实例都会自动在本地主机的这个端口上查找侦听器,并在查找到侦听器时进行注册。如果侦听器没有在默认端口上运行,就必须通过设置local_listener参数和重新注册来指定侦听器所运行的位置。 eg:
ALTER SYSTEM set local_listener=list2;
ALTER SYSTEM register;
侦听器控制实用程序:lsnrctl。如果没有使用默认的名称LISTENER,就必须指定侦听器的名称。
lsnrctl status listener_name:检查侦听器的状态:接受连接请求的侦听器地址,定义该侦听器的listener.ora文件的名称与位置,用于该侦听器的日志文件的名称与位置。
lsnrctl start listener_name:启动侦听器;
status listener_name:显示一个实例在动态注册之后的状态
services listener_name:显示一个实例在动态注册之后的状态
名称解析技术
Easy Connect名称解析方法:10G新提供的名称解析方法。使用简单,不需进行任何配置。但被限制于只能使用TCP协议,不能与ORACLE NET的高级性能一起使用。
本地名称解析方法:可以为连接串提供一个ORACLE NET服务别名,该别名通过一个本地文件被解析为完整的网络地址。这个文件是tnsnames.ora。ORACLE NET服务名,服务别名和实例名这间不需要存在任何关系,为了便于使用,一般这些名称通常是相同的。本地名称解析方法支持所有的协议及ORACLE NET的所有高级功能,不过在所有客户机上维护tnsnames.ora文件极为费时。
目录名称解析方法:用户会被指向一个解析别名的LDAP目录服务器。LDAP(Lightweight Directory Protocol,轻量级目录访问协议)是一个广泛使用的标准。为了使用目录名称解析方法,必须首先在网络中安装和配置一个目录服务器。目录名称解析方法也支持ORACLE NET的所有高级功能。与本地名称解析方法不同的是:目录名称解析方法为所有名称解的细节提供了一个中心库:目录服务器。
外部名称解析方法:类似于目录名称解析方法,不过该方法使用了第三方名称解析服务。
配置服务别名: EMDC能够完成这个配置任务,但因为EMDC是一个服务器端进程,所以只能使用其配置在数据库服务器上运行的客户程序。另一种方法是使用NET MANAGER。希望启动NET MANAGER,在UNIX下可以运行netmgr。
高级连接的选项:既可以配置一个侦听器具有两个侦听地址,也可以创建第二个地址的另一个侦听器。
tnsnames.ora
ocp10g_net1=
(DESCRIPTION= (ADDRESS_LIST= (ADDRESS =(PROTOCOL=TCP)(HOST = ora10g_net1.haunting.com)(PORT = 1521))
) ( CONNECT_DATA = (service_name = ocp10g) )
)
ocp10g_net2=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS =(PROTOCOL=TCP)(HOST = ora10g_net2.haunting.com)(PORT = 1521))
)
( CONNECT_DATA =
(service_name = ocp10g) )
)
ocp10g_either =
(DESCRIPTION=
(ADDRESS_LIST=
(load_balance=on)
(failover=on)
(ADDRESS =(PROTOCOL=TCP)(HOST = ora10g_net1.haunting.com)(PORT = 1521))
(ADDRESS =(PROTOCOL=TCP)(HOST = ora10g_net2.haunting.com)(PORT = 1521))
)
(CONNECT_DATA =
(service_name = ocp10g)
)
ocp10g_from_outside =
(DESCRIPTION=
(ADDRESS_LIST=
(source_route=on)
(ADDRESS =(PROTOCOL=TCP)(HOST = firewall.haunting.com)(PORT = 1521))
(ADDRESS =(PROTOCOL=TCP)(HOST = ora10g.haunting.com)(PORT = 1521))
)
(CONNECT_DATA = (service_name = ocp10g) ) )
上例中,ORACLE NET服务别名ocp10g_net1通过用于ora10g_net1.haunting.com的IP地址请求连接服务ocp10g,别名ocp10g_net2通过不同的IP地址请求相同的服务,而别名ocp10g_either在其address_list列表中包含了前面涉及的两个IP地址。load_balance=on指令指示用户进程随机选择一个IP地址,这样会使半数用户通过一个IP找到数据库服务器,其余用户通过另一个IP地直找到数据库服务器,从而实现网络负载在数据库的两个网卡间均衡。fail_over=on指令批示用户进程在随机选择第一个IP地址失败时尝试另一个IP地址,从而能够提供容错与负载均衡。服务别名ocp10g_from_outside从Internet登录系统的用户会使用该别名。source_route=on指令指示用户进程到达列表中的第一个地址,也就是运行在防火墙上的Connection Manager的地址。Connection Manager随后继续连接第二个地址(也就是内部网中的数据库服务器的地址)所标识的侦听器。这样Connection Manager就可以代理所有往返的通信量。
测试ORACLE NET连接 tnsping实用程序完成与指定侦听器的一次握手,但是并不测试实例是否正在运行及数据库是否已被打开。只有NET MANAGER内的Test命令才能完成上述测试。 ORACLE NET受下列文件控制:定义侦听器的服务器端listener.ora文件,为本地名称解析方法(这是最常用的名称解析方法)提供名称解析能力的客户端tnsnames.ora文件。此外,sqlnet.ora文件是一个用于客户端或服务器端的可选文件。
ORACLE NET 10G使用下列协议:TCP,SDP(Sockets Direct Protocol,新套接字直接协议),使用安全套接字的TCP(TCP with secure sockets),NMP(Named Pipes,命名管理)。 通过服务器进程与用户进程区分客户与服务器。
只要侦听器使用不同的端口,一个网络接口卡就能够支持多个侦听器。
如果关闭某个侦听器,对通过这个侦听器连接的会话不会有任何影响,因为侦听器只负责建立连接,但不负责维护连接。
如果关闭某个Connection Manager,那么通过这个实用程序连接的会话会因为出错而中断。因为connection Manager负责维护连接,所有通信量都要通过Connection Manager. 如果在同一台机器上运行希望连接的实例与指定的用户进程,则不需要通过某个侦听器就能到达希望连接的实例,所有连接都使用ORACLE NET,但是并不需要网络。对于本地连接,不需要对ORACLE NET进行任何配置。
如果服务器使用European字符集,客户机使用American字符集,那么ORACLE NET的Two-Task Common层会完成字符集转换;
十三、管理共享服务器
专用服务器:要求数据库侦听器应当为并发的每个实例连接都生成一个专用的服务器进程;在相应会话终止前,这些服务器进程会一直持续;
共享服务器:由指定实例一部分的其他进程实现。这些进程是在实例启动阶段被启动的后台进程。此时存在两种新的进程类型:调度进程与共享服务器进程。为了保持一个会话,与调度进程的连接必须持久,而与侦听器的连接可以是短暂的。所有调度进程共享一个公共的输入队列,但每个调度进程都有自己的响应队列。调度进程与队列机制使任何可用的共享服务器都能够执行来自任何用户进程的任何SQL语句。在共享服务器中,不进入SGA的PGA存储结构为堆栈空间。
配置共享服务器:不需要在客户端做任何的配置,完全不涉及通常的客户端ORACLE NET配置。在服务器端,共享服务器与数据库无关,而只是与实例有关。通过动态实例注册,侦听器会被自动配置以用于共享服务器。共享服务器通过实例初始化参数进行配置。只有一个参数是共享服务器所必需的,下面会有具体的介绍。
只要使用了共享服务器,就应该设置实例参数SHARED_SERVERS,DISPATCHERS和LARGE_POOL_SIZE。在任何情况下始终应该设置的实例参数为PROCESSES,SESSIONS。此外,如果侦听器没有使用1521端口,还必须设定LOCAL_LISTENER参数。
实例参数介绍:
SHARED_SERVERS:控制在实例启动阶段被启动的共享服务器的数据。该参数应该被设置为期望的最大并发请求数。共享服务器的数量最大可达到MAX_SHARED_SERVERS参数的设置值。默认情况下,如果设置了DISPATCHERS,则SHARED_SERVERS参数就是1。MAX_SHARED_SERVERS参数被默认设置为PROCESSES参数值的1/8; DISPATCHERS:控制在实例启动阶段所启动的进程数及这些进程的行为。该参数是共享服务器必须的唯一参数。一般只需设置其中两个选项:启动的调度进程数及其应该侦听的协议类型。经常使用LOCAL_LISTENER参数来控制调度进程进行注册的侦听器。MAX_DISPATCHERS参数是指能够启动的进程数的上限值,但与共享服务器不一样的是,ORACLE不会根据需求启动额外的调度进程。
LOCAL_LISTENER:该参数与动态实例注册有关,该参数告知实例其应当注册的侦听器的地址。在共享服务器环境中,调度进程也使使用这个参数进行注册,否则侦听器无法知道调度进程所处的位置。在实例的生存期内,调度进程不断使用与所服务会话数相关的数据更新本地侦听器,因此侦听器总是能够将新的引入连接请求指向最不忙碌的调度进程。 LARGE_POOL_SIZE:在SGA中创建一个单独区域,该区域供代替共享池的UGA使用,从而大减轻共享池的压力。
CIRCUITS和SHARED_SERVER_SESSIONS参数限制了允许通过共享服务器进行连接的用户数。一个回路是一个到达调度进程的连接,并且通常映射一个会话。回路数和共享会话数在默认情况下都没有限制。
SESSIONS和PROCESSES:基本参数。PROCESSES参数限制了能够连接SGA的操作系统进程数,这个总数必须足够大,从而能够适用于后台进程与所有的专用服务器进程,此外共享服务器进程与调度进程的数目也被计算机在内。因专用服务器环境中,这是一种限制并发连接数的方法。SESSIONS能数被应用于ORACLE层次而非操作系统层次。在不考虑通过专用服务器或共享服务器进行登录的情况下,该参数限制了对指定实例的并发登录数。
监视共享服务器:
V$CIRCUIT视图给出一条记录,说明通过共享服务器的所有并发连接。其中,CIRCUIT列是唯一标志符。通过该列与V$SESSION视图的SADDR列及V$DISPATCHER视图中的DISPATCHER列,我们可以将会话映射至调度进程。
V$SHARED_SERVER视图给出了每个共享服务器进程的状态。IDLE和BUSY列说明了每个进程实际服务于请求所花费的时间量,而不是等待作业到达公共队列所花费的时间量。 V$DISPATCHER视图为每个调度进程给出一条记录。
V$SHARED_SERVER_MONITOR视图只给出一条记录,说明经过共享服务器的最大连接数与最大会话数(通常这两个数字是相同的),及已被动态启动的共享服务器进程数。如果这个数字大于0,说明最初没有启动足够多的共享服务器进程。
V$QUEUE视图给出用于一条公共队列的记录及一条用于所有调度进程的响应队列的记录。QUEUED列说明队列中数据项的数目。理想情况下应当不存在排队,如果公共队列中存在数据项,说明没有足够的共享服务器进程被用于清空队列。如果响应队列中存在数据项,说明调度进程处于超负荷状态。
V$MTS视图提供了向后兼容的能力,除名称更短外,这个视图与V$SHARED_SERVER_MONITOR视图完全相同。
在并发连接数达到几百左右是,应当考虑使用共享服务器;如果并发连接数少于一百,则不需要使用共享服务器;
使用本地名称解析或目录名称解析时可以选择连接类型,使用Easy Connection名称解析时则无法选择。如果共享服务器可以,Easy Connection总是会使用共享服务器。
对于本地连接,都会得到一个专用服务器。
OLTP会话中通常存在较短的查询与事务,使用共享服务器较为适当。长时间的语句运行工作不适合使用共享服务器。
使用共享服务器需要增加SGA的大小,从而为存储在共享池内或更合适的大池内的会话UGA提供空间。
使用共享服务器时进程数会减少,所需的整个存储空间也会减少,SGA的大小会变小,会话的UGA大小会变小。
启动与关闭操作无法通过共享服务器来完成,因为共享服务器是指定实例的一部分。
如果一个调度进程已与多个会话相连接,所有会话都在相同TCP端口上连接这个调度进程,所有会话在一个端口上互斥;
(CONNECT_DATA=
(SERVER=SHARED)
(SERVICE_NAME = ocp10g)
)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME = ocp10g)
)
其中SERVER=SHARED表示通过共享服务器连接,DEDICATED表示通过专用服务器连接。
共享服务器工作原理: 通过初始化实例参数,指示实例启动一个或多个调度进程和共享服务器进程。调度进程向某个侦听器进行注册,侦听器随后并发连接许多用户进程与不同的调度进程。用户进程向调度进程提交SQL语句,调度进程则将SQL语句放入一个被用为共享服务器池的公共队列。执行这些语句后,共享服务器将结果集放入响应队列,随后调度进程从响应队列中将结果集取回至用户进程。
所有SQL共享公共队列,调度进程接收来自用户进程的SQL,大池一旦被创建,就是存储UGA的位置,侦听器通过连接用户进程和调度进程建立会话,每个调度进程都有自己的结果集响应队列,共享服务器通常执行SQL语句。
调度进程是用户进程与队列之间的媒介,侦听器可以均衡调度程序之间的引入连接请示。
V$PROCESS视图具有一个用于所有进程的条目,具有一条用于所有共享服务器进程的记录,一条用于所有调度进程的记录;