一、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.ora,其中是实例的名称);动态参数文件(名为spfileSID.ora)。静态参数文件是一个简单的文本文件,实例只在启动时读取一次静态参数文件;动态参数文件是一个二进制文件,由ORACLE自身通过响应输入命令进行维护和编辑。

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关键字,并且在这两关键字之间至少存在一行有效的代码;

SQLPLUS包含的SET命令可以被保存在一个名为login.sql的文件中,启动SQLPLUS时会执行该文件来适当配置SQL*PLUS环境;

DBA可以通过在PRODUCT_USER_PROFILE表(属于SYSTEM模式)中添加条目来限定用户在SQL*PLUS中使用的命令;

在LINUX环境中启动iSQLPLUS,需要以oracle(ORACLE软件的拥有者)身份登录安装ORACLE软件的计算机,同时确保查找中包含$ORACLE_HOME/bin,然后执行 isqlplusctl start;如果希望在LINUX系统中停止iSQLPLUS,则执行 isqlplusctl stop。

在WINDOWS环境中iSQL*PLUS作为一种服务来运行,通过MMC管理单元来进行启动和关闭。使用isqlplusctl命令也可以停止、启动这种服务并检查该服务的状态。

可以在WEB浏览器中输入:/isqlplus">http://:/isqlplus形式的URL来运行。其中server是运行ORACLE的计算机的名称或IP,port是侦听iSQL*PLUS的TCP端口号,通过为5560。如果5560被占用,那会向上查找更大的可用端口。为了确定哪些端口被占用,我们可以查看$ORACLE_HOME/install目录中portlist.ini文件的内容。

访问数据库,可以使用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://<host.domain>:<port>/em  <host.domain>是数据库服务器的地址,相同计算机上的第一个数据库使用的端口默认是5500,
第二个默认是5501,依此类推。

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能执行下列命令:    STARTUPSHUTDOWN 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<SID>.ora,       spfile.ora,       init<SID>.ora    spfile<SID>.ora最便于用作参数文件。通常只有在RAC环境中使用spfile.ora文件。在这种环境中,一个文件可用于启动多个实例。如果需要进行人工编辑则使用init<SID>.ora文件。因为spfile.ora文件是二进制文件。    在实例启动时init<SID>.ora只被读取一次,所以init<SID>.ora文件也叫静态参数文件;在实例运行时会不断地读取和更新spfile文件,所以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:通过口令;
  1. 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.ora,在UNIX系统中为orapw),这个文件具有实例特有的口令。

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.oraocp10g_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视图具有一个用于所有进程的条目,具有一条用于所有共享服务器进程的记录,一条用于所有调度进程的记录;

十四、管理数据库性能

性能监视通过具有下列形式:反应式和前摄式。反应式意味着在出现某个问题的时候或之后执行某些动作;前摄式意味着在成为问题前标识未决的问题。最理想的方式是前摄式。但有些情况下也必须采用反应式监视。本课将阐述在出现问题后对问题的标识。

无效的对象:
大多数而并非全部过程对象都会引用数据对象。编译一个过程对象时,编译器会检查这个过程对象引用的数据对象,从而确定用于代码块的数据对象的定义是否正确及是否具有适当的权限。如果某个过程对象所引用的数据对旬在该过程对象编译后发生变化,则该过程会被标记为无效:INVALID。oracle会尝试自动编译无效的PL/SQL对象和视图,但是可能不会成功。虽然Oracle可能建议手动进行编译,但并非必须进行这个操作。

标识无效的对象:
DBA_OBJECTS视图及派生的ALL_OBJECTS和USER_OBJECTS视图,具有一个STATUS列,这个列在理想情况下应当始终是有效的。通过查看该列可以确定对象的状态是否被标识为无效。

修正无效的对象
为了编译过程对象,需使用ALTER … COMPILE命令。例如:
Alter Procedure procedure_name compile;重新编译存储过程;
如果编译成功,就不会存在什么问题。如果编译失败,就需要找出失败的原因。如果某个过程没有被编译,那么可用SHOW ERRORS命令来查看原因,遗憾的是该命令不支持对视图的操作。如果希望确定编译错误的原因,通过需要首先使用DBA_DEPENDENCIES视图。
对于通过NAME进行标识的每个对象来说,视图中都存在说明对象依赖关系的记录。REFERENCED_NAME列显示NAME所标识的对象所依赖的对象名。如果需要重新编译数百个或数千个无效对象,可以使用补充的实用程序脚本。UNIX下运行@?/rdbms/admin/utlrp;WINDWOWS下运行
@?\rdbms\admin\utlrp。这个在作为SYSDBA进行连接时运行的脚本会试图编译所有无效的对象。如果运行之后仍存在无效的对象,则可以认定存在应当单独进行解决问题。

无用的索引
如果某个过程对象变为无效,则DBA不必执行任何操作。首次访问该对象时,ORACLE会尝试进行重新编译,而且完全可能编译成功。但如果某个索引由于种种原因变得无用,必须始终在能够使用该索引之前执行显示的修复操作。
一个索引由若干按照顺序排列的索引键组成,每个索引键值都具有相关联的rowid。rowid是索引键引用的记录的位置物理指针。如果某个表的rowid发生变化,则索引就会被标记为无用。最常见的是使用ALTER TABLE … MOVE命令删除了指定的表。

标志无用的索引
SKIP_UNUSABLE_INDEXES实例参数控制如果索引无用是否跳过该无用索引即不使用被标志为无用的索引。设置为TRUE则表示跳过,设置为FALSE则会因为无用索引而返回错误消息。对于索引有必要实施约束的情况是个例外:如果主键列上的索引变得无用,则会为DML锁定指定的表,即SELECT语句可以通过扫描整个表而成功执行。大多数DML语句的执行都会失败,唯一的例外是不影响键列的UPDATE语句。
通过查询DBA_INDEXES视图,检测变得无用的索引。

修正无用的索引
如果rowid指针不再正确,索引就会标记为无用。使用ALTER INDEX … REBUILD命令重新创建该索引。执行该命令会扫描指定的表,同时为每个索引键生成一个具有正确rowid指针的新索引。生成新的索引后,原有的无用索引会被删除。索引的重建过程需要额外的存储空间。REBUILD命令有很多选项,最重要的是TABLESPACE、ONLINE及NOLOGGING。在默认情况下,索引在其当前的表空间内重建,如果使用TABLESPACE关键字指定了表空间,则重建将在该表空间内进行。默认情况下,重建过程会为DML命令锁定指定的表,如果使用ONLINE关键字则可以避免这种状况。NOLOGGING关键字则指示ORACLE不为索引重建操作生成重做,这样可以快速完成重建,不过也意味着应当立即对包含指定索引的表空间进行备份,在备份表空间之前,因为需要使用还原和恢复,所以遭受介质损害的索引无法被修复。启用NOLOGGING选项只是为索引重建禁用重做生成。在索引重建后,针对该索引的所有DML命令都会像平时一样生成重做。重建索引时所需的磁盘空间可能两倍于使用这个索引时所需的磁盘空间。因为重建过程同时需要使用旧索引和新索引所需的磁盘空间。

优化器统计
对于性能来说,执行计划的选择十分重要。在ORACLE中,标准的做法是使用优化器来选择执行计划。优化器紧密依赖于一些统计量,统计量的正确性至关重要。统计量有许多类型,但主要是对象统计量。这种统计给出了SQL语句所涉及的表的详细信息。统计与PL/SQL无关,而只与SQL有关。因此统计量分析不能改善PL/SQL的性能。不过,大多数PL/SQL代码都包含对SQL语句的调用。对于这些语句来说,统计量同样非常重要。

对象统计量
对某个表进行分析可以收集优化器能够使用的,与该表相关的统计量。这些统计量显示在DBA_TABLES视图内 。列统计量显示在DBA_COLUMNS视图内。索引统计量显示在DBA_INDEXES视图内。分析了索引所基于的表后,同样会填充DBA_INDEXES视图。以上统计量都存储在数据字典内。如果统计量丢失或不正确,数据库的性能会显著退化。其他与索引相关的统计量显示在INDEX_STATS视图内。
除DBA_TABLES视图中的表统计量之外,分析某个表时还会收集DBA_INDEXES视图中的索引统计量及DBA_COLUMNS视图中的列统计量。

收集统计量:对象统计量不是实时的,而是静态的。统计量的收集操作可以是自动的,也可以手工完成。使用ANALYZE命令或DBMS_STATS程序包中的过程能够手动地收集统计量。
ANALYZE TABLE table_name COMPUTE STATISTICS:分析整个表。
DBMS_STATS.GATHER_TABLE_STATS(owner,table_name);
与原有的ANALYZE命令相比,能够接受许多实参的DBMS_STATS过程更能影响统计量分析的深入程度。
对象统计量不是实时的,并且在新分析对其进行刷新之前是静态的。如果没有足够频繁地进行对象统计,统计量将变得过时,从而会使优化器选择不当的执行计划。

性能指标:
统计量是一个原始数字,其本身可能无用。指标是一个经过转换变得有意义的统计量。

使用动态性能视图查看统计量
以VKaTeX parse error: Expected group after '_' at position 27: …根本不是视图,而是用于前缀为V_̲的视图的同义词。
通过动态性能视图来访问与实例相关的以及与数据库特定区间相关的信息感知量。大多数动态性能视图填充来自实例的信息,剩余的动态性能视图则填充来自控制文件的信息。所有这些视图都能给出实时的信息。填充信息来自指定实例的动态性能视图(VINSTANCE或VINSTANCE或VINSTANCE或VSYSSTAT视图)在任何时候都可用,即使这个实例处于NOMOUNT模式下仍然如此。除非指定控制文件读取的数据库已加载,否则填充信息来自这个控制文件的动态性能视图(VDATABASE或VDATABASE或VDATABASE或VDATAFILE视图),且不能被查询。数据字典视图(DBA,ALL,USER为前缀)只能在包含指定数据字典的数据库被打开后被查询。
动态性能视图填充了来自实例或控制文件的信息,前缀为DBA,ALL,USER的数据字典视图则填充了来自数据字典的信息。
动态性能视图在数据库启动阶段被创建,在指定实例的生存期内进行更新,在数据库关闭阶段被删除。这意味着动态性能视图包含了从数据库启动开始积累的值。如果数据库被连接打开半年时间,则动态性能视图就具有这一段时间内建立的所有数据。动态性能视图通常提供的是统计量而非指标。
V$SYSTEM_WAIT_CLASS视图概述了可能导致会话或整个数据库运行缓慢的各种问题。

在理想情况下,我们不需要对性能问题作出反应,而是应当在问题出现之前对其进行预期。EMDC的Performance标签下,显示了五个将时间与性能指标关联在一起的图形:
运行队列的长度:指示服务器CPU资源的紧张程度;
分页速度:在服务器内存不足的情况下会增加;
正在等待的数据库会话数及其原因
每秒的登录与事务数
物理读取数以及每秒生成的重做量。

十五、监视ORACLE
自动工作负荷仓库
ORACLE收集了大量与性能和动作相关的统计信息。这些信息在内存中累加,并有规律地写入磁盘(也就是写入构成AWR–Automatic Workload Repository,自动工作负荷仓库的表)。最终,这些信息会过期并会被重写。
收集统计量的级别由实例参数STATISTICS_LEVEL控制。该参数可能会被设置为BASIC,TYPICAL或ALL。TYPICAL级别允许收集正常调整所需的所有统计量,同时不会收集对性能有不良影响的统计量集合。BASIC级别事实上禁止收集统计量,并且不存在可评估的性能优势。ALL级别会收集与SQL执行相关的、极其详细的统计量。如果进行高级的SQL语句调整,那么就可以用ALL级别,不过在收集统计量时会导致性能稍有退化。在正常运行期间需要将STATISTICS_LEVEL参数保持为默认的TYPICAL级别。

统计量在内存中(也就是在SGA内的数据结构中)累积。因为统计量只反映实例所作的动作,所以并不影响实例的性能。在默认情况下,MMON进程每1小时将统计量作为一个快照保存至AWR。MMON进程直接访问构成SGA的内存结构,从而也可以访问这些内存结构中的统计量。这个进程可以在不需要通过会话的情况下从SGA内抽取数据。唯一的系统开销是将数据实际写入AWR。

AWR的位置和大小。AWR位于SYSAUX表空间内,并且不能被重新定位至其他位置,存在于SYSMAN模式中。ORACLE不支持使用除了DBMS程序包程序形式提供的各种API外的其他工具访问AWR。访问AWR最简单的形式是EMDC。写入AWR的统计量叫快照。快照默认保存在AWR中7天,这个周期是可配置的。如果每小时一次快照收集并且快照保留时间为7天,则AWR在SYSAXU表空间内可能需要200-300M的空间。这个数字总会发生变化,并根据会话数会被大幅提高。调整AWR设置从而能够更频繁地保存快照,这样可以更精确地诊断问题。但过于频繁地收集快照又会增加AWR的大小,并且可能会因为收集信息和保存所增加的工作负荷而影响性能。

快照会在特定时间周期后被清除。默认情况下时间周期为7天。创建长时间保存的快照意味着可随时比较当前的性能与过去任意时刻的性能,这对于固定趋势分析来说至关重要。ADDM报告自身默认保存30天。如果长时间保存快照,则总能够重新生成ADDM报告。

诊断与调整顾问程序
ADDM(Automatic Database Diagnostic Monitor,数据库自动诊断监视程序):研究在保存AWR快照时自动生成的ADDM报告是DBA的一项日常事务。ADDM报告突出说明了数据库内的问题以及建议的解决方法。其他顾问程序必须被手动调用,与ADDM相比能够给出更准确的诊断信息与建议。
其他顾问程序:
SQL Tuning Advisor:SQL调整顾问程序
SQL Access Advisor:SQL访问顾问程序
Memory Advisor :内存顾问程序
Mean Time to Recover(MTTR)Advisor:平均恢复时间顾问程序
Segment Advisor:段顾问程序
Undo Advisor: 撤销顾问程序

只要生成快照,MMON进程就会自动运行ADDM。ADDM接受来自AWR的统计量及其他信息。自动生成的ADDM报告总会涉及当前快照与前一个快照之间的时间段。因此在默认情况下可以访问每小时的ADDM报告。如果希望ADDM报告跨越更长的时间范围,可以手动调用ADDM生成涉及任意两个快照之间时间段的报告。自动快照及手动收集快照都会触发ADDM。

SQL Tuning Advisor:将一条或多条SQL语句作为输入,并且研究这些语句的结构与执行方式。这些SQL语句被称为SQL Tuning Set。收集所涉及对象的优化器统计量,使用与语句执行相关的统计量生成SQL配置文件,修改代码从而更有效地使用SQL构造,重写代码,从而去除可能的设计错误。
SQL Access Advisor:也将SQL Tuning Set作为输入。研究通过添加索引或物化视图是否能够改善性能及某些索引与物化视图实际上是否会妨碍改善性能及是否应当被删除。评估通过创建其他索引与物化视图是否能够改善性能,建议删除虽然存在但未被使用的索引与物化视图。
Memory Advisor:高速缓存区的大小减少至40MB以下会带来惨重损失。如果为SGA结构或PGA分配更多的内存,则性能会得到进一步改善,不守效益会递减。如果可能因为交换系统而需要减少内存的使用,则就能够节省内存,但如果节省的内存过多,性能就将会退化。
MTTR Advisor:恢复进程能够确保数据库在发生任何情况下都不会由于实例的崩溃而导致讹误。MTTR通常被构建在服务级别协议内。以秒为单位进行设置的实例参数FAST_START_RECOVERY_TARGET能够控制MTTR。该参数设置的时间越短,在实例崩溃后就越能更快地打开数据库,不过联机性能会更差。为了最小化恢复时间,ORACLE必须向磁盘写入更多的数据,但是这样会对性能产生更不利的影响。
Segment Advisor:ORACLE中,段会自动地增长,但不会自动地缩短。该顾问会查看段,并且能够确定为未被使用的段所分配的空间大小是否足够用于执行SHRINK SPACE操作。

Undo Advisor:决定撤销表空间大小的算法基于下列方面:每秒钟生成撤销的速度,存储满足查询运行时间最长需求的数据的秒数,并且可能使用闪回查询。

创建AWR快照:exec dbms_workload_repository.create_snapshot;

服务器生成的告警:
告警系统的安装与启用是自动的。
告警系统体系结构:
MMON后台进程是一个易管理的监视器,该进程可以观察实例与数据库。如果某种指标过于偏离期望值,则MMON进程就会生成一个告警。MMON进程生成的所有告警都被置入SYS模式中的队列ALERT_QUE。为了查看告警消息,就必须订阅告警队列。可以使用高级队列API(DBMS_AQ程序包)编写自己的,用于查看告警的例程。通过自动订阅告警队列的EMDC来查看告警是最简单的方式。
告警具有两种形式:阈值(有状态的)或无阈值(无状态的)。配置阈值告警时,必须设置某些要监视的指标值。当越过阈值时,就会引发一个告警,并且该告警在采用使用指标值低于触发值的某些动作之前一直持续。无阈值告警由某个发生后并不持久的事件触发,如ORA-1555:snapshot too old(快照过旧)错误。告警通过MMON后台进程发送,并通过EMDC显示。

十六、管理撤销
撤销的原因与实质
回滚某个事务意味意味阒使用撤销段中的数据来构造一个与事务发生前相同的数据映像。通过查询DBA_SEGMENTS视图可以确定回滚与撤销的不同。撤销段只能存在于一个撤销表空间内,而这只是撤销段的一个特性。在数据库创建阶段可能不存在撤销表空间。除了数据字典外,ORACLE还会在SYSTEM表空间内创建一个过时的回滚段。该回滚段在数据库创建期间使用,决不会在正常运行期间使用。所有用户都会使用撤销段,这些撤销段在DBA_SEGMENTS的segmgent_type中显示TYPE2 UNDO,回滚段显示为rollback,也称为TYPE1 UNDO。如果数据库已被转换使用撤销段,并且自动进行撤销管理,则任何现有的回滚段都必须处于脱机模式中,且不能被设置为联机,因此完全有理由去除这些回滚段。撤销段的使用与回滚段的使用相矛盾:根据UNDO_MANAGEMENT参数的不同设置,ORACLE数据库要么使用撤销段,要么使用回滚段。

撤销段只能存在于专门针对撤销目的创建的某个表空间内,而回滚段则可以被创建在任何表空间内。如果创建了多个撤销表空间则在任意给定时刻都只能使用其中一个撤销表空间,但RAC情况下除外。在RAC环境中,打开该数据库的每个实例都会使用自己的撤销表空间。
撤销表空间必须被创建为持久的,本地管理的并且能够自动扩展分配空间的表空间。在创建之后,管理命令通常被限制为物理操作。
dba_rollback_segs视图可以查看数据库中所有撤销段或回滚段的记录。

事务与撤销段
在某个事务启动时,ORACLE会为其指派一个(并且只能指派一个)撤销段。任何事务生成的撤销数据都无法被分配到多个撤销段中。如果某个事务生成的撤销数据填满了自己使用的撤销段,则ORACLE会自动为该撤销段添加另一个区间,从而使这个事务能够继续进行。虽然多个事务可以共享一个撤销段,但在数据库正常运行时就不会发生这种情况。
撤销管理的一个特性是ORACLE会根据需要自动生成新的撤销段,从而能够尽可能地确保多个事务不必共享撤销段。同样也会自动缩小或删除撤销段。
在某个事务更新表和索引数据块时,回滚该变化所需的信息会被写入指定撤销表空间的数据块。所有撤销数据一直会被保持至事务被提交。在默认情况下,ORACLE不会保证ACID测试的一致性,只能在一定的程度上保证一致性:某个查询成功,则查询结果会与这个查询开始时的数据库的状态一致。但能绝对保证ACID测试的原子性。撤销数据被分为两部分:Active撤销是回滚当前事务可能需要的撤销数据,在事务结束之前,这些数据不会被重写;Expired撤销是指事务被提交后ORACLE不再需要保存的撤销数据,如果ORACLE需要为当前的其他事务提供空间,则可以重写这些数据。
撤销数据在提交后过期意味着可以采用循环方式使用撤销段。最终,撤销数据会填满整个撤销表空间。可以通过查询VTRANSACTION视图(该视图将VTRANSACTION视图(该视图将VTRANSACTION视图(该视图将VSESSION与DBA_ROLLBACK_SEGS的列连接在一起)来查看为每个事务所指派的段。

管理撤销
管理撤销的原则:应该始终存在允许所有事务继续进行的足够撤销空间,要求撤销表空间大到足以应付撤销需求的最坏情况;
应该始终存在保证查询成功的足够撤销数据,要求撤销表空间内存在额外的空间,这些空间能够存储读一致性可能需要的过期撤销数据,从而长时间运行的查询不会因为出现快照过旧ORA-1555错误而失败。
如果某个事务耗尽了撤销空间,则该事务就会由于ORA-30036无法扩展撤销表空间内的撤销段而失败。导致该错误的语句会回滚,但指定事务的剩余部分会保持不变并不被提交。当且仅当撤销表空间被过期的撤销数据完全填满时才会引发这个错误条件。如果某个查询由于快照过旧而导致一致读失败,就意味着该查询会涉及一个在查询开始后发生变化的数据块,但当进入该撤销段查找原有数据时,撤销数据已被重写。

UNDO_MANAGEMENT:默认值为manual,表示ORACLE根本不会使用撤销段。应用该设置必须完成大量创建和调整回滚段的工作;auto表示启用使用撤销段的自动撤销管理。该参数是静态的,意味着参数发生变化只有在重新启动实例后才能生效。
UNDO_TABLESPACE:启用UNDO_MANAGEMENT=auto后,就必须指定该参数。该参数指定了一个作为有效撤销表空间的表空间,且该表空间必须已被创建为一个撤销表空间,同时其内部的所有撤销段都会被自动联机即,使撤销段可用;
UNDO_RETENTION:以秒为单位进行设置的可选参数。该参数指定了保留过期撤销数据的时间,以保证数据库不出现ORA-1555错误。如果没有设置这个参数或将其设置为0,则ORACLE仍会尽可能长时间地保留撤销数据。UNDO_RETENTION参数的最大值总与撤销表空间的大小一致。
如果配置了保证撤销保留(见后),则UNDO_RETENTION参数就不是可选的。针对撤销的默认操作模式是:对于事务与查询来说,ORACLE更倾向于维护事务。如果在查询可能出现ORA-1555失败与事务必定出现ORA-30036失败之间选择撤销表空间的大小,则ORACLE会通过重写查询所需的已提交撤销数据使指定事务继续进行。UNDO_RETENTION是 ORACLE试图达到的唯一目标。
ORACLE10G版本中存在保证撤销保留的选项。经过UNDO_RETENTION参数所设定的时间之前,撤销数据决不会被重写。在表空间层次上通过Retention Guarantee子句就能够启用撤销保留保证。可以在创建撤销表空间或修改撤销表空间时启用该特性。一旦激活某个已被指定保留保证的撤销表空间,如果所有查询都能够在撤销保留时间内结束,则这些查询都将成功完成,而且也不会再次接收到快照过旧的错误。由于ORACLE在经过保留时间前不会重写已提交的撤销数据,故不利的方面是事务可能由于缺乏撤销表空间而导致失败。我们可以通过SQL*PLUS中更改某个表空间的撤销保留保证,但无法通过EMDC来完成。

调整与监视撤销表空间
撤销表空间应该足够大,这样才能存储并发事务生成的所有撤销数据的最坏情况,这些数据是有效的撤销数据及长时间运行查询所需的过期撤销数据。在更高级的环境中,最好还应该添加允许闪回查询的空间。算法是:首先计算在最高工作负荷时生成撤销的速度,然后再乘以最长的查询的时间长度。
查询V$UNDOSTAT视图可以得到需要知道的所有信息。

删除与缩小撤销段
创建一个撤销表空间时,ORACLE会在这个表空间内创建一个撤销段池。如果并发事务数超过了这个池中的撤销段数,则ORACLE会创建更多的撤销段。如果某个事务的撤销数据超过了其撤销段的大小,则这个撤销段也会被扩展。在正常运行期间,如果撤销表空间受到与空间相关的压力,则ORACLE就会在必要时自动将过期撤销数据的区间从一个撤销段转移至另一个撤销段,从而确保撤销段的空间足够保存当前运行事务所产生的有效撤销数据。用于重新分配撤销表大小甚至删除撤销表的额外机制由SMON驱动。每隔24小时,SMON进程都会查看撤销表空间,并且删除用于满足最高工作负荷要求但已不再需要的撤销段,则时还会缩小过大的撤销段。
如果撤销段被填满,则这个撤销段的大小会根据这个事务的撤销数据量按需要增加;
执行一条DML语句时磁盘上的数据与撤销块都会被更新,并且相应的变化会被写至日志缓冲区;
即使使用了自动的撤销管理段,但仍遇到快照过旧错误,则应该首先调整查询,再加撤销表空间,启用撤销保留保证。
针对一连串SET transaction read only设置要求广泛地使用撤销数据,故会导致快照过旧错误。

十七、处理锁定
借助于记录和表锁定机制,可以实现并行访问的串行化。ORACLE中,锁定是完全自动的。

共享锁和排他锁:在指定记录上请求排他锁的第一个会话将得到这个锁定,其他请求对该记录进行写访问的会话则必须等待。即每次只能有一个会话可以获得排他锁。指定记录上的排他锁只有在COMMIT或ROLLBACK后才会被解除。共享表被设置于整个表上,多个会话可以获得同一个表上的共享锁。设置共享所的目的是为了防止另一会话获得这个表上的排他锁。在表上放置排他锁时需要执行DDL语句。执行DML语句,当前会话必须获取待更改记录上的排他锁及包含这些记录表上的共享锁。
DML语句至少需要受影响记录上的排他锁及包含这些记录表上的共享锁。排他锁能够防止其他会话干预指定记录,共享锁则能阻止其他会话使用DDL语句修改表的定义。这两种锁定会被自动请求。如果某DML语句在指定记录上无法获得所需的排他锁,则该语句将被挂起直至获得所需的排他锁。
DDL语句需要使用所涉及对象上的排他锁。只有在针对指定表的所有DML事务结束,且记录上的排他锁及表上的共享锁都被解除后,才能获得执行DDL命令所需的排他锁。任何DDL语句所需的排他锁都是自动请求的,但如果无法获取需要的排他锁,则DDL语句会立即终止。

请求锁定需要排队。如果不希望某个会话在无法获取锁定时进行排队,唯一的方法就是使用SELECT FOR UPDATE命令的WAIT或NOWAIT子句。由于SELECT不需要任何锁定故普通的SELECT语句总是能够成功的执行,但DML语句会挂起。SELECT FOR UPDATE命令采用专有的模式来选择和锁定记录。如果某条记录被锁定,则在锁定释放之前,SELECT FOR UPDATE语句就会像DML一样进行排队并挂起会话。使用SELECT FOR UPDATE NOWAIT和SELECT FOR UPDATE WAIT n就可以避免挂起会话,n是以秒为单位的数值。使用SELECT FOR UPDATE的任一子句获得锁定后,就可以在不必挂起的情况下执行DML命令。如果使用NOWAIT子句则会在无法获得锁定的情况下立即终止语句。使用WAIT n子句会在无法获得锁定的情况下等待n秒,如果n秒后还无法获得锁定则立即终止语句。

锁定争用机制:当某个会话请求一条记录或一个对象上的锁定时,由于其他会话已经获取了该记录或对象上的排他锁而无法获取锁定时,这个会话将挂起,这种现象称为锁定争用。死锁是锁定争用的一种特殊情况,通常由数据库本身自动解决。
SET TRANSACTION READ ONLY语句能够保证在不带来任何锁定的前提下,该会话不会看到任何表上被提交或未被提交的任何DML语句,直至使用COMMIT或ROLLBACK命令终止这个只读事务。
在紧急情况下,DBA能够通过终止长时间拥有过多锁定的会话来解决锁定争用的问题。强制终止某个会话时,该会话拥有的任何锁定都会在回滚其作用的事务时同时被释放。此时被锁定的会话将被释放并继续执行。可以通过EMDC功ALTER SYSTEM KILL SESSION 'session_id,session serial Number’来终止指定会话。
死锁不是DBA的问题并且数据库自身能够自动解决死锁。与死锁相关的信息会被写入告警日志,并且被详细记录至某个跟踪文件。除了报告死锁的发生之外,DBA不需要完成针对死锁的操作。死锁问题由ORACLE数据库自动解决的。死锁是一种程序设计错误。告警日志位于BACKGROUND_DUMP_DEST实例参数指定的目录内,并且名为alert_<instance_name>.log。告警日志最后一个条目会告诉跟踪文件的位置。跟踪文件位于USER_DUMP_DEST实例参数指定的目录内。ORACLE会通过回滚导致死锁的某条语句来解决死锁问题。
锁定是由排队机制实现的,队列跟踪了已被请求的锁定,并且队列中的锁定排列顺序与锁定被请求的顺序一致。在等待排队时,会话将被挂起。针对表和记录的锁定是完全自动的。

十八、配置数据库的备份与恢复
重做与撤销机制都能保证数据库绝对不会出现讹误。
服务级别与备份和恢复相关的三个方面:MTBF(mean time between failures,平均失败时间),MTTR(mean time to recover,平均恢复时间)和数据损失量。DBA的目标就是减少MTTR和数据损失量的同时增加MTBF。MTBF是指数据库出现失败的频繁度。ORACLE提供了两种有助于百分之百可用性的高级选项:RAC和Streams。RAC数据库由位于多台计算机上的多个实例所打开的一个物理数据库组成。RAC使硬件,操作系统与软件免遭失败。Streams环境由位于不同计算机上的两个或多个数据库组成。Streams能够根据需要保持两个数据库实时同步。Streams选项使磁盘和网络免遭失败及硬件,操作系统与软件免遭失败,与RAC相比,其容错能力更强。MTTR是指数据库出现失败后的停机时间。Data Guard实现使数据库在任何情况下都不会损失数据。在Data Guard系统中,实际运行的数据库(被称为主数据库)受到一个或多个备用数据库的保护。RAC、Streams和Data Guard选项都不会对性能造成影响。任何容错系统都特别依赖于硬件冗余。DBA需要与系统管理员一起实现容错功能。

失败类别:
1.语句失败:无效数据是语句失败的常见原因。应用程序中的逻辑错误、空间管理问题和缺少权限也是语句失败的一个原因。如果执行alter session enable resumable,指定会话就不会告知任何与空间相关的问题,而是将问题挂起直至解决。使用RESUMABLE_TIMEOUT参数可以为整个实例启用可恢复的空间分配。
2.用户进程失败:用户并非登出的异常退出,终端的重启;导致地址违规的程序。PMON后台进程通过定时轮询所有的服务器进程来确定会话的状态。如果某个服务器进程报告失去了与其用户进程的联系,此时PMON进程会解决这个问题。如果指定的会话位于某个事务的中部,PMON会首先回滚这个事务并释放所有锁定,然后终止该服务器进程,同时将PGA释放回操作系统。
3.网络失败:DBA应当能够通过配置ORACLE NET来杜绝网络失败。此时需要考虑三个方面:侦听器,网络接口卡及路由。侦听器能够完成的工作量是有限的。一个侦听器每次只能为一个连接请求服务,并且需要在适当的时间内启动一个服务器进程及将庐服务器进程连接到某个用户进程。可通过配置多个侦听器及使用连接时的负载均衡,在所有侦听器之间分散这些工作量。
4.用户错误:解决用户错误的理想方式是防止该类错误的出现。闪回查询,闪回删除,Log Miner、不完全恢复及闪回数据库可以解决用户错误。闪回查询针对过去某时存在的数据库所运行的查询。通过使用撤销数据,就可只为当前会话构造读一致的数据库。闪回删除倒退了DROP TABLE命令的结果。在旧的ORACLE中,DROP命令能够从数据字典中删除对指定表的所有引用,使该命令无法倒退,甚至闪回查询也将失败,因为闪回查询机制需要数据字典对象定义。在10G中,DROP命令,如果没有特别的要求,则该命令不再进行任何删除操作,而仅仅重命名对象。Log Miner是一种从联机和归档的重做日志中抽取信息的工具。重做包含数据块发生的所有变化。与闪回查询相同的是,都是根据撤销数据构造倒退变化所需的信息。与闪回查询不同的是,闪回查询使用当前存在于撤销段内的撤销数据,而Log Miner则从重做日志中抽取数据。闪回查询只能返回至撤销表空间所允许的时刻,而Log Miner在有相关日志的副本的情况下,能够返回至先前的任意时刻。不完全恢复与闪回数据库使整个数据库会返回至发生错误前的时刻。即会损失从返回时刻开始的所有工作,而不仅仅只损失错误的事务。
5.介质失败:控制文件和联机重做日志应当始终通过复用技术进行保护。数据文件无法被复用,一旦某个数据文件被破坏,唯一的选择就是从备份中还原这个数据文件,同时通过从联机和归档的重做日志中抽取的变化将数据文件返回至受损之前的状态。归档的重做日志文件是在每次日志切换后生成的联机重做日志的副本。为了应对介质失败,必须生成控制文件,联机重做日志文件及归档的重做日志文件的多个副本,必须对控制文件,数据文件及归档日志文件进行备份,不必备份重做日志,重做日志在被复制至归档日志时会进行备份。复用并不能保护数据文件,数据文件必须通过硬件冗余保护。
6.实例失败:实例的无序关闭,通常称为崩溃。断电,关闭或重启服务器及许多至关重要的硬件问题都会导致实例失败。实例失败的结果与执行SHUTDOWN ABORT命令的结果相同。

实例恢复:如果数据库出现讹误 ,ORACLE会自动检测到这种状况,并且通过执行实例恢复去除讹误。实例恢复是完全自动的。如果实例恢复失败,唯一的可能是在实例失败的同时还存在介质失败。实例恢复分为前滚和回滚两个阶段,均是自动完成的。前滚是使用联机日志文件的内容将数据库高速缓存区重新构建至崩溃之前的状态。完成前滚后,就能打开数据库。该阶段将恢复所有变化(针对已提交和未提交事务的数据块变化与撤销块变化)。此时数据库仍存在讹误,因为数据库中存在未提交的事务,这些事务必须回滚。ORACLE在实例恢复的回滚阶段自动完成未提交事务的回滚。通过执行STARTUP命令可以自动调用实例恢复。执行SHUTDOWN ABORT命令会造成数据库崩溃,但不可能造成数据库讹误。调整实例恢复:MTTR是各种事件出现后的平均恢复时间。这个时间取决于两个因素:需要读取的重做数及应用重做时需要在数据文件上完成的读写操作数。这两个因素都受到检查点的控制。检查点保证了在某个特定的时间,DBWn进程将构成一个特定系统更改号(System Change Number,SCN)的所有数据变化都已写入数据文件。在一个实例崩溃事件中,只有SMON进程需要重演从上一个检查点位置开始生成的重做。无论是否被提交,在这个检查点之前所做的全部变化都已被写入数据文件。因此,不需要使用重做来重新构造在该检查点这前已提交的事务。对于该检查点之前未提交的事务所做的变化也会被写入数据文件,也不需要重新构造该检查点这前的撤销数据,回滚需要使用的这些数据已经存在于磁盘上的撤销段内。检查点越近实例恢复就会越快。FAST_START_MTTR_TARGET参数使得对实例恢复时间的控制变得十分容易。以秒为单位指定该参数,ORACLE随后将确认DBWn进程在实例崩溃后能够以足够快的速度将数据块写至磁盘,从而不会超过指定的秒数。设置的FAST_START_MTTR_TARGET参数值越小,DBWn进程将会更努力地尝试最小化检查点位置与实际时间之间的间隔。可以从V$INSTANCE_RECOVERY视图中获得详细的信息。配置数据库的可恢复性
为了保证数据库具有最大程度的可恢复性,必须复用控制文件与联机重做日志,必须在archivelog模式中运行数据库,同时必须复用归档日志文件,还必须定期备份数据库。
控制文件用于加载数据库,并且在数据库打开时被频繁地读写。控制文件最多具有8个被复用的副本,并且应该放置在不同的物理设备上。ORACLE确保控制文件的副本完全相同。一个控制文件的损坏会导致停机,一旦ORACLE检测到某个控制文件被损坏或丢失,实例就会由于实例失败而终止。为了移动或添加一个控制文件,首先需要关闭数据库。在数据库打开时,不能进行任何控制文件操作。接着使用操作系统命令移动或复制控制文件。随后编辑指向新位置的CONTROL_FILES参数。如果使用静态参数文件,直接可用文本编辑器进行编辑。如果使用动态参数文件,则需要在NOMOUNT模式中启动数据库,并且执行alter system set control_files= 命令。最后正常地打开数据库。
保护联机重做日志文件
ORACLE数据库运行时至少需要两个联机重做日志文件组,每个文件组至少需要一个成员。为安全起见,每个联机重做日志文件组至少都应当具有两个成员。
如果出现丢失当前联机日志文件组的所有备份,则数据就会丢失。因为实例崩溃后,SMON进程会使用当前联机日志文件组的内容进行前滚恢复,从而修复数据库中的任何讹误。如果当前联机日志文件组由于未被复用及一个成员因介质损坏破坏而变得不可用,则SMON进程就无法进行前滚恢复。如果不能通过前滚修正数据库的讹误,则无法打开数据库。尽量不将任何数据文件放置在与重做日志文件相同的设备中。如果一个LGWR进程不得不与DBWn进程及许多服务器进程竞争磁盘I/O资源,则数据库的性能可能退化。如果重做日志文件组的一个成员被损坏或丢失,则数据库在存在幸存成员的情况下仍然会保持打开状态。只要存在至少两个重做日志文件组且每个组至少具有一个有效的成员,数据库打开时也可以添加或删除重做日志文件组及组中的成员。V$LOG视图查看日志文件组信息和V$LOGFILE查看日志文件信息。V$LOG的STATUS列显示重做日志文件组的状态,CURRENT表示该日志组为当前日志组,ACTIVE表示如果实例失败,SMON将用该组进行实例恢复。在最近一次切换前,只有ACTIVE日志文件组正被使用。如果执行alter system checkpoint命令会使检查点位置是最近的。同一时刻只能具有一组活动的日志文件组;MEMBERS列显示该日志文件组具有的成员数量;SEQUENCE#列说明从数据库被创建开始总共发生过的日志切换,随着每次日志切换的发生,这个数字会被累加。执行alter system switch logfile;命令可以实施一次日志切换。如果在当前组已满时仍然存在正在执行的DML语句,则就会自动发生日志切换。无论是手动的还是自动的,日志切换都会使LGWR进程开始在下一个联机日志文件组中写入撤销数据。
每个重做日志文件组的成员都受到控制文件中若干设置的限制,并且是在数据库创建阶段确定的。MAXLOGMEMERS指令限制了每个组可以具有的最大成员数。MAXLOGFILES指令限制了数据库可以具有的重做日志文件组数。DBCA默认这两个数值分别为3和16。

archivelog模式与归档器进程:为了保证在介质失败后不丢失任何数据,就必须具有一条针对从数据库最近一次备份开始应用于数据库的所有变化的记录,在默认情况下,这种功能并未被激活。在切换日志时,会重写联机重做日志文件。将数据库移至archivelog模式能够确保如果联机重做日志文件没有首先被复制为归档日志,就不能被重写。这样将存在一系列归档日志文件,这些文件描述了应用于数据库的所有变化的完整历史。默认情况下,数据库是在archivelog模式中创建的,这就意味着日志切换在没有先进行复制的情况下会重写联机重做日志文件。(为什么???)此时数据库不会产生讹误 ,但如果数据文件因为介质失败被损坏,就会丢失数据。在数据库移至archivelog模式时,如果从最近一次数据库备份开始的所有归档日志文件可用,就不可能丢失数据。一旦数据库被转换至archivelog模式,就会自动启动一个新的后台进程ARCn。在默认情况下,ORACLE会启动两个ARCn,最多可启动10个归档器进程。如果数据库位于archivelog模式,实例会自动启动归档器进程。归档器进程在每次日志切换后将联机重做日志文件复制到一个归档日志文件,从而生成一串连续的且能用于恢复一个备份的日志文件。归档日志文件可以像联机日志文件一样被复用,但应当被迁移至脱机的存储设备中。ORACLE实例使用ARCn进程维护归档日志的创建过程,但DBA必须通过操作系统命令,RMAN或者第三方备份软件程序包控制归档日志文件至磁带的迁移过程。
数据库只有在关闭后位于加载模式中时才能被转换至archivelog模式,并且必须建立了SYSDBA连接的用户完成。还必须设置若干控制的所生成的归档日志名称和位置的初始化参数。这些名称必须唯一,否则会重写归档日志。
为确保从一个还原的备份中进行恢复,就需要最小化归档。也就是设置一个归档目的地。为安全起见,通常需要通过指定两个或多个目的地来复用归档日志文件。

实例恢复机制保证了ORACLE数据库绝对不会出现讹误,归档机制保证了在没有丢失当前未归档的连接重做日志文件组并具有足够备份的情况下绝对不会丢失数据。与控制文件不同的事,始终只能在数据库打开时管理联机重做日志文件。一次日志切换会实施归档操作。在数据库打开时,无法操纵的只有控制文件。

十九、备份ORACLE数据库
直接使用操作系统的实用程序就可以进行备份操作。但ORACLE强烈建议使用RMAN。RMAN的一个特别功能是集成了第三方磁带库。RMAN能够备份数据文件,控制文件,归档日志及服务器参数文件。

全部备份:所有数据文件,控制文件及服务器参数文件的备份,并不需要备份联机重做日志。联机重做日志文件通过复用与可选的归档受到保护。由于控制文件的所有复用副本都完全相同,备份时只要备份一个控制文件副本就可以了。只有用于永久表空间的数据文件才会被备份。RMAN不能备份用于临时表空间的临时文件,这些临时文件也不能被置入用于操作系统备份的备份模式。
部分备份:一个或多个数据文件以及控制文件的备份。部分备份与数据库的剩余部分肯定不会同步。部分备份只能在特定时刻数据库某部分的副本。如果必要从部分备份中还原一个文件,则这个文件在能够使用之前必须与数据库的其余部分同步,这意味着需要通过应用归档和联机重做日志文件中的变化使恢复的文件是最新的。只有在数据库位于archivelog模式中是,部分备份才有效。如果数据库没有在archivelog模式中运行,应当进行全部备份。
完整备份:是一个或多个数据文件的一个完整副本,这个副本可以是全部备份也可以是部分备份。
增量备份:是数据文件的某些数据块的一个备份,该备份只包含从最近一次完整备份以来被修改或添加的数据块。只有使用RMAN才能实现增量备份。增量备份远小于完整备份,其备份速度显著地快于完整备份的速度。无论数据库位于archivelog模式还是noarchivelog模式,增量备份都可以在数据库打开或关闭时进行。
脱机备份:在数据库关闭时生成的备份,也称为冷备份,关闭备份或一致备份。通常只有使用IMMEDIATE、TRANSACTIONAL或NORMAL关闭选项干净地关闭数据库时才能保证数据文件的一致性。
联机备份:在数据库正被使用时生成的备份,也称为开启备份,热备份或非一致备份。联机备份可以是全部备份也可以是部分备份,并且能够通过使用RMAN或操作系统命令来完成。不过只能在archivelog模式下才能进行。联机备份可以是完整备份也可以是部分增量备份。联机备份的一个数据文件不仅不会与任何特定的SCN同步,而且也不会与其他数据文件或控制文件同步。被还的联机备份总是需要通过使用联机和归档日志文件才能与数据库的其余部分同步。
映像副本:映像副本是某个文件的备份,并且每个字节都与源文件相同。映像副本不可能是增量备份,也不可能在磁带设备上生成。在使用操作系统命令进行备份时,如果没有压缩数据或将数据直接流入磁带,输入文件就是映像副本。数据库打开或关闭时可以由数据文件,控制文件及归档日志生成映像副本,仍然不能备份联机日志。
备份集:由RMAN生成的一种专有结构。是由一个或多个被称为片的物理文件组成的逻辑结构。备份片中包含了一个或多个数据库文件,这些数据库文件可以是数据文件、控制文件或归档日志文件。上述3种文件类型可以被任意组合在一个备份集内。只有RMAN才能译解备份集格式。RMAN还可以生成映像副本,且与操作系统命令生成的映像副本无法进行区分。备份集可以拥有增量备份。即使对于完整备份来说,组成备份集的备份片通常会显著地小于映像副本。因为备份集不会包含空的数据块。可根据自己的意愿在备份集中启用数据压缩。如果为磁带库安装了RMAN驱动程序,则RMAN可以将备份集直接流入磁带。映像副本只能在磁盘上生成,备份集则可以在磁盘或磁带上生成。数据文件,控制文件和归档日志文件的映像副本和备份集都可以是联机或脱机备份,全部或部分备份及完整备份。映像副本不可能是增量备份,在archivelog模式和noarchivelog模式中都可以进行。备份集只能由RMAN生成或还原。

RMAN设置
RMAN可以在不进行任何配置的情况下运行。

设备的设置:并行度,目标目录,生成备份集还是映像副本是用于磁盘备份的选项。并行度默认为1,意味着RMAN进程只会产生1个被称为通道的服务器进程来实际创建备份。对于脱机备份而言,希望尽快完成备份,对于联机备份而言,为了限制耗用的资源量,最好减缓备份的速度。磁盘备份位置可以是任意目录,如果未进行设置,默认是DB_RECOVERY_DEST参数的设置,而该参数默认为ORACLE_HOME目录中的flash_recovery_area目录。如果选择生成备份集还需要确定是否压缩数据。磁带设备的数量,磁带库专用的选项及是否压缩备份集是用于磁带备份的选项。在磁带上不可以生成映像备份。指定磁带设备的数量相当于磁盘备份指定并行度。确定执行磁带备份或磁盘备份时,必须在Host Credentials部分指定登入驻留数据库的机器的操作系统。因为RMAN通道需要采用一个操作系统身份,从而能够读写备份目的地。

备份集的设置:默认情况下,备份片的大小没有限制:整个备份集被物理存储于一个片或文件中。备份片大小的值设定需要与系统管理员协商沟通,最大值需要被设定为易于管理的值。可以通过指定多个副本来复用备份集。如果没有通过RAID或磁带镜像来保护备份目的地,就会带来额外的安全级别。

策略的设置:确定在生成备份(不包括控制文件和服务器参数文件)时是否备份控制文件和服务器参数文件;
确定是否通过排除最近一次备份以来未发生变化的文件来最优化备份:任何脱机的或标记为只读的数据文件只被备份一次 从而能够节省后续备份操作的时间与容量。
确定是否为加快增量备份启用数据块变化跟踪:ORACLE 10G的新特性。能够显著地影响增量备份所需的时间。如果选择该 选项,会启动变化跟踪写入器(Change Tracking Writer,CTWR)后台进程。CTWR进程会在一个块变化跟踪文件中写下被更新 的数据块的地址。在SQL*PLUS环境下通过执行ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE ‘file_name’;
确定完整备份操作期间不需要备份的一个或多个表空间:Tablespaces Excluded From Database Backup选项。
Retention Policy:根据备份保留策略,RMAN可以删除被认为不再需要的备份。默认的备份保留策略是RMAN会保证所有数据 文件与每个归档日志只具有一个副本。更复杂的保留策略是恢复窗口策略,RMAN需要保证具有足够的完整备份、增量备份 及归档日志备份,从而能够还原数据库并将其恢复至先前的任意时刻(默认是31天前);

控制文件备份:是一种用于跟踪的备份。如果控制文件的所有副本都受损,那么有时候不必还原控制文件一个备份就能够更容易地重新创建控制文件。如果需要修改控制文件内部的任何设置,也可以通过某种方式重新创建控制文件。用于跟踪的备份会使用CREATE CONTROLFILE命令生成一个控制文件的创建脚本,该脚本可以在编写完成后运行,也可以在需要调整任何设置的情况下进行编辑。在SQL*PLUS中执行ALTER DATABASE BACKUP CONTROLFILE TO TRACE命令或选择相应的DC选项,就可以在USER_DUMP_DEST参数指定的目录中创建一个文件。我们应该将该文件重命名为有意义的名称,同时将其复制至安全的位置。理想情况下,在数据库每次出现结构化变化后,都应当生成和保存一个新的跟踪文件。

管理RMAN备份
DC不会在一个备份集中混合各种文件类型,但从命令行中则可以实现。

默认的备份目的地:闪回恢复区基于磁盘的存储结构。在ORACLE10g中,闪回恢复区被用作存储与恢复相关的数据的默认位置。这些数据包括:控制文件和联机重做日志文件的复用副本;归档日志目的地;RMAN备份集与映像副本;闪回日志。闪回恢复区受到DB_RECOVERY_FILE_DEST和DB_RECOVERY_FILE_SIZE参数的控制。这两个参数都不具有默认值。但在用DBCA创建数据库是,DBCA将DB_RECOVERY_FILE_DEST设置为ORACLE_HOME主目录中的flash_recovery_area目录,将DB_RECOVERY_SIZE设置为2MB。这两个参数都是静态的。一旦写至闪回恢复区的大量数据到达所指定的大小,就可能出现问题。因此对闪回恢复区的监视十分重要。通过查询V$RECOVERY_FILE_DESC视图可以得到闪回恢复区的相关信息。如果闪回恢复区中的文件变为多余的,则它们在需要时会被替换为更新的文件。RMAN与归档器进程都能够智能地发现闪回恢复区中某个文件何时不需要以及何时被重写。

如果数据库位于noarchivelog模式中,备份被限制为脱机的全部备份和RMAN进行增量备份。
可以限制备份片的大小,但无法预知备份集的大小,不能在一个备份集中同时存储完整备份和增量备份。我们可以通过ALTER DATABASE BACKUP CONTROLFILE来备份控制文件。
ORACLE Suggested策略遵循默认的设置:在每个周末进行一次全部备份,然后从每个周日夜间开始不断生成增量备份。
交叉检查期间,RMAN会读取所有磁带目录,从而确认备份片的存在。对于磁盘备份而言,RMAN会读取文件头,这两种情况下RMAN都不会通过扫描文件本身来确认这些文件确实有效。交叉检查发现某个备份丢失,则该备份就会被标记为过期备份。即交叉检查失败的备份是过期备份。

二十、恢复数据库
恢复结构与进程
对于受损的控制文件来说,既可以将其替换为某个复用副本,也可用CREATE CONTROLFILE命令重新创建。在极端情况下,可从备份中还原控制文件。
受损的联机重做日志文件可以被重新生成。ORACLE提供了一个ALTER DATABASE CLEAR LOGFILE GROUP#(#为受损成员的日志文件组号)命令,使用这个命令可以删除与重建某个日志文件组的成员。如果数据库在archivelog模式中运行并且应该在这个模式中运行,则日志文件组必须在ORACLE允许执行清除日志文件命令之前已被归档。因为清除未归档的日志文件组意味着归档日志流会丢失一个日志文件,从而不可能完成恢复。ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP#命令可以删除和重建一个即使已被成功归档的日志文件,但执行该命令后必须对整个数据库进行备份。
恢复受损的数据文件需要使用备份与归档日志。在导致某个数据文件受损的介质失败后,存在下列两种选项:完全恢复,不会丢失任何数据;不完全恢复,通过在完成前停止恢复进程来故意丢失一些数据。不完全恢复是一个高级过程。完全恢复是一个两阶段的过程:首先必须从备份中还原受损文件;随后,必须使用归档日志文件中的信息将数据库提前至被还原的文件与数据库其余部分同步的时刻,从而恢复这个文件。在ORACLE环境中,还原意味着使用备份替换受损的或丢失的文件,恢复意味着通过使用归档日志来同步受损文件与数据库其余部分。
因为RMAN从不备份联机重做日志,所以RMAN无法用于恢复受损的联机日志文件。使用SQLPLUS或DC能够修复因介质失败而受损的联机重做日志文件。RMAN能够还原与恢复控制文件和数据文件。事实上,如果在备份集中备份了这些文件,使用RMAN是唯一的选择。
为了打开数据库,所有控制文件副本,每个联机日志文件组的至少一个成员及所有联机数据文件都必须存在且同步。如果SMON进程在启动期间发现情况并非如此,启动就不会完成。如果某个控制文件副本受损或丢失,启动会停止在NOMOUNT模式中,告警日志中会写下受损控制文件副本的详细信息。如果控制文件没有问题,SMON进程就将继续打开数据库。在这个阶段中,SMON进程会查看所有联机数据文件的头部。只要任何联机数据文件的头部受损或丢失,相应的错误消息都会被写入告警日志,并且数据库停留在加载模式中。如果所有联机文件都存在并且未受损,但某个或多个联机文件没有同步,SMON进程会尝试通过联机重做日志文件来同步这些文件。这是能够自动发生的实例恢复过程。如果所需的联机日志不可用,就无法打开数据库。如果一个或多个数据文件是通过备份还原的,则这些文件几乎肯定已过期较长时间,联机重做日志文件也无法返回至恢复上述文件的时间,此时,必须使用归档日志文件来进行恢复,这是一个必须手工启动的过程:如果使用操作系统命令进行备份,就需要在SQL*PLUS中启动这个过程,如果使用RMAN进行备份,就需要使用RMAN启动这个过程。
如果在数据库打开时出现介质损坏,其结果取决于受影响的文件。任何控制文件副本受损都会导致实例立即终止。作为SYSTEM表空间或活动的撤销表空间一部分的数据文件受损也会造成同样的结果。但是,在联机日志受损时,只要日志文件组中存在幸存成员,就不会造成实例的终止。事实上,实例会继续运行,终端用户甚至无法察觉联机日志文件受损的情况。不过,相应的错误消息会被写入告警日志,这种状况应当被立即修正,修正能够而且应当在用户可以继续工作的联机状态下完成。作为除了SYSTEM表空间或活动的撤销表空间之外的表空间一部分的数据文件受损也不会导致实例失败,但因为数据库的某部分丢失,所以终端用户可能遇到问题。如果受损数据文件不属于SYSTEM表空间或活动的撤销表空间,就能够联机完成这些数据文件的还原和恢复。
与备份一样,使用RMAN或操作系统实用程序也可以完成还原操作。但是RMAN备份操作生成的是备份集而非映像副本,就只能使用RMAN进行还原操作。可以使用RMAN或操作系统衫程序可以完成还原之后的恢复操作,但存在同样的限制:只有RMAN才能从备份集中抽取归档日志。

介质失败后的恢复
恢复受损的复用控制文件:只要存在幸存的复用控制文件副本,恢复工作只需要将受损或丢失的控制文件副本替换为幸存的控制文件副本就可以完成。从备份中还原受损或丢失的控制文件副本是无用的,还原的副本无法与幸存的副本保持同步也不能与数据库的其他部分同步。可以通过使用幸存的控制文件副本来替换受损或丢失的文件或者修改CONTORL_FILES初始化参数,将对受损文件的引用替换为对某个新文件的引用,并且将这个新文件复制为控制文件副本。恢复受损的控制文件时必须使数据库停机,该操作无法在联机状态下完成。

恢复受损的复用联机重做日志文件:在数据库打开时可以恢复复用的联机重做日志文件,因此不会造成数据库的停机。使用ALTER DATABASE CLEAR LOGFILE命令删除已有的日志文件(至少是仍然存在的日志文件)并且创建新的文件。这个操作只有在这些日志文件不活动时进行。如果试图清空当前的日志文件组,或者前一个日志文件组仍是活动的,就会收到出错的消息。如果数据库位于archivelog模式中,日志文件组必须已归档。

恢复受损的数据文件:必须先还原数据文件的一个备份,然后再应用归档日志同步数据文件与数据库的其余部分。根据数据库是否位于archivelog模式中,受损文件是运行ORACLE所需的重要文件还只包含用户数据的非重要文件,恢复数据文件时可以有多种可用的选项。

noarchivelog模式中数据文件的恢复:不存在恢复所需的归档日志文件,在该模式下中无执行恢复操作,只能完成还原操作。如果没有通过应用归档日志文件来同步一个被还原的数据文件与数据库其余部分,数据库就不能打开。noarchivelog模式中唯一选项是还原整个数据库(包括所有数据文件及控制文件)。但是会丢失这次备份之后的所有工作。因为RMAN不会备份联机重做日志文件,所以在执行完整的还原操作后,数据库仍然丢失这些文件,还原之后的启动操作会失败,数据库将停止在加载模式中。在加载模式中,可以通过执行ALTER DATABASE CLEAR LOGFILE GROUP#命令重建所有日志文件组,从而打开数据库。如果通过与RMAN接口的DC来执行还原操作,这个过程就是完全自动的。

archivelog模式中非重要数据文件的恢复:ORACLE数据库中,组成SYSTEM表空间及当前活动的撤销表空间(由UNDO_TABLESPACE参数决定)的数据文件被视为重要文件。任何重要的数据文件受损都会导致实例立即终止。在通过还原与恢复修复受损文件之前,数据库无法被再次打开。对于组成用于用户数据的表空间的数据文件来说,文件受损通常不会导致实例的崩溃。ORACLE会将这些受损的数据文件脱机并使其内容不可被访问,但数据库的其他部分应当保持为打开状态。如果备份是使用RMAN生成的,则受损数据文件的还原和恢复操作就是完全自动的。RMAN先智能地使用完整备份和增量备份,然后再应用必要的归档日志,从而尽可能地以最有效的方式完成还原操作。如果RMAN链接了某个磁带库,则会通过自动加载磁带来抽取所需的文件。只有在最近一次备份之后生成的所有归档日志文件都可用的情况下,才可以成功地完成数据文件的还原和完全恢复操作。为了在恢复操作期间进行还原,归档日志文件要么必须位于磁盘上的归档日志目的地目录中,要么已被迁移至磁带。RMAN能够自动地从备份集中抽取归档日志文件并将其还原至磁盘。如果归档日志文件出现丢失或讹误,则恢复操作就会失败。但是由于归档日志目的地与RMAN备份集能够并且应当被复用,因此绝对不会出现这样的情况。如果出现了恢复操作失败的情况,唯一的选项是通过完全还原以及不完全恢复得到丢失的归档日志文件,这意味着会丢失最近一次备份之后所进行的所有工作。

恢复受损的重要数据文件: 重要数据文件的受损或丢失会导致数据库无法打开。重要数据文件与非重要数据文件的恢复生还原完全相同,但重要数据文件应当在加载模式中完成还原和恢复。重要数据文件受损并不意味着会丢失数据,而是意味着会损失时间。

廿一、管理ORACLE数据库中的全球化特性
ORACLE的默认字符集为7比特的ASCII或7比特的EBCDIC。Unicode标准是一种用于字符编码的国际标准,并且包含了任何计算机系统需要的所有字符。目前,ASCII代码(American Standard Code for Information Interchange,美国信息交换标准代码),EBCDIC(Extended Binary Coded Decimal Interchange Code,扩充的二进制编码的十进制交换码),ISO(International Standards Organization,国际标准化组织),ANSI(American National Standards Institute,美国国家标准化组织)。AL16UTF16:一种两字节的Unicode字符集,并且是ORACLE10g唯一支持的固定长度的Unicode字符集。可以通过查询V$NLS_VAILD_VALUES视图取得NLS的相关信息。

地区支持:选中某个地区可以默认设置许多NLS特性。选择地区还可以默认设置日期和周的编号,收支符号,日期格式,小数点分隔符与组分隔符及货币符号。

指定全球化级别(由低到高的优先级顺序):
数据库,实例,客户机环境,会话,语句。在服务器端,实例设置优先于数据库设置,但是在服务器上的所有相关设置都会被客户端重写。
在创建数据库阶段必须正确完成的两个设置:DB_BLOCK_SIZE,该参数被用来指定SYSTEM表空间的块大小。如果没有重建数据库,就无法修改这个参数;数据库字符集,被用于存储VARCHAR2,CLOB,CHAR和LONG数据类型的所有数据。如果改变了字符集,可能销毁这些数据类型中已有的所有数据。
从9i开始,能够作为National Character Set被支持的两种Unicode字符集是AL16UTF16和UTF8。AL16UTF16是一个定长的两字节字符集,UTF8是一个长度可变的字符集。在两种字符集之间进行选择时,需要考虑与NVARCHAR2和NCLOB列中预计存储数据类型相关的空间效率及性能。要使用支持多种语言的数据库,可以使用Unicode字符集作为实际的数据库字符集,此时所支持的选项为UTF8和AL32UTF8,这两种字符集都是长度可变的多字节字符集。数据库字符集的唯一限制是必须将US7ASCII或EBCDIC作为一个子集,原因在于数据库字符集被用于存储SQL或PL/SQL源代码,而这些源代码采用上述类型字符编写的。默认的数据库字符集与National Character Set为US7ASCII与AL16UTF16。如果数据库是DBCA创建的,则DBCA会提供一个默认的数据库字符集,这个字符集与运行DBCA的操作系统的字符集相同。

改变数据库字符集:从9i开发虽然存在改变数据库字符集的方法,但是无法保证这种方法有效。DBA应当全面负责检查数据库字符集的改变不会损坏数据。ORACLE提供了下列两种有助于决定字符集修改的工具:数据库字符集扫描程序(Database Character Set Scanner)和语言与字符集文件扫描程序(Language and Character Set File Scanner)。在UNIX下分别为csscan和lcsscan,在WINDOWS下为csscan.exe和lcsscan.exe。为了使数据库能够运行数据库字符集扫描程序,必须首先运行csminst.sql脚本。语言与字符集文件扫描程序能够尝试标识用于文本文件的语言和字符集。判断能够无损地改变数据库字符集后,可以通过执行ALTER DATABASE CHARACTER SET命令来完成字符集的修改。改变National Character Set的等价命令为ALTER DATABASE NATIONAL CHARACTER SET。这条命令的唯一限制是目标字符集必须是原始字符集的一个超集,但是并不能保证不存在讹误。保证不出现讹误应当是DBA的责任。
数据库内的全球化:通过查看NLS_DATABASE_PARAMETERS视图可以查看NLS设置。
实例级别的全球化:在RAC环境中,不同的实例可以具有不同的设置。全球化实例参数是静态参数,在变化之前必须重启实例。NLS_INSTANCE_PARMAETERS视图给出了当前有效的设置,除与不应用于实例的字符集和RDBMS版本有关的3条记录外,该视图与NLS_DATABASE_PARAMETERS视图具有相同的记录;
客户端环境设置:NLS_LANG环境变量的3个元素:语言,地区和字符集都是可选的。NLS_LANG是一个关键的变量,其完整规范包括语言,地区和字符集。服务器与客户端全球化设置之间的转换由ORACLE NET完成,所有必要转换都是由ORACLE NET的双任务公共层实现的。
会话级别的全球化设置:ALTER SESSION命令来建立自己的全球化首选项。DBMS_SESSION程序包可以代替ALTER SESSION命令。会话级别的规范优先于服务器端数据库与实例级别的设置,而且还会重写用户使用环境变量配置其会话的各种尝试。V$NLS_PARAMETERS视图中显示了当前作用于会话的全球化设置。除字符集外,NLS_SESSION_PARAMETERS视图中也显示了相同的记录。
语句级别的全球化设置:是最优控制级别的全球化设置。

语言排序与选择:ORACLE默认使用二进制排序。

Locale Builder工具的使用:UNIX环境下:$ORACLE_HOME/nls/lbuilder/lbuilder,WINDOWS环境下:%ORACLE_HOME%\nls\lbuilder\lbuilder.bat。

时区:ORACLE环境能够知道所使用的时区。为了使用时区,需要指定数据库所动作的时区及使用TIMESTAMP WITH TIME ZONE与TIMESTAMP WITH LOCAL TIME_ZONE数据类型。前一种类型在被存储时不会被格式化至数据库时区,不过将具有一个时区指示标志,这个标志说明其引用的时区。后一种数据类型在被存储时会被格式化至数据库时区,随后在检索时被转换至客户机时区。普通的DATE和TIMESTAMP数据类型在被存储时始终会被格式化至数据库时区,并且在选中时被原样显示。可以使用CREATE DATABASE命令在创建数据库时设置时区,也可以在之后通过ALTER DATABASE SET TIME_ZONE=命令进行调整。如果没有进行设置,就会在创建数据库时将数据库时区默认为主机操作系统的时区。客户机时区默认为客户机操作系统的时区。使用ORA_STDZ环境变量也可以设置客户机时区。在会话内,使用ALTER SESSION SET TIME_ZONE也可以设置时区。使用完整的名字,简写的名字与格林威治标准时间的小时和分钟的固定偏移量都可以指定时区。指定偏移量的方法无法根据夏令时或冬令时进行相应的调整。VTIMEZONENAMES视图中显示了被支持的所有时区。全球化设置会影响消息的语言,排序顺序,日期格式,历法,日期和月份的名字或数值格式等。字符集的选择至关重要,并且涉及两上字符集的选择。数据库字符集被用于VARCHAR2,CLOB,CHAR和LONG列;NationalCharacterSet则用于NVARCHAR2,NCLOB和NCHAR列。NLSDATELANGUAGE与NLSSORT由NLSLANGUAGE控制的两个参数,NLSDATEFORMAT与NLSNUMERICCHARACTERS参数由NLSTERRITORY控制。CharacterSetScanner工具会报告改变字符集所导致的问题。视图VTIMEZONE_NAMES视图中显示了被支持的所有时区。 全球化设置会影响消息的语言,排序顺序,日期格式,历法,日期和月份的名字或数值格式等。字符集的选择至关重要,并且涉及两上字符集的选择。数据库字符集被用于VARCHAR2,CLOB,CHAR和LONG列;National Character Set则用于NVARCHAR2,NCLOB和NCHAR列。 NLS_DATE_LANGUAGE与NLS_SORT由NLS_LANGUAGE控制的两个参数,NLS_DATE_FORMAT与NLS_NUMERIC_CHARACTERS参数由NLS_TERRITORY控制。 Character Set Scanner工具会报告改变字符集所导致的问题。视图VTIMEZONEN​AMES视图中显示了被支持的所有时区。全球化设置会影响消息的语言,排序顺序,日期格式,历法,日期和月份的名字或数值格式等。字符集的选择至关重要,并且涉及两上字符集的选择。数据库字符集被用于VARCHAR2,CLOB,CHAR和LONG列;NationalCharacterSet则用于NVARCHAR2,NCLOB和NCHAR列。NLSD​ATEL​ANGUAGE与NLSS​ORT由NLSL​ANGUAGE控制的两个参数,NLSD​ATEF​ORMAT与NLSN​UMERICC​HARACTERS参数由NLST​ERRITORY控制。CharacterSetScanner工具会报告改变字符集所导致的问题。视图VNLS_VAILD_VALUES视图可以说明能够被支持的语言。

廿二、配置侦听器的安全性

保护侦听器的安全:为了显示常见的管理命令,可以在操作系统提示符下运行lsnrctl help命令。
侦听器的操作系统身份验证:侦听器管理命令默认的安全性基于操作系统用户ID。这种安全形式总会被启用,并且优先于口令安全性。即使不知道侦听器口令,但知道启动侦听器的用户的操作系统口令,仍然能够管理侦听器。
侦听器的口令身份验证可以为授予受保护命令的执行权限提供另外一种身份验证方法。通过NET MANAGER GUI,EMDC或手动编辑listener.ora文件都可启用和设置侦听器的口令。通过手工编辑listener.ora文件不会加密侦听器口令。
change_password:更改侦听器的口令;
save_config:将相关配置(如口令)保存到listener.ora。

控制对数据库的访问:默认的侦听器配置对能够连接数据库服务器的用户没有进行任何限制,必须在数据库或应用程序内管理所有的安全性。通过配置Oracle Net配置文件能够控制对侦听器的访问,配置文件事实上是服务器上sqlnet.ora文件的一组指令。这些指令包括:TCP.VALIDNODE_CHECKING,TCP.EXCLUDED_NODES,TCP.INVITED_NODES。一旦TCP.VALIDNODE_CHECKING从默认值NO变成YES,就会启用其他两条指令。事实上,只能设置其中一条指令。如果任何节点列在TCP.INVITED_NODES中,则其他所有的节点都将以隐性的方式排除在外;如果在TCP.EXCLUDED_NODES中列出了某个节点,则其他所有的节点都将以隐性的方式加入。如果以上两条都进行了设置并且存在冲突,会优先启用TCP.INVITED_NODES;被加入或被排除的节点可以按名称或IP列出,但不允许使用通配符,且只能应用于TCP。Connection Manager可以提供更大的访问控制能力,包括主机与IP中通配符的使用。
外部过程:外部过程必须以C语言编写,与OCI库链接的用户进程软件则可以以C或C++语言编写。在执行其中的代码之前,动态链接库必须完成动态的链接。侦听器会启动一个被称为外部过程代理程序的进程,该代码程序只具有一个函数,该函数通过动态地链接与运行外部过程来响应数据库用户的调用。向ORACLE通知共享对象库的存在,必须要执行CREATE LIBRARY 命令。如:
CREATE LIBRARY util_lib as ‘file_name’;会创建逻辑指针util_lib,该指针会指向编程人员所交付的物理文件。

外部过程代理程序:是ORACLE_HOME/bin目录中的一个可执行文件。UNIX系统中,这个文件名为extproc;在WINDOWS中,这个文件名为extproc.exe。外部过程代理程序根据侦听器的要求启动。PL/SQL过程调用外部过程时,代理程序会将PL/SQL调用转为C调用,载入共享对象库,并且执行所请求的C语言函数。代理程序还能引发可能出现的任何异常,并且可以将异常或实参返回至PL/SQL环境。外部过程代理程序提供了
一些内置的安全性。在默认情况下,代理程序只从ORACLE_HOME/bin目录中载入共享对象库,这个目录应当受到严格的控制,否则恶意的用户就可以编写一个PL/SQL过程,而这个PL/SQL过程能够调用数据库服务器操作系统可用的任何标准共享库中的C过程。在实际应用中,比较好的作法是:在listener.ora文件中指定代理程序能够载入的共享库,从而进行一定的限制。

配置侦听器启动外部过程代理程序:代理程序根据需要启动,每个会话都有一个代理程序,并且这个代理程序在会话的生存期内保持活动状态。无论产生了多少个外部过程调用,每个会话都只会启动一次代理程序。配置外部过程服务时,可以选择键与SID名,甚至还可以指定要启动的进程。但是,必须使用IPC协议,且TNS别名必须为EXTPROC_CONNECTION_DATA。

侦听器默认启用操作系统身份验证,只有启动某个侦听器的操作系统用户才能停止这个侦听器。设置口令意味着只要知道口令则任何人都能够控制相应的侦听器。
在默认情况下,侦听器能够从任意节点链接用户与数据库,所有安全性必须由数据库服务器自身处理。编写一个节点列表说明被许可或丢弃的会话,从而能够在侦听器内建立访问控制。

ORACLE 技术学习笔记相关推荐

  1. oracle goldengate学习笔记,【学习笔记】Oracle goldengate monitor使用笔记

    天萃荷净 Oracle研究中心学习笔记:分享一篇关于Oracle数据库goldengate monitor的使用笔记. 本站文章除注明转载外,均为本站原创: 转载自love wife & lo ...

  2. hadoop大数据开发技术学习笔记第三天:(前序)MySQL数据库进阶

    hadoop大数据开发技术学习笔记第三天:(前序)MySQL数据库进阶 一.回顾知识 1.myschool数据库和数据表的创建 (1)创建数据库 (2)数据库模型图 (3)创建数据表grand (4) ...

  3. java mvc框架代码_JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码)

    原标题:JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码) JavaEE体系结构包括四层,从上到下分别是应用层.Web层.业务层.持久层.Struts和SpringMVC是Web层的 ...

  4. oracle buffer block,8 Oracle深度学习笔记——BUFFER CACHE深入一

    8.Oracle深度学习笔记--BUFFER CACHE深入一 最近项目一直和ORACLE死磕,感觉总是找不到出口,只能多看书少说话了. 先记录多少是多少吧! BUFFER CACHE在ORACLE的 ...

  5. 小五思科技术学习笔记之SSH

    下面介绍一下相关概念: SSH的概念: SSH的英文全称为Secure Shell,SSH使用TCP的22号端口,其目的是要在非安全的网络上提供安全的远程登陆和其他安全的网络服务, 为什么要使用SSH ...

  6. oracle数据库的model,Oracle 11g学习笔记–model子句

    Oracle 11g学习笔记–model子句 oracle 10g中新增的model子句可以用来进行行间计算.model子句允许像访问数组中元素那样访问记录中的某个列,这就提供了诸如电子表格计算之类的 ...

  7. ssm 转发请求_千呼万唤!阿里内部终于把这份SSM框架技术学习笔记分享出来了...

    SSM SSM(Spring+SpringMVC+MyBatis)框架集由Spring.MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容).常作为数据源较简单的web项 ...

  8. Oracle 10g学习笔记(一)

    前言 很不好意思的坦白本人是刚刚学习oracle的菜鸟,以下内容是节取的书中一些值得注意的事项,因为只涉及oracle最初级的知识,并没有太深的内容,希望各位oralce高手们能够帮忙指点指点. Or ...

  9. 【Oracle Hint】Oracle Hint学习笔记【一】

    一.Oracle Hint的一些基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer). 它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划. Oracl ...

最新文章

  1. ClickHouse系列教程七:centos下源码编译安装及报错解决
  2. 7步搞定Python数据可视化,业界大牛出品教程,Jupyter、Colab都有在线版
  3. JS 简单实现公告消息自动逐条切换
  4. ArcEngine的鼠标事件中按键判断~
  5. mysql 存储过程循环一张表的所有记录_MySQL数据库知识汇总
  6. boost::math::boost::math::interpolators::cardinal_cubic_b_spline用法的测试程序
  7. 计算php代码执行时间长短的类
  8. [原] jQuery EasyUI 1.2.6源码、Demo合集、离线API
  9. Directx11教程39 纹理映射(9)
  10. The Linux commands you need!
  11. 微信内置浏览器不支持 onclick 如何解决?(原因是因为内面中的内容或者标签大部分是动态生成的)...
  12. Python有限状态机FMS结合测试用例
  13. ios java模拟器 2017_Visual Studio 2017(Xamarin)未显示iPhone模拟器列表
  14. mysql切片库_Database数据库切片模式
  15. 最后冲刺—信息系统开发与管理
  16. Ubuntu 16.04下的美化配置过程
  17. 手机续航能力测试软件,五小时极限测试告诉你荣耀X10续航表现怎么样
  18. 反向代理和正向代理详解
  19. 【C语言航路】第一站:初识C语言(三)
  20. 如何防止恶意攻击短信验证码接口

热门文章

  1. 最长回文子串(C++)
  2. 自动登录武汉理工大学鉴湖宿舍校园网的方式-苹果/ipad端
  3. 01_Linux install lastest opencv
  4. 9.app后端选择什么服务器
  5. 【毕业设计】基于红外热释电的房间人数计数系统 - 单片机 物联网嵌入式
  6. 道教圣地青城山有一副名联:事在人为……
  7. 甲基乙烯基硼酸 cas7547-97-9/异环己酰亚胺 cas4538-37-8
  8. MFC属性页CPropertySheet的使用
  9. Heatmap Plot with ggplot2 【R】
  10. 十进制与二进制相互转换(包括带小数点.各类进制转换公式)