您好,欢迎来到易榕旅网。
搜索
您的当前位置:首页OCP认证考试指南-10g

OCP认证考试指南-10g

来源:易榕旅网
OCP认证考试指南-10g

OCP认证考试指南(1):Oracle的基本概念

先来了解下几个英文的简称,在以后经常会见到。

    

对象关系数据库管理系统(Object Relational Database Management System,简称ORDBMS) 关系数据库管理系统(Relational Database Management System,简称RDBMS) 数据库管理系统(Database Management System,简称DBMS) 结构化查询语言(Structured Query Language,简称SQL) 二进制大对象(Binary Large Objects,简称BLOB)

1、SQL:结构化查询语言

SQL由下列语言组成:

数据定义语言(Data Definition Language,简称DDL)。DDL用于创建和修改数据库对象。DDL语句包括CREATE、ALTER、DROP、RENAME以及 TRUNCATE语句。如果需要在数据库中添加一个新表,可以使用CREATE语句完成该任务;如果需要删除一个索引,那么可以使用DROP INDEX语句。

数据操作语言(Data Manipulation Language,简称DML)。DML用于修改数据库内表中的数据。DML语句包括INSERT、UPDATE、和DELETE语句以及用于控制数据库内事务的扩展部分(扩展部分包含COMMIT、ROLLBACK和SAVEPOINT语句)。

数据控制语句(Data Control Language,简称DCL)。DCL用于配置执行数据库任务和操纵数据库对象的安全性。DCL语句包括GRANT和REEVOKE语句。用户可以被授予执行某个任务的权限。

2、Oracle数据字典

Oracle中的数据字典是一组被称为基表的表。这些表包含与用户创建的数据库对象相关的最基本的信息。基表属于名为SYS的Oracle用户,该用户在创建数据库的同时被创建。基表永远不会被直接访问,其名称十分含糊,以便阻止用户进行查询与修改。为了更易于访问数据字典和获取数据库中对象的相关信息,数据库创建过程中会创建一系列视图,这些视图通常被称为数据字典视图。

Oracle具有下列3种数据字典视图:

USER_视图:这些视图允许用户获取其模式中对象的相关信息(也就是用户创建并拥有的对象)

ALL_视图:这些视图允许用户获取其拥有的或可被访问的对象的相关信息。

DBA_视图:数据库管理员(Database Administrator,简称DBA)使用的DBA_视图提供了数据库

中所有对象(也就是所有用户创建的所有对象)的完整信息。

3、数据库管理员的职责

在Oracle的领域中,DBA负责以下任务。

        

评估并决定服务器硬件的规模。 安装Oracle软件与补充资料。 计划与设计数据库结构。 创建数据库。

为了保护数据的安全,能够备份数据库和采用其它方法。 创建与维护数据库用户。 实现应用程序与数据库设计。 还原与恢复数据库。 监视与调整数据库性能。

OCP 认证考试指南(2):安装Oracle Database 10G

想在Linux系统把Oralce安装好,确实是个不小的挑战,最起码的,首先要对Linux系统有所了解,不说多的,简单的一些配置文件和常用命令总要知道,要不真不知道如何下手。今天按书本的启示,和网上别人写的文章还有Oralce官方的帮助感觉都对我帮助甚微啊。。。不过感觉最后还是在QQ 群和百度的帮助下,当然书本和那些文章都起到了作用,终于把Oracle安装好了。

所以在这里,我准备把安装步骤详细点写清,网上看了半天,都只会说,有代码的,象对Linux了解不深的根本看不明白,好象看他们写的东西都是高手看的一样,都高手了,还用得着天天百度嘛。。。

1、最优灵活体系结构(Optimal Flexible Architecture,简称OFA)

我所理解的OFA其实就是一种Oracle的一种规范。其意义就是用一种统一的给文件和文件夹的规则,和文件存放目录的规则做一个约定。这样,我们不管是安装多个版本的Oracle Database也好,因为目录规范,命名规范,这样软件不会冲突,方便管理,文件也方便查找,好处大大的有。

在Linux/Unix平台上,建议遵循的OFA的命名模式包含下列内容:

 

使用通用串常量和变量值的组合来命名所有装载点,这个组合的形式为/pm ,其中p 是一个串常量,m 是一个变量值。例如:/u01、/u02、/ora01、/ora02都是不错的选择。

在装载点之内,采用形式 /pm /h /u /product/v 命名安装Oracle软件的目录,其中/pm 是如前所说的装载点,h 是指示用途的标准目录名(如app、db、home),u 是目录拥有者的名称,product是一个字面值,v 指定目录中安装的Oracle产品的版本。例如:操作系统用户oracle拥有的Oracle 10G数据库的位置可以为/ora01/db/oracle/product/10.2.0,Oracle 8I数据库的位置则为/ora02/db/oracle/product/8.1.7。

 在目录结构之内可以创建一个admin目录,并且在目录内创建存储Oracle所使用的特定文件类型的其他子目录。目录完整路径名为/pm /h /admin/d /a ,其中admin是字面值,d 是数

据库的系统标识符(System Identifier,简称SID),a 是用于存储特定管理文件类型的子目录。

常见的有: 子目录名 adhoc arch adump 用途 存储数据库专用的SQL和PL/SQL脚本 存储已归档的重做日志文件 存储审计文件的目录(需要首先设置AUDIT_FILE_DEST)参数 存储后台进程跟踪文件与警告日志文件。使用BACKGROUND_DUMP_DEST参数进行设置 存储核心堆积文件。使用CORE_DUMP_DEST参数进行设置 存储用于创建数据库的脚本。在创建新的数据库时,DBCA将创建数据库的脚本设置在这个目录中 建议存储使用Export实用程序或Oracle Data Pump创建的数据库导出文件的目录 示例 /ora01/db/admin/ocp10g/adhoc /ora01/db/admin/ocp10g/arch /ora01/db/admin/ocp10g/adump bdump /ora01/db/admin/ocp10g/bdump cdump /ora01/db/admin/ocp10g/cdump create /ora01/db/admin/ocp10g/create exp /ora01/db/admin/ocp10g/exp /ora01/db/admin/ocp10g/logbook /ora01/db/admin/ocp10g/pfile /ora01/db/admin/ocp10g/udump logbook 存储数据库历史与状态日志文件 pfile udump

用于启动数据库的参数文件被放置在这个目录中 存储用户进程跟踪文件。使用USER_DUMP_DEST参数进行设置 Oracle数据文件的根是一个形式为/pm /q/d 的字典,其中/pm 是装载点,q是一个字面值,这个字面值包含Oracle数据库结构的字典(例如:oradta、oracle),d 则是数据库的名称。例如:/ora01/oradata/ocp10g和/u01/oracle/mydb都是正确的形式。

Oracle数据库文件的推荐命名的约定: 子目录名 控制文件 重做日志用途 用于存储与数据库、数据库文件及其状态相关的信息 在数据库数据发生变化时存储这些变化的推荐为redonn .log,其中nn 是一个数字(例如redo01.log) 命名约定 推荐为control.ctl或controlnn .ctl,其中nn 是一个数字(例如control01.ctl) 文件 记录 数据文件

推荐为tablespacenamenn .dbf,其中tablespacename 是Oracle数存储数据库数据 据库逻辑存储结构的名称,nn 是一个数据(例如system01.dbf、undo01.dbf) 2、使用Oracle Universal Installer 安装Oracle

现在要开始我们的重点了,就是Linux下Oracle Database的安装,我所应用的操作系统平台为Red Hat Enterprise Linux AS 5,如果不会的请参考本博“本地硬盘安装Red Hat Enterprise Linux AS 5”。

2.1、验证系统要求

这个不想多说和多做,有个自己感觉还不错的电脑就OK了,硬是要搞个256M的内存来安装个Oracle我也无语。

#grep MemTotal /proc/meminfo MemTotal: 961480 kB #grep SwapTotal /proc/meminfo SwapTotal: 2031608 kB

Oracle官方要求所需最小 RAM 为 512MB,而所需最小交换空间为 1GB。对于 RAM 小于或等于 2GB 的系统,交换空间应为 RAM 数量的两倍;对于 RAM 大于 2GB 的系统,交换空间应为 RAM 数量的一到两倍。

Oracle 10g 软件还需要 2.5GB 的可用磁盘空间,而数据库则另需 1.2GB 的可用磁盘空间。/tmp 目录至少需要 400MB 的可用空间。要检查系统上的可用磁盘空间,运行以下命令: #df -h

文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/VolGroup00-LogVol00

71G 5.2G 62G 8% / /dev/hdb1 99M 12M 82M 13% /boot tmpfs 471M 0 471M 0% /dev/shm

好了,我的硬件当然是OK拉。

2.2、创建用户帐户和用户组

#groupadd oinstall #groupadd dba

#useradd -m -g oinstall -G dba oracle #id oracle

uid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba)

设置帐户oracle的密码:

#passwd oracle

Changing password for user oracle. New UNIX password: Retype new UNIX password:

passwd: all authentication tokens updated successfully.

2.3、创建Oracle Database安装目录

#mkdir -p /ora01/db/oracle #mkdir -p /ora02/oradata

#chown -R oracle:oinstall /ora01/db/oracle /ora02/oradata #chmod -R 775 /ora01/db/oracle /ora02/oradata

2.4、配置Linux内核参数

Oracle Database 10G 需要以下所示的内核参数设置。其中给出的是最小值,因此如果您的系统使用的值较大,则不要更改它。 需要的参数最少值为:

kernel.shmall = 2097152 kernel.shmmax = 2147483648 kernel.shmmni = 4096

kernel.sem = 250 32000 100 128 fs.file-max = 65536

net.ipv4.ip_local_port_range = 1024 65000

首先,我们不用急着改,先查看一下吧。

#sysctl -a | grep shm kernel.shmmni = 4096 kernel.shmall = 268435456 kernel.shmmax = 4294967295 #sysctl -a | grep sem

kernel.sem = 250 32000 32 128 #sysctl -a | grep file-max fs.file-max = 92438

#sysctl -a | grep ip_local_port_range

net.ipv4.ip_local_port_range = 32768 61000

还行吧,都比较大呢。电脑好,没办法。

2.5、oracle用户的环境变量

要使用 Oracle 产品,应该或必须设置几个环境变量。对于数据库服务器,建议设置以下环境变量:

ORACLE_BASE ORACLE_HOME ORACLE_SID PATH

如果您在同一服务器上安装了多个 Oracle 产品或数据库,则 ORACLE_HOME、ORACLE_SID 和 PATH 变量可能会更改。ORACLE_BASE 变量不应更改,并可以在需要时在您的登录配置文件中设置它。

(哎,Linux会一点,又不是很厉害,环境变量这东西又是安装Oracle的一个重点,教程、书本,网文都没写清怎么搞,郁闷,当然拉,也是自己的水平问题,但写的那些根本就不合适初学者了嘛。搞的我研究半天,看我写的多清楚。)

以下操作,以oracle的身份登录Linux操作(请注意前面的#已经换成了$)。

$ vi .bash_profile

进入编辑模式中,按 I 键进行编辑操作,在适当部分加入环境变量。

# .bash_profile

# Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi

# User specific environment and startup programs

ORACLE_BASE=/ora01/db/oracle; export ORACLE_BASE ORACLE_SID=ocp; export ORACLE_SID

ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db export ORACLE_HOME PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin; export PATH

改完以后,按ESC键,退出编辑模式,再输入 :wq(保存退出)

2.6、安装Oracle

终于到达这一步了,真辛苦,首先要做的是把Oracle Database 10G放到Linux系统上面来,这不用

教了吧,很多种方法,可以用远程连接软件发送压缩包过来,可以用U盘、移动硬盘、双硬盘的方式直接Copy到 Linux电脑上(Fat32格式应该是直接能挂载,NTFS格式不能挂载的请参考本博“Linux下挂载NTFS格式分区”)

Oracle 的官方下载地址:http://www.oracle.com/technology ... database/index.html

好了,开始安装吧(让我们把安装文件放在/DB文件夹里吧),不过,这又有个小问题(当然不是大问题拉),因为Oracle Database虽说是跨平台的数据库,但真正由Oracle官方认证过的系统却没几个,所以当我们直接进入安装目录安装的时候就会发现: $ cd /DB $ ./runInstaller

正在启动 Oracle Universal Installer...

正在检查安装程序要求...

检查操作系统版本: 必须是redhat-3, SuSE-9, redhat-4,

UnitedLinux-1.0, asianux-1 or asianux-2

未通过 <<<<

正在退出 Oracle Universal Installer。您可以在

/home/oracle/oraInventory/logs/installActions2008-09-13_03-30-02AM.log 中找到本次会话的日志

这里我们有2种解决方式:

第一种最快的,最方便的,就是多打几个字母的方法,呵呵,加参数。

$ ./runInstaller -ignoreSysPrereqs

第二种方法,修改参数文件,让它认为我们的系统是认证系统。

$ cd /DB/install $ vi oraparam.ini

编辑方法前面说过了,我们找到

[Certified Versions]

Linux=redhat-3,SuSE-9,redhat-4,UnitedLinux-1.0,asianux-1,asianux-2

在中间把我们的系统版本加进去,就OK了。 ?[Copy to clipboard]View Code INI

[Certified Versions] Linux=redhat-3,redhat-5,

SuSE-9,redhat-4,UnitedLinux-1.0,asianux-1,asianux-2

哦,My God!又出问题,安装Oracle真是很艰难啊。

Oracle的安装界面好不容易是出来了,可连个字都没有(有的人说个是口口口,而我没发生这种情况,我的是空白),辛苦啊,改英文吧,用英文起码还能看到个字母在上面。(ITPUT论坛里也有牛人们把中文搞出来了,不过过程之复杂,我想也是一定的,再说学Oracle看点英文也不算什么,加油吧!) 于是,我们这样设置:

$ LANG=\"en_US\" $ ./runInstaller

终于OK,虽然说是洋文的安装界面,但辛苦这久,终于是出来东西了,让我们好好享受,这Next,Next带来的快感吧。这里我没办法做到 Linux下的截图,放上Windows的载图。(这图是中文的,正好对着Linux下的英文翻译)。

这里我们选高级安装。

默认的,企业版。

上面写的是Windows的路径,Linux下可不是这样,如果环境变量先前配置好的话,在这会自动写上的(/ora01/db/oracle /product/10.2.0/db)

安装条件检查,前面如果一直是按步骤来的话,一般是不会出问题的,如果有问题,检查下前面哪里没搞好吧。

在安装Oracle的时候就创建一个数据库吧。我们选第一个。

接受默认值 Create a starter database 和 General Purpose 。

环境变量的SID配置的话,这里就会自己写上去,选择下面的 Create database with sample schemas 。

Use Database Control for Database Manangement 。

选择File System ,我们特意建了一个/ora02/oradata存放数据库文件。

Do not enable Automated backups 。

设置密码,选下面的,可以给所有的设置一个统一的密码,方便管理。

摘要列表,这些都是要准备安装的,点击Install之后开始。

OK,到这里可以暂时放松一下了。(为什么是暂时。。。因为还有工作要做。)

2.7、执行脚本

安装全是自动化,真方便,到最后时刻会有个窗口弹出,大堆英文,不过意思很明白,叫你以root身份登录,并执行2个脚本 orainstRoot.sh和Root.sh(别人和我的版本不同吗?为什么到处都是说只执行一个orainstRoot.sh)。 $ su 口令:

#cd /ora01/db/oracle/oraInventory/ #./orainstRoot.sh

Changing permissions of /ora01/db/oracle/oraInventory to 770. Changing groupname of /ora01/db/oracle/oraInventory to oinstall. The execution of the script is complete #/ora01/db/oracle/oracle/product/10.2.0/db/ #./root.sh

Running Oracle10 root.sh script...

The following environment variables are set as: ORACLE_OWNER= oracle

ORACLE_HOME= /ora01/db/oracle/oracle/product/10.2.0/db

Enter the full pathname of the local bin directory: [/usr/local/bin]:

说明:

orainstRoot.sh 给oracle安装文件夹读写权限的 root.sh 设置环境变量

OK,到这一步,根本上Oracle 10G的安装过程基本结束了,最后一步时,记下摘要中显示的 URL,单击 Exit。

感觉我写的还是很明白吧?中间的要怎么安装起码都很明显表示出来了,应该算是不错的教程了。如果还有不明白的,这里给大家一个Oracle官方的中文文档(感觉我的其实还好些,呵呵)

OCP 认证考试指南(3):创建Oracle数据库

感觉这个还是分开写好了,数据库的创建工作,原以为好容易就是下一步下一步的问题,原来里面的内容还是很多的,包括体系结构要了解一些,DBCA建库是容易拉,不过要会手动建库那才叫酷嘛,拿个界面点下一步下一步谁不会啊,那还叫DBA啊?呵呵。

Oracle服务器由下列两个实体组成:实例(Instance)与数据库。实例由存储结构和进程组成,并且只短暂存在于RAM和CPU中。数据库由磁盘上的物理文件组成。

实例与数据库的关系是一对一的,一个实例连接一个数据库,但也有可能是多对一的,即不同计算机上的多个实例打开共享磁盘系统上的一个公用数据库。这种多对一关系被称为实际应用群集(Real Application Clusters,简写为RAC)。

下面我们根据这张图,来详细了解关于Oracle的体系结构:

1、实例:存储结构与进程

一个Oracle实例由一块被称为系统全局区(System Global Area,简写为SGA)的共享内存以及若干进程组成。SGA至少包含共享池、数据库高速缓存区(Database Buffer Cache)以及日志缓冲区这三种数据结构,此外还可能包含大池、Java池或流池。启动实例会确定上述某些SGA结构的大小,而其他一些SGA结构的大小可以动态变化。不过,创建数据库时并不会确定任何SGA结构的大小,我们可以随时停止和重新启动实例,每次都将得到一种完全不同的内存配置。

记住:如果在现场系统中频繁地改变内存配置,并且都属于需要关闭实例的变化类型,那以会不断出现停机,从而造成终端用户的不满。

要查看SGA的大小,我们可以通过如下语句:

# SQL> select * from v$sga; # # NAME VALUE #

-------------------- ---------- # Fixed Size 1218868 # Variable Size 79693516 # Database Buffers 180355072 # Redo Buffers 2973696

1.1、共享池(Shared Pool)

共享池是SGA中最关键的内存片段,特别是在性能和可伸缩性上。一个太小的共享池会扼杀性能,使系统停止,太大的共享池也会有同样的效果,将会消耗大量的CPU来管理这个共享池。不正确的使用共享池只会带来灾难。共享池主要又可以分为以下两个部分:

库缓存区(Library Cache),也叫SQL语句缓冲区。当一个用户提交一个SQL语句,Oracle会将这句SQL进行分析(Parse),这个过程类似于编译,会耗费相对较多的时间。在分析完这个SQL,Oracle会把他的分析结果给保存在Shared Pool的Library Cache中,当数据库第二次执行该SQL时,Oracle自动跳过这个分析过程,从而减少了系统运行的时间。这也是为什么第一次运行的SQL 比第二次运行的SQL要慢一点的原因。

对于保存在共享池中的SQL语句,可以从v$Sqltext、v$Sqlarea中查询到,对于编程者来说,要尽量提高语句的重用率,减少语句的分析时间。一个设计的差的应用程序可以毁掉整个数据库的Share Pool,提高SQL语句的重用率必须先养成良好的变成习惯,尽量使用Bind变量。

数据字典缓存区(Data Dictionary Cache),存储最近使用的对象定义,包括对表、索引、用户的描述以及其他元数据的定义。将上述这些定义存储在内存中的,就不必重复读取磁盘上的数据字典,从而能提高性能。

1.2、数据库高速缓存区(Database Buffer Cache)

Oracle执行SQL的工作区域。用户不必不断地更新磁盘上的数据,而是可以将数据复制至内存中的数据库高速缓存区中并在些进行更新。在理想情况下,所有被频繁的数据都位于数据库高速缓存区,从而最小化磁盘的I/O的需求。数据库的任何修改都在该缓冲里完成,并由DBWR进程将修改后的数据写入磁盘。由于操作系统寻址能力的限制,不通过特殊设置,在32位的系统上,块缓冲区高速缓存最大可以达到1.7G,在64位系统上,块缓冲区高速缓存最大可以达到10G。

1.3、日志缓冲区(Log Buffer)

日志文件的缓冲区,对数据库的任何修改都按顺序被记录在该缓冲,然后由LGWR进程将它写入磁盘。这些修改信息可能是DML语句,如(Insert,Update,Delete),或DDL语句,如(Create,Alter,Drop等)。

日志缓冲区的存在是因为内存到内存的操作比较内存到硬盘的速度快很多,所以重作日志缓冲区可以加快数据库的操作速度,但是考虑的数据库的一致性与可恢复性,数据在重做日志缓冲区中的滞留时间不会很长。所以重作日志缓冲区一般都很小,大于3M之后的重作日志缓冲区已经没有太大的实际意义。

1.4、大池(Large Pool)

大池是一个可选区域。如果创建了大池,那么各种进程都会自动使用大池;否则,各种进程就只能使用共享池中的内存。大池的得名不是因为大,而是因为它用来分配大块的内存,处理比共享池更大的

内存,在8.0开始引入。

下面对象使用大池:

  

MTS在SGA的Large Pool中分配UGA

语句的并行查询(Parallel Executeion of Statements)允许进程间消息缓冲区的分配,用来协调并行查询服务器

备份(Backup)用于RMAN磁盘I/O缓存

1.5、Java程序缓冲区(Java Pool)

Java 的程序区,Oracle 8I 以后,Oracle 在内核中加入了对Java的支持。该程序缓冲区就是为Java 程序保留的。如果不用Java程序没有必要改变该缓冲区的默认大小。

1.6、流池(Stream Pool)

在这里对它不多做说明。

除SGA存储结构外,实例至少还具有5个进程:系统监视(System Monitor,简写为SMON)进程;进程监视(Process Monitor,简写为PMON)进程;数据库写入器(Database Writer,简写为DBWn,最多可以使用10个这样的进程)进程;日志写入器(Log Writer,简写为LGWR)进程;检查点(CheckPoint,简写为CKPT)进程。不论实例中是否确实有会话登录,甚至是还未创建或打开数据库,上述进程总是在实例运行时存在,因此它们都被称为“后台”进程。

我们可以通过如下方法查看后台进程: ?[Copy to clipboard]View Code BASH

$ ps -ef | grep ora_

oracle 3461 1 0 18:31 ? 00:00:00 ora_pmon_ocp oracle 3467 1 0 18:31 ? 00:00:00 ora_dbw0_ocp oracle 3469 1 0 18:31 ? 00:00:00 ora_lgwr_ocp oracle 3471 1 0 18:31 ? 00:00:00 ora_ckpt_ocp oracle 3473 1 0 18:31 ? 00:00:01 ora_smon_ocp oracle 3955 3934 0 20:08 pts/1 00:00:00 grep ora_

1.7、SMON

主要功能是打开数据库,从而支持实例与数据库之间的连接。在正常运行期间,SMON能够完成一系列监视与整理操作。

1.8、PMON

管理用户会话,这个进程会在某个会话出现问题时执行适当的操作。用于清除失效的用户进程,释放

用户进程所用的资源。

1.9、DBWn

负责数据库的所有写入。没有任何会话能够不断地更新磁盘上的数据。会话只更新数据库高速缓存区中的数据,之后,所有的更新都通过DBWn汇集写入磁盘。

1.10、LGWR

应用于数据库高速缓存区中数据的所有变化写入磁盘上的联机重做日志文件。与 DBWn不同的是,这种磁盘写行为尽可能接近于实时完成。

1.11、CKPT

能够确保实例不时地与数据库同步。

此外,Oracle 10G还存在更多的后台进程,但这5个,我们必须记住。

2、数据库:物理结构

Oracle数据库由3种文件类型组成,外面还存在其它一些文件,但都是可选的。必须的文件是控制文件、联机重做日志文件以及数据文件。外部文件则包括初始化参数文件、口令文件与归档重做日志文件。

2.1、控制文件

每个数据库都具有一个控制文件(Controlfile),我们总是会创建这个控制文件的多个副本,从而在一个副本遭到破坏时能保证数据库的正常动作。控制文件虽然很小,通常只有几兆,但是至关重要,不可或缺。它包含指向数据库其余部分(联机重做日志与数据文件位置)的指针,此外还存储维护数据库完整性所需的信息(各种重要的序列号与时间标记)。如果使用Reover Manager(简写为RMAN),那么某些备份信息也会被存储在控制文件中。

控制文件的查询:

SQL> select NAME from v$controlfile; NAME

---------------------------------------- /u02/oradata/ocp/control01.ctl /u02/oradata/ocp/control02.ctl /u02/oradata/ocp/control03.ctl

记住,控制文件的添加、删除或者移动这些操作只能在停机时间进行。

2.2、联机重做日志文件

每个数据库都具有至少两个联机重做日志文件(Redo Log File),与控制文件一样,总会为每个联机重做日志文件创建多个副本。联机重做日志由若干组重做日志文件组成,其中每个文件都被称为一个成员(Member)。要运行Oracle,需要至少两组重做日志文件,每组重做日志文件至少具有一个成员。考虑性能,我们可以创建两组以上的重做日志文件;考虑安全,可以为每组重做日志文件创建多个成员。最少需要两组重做日志文件,这是为了使一组重做日志文件能接受当前的变化,而另外的一组重做日志文件能够进行归档。我们是不必在数据库的创建阶段担心这个问题的,稍后的任意时间里,我们移动、添加或删除联机重做日志文件都可以在不停机的情况下“联机”执行。

下面的图,应该表明了切换归档的意思:

日志组的查询:

SQL> select GROUP#,BYTES,STATUS from v$log; GROUP# BYTES STATUS

---------- ---------- ---------------- 1 52428800 INACTIVE 2 52428800 CURRENT 3 52428800 INACTIVE

日志文件的查询:

SQL> select GROUP#,STATUS,TYPE from v$logfile;

GROUP# STATUS TYPE ---------- ------- ------- 3 STALE ONLINE 2 ONLINE 1 STALE ONLINE

2.3、数据文件

数据库创建阶段,必须至少创建两个数据文件。实际使用的数据库具有更多的数据文件。在数据库生存期内的任意时刻,数据文件都可以被重命名、重新分配大小、移动、添加或删除。

数据文件的查询:

SQL> select NAME from v$datafile; NAME

---------------------------------------- /u02/oradata/ocp/system01.dbf /u02/oradata/ocp/undotbs01.dbf /u02/oradata/ocp/sysaux01.dbf /u02/oradata/ocp/users01.dbf /u02/oradata/ocp/example01.dbf

记住,对某些数据库文件的某些操作需要在停机时间进行。

3、逻辑结构:表空间与段

Oracle使用术语“段(Segment)”来描述包含数据的所有结构。最典型的段是包含数据记录的表,不过Oracle中还可能存在十几种段类型。我们这里关心表段、索引段以及撤销段。表段包含信息记录;索引段是一种用于快速访问任意特定记录的机制;撤销段是一种数据结构,这种数据结构被用于存储颠倒或回滚不希望持久的事务可能需要的信息。

借助于表空间,Oracle可以从物理的存储结构中抽取出逻辑的存储结构。从逻辑上看,表空间(TableSpace)是一个或多个段的集合;从物理上看,表空间是一个或多个数据文件的集合。按照关系分析,段与数据文件之间存在多对多关系:一个表可以被分割在多个数据文件中;一个数据文件可能包含多个表。通过在段与数据文件之间插入表空间实体,Oracle就解决了上述的多对多关系。

在数据库创建阶段,必须创建许多组成数据字典的段。这些段被存储在名为SYSTEM与SYSAUX的两个表空间内。

记住:在Oracle 10G版本中,创建数据库时必须创建SYSAUX表空间。如果没有进行指定,那么系统

会默认创建这个表空间。

4、数据字典

数据字典被存储为SYSTEM与SYSAUX表空间内的若干段。

组成数据字典的段在许多方面与其他段相似,它们都只具有表与索引。这些段的主要差异在于:数据字典表在数据库创建阶段生成,并且不允许被直接访问。

为了查询数据字典,Oracle提供了一组视图。这些视图存在3种形式,前缀分别为“DBA_”、“ALL_”、“USER_”。

  

前缀为“USER_”的视图:视图内填充的记录描述了查询该视图用户拥有的对象,因此不同的用户不可能看到相同的内容。

前缀为“ALL_”的视图:视图内填充的记录搭档了访问的对象。因些,ALL_TABLES视图包含的记录既可以描述你自己的表,也可以描述给定可视权限的、属于其他用户的表。

前缀为“DBA_”的视图:视图内填充的记录描述了数据中的所有对象。因此,无论表是由哪个用户创建的,对于数据库中的每个表来说,DBA_TABLES视图都包含用于该表的一个记录。

注意:显示数据库中所有表的视图是DBA_TABLES,而不是ALL_TABLES。

5、管理工具

Oracle Database 10G提供两种管理环境:Enterprise Manager Database Control 与 Enterprise Manager Grid Control。暂时我们用Database Control吧。

6、外部文件

数据库外部存在3种文件类型:参数文件、口令文件以及归档日志文件。

6.1、参数文件

参数文件定义了实例。参数文件中指定的实例参数主要控制各种存储结构的大小以及后台进程的行为,同时还会设置特定的限制。除了DB_NAME(数据库名称)之外,所有参数都存在默认值。这样,我们就能够完全依赖于默认参数值来启动一个实例。许多参数是动态的(参数值在实例运行和数据库打开时会发生变化),不过另外一些参数的值在实例启动时是固定的。除了DB_BLOCK_SIZE之外,通过关闭数据库、关闭实例、编辑参数文件以及再次启动数据库,所有的参数都能够在数据库创建之后被改变。

6.2、口令文件

Oracle提供两种不基于数据字典的身份验证方式,操作系统身份验证以及口令文件身份验证。

6.3、归档日志

归档日志是已填满的联机重做日志文件的副本。

暂时到这这吧,内容有些多,在创建数据库前先交代好数据库的一些文件等东西,之后就是用工具DBCA创建数据库和手动脚本创建数据库了。

OCP 认证考试指南(4):接合Oracle数据库 一、SQL的使用

  

CREATE、ALTER和DROP是主要的3种DDL语句,这些语句被用于在数据库中添加、修改或删除对象。

DCL语句包括GRANT和REVOKE命令,它们可以被用于为用户或角色授予或取消权限,可以被授予和取消的两种权限是系统权限和对象权限。取决于不同的对象类型,对象权限可能不同。 操纵或检索数据都需要使用DML语句。DML的主要元素是SELECT、INSERT、UPDATE和DELETE命令;DML还包括由 COMMIT、ROLLBACK和SAVEPOINT命令组成的事务控制语言元素。

1、SELECT语句

基本格式如下:

SELECT [DISTINCT] {* | column, [expression],...} FROM table; 例子:

SQL> select username || 'is' || account_status as \"User and Sstatus\" 2 from dba_users;

1.1、使用WHERE子句限定返回的行

在SELECT语句中,WHERE子句总是位于FROM子句之后:

SELECT [DISTINCT] {* | column, [expression],...} FROM table;

[WHERE condition1 [{AND | OR [NOT]} condition2...] ] 例子:

SQL> select count(*) from dba_tables where owner = 'SYSMAN';

记住:Oracle执行字符比较时会区分大小写。例如:

SQL> select count(*) from dba_tables where owner = 'sysman';

COUNT(*) ---------- 0

SQL> select count(*) from dba_tables where owner = 'SYSMAN';

COUNT(*) ---------- 337

1.2、避免结果集中出现重复

DISTINCT关键字可以应用于SELECT列表中的所有列或表达式。例如:

SQL> select distinct owner from dba_objects;

SQL> select distinct owner, object_type from dba_objects;

1.3、从多个表中检索数据

Oracle能够支持传统的连接语法,不过应当首选ANSI JOIN语法,下面两种,我们更推荐第二种方法。

SQL> select dba_data_files.tablespace_name, file_name 2 from dba_tablespaces, dba_data_files

3 where dba_tablespaces.tablespace_name=dba_data_files.tablespace_name;

SQL> select dba_data_files.tablespace_name, file_name 2 from dba_tablespaces join dba_data_files

3 on dba_tablespaces.tablespace_name = dba_data_files.tablespace_name;

1.4、数据的排序与分组

ORDER BY子句必须始终出现在SQL语句的最后;子句中的表达式不必位于SELECT列表、JOIN条件或WHERE子句中;除了大型对象数据类型之外,可以使用任何数据类型的列进行排列。

SQL> select dba_data_files.tablespace_name, file_name 2 from dba_tablespaces join dba_data_files

3 on dba_tablespaces.tablespace_name = dba_data_files.tablespace_name 4 order by dba_data_files.bytes desc;

2、使用INSERT、UPDATE与DELETE语句操纵数据

INSERT、UPDATE与DELETE语句只能应用于一个表中的数据。

2.1、INSERT语句 INSERT语句的基本语法:

INSERT INTO table [(column, [column...])] VALUES (value [,value...]);

2.2、UPDATE语句 UPDATE语句的基本语法:

UPDATE table

SET column = value [, column = value,...] [WHERE condition];

2.3、DELETE语句 DELETE语句的基本语法:

DELETE [FROM] table [WHERE condition];

2.4、事务控制

Oracle中的事务控制用于满足ACID测试。ACID代表“原子性(Atomicity)”、“一致性(Consistency)”、“隔离性(Isolation)”与“持久性(Durability)”。

   

原子性:整个事务必须作为一个单元提交,或者全部都不被提交。 一致性:事务必须遵循某些逻辑原则。

隔离性:完成事务的进程必须能够绝对控制其作用的所有元素。 持久性:意味着某个事务完成(或提交)之后,数据必须保持不变。

执行第一个DML语句时会启动一个事务。执行COMMIT或ROLLBACK命令可以结束一个事务,执行隐匿的提交或回滚操作也可以结束一个事务。

2.5、锁定

Oracle中存在两种锁定类型:共享锁与排他锁。

执行SELECT语句可以获得共享锁。通过锁定来确保没有人能够在你使用表数据时修改表结构(ALTER TABLE或DROP TABLE),但是,查询的记录并没进行锁定。多个用户可以同时获得相同数据上的共享锁。

执行DML语句时可以获得排他锁,并且正在被修改的所有记录都会获得排他锁,直至执行COMMIT或ROLLBACK语句。这样,两个用户就无法同时更新相同的数据。

3、数据定义语言

3种主要的DDL命令:

  

CREATE:执行CREATE语句可以在数据库中添加一个新对象。 ALTER:ALTER语句被用于改变数据中的表、索引和其他对象的特征。 DROP:DROP语句被用于从数据库中删除对象。

4、数据库、系统与会话管理命令

这些特殊命令包括ALTER DATABASE、ALTER SYSTEM、ALTER SESSION以及其它命令。

  

ALTER DATABASE:用于数据库进行全部或部分修改。 ALTER SYSTEM:用于改变运行实例的状态。 ALTER SESSION:允许用户修改其会话的属性。

二、理解PL/SQL

PL/SQL表示对SQL语言的过程语言扩展(Procedural Language Extensions to SQL)。

PL/SQL代码必须被编写为若干名为代码块(Block)的部分。因为PL/SQL是一种编译型语言,所以这些代码块在执行之前必须经过编译器的处理。

PL/SQL代码块具有两种形式:匿名块和命名块。

匿名(Anonymous)PL/SQL代码块是头部不具有名称的PL/SQL代码。通过工具(如SQL*Plus)发送至PL/SQL引擎,这些代码块随后会立即消失。

命名(Named)PL/SQL代码块的名称就可以多次“调用”命名块。Oracle中存在4种命名子程序:过程、函数、程序包和触发器。

所有PL/SQL代码块都具有相同的结构,包括一个用于声明变量和其它标识符的声明部分(以DECLARE关键字开始),一个用于可以运行代码的执行部分(以BEGIN关键字开始),一个用于捕获错误的异常部分(以EXCEPTION关键字开始)以及一个使用END关键字指示的代码块结束符。

有效的PL/SQL代码块只需要BEGIN和END 关键字,并且在这两个关键字之间至少存在一行有效的代码。

匿名PL/SQL代码块:

SQL> SET SERVEROUTPUT ON SQL> DECLARE

2 Val1 NUMBER := 5; 3 Val2 NUMBER := 2;

4 TheAnswer NUMBER; 5 BEGIN

6 TheAnswer := Val1 + Val2;

7 DBMS_OUTPUT.PUT_LINE('The answer is ' || TheAnswer); 8 EXCEPTION

9 WHEN ZERO_DIVIDE THEN

10 DBMS_OUTPUT.PUT_LINE('Cannot divide by zero!'); 11 END; 12 / The answer is 7

PL/SQL procedure successfully completed.

命名PL/SQL代码块:

SQL> SET SERVEROUTPUT ON

SQL> CREATE OR REPLACE PROCEDURE Add_Nums (Val1 IN NUMBER, Val2 IN NUMBER) 2 AS

3 TheAnswer NUMBER; 4 BEGIN

5 TheAnswer := Val1 + Val2;

6 DBMS_OUTPUT.PUT_LINE('The answer is ' || TheAnswer); 7 EXCEPTION

8 WHEN ZERO_DIVIDE THEN

9 DBMS_OUTPUT.PUT_LINE('Cannot divide by zero!'); 10 END; 11 /

Procedure created.

SQL> execute Add_Nums(10,2); The answer is 12

PL/SQL procedure successfully completed.

三、Oracle 10G中的查询工具

1、SQL*Plus

一直以来,我们在前面所说的环境都是SQL*Plus,这里就不多说了。

2、iSQL*Plus

在Linux环境下,我们要启动iSQL*Plus,需要以用户Oracle用户登录,要保证环境变量和Oralce的安装没有问题,都一直按我说的做,当然不会有问题拉,呵。下面来启动它:

$ isqlplusctl start

有没有启动成功,最好的方法是打开网页,输入 http://:/isqlplus server:运行Oracle的主机名或IP地址。

port:侦听iSQL*Plus的TCP端口号(通常为5560)。

成功打开网页,登录进去,一切OK。(口口口?乱码?哦,兄弟,正常!我的也有,所以从来不用,试着改浏览器的语言为English吧,我的改了都没办法,再加上一般情况下都不会用到这个iSQL*Plus工具,所以也不用太急!)

停止iSQL*Plus: $ isqlplusctl stop

OCP 认证考试指南(5):管理Oracle进程 1、启动SQL*Plus

启动用SQL*Plus都会启动了,这种方式合适正常的终端用户使用,作为管理员我们有另一种变化形式NOLOG开关。

$ sqlplus /nolog

2、启动iSQL*Plus

由于不是主要学这个,前一篇也提过这个了,看下前一篇的内容吧,OCP认证考试指南(四):接合Oracle数据库

3、启动Database Listenter 启动:

$ lsnrctl start 关闭: $ lsnrctl stop 查看:

$ lsnrctl status

4、启动Database Control端口监控程序 启动:

$ emctl start dbconsole 关闭:

$ emctl stop dbconsole 查看:

$ emctl status dbconsole

启动之后,我们一样可以打开网页查看,输入URL:http://:/em host.domain:数据库服务器的地址。

port:端口号。(书上和网上都看到说默认第一个数据库的端口5500,我的好象每次安装Oracle在创建库的时候默认的1158一样)

提示:以上URL地址都可以在$ORACLE_HOME/install/readme.txt文件中查到。

5、数据库的启动和关闭

严格说来,我们并不是启动或停止一个数据库:实例可以被启动和停止;数据库可以被加载和打开,随后还可以被卸载和关闭。

5.1、使用正确的权限进行连接

普通用户无法启动或关闭数据库,其原因在于普通用户依据数据字典进行身份验证,但是数据字典在数据库打开前无法被读取,从而出现普通用户注定无法启动(或创建)数据库的情况。所以想要连接数据库,我们要用某种外部身份验证:作为Oracle软件拥有组的一个成员,通过系统进行身份验证;通过给出存在于外部口令文件的某个用户名口令组合进行身份验证。

CONNECT命令可能具有下列语法: SQL> connect user/pass[@db]

这是标准的数据字典身份验证,Oracle会依据数据字典中的存储值来验证用户名/口令组合,此时数据库必须被打开。

SQL> connect user/pass[@db] as sysdba SQL> connect user/pass[@db] as sysoper

Oracle外部口令文件验证用户名/口令组合。

SQL> connect / as sysdba SQL> connect / as sysoper

操作系统身份验证。

5.2、SYSOPER与SYSDBA

SYSOPER能够执行如下所示的命令: STARTUP SHUTDOWN

ALTER DATABASE [MOUNT | OPEN | CLOSE| DISMOUNT] ALTER [DATABASE | TABLESPACE] [BEGIN | END] BACKUP RECOVER

SYSDBA权限包括上述的所有命令,此外还能创建数据库、执行不完全恢复以及创建其它SYSOPER和SYSDBA用户。

SYSDBA与SYSOPER不是用户,而是能够被授予用户的权限。默认情况下,只有用户SYS才具有这些权限。

5.3、startup 命令

数据库的启动进程是分阶段的:首先,在内存中构建实例;接着,通过加载数据库来支持与数据库的连接;最后,打开数据库以供使用。根据这个,我们来看数据库的4种状态:

 

SHUTDOWN

数据库处于SHUTDOWN模式时,与数据库相关的所有文件都被关闭,同时实例并不存在。 NOMOUNT

在NOMOUNT模式中,实例被构建在内存中(SGA已被创建,根据参数文件的指定启动某些后台进程),但是没有连接数据库,这种情况在数据库不存在时确实可能出现。

 

MOUNT

在MOUNT模式中,实例定位并读取数据库控制文件。 OPEN

OPEN模式中,所有数据库文件都被定位和打开,并且终端用户能够使用数据库。

提示:如果控制文件被损坏或者丢失了某个多元化副本,那么就无法加载数据库,但是停止NOMOUNT模式可以修复损坏;如果任何数据文件或重做日志文件存在问题,那么在数据库过渡至OPEN模式之前,可以在MOUNT模式中修复这些文件。

在这里会有一些有关于Oracle定位参数文件的问题。请参考“Oracle初始化参数文件”。

OCP 认证考试指南(6):管理Oracle存储结构 一、基本的Oracle存储结构:表空间与数据文件

Oracle数据库中具有两种类型的存储:物理存储和逻辑存储。

上面的Oracle存储结构模型中,可以看出下列要素:

       

每个数据库(Database)都必须由一个或多个表空间(Tablespace)组成。每个表空间都必须属于并且只属于一个数据库。

每个表空间都必须由一个或多个数据文件(Datafile)组成。每个数据文件都必须属于并且只属于一个表空间。

每个数据文件都必须由一个或多个操作系统块(Operation System Block)组成。每个操作系统块都必须属于并且只属于一个数据文件。

每个表空间都可以包含一个或多个段(Segment)。每个段都必须存在并且只能存在于一个表空间内。

每个段都必须由一个或多个区间(Extent)组成。每个区间都必须属于并且只属于一个段。 每个区间都必须由一个或多个Oracle数据块(Oracle Block)组成。每个Oracle数据块都必须属于并且只属于一个区间。

每个区间都必须被定位并且只能定位在一个数据文件内。数据文件中的空间可以被分配为一个或多个区间。

每个Oracle数据块都必须由一个或多个操作系统块组成。每个操作系统块都可以是并且只能是一个Oracle数据块的部分。

1、物理存储结构

物理结构是操作系统操作Oracle数据库时能够看见的结构。

1.1、Oracle数据文件

数据文件由下列3部分组成:头部、区间(已分配的空间)以及空闲空间(未分配的空间)。

oracle16

数据文件的头部(Header)将其标识为数据库的一部分,并且存储了该数据文件的细节,细节包括数据文件所属的表空间以及最后执行的检查点。这样,Oracle就能够在启动时检查所有相关文件是否同步。数据文件的剩余部分由区间和空闲空间组成,通过创建、删除和更改Oracle的段(Segment)逻辑存储组件就可以对这些剩余部分进行管理。

每个Oracle数据文件都只属于一个表空间。

1.2、操作系统块

操作系统块(Operating System Block)是文件系统所使用的最小分配单元。

2、逻辑存储结构

2.1、表空间

在数据库中,表空间是最大的存储结构。在Oracle 10G版本中,数据库至少具有下列3个表空间:SYSTEM、SYSAUX以及一个撤销表空间。

在Oracle中创建一个用户时,需要指定默认的表空间,这个默认的表空间能够存储用于该用户创建的所有段的区间。尽管最好使用为数据库定义的全局临时表空间,但还是可以创建一个存储临时段的临时表空间。

所有用户共享DBA所设置的撤销表空间。查看用户的默认表空间和临时表空间,我们可以执行:

SQL> select username, default_tablespace, temporary_tablespace from dba_users;

系统表空间

系统表空间(system tablespace)是每个Oracle数据库都必须具备的。其功能是在系统表空间中存放诸如表空间名称、表空间所含数据文件等数据库管理所需的信息。系统表空间的名称是不可更改的。系统表空间必须在任何时候都可以用,也是数据库运行的必要条件。因此,系统表空间是不能脱机的。

系统表空间包括数据字典、存储过程、触发器和系统回滚段。为避免系统表空间产生存储碎片以及争用系统资源的问题,应创建一个独立的表空间用来单独存储用户数据。

 SYSAUX表空间

SYSAUX表空间是随着数据库的创建而创建的,它充当SYSTEM的辅助表空间,主要存储除数据字典以外的其他对象。SYSAUX也是许多Oracle 数据库的默认表空间,它减少了由数据库和DBA管理的表空间数量,降低了SYSTEM表空间的负荷。

 临时表空间

相对于其他表空间而言,临时表空间(temp tablespace)主要用于存储Oracle数据库运行期

间所产生的临时数据。数据库可以建立多个临时表空间。当数据库关闭后,临时表空间中所有数据将全部被清除。除临时表空间外,其他表空间都属于永久性表空间。

撤销表空间

用于保存Oracle数据库撤销信息,即保存用户回滚段的表空间称之为回滚表空间(或简称为RBS撤销表空间(undo tablespace))。在Oracle8i中是rollback tablespace,从Oracle9i开始改为undo tablespace。在Oracle 10g中初始创建的只有6个表空间sysaux、system、temp、undotbs1、example和users。其中temp是临时表空间,undotbs1是undo撤销表空间。

2.2、段

表空间内的空间被分配给若干段。段(Segment)是数据库中要求存储的对象,如一个表或一个索引。因为并不存储数据,所以视图(View)不是段。Oracle允许创建多种不同类型的段。对DBA_SEGMENTS视图的查询:

SQL> select distinct segment_type from dba_segments;

2.3、区间

区间(Extent)也称为数据区,是一组连续的数据块。当一个表、回滚段或临时段创建或需要附加空间时,系统总是为之分配一个新的数据区。一个数据区不能跨越多个文件,因为它包含连续的数据块。使用区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位。在Oracle数据库中,分配空间就是以数据区为单位的。一个Oracle对象包含至少一个数据区。设置一个表或索引的存储参数包含设置它的数据区大小。

区间是为某个段分配的若干邻近数据块的集合。可以在表空间内本地管理区间(推荐),也可以对区间进行字典管理(向后美容性)。

2.4、数据库块

Oracle数据块(Data Block)是一组连续的操作系统块。分配数据库块大小是在Oracle数据库创建时设置的,数据块是Oracle读写的基本单位。数据块的大小一般是操作系统块大小的整数倍,这样可以避免不必要的系统I/O操作。

二、创建与管理表空间

1、CREATE TABLESPACE命令

CREATE TABLESPACE命令与CREATE TEMPORARY TABLESPACE命令都可以用SQL*Plus或iSQL*Plus创建表空间。(OEM暂不用,因为图形化界面使用简单,学习中不考虑)

CREATE TABLESPACE命令的完整语法有些复杂:

CREATE [BIGFILE | SMALLFILE] [TEMPORARY] TABLESPACE tablespace name

DATAFILE datafile spec | TEMPFILE tempfile spec [MINIMUM EXTENT minimum extent 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]

创建一个表空间:

SQL> create tablespace demo nologging datafile '/ora02/oradata/ocp/demo01.dbf' size 10M;

Tablespace created.

创建临时表空间:

SQL> create temporary tablespace tempDemo tempfile '/ora02/oradata/ocp/temp01.ora' size 10M autoextend off;

Tablespace created.

2、修改表空间

2.1、使一个表空间脱机 语法:

ALTER TABLESPACE tablespace name OFFLINE; 例:

SQL> alter tablespace demo offline; Tablespace altered.

2.2、使一个表空间联机 语法:

ALTER TABLESPACE tablespace name ONLINE; 例:

SQL> alter tablespace demo online; Tablespace altered.

2.3、使一个表空间只读 语法:

ALTER TABLESPACE tablespace name READ ONLY; 例:

SQL> alter tablespace demo read only; Tablespace altered.

2.4、使一个表空间可读写 语法:

ALTER TABLESPACE tablespace name READ WRITE; 例:

SQL> alter tablespace demo read write; Tablespace altered.

2.5、添加临时表空间的数据文件 语法:

ALTER TABLESPACE temp tablespace name ADD TEMPFILE path and file name SIZE size; 例:

SQL> alter tablespace tempDemo add tempfile 2 '/ora02/oradata/ocp/tempDemo.dbf' size 10M;

Tablespace altered.

2.6、调整临时表空间的数据文件,例如大小 语法:

ALTER DATABASE TEMPFILE ADD TEMPFILE path and file name RESIZE size; 例:

SQL> alter database tempfile '/ora02/oradata/ocp/temp01.ora' resize 5M;

Database altered.

2.6、将临时表空间脱机 语法:

ALTER DATABASE TEMPFILE path and file name OFFLINE; 例:

SQL> alter database tempfile '/ora02/oradata/ocp/temp01.ora' offline; Database altered.

2.7、将临时表空间联机 语法:

ALTER DATABASE TEMPFILE path and file name ONLINE; 例:

SQL> alter database tempfile '/ora02/oradata/ocp/temp01.ora' online;

Database altered.

2.8、表空间重命名 语法:

ALTER TABLESPACE old tablespace name RENAME TO new tablespace name 例:

SQL> alter tablespace demo rename to testdemo;

Tablespace altered.

3、删除表空间

3.1、删除表空间,但不删除其文件 语法:

DROP TABLESPACE tablespace name; 例:

SQL> drop tablespace demo;

Tablespace dropped.

3.2、删除表空间及其包含的内容 语法:

DROP TABLESPACE tablespace name INCLUDING CONTENTS; 例:

SQL> drop tablespace demo including contents;

Tablespace dropped.

3.3、删除表空间及其包含的内容、数据文件以及相关约束一同删除 语法:

DROP TABLESPACE tablespace name INCLUDING CONTENTS CASCADE CONSTRAINT; 例:

SQL> drop tablespace demo including contents cascade constraint;

Tablespace dropped.

OCP 认证考试指南(7):管理数据库用户

1、 用户与模式

在Oracle中,拥有对象的用户与只访问其他用户拥有对象的用户之间的差异是一个非常重要的知识点。

具有创建对象权限并创建了对象的用户称为拥有某个模式。模式(Schema)是某个用户拥有的所有对象的集合。模式具有与用户相同的名称。

例如:如果某个数据库用户John创建了一个名为Customers的表,那么此时John也创建了自己的模式,并且成为John模式的拥有者.希望查询John模式中的新表的任何人都可以在表名前加上模式名并查询数据JOHN.CUSTOMERS(假定John为他们授予了相应的权限)。

2、创建用户

除了SYS和SYSTEM用户之外,Oracle Database 10G数据库通常还具有许多用户,这些用户在数据库创建阶段被定义。大多数用户的账户都被锁定,并且需要通过DBA或运行DBCA来进行人工解锁。

Oracle中创建一个用户的命令为CREATE USER。下面我们看看语法和各种参数:

CREATE USER username

IDENTIFIED [BY password | 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]...]

CREATE USER命令的各种参数 username

要创建的用户的名称。创建用户必须指定用户名,并且是唯一的。最长30个字符,并且应当遵循Oracle命名约定(必须以一个字母开头,可以包含数字、字母、符号#、_或$)

IDENTIFIED

指定验证用户真实性的方法,有下列3种:

—BY password。其中,password 表示DBA指定的一个口令。

—EXTERNALLY。使用这种方法时,运行数据库的计算机的操作系统会对用户名进行身份验证。

—GLOBALLY AS extame。全用这种方法时,用户名和口令会被传递至extname 服务进行登录验证。这种身份验证类型需要外部身份验证机制。

DEFAULT TABLESPACE

如果在创建对象时没有指定表空间,那么就使用这个默认的表空间名来存储用户所创建的段。如果在创建用户时没有指定DEFAULT TABLESPACE参数,那么在数据库层次上配置的表空间就会成为要使用的数据库默认表空间。如果没有配置数据库默认表空间,那么这个参数默认为 SYSTEM。强烈建议:始终为用户指定默认表空间,如果预期用户会创建段,那么最好在这个表空间上指定一个定额

TEMPORARY TABLESPACE

用于存储临时段(例如排序段)的表空间的名称。如果在创建用户时没有指定TEMPORARY TABLESPACE参数,那么在数据库层次上配置的表空间就会成为要使用的数据库临时表空间。如果没有配置数据库临时表空间,那么这个参数默认为 SYSTEM。强烈建议:为用户指定临时表空间。

ACCOUNT LOCK|UNLOCK

允许在创建用户时显式地锁定或解锁用户帐户。默认为UNLOCK。

PROFILE

指定将要指派给用户的配置文件(profile)。配置文件会确定口令管理,并且可以选择限制应用于用户的资源。如果没有指定这个参数或没有使用关键字DEFAULT,那么就会为用户指派默认的配置文件。

PASSWORD EXPIRE

允许在创建用户时自动终止用户的口令,从而强制用户在第一次建立成功的实例连接时更改口令。

QUOTA

允许为数据库内表空间上的用户配置一个定额。指定为字节、千字节(KB)或兆字节(MB)形式。如果预期用户会创建段,那么应当在默认表空间上指定一个定额。对于常规用户来说,不能为其在表空间上指定UNLIMITED定额

下面我们先创建一个用户做例子(学有所用啊,这里所需要的东西,可以让我把前面所学的都复习一通,全部SQL打过来,速度之快,可见我的学习成果还是很不错的):

$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Sep 23 03:32:39 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

SQL> connect / as sysdba Connected to an idle instance. SQL> startup nomount ORACLE instance started.

Total System Global Area 264241152 bytes Fixed Size 1218868 bytes Variable Size 67110604 bytes Database Buffers 192937984 bytes Redo Buffers 2973696 bytes SQL> alter database mount;

Database altered.

SQL> alter database open;

Database altered.

SQL> create tablespace mydemo

2 datafile '/ora02/oradata/ocp/mydemo.dbf' size 10M;

Tablespace created.

SQL> create temporary tablespace mydemotemp

2 tempfile '/ora02/oradata/ocp/mydemotemp.ora' size 5M;

Tablespace created.

SQL> create user dandan identified by dandan1982

2 default tablespace mydemo 3 temporary tablespace mydemotemp 4 profile default;

User created.

3、修改用户属性

使用ALTER USER命令可以完成任务,语法如下:

ALTER USER username

IDENTIFIED [BY password | 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]...]

可以看到:命令几乎完全由CREATE USER命令变化而来,可用的选项全部相同。ALTER USER命令最有用的一种特征是数据库用户也可以执行命令修改口令:

SQL> alter user dandan identified by dandan;

User altered.

除了用户名之外,用户的所有属性都可以通过使用ALTER USER命令被修改。

4、删除用户

删除用户都能猜到是用DROP USER命令了,不过因为用户可能具有某个模式,所以这命令语法不像DROP USER username 一样简单。让我们来看命令语法:

DROP USER username [CASCADE]

因为用户与模式链接在一起,所以删除用户也会删除相应的模式。如果没有在DROP USER命令中指定CASEADE选项,那么Oracle并不允许同时删除用户和模式。

要删除某个模式用户,就必须指定DROP USER命令的CASECADE选项。不过,最好的方法是首先删除这个用对象,然后再删除该用户。因为如果删除不当,会导致严重的后果。我们可以验证其他用户并不依赖于这些对象后再删除。

为了查找待删除用户拥有的对象,可以查询DBA_OBJECTS视图。

SQL> select object_name, object_type 2 from dba_objects 3 where owner = 'dandan';

no rows selected

这里没有返回任何查询结果,那么可以安全删除用户:

SQL> drop user dandan;

User dropped.

OCP 认证考试指南(8):管理数据库对象

1、用户、模式以及模式对象

1.1、命名模式对象

模式(Schema)对象是指用户拥有的对象。

所有的模式对象名称必须遵循下列特定原则:

    

除了数据库链接名最多可以为128个字符之外,模式对象名最多为30个字符。 保留字不能用作对象名。

所有名称必须以从A到Z的一个字母打头。

名称只能包含字母、数字、下划线(_)、美元符号($)或hash符号(#)。 小写字母会被转换为大写字母。

如果在双引号中封装名称,那么就不需要遵循上述所有规则(除名称长度外),但随后获取这种对象时,必须始终使用双引号来指定对象,列名也应用相同约束。

如果没有将名称封装在双引号内,会自动将小写字母转换为大写字母。记住:对象名总是区分大小写。

SQL> create table lower ( lid int );

Table created.

SQL> create table \"lower\" ( lid int );

Table created.

SQL> select table_name from dba_tables

2 where lower(table_name) = 'lower';

TABLE_NAME

------------------------------ LOWER lower

可以看到,两个表完全不同。

1.2、对象命名空间

对象的唯一标识符是前缀为模式名的对象名。命名空间(namespace)定义了一组对象类型,这组对象类型内的所有名称都必须通过模式与名称被唯一标识。不同命名空间内的对象能共享相同的名称。

下列对象类型能够共享相同的命名空间:

        

表 视图 序列 私有的同义词 独立的过程 独立的存储函数 程序包 物化视图 自定义类型

因此,我们无法创建一个与某个表具有相同名称的视图,至少在二者存在于相同模式内的情况下是不可能的。

下列对象类型分别具各自的命名空间:

     

索引 约束 群集 数据库触发器 私有的数据库链接 维

2、数据类型

用于文字数字式数据的数据类型

数据类型 说明 VARCHAR2 长度为1字节到4K的字符数据。数据被存储在数据库字符集内 NVARCHAR2 CHAR 与VARCHAR2一样,不过数据被存储在别国语言字符集内,字符集是经过许可的Unicode字符集 数据库字符集内固定长度的数据。这种数据的长度不为列的长度,那么就需要填充空格 长度为1字节到2K可变的二进制数据。与CHAR和VARCHAR数据类型不一样,Oracle NetRAW 无法通过选择或其他插入方式将RAW类型数据从数据库的字符集转换为用户进程的字符集

用于数值数据的数据类型(全部具有可变长度) 数据类型 NUMBER FLOAT INTGER

为了与ISO/ANSI一致,可以指定VARCHAR数据类型,但这种数据类型的任何列都被自动转换为VARCHAR2类型。

日期和时间数据的数据类型(全部具有固定长度) 数据类型 DATE 说明 长度可以为0(列为空),也可以为7个字节。所有DATE数据包括世纪、年、月、日、小时、分钟和秒 长度可以为0(列为空),也可以到11个字节(取决于指定精度)。与DATE类型相似,不过用于秒的精度最大可以达到小数点后9位(默认6位) 与TIMESTAMP一样,不过数据必须用所涉及的时区记录进行存储。长度最大13字节。即使两个时间用于不同时区,这类型也会通过数据规格化为UTC来确定两个时间的差异 与TIMESTAMP一样,不过数据存储时会被规格化为数据库时区形式。检索时,数据会被规格化为用户进程选中的时区形式 说明 可以指定精度和刻度的数值数据。精度范围1~38,刻度范围-84~127 这是一种ANSI数据类型,用于精度为126位二进制数的浮点数 刻度相当于0的NUMBER类型 TIMESTAMP TIMESTAMP WITH TIMEZONE TIMESTAMP WITH LOCAL TIMEZONE INTERVAL YEAR TO 用以年和月为单位记录两个DATE类型数据或两个TIMESTAMP类型数据之间的时MONTH INTERVAL DAY TO SECOND 间长度 用于以日和秒为单位记录两个DATE类型数据或两个TIMESTAMP类型数据之间的时间长度

大对象数据类型 数据类型 CLOB NCLOB BFILE LONG LONG RAW

3、创建表

SQL> create table emp ( 2 empno number(6)

3 constraint emp_empno_pk primary key 4 using index

5 (create index emp_empno_pk on emp(empno) tablespace mydemo), 6 firstname varchar2(20), 7 lastname varchar2(25)

8 constraint emp_last_name_nn not null, 9 hire_date date default sysdate, 10 salary number(8, 2), 11 managerid number(6)

12 constraint emp_managerid_fk references emp(empno), 13 photo blob, 14 resume clob, 15 email varchar2(25),

16 constraint emp_salary_min check (salary >= 0), 17 constraint emp_email_uk unique (email)) 18 lob (photo, resume) store as 19 (tablespace mydemo chunk 4096);

Table created.

此例复杂度一般,用这个例子说明一下创建表:

说明 存储在数据字符集中的字符数据,大小几乎不受限制(数据块大小与4G的乘积) 与CLOB一样,不过数据被存储在别国语言字符集内,字符集是经过许可的Unicode字符集 指向数据库服务器的操作系统中存储的某个文件的定位器。文件大小被限制在4G内 数据库字符集内的字符数据,最大长度2G。CLOB提供了LONG类型的所有功能(以及更多功能)。不推荐用该类型了。 会被转为BLOB类型,也不推荐用了。 2、3、4、5:定义数值列EMPNO,并被用作主键,没有设置默认主键索引,而是使用USING INDEX指定一条完整索引创建命令。

7、8:创建一个NOT NULL约束。 9:日期类型列并有默认值。

10:数值列,精度达到小数点后2位。 11、12:创建一个外键约束列。 13、14:创建两个大对象列。

16、17:在前面定义的两个列上创建约束。UNIQUE约束会使用默认设置来影响索引的创建。 18、19:为上述大对象指定一些存储选项。

4、创建约束

Oracle支持下列约束:

   

UNIQUE:对于UNIQUE列来说不可能存在具有相同值的两条记录。不过,这列允许存在NULL值,事实上多条记录都可以具有NULL值。 NOTNULL:非空,列必须有一个值。

PRIMARY KEY:主键是定位记录的手段,值必须同时满足UNIQUE和NOT NULL约束。 CHECK:实施简单原则,例如值的范围。NOT NULL约束内部实现实际是预配置的CHECK约束。

5、创建索引

索引具有双重目的:增强检索记录的性能,实施约束。

使用CREATE INDEX命令创建索引。

SQL> create table test ( tid number(6), tname varchar(20));

Table created.

SQL> create index name_id_pk on test(tid);

Index created.

SQL> select index_name from dba_indexes

2 where table_name='TEST' and owner='SYS';

INDEX_NAME

------------------------------ NAME_ID_PK

6、创建视图

视图(VIEW)是向用户显示数据的一种手段。视图实际上是一个查询,也就是存储在数据字典内的一条SELECT语句。是否对一个视图执行DML语句,取决于视图的查询复杂程度。

SQL> create table bb (

2 bid number(6) primary key, 3 bname varchar(10));

Table created.

SQL> insert into bb values (1, 'bb1'); SQL> insert into bb values (2, 'bb2'); SQL> insert into bb values (3, 'bb3'); SQL> insert into bb values (4, 'bb1'); SQL> insert into bb values (5, 'bb1'); SQL> insert into bb values (6, 'bb1');

SQL> create table aa ( 2 aid number(6)

3 constraint aa_aid_pk primary key 4 using index (

5 create index aa_aid_pk on aa(aid) tablespace mydemo), 6 aname varchar(20), 7 bid number(6)

8 constraint bb_bid_fk references bb(bid));

Table created.

SQL> insert into aa values (1, 'aa1', 1); SQL> insert into aa values (2, 'aa2', 1); SQL> insert into aa values (3, 'aa1', 1); SQL> insert into aa values (4, 'aa2', 4); SQL> insert into aa values (5, 'aa1', 5); SQL> insert into aa values (6, 'aa2', 6);

SQL> create view a as

2 select aid, aname from aa;

View created.

SQL> select * from a;

AID ANAME

---------- --------------------

1 aa1 2 aa2 3 aa1 4 aa2 5 aa1 6 aa2

6 rows selected.

SQL> delete from a where aid = 2;

1 row deleted.

SQL> create view ab as

2 select sum(aid) aid, bname from aa 3 join bb on aa.bid = bb.bid 4 group by bname;

View created.

SQL> select * from ab;

AID BNAME ---------- ---------- 19 bb1

SQL> update ab set aid = 10; update ab set aid = 10 * ERROR at line 1:

ORA-01732: data manipulation operation not legal on this view

上面就可以看出,简单VIEW做DML操作是没有问题的,太复杂就会报异常了。

7、创建与使用序列

典型数据库中存在许多需要唯一数字的情况,通常情况针对的是主键。

SQL> create sequence inv_nos start with 1 increment by 1;

Sequence created.

SQL> select inv_nos.nextval from dual;

NEXTVAL ---------- 1

SQL> select inv_nos.nextval from dual;

NEXTVAL ---------- 2

通过在创建序列时使用CACHE子句,可以改善序列性能,不过这样会导致更多的间隔。

OCP 认证考试指南(9):操纵数据库数据 1、 数据库事务

1.1、原子性(A)

原子性(Atomicity)原则规定一个事务的各个部分都必须完成,否则整个事务都不会完成。数据库必须保证两个更新操作都能完成或者都不完成。

1.2、一致性(C)

一致性(Consistency)的原则规定查询的结果必须与数据库在查询开始时的状态一致。例如:查询整个表要数分钟,在查询期间,其他用户更新记录,那查询出来的应该还新值还是旧值?通过使用摊销段,在查询成功的前提下,查询结果是一致的,如果撤消段没有正确配置,查询可能不成功会引发常见的 Oracle错误“ORA-1555 snapshot too old(快照过旧)”。

1.3、隔离性(I)

隔离性(Isolation)的原则规定对于其他部分来说,未完成的事务必须不可视。就是说只有执行该事务的一个会话看见所做变化,其他所有会话看见的都是没有变化的数据(而不是更改后的新值)。这点也是通过撤销段来保证的。

1.4、持久性(D)

持久性(Durability)原则规定一旦使用COMMIT命令结束某个事务,就必须保证数据库不丢失这个事务。隔离性是要求除指定会话外的任何用户看不到当前所做变化,事务一旦完成,所有用户都必须能立即看到所做的变化,同时数据库必须保证这些变化绝不会丢失。这点通过日志文件来满足。

2、执行SQL语句

2.1、执行SELECT语句

SELECT语句分阶段执行。服务器进程首先查看包含所需数据的数据块是否已经位于内存和数据库高速缓存区中。如果条件成立,执行就会立即进行。如果条件不成立,服务器必须在磁盘上定位相应的数据块,并将这些数据块复制至数据库高速缓存区,进一步的处理(如排序或聚集)就在指定会话的PGA中完成,执行完成后,结果集返回至用户进程。

如果查询遇到在查询开始之后被改变的数据块,那么服务器进程会进入保护这个变化的撤销段,从而定位原有数据和回滚该变化。这样,在查询开始之后启动的任何变化都不可视。

2.2、执行UPDATE语句

对于DML操作,必须同时处理数据块和撤销块,并且还会生成重做。ACID测试的A、C和I要求生成撤销,D则要求生成重做。

“撤销”不是“重做”的逆过程!对于表段、索引段或撤销段的数据块的变化来说,重做可以保护所有的数据块变化。就重做而言,撤销段只是一个段,对这个段所做的任何变化都必须是持久的。

执行DML语句的第一个步骤与执行SELECT语句第一个步骤相同:必须在内存中查找到所需的数据块或者将所需的数据块从磁盘复制至内存。这个步骤中,二者唯一的不同是执行DML语句还需要某个撤销段的一个空数据块(或过期数据块)。之后,必须在DML操作影响的所有记录以及关联索引键上放置锁定。接下来会生成重做,此时服务器进程在日志缓冲区中写入即将应用于指定数据块的变化。这个重做生成操作应用于数据块的变化和撤销块的变化。如果要更新某个列,这个列的新值(应用于表数据块的变化)以及旧值(应用于撤销块的变化)都会被写入日志缓冲区。如果这个列是某个索引键的一部分,应用于该索引的变化以及保护索引变化的撤销块变化也会被写入日志缓冲区。

生成重做后,就可以在数据库高速缓存区完成下列更新操作:使用变化后的列更新表数据块,未变化的列则被写入撤销段数据块。从这一时刻到提交更新操作的时候,与发生变化的记录相关的其他会话中的所有查询都会被重定向至撤销数据。只有执行更新操作的会话才可以在表数据块中看见更新后的记录。所有关联的索引变化同样也会应用上述原则。 例如:

SQL> update emp set sal = sal * 1.1 where empno = 7934;

为执行这条语句,包含员工号为7934记录的表数据块会被复制至数据库高速缓存区,

某个撤销段的数据块也会被复制至数据库的高速缓存区。接下来,服务器进程将未变化的sal列(应用于撤销块的变化)和变化后的sal列(应用于表数据块的变化)都写入日志缓存区。最后,这些数据块会被更新。

2.3、执行INSERT与DELETE语句

INSERT和DELETE语句与UPDATE具有相同的管理方式。其中,重做生成操作完全相同,对数据块和撤销块进行的所有变化都会首先被写入日志缓存区。二者的差异在于所生成的撤销数据量不同。插入一条记录时,生成撤销的操作只涉及为撤销块写下新的rowid。这是由于回滚INSERT语句时,只需要rowid信息。

对于DELETE语句来说,因为整条记录都被写入摊销块,所以在必要时通过在表中插回整条记录就可以回滚这个删除操作。

2.4、执行ROLLBACK命令

出现任何错误,后台进程都会完全自动地回滚正在进行的事务。发出ROLLBACK命令时,用户可以执行手动的回滚操作。无论何种方式回滚,机制都相同。回滚UPDATE,未被更新的列会从撤销块复制回表数据块。回滚INSERT,从撤销块中检索插入记录的rowid,并将其用作在表上进行删除的键。回滚DELETE,根据撤销块中的数据构造一条完整的插入语句。因此,实现ROLLBACK命令时会使用撤销数据来构造和执行反转第一条语句执行结果的另一条语句。

2.5、执行COMMIT命令

执行COMMIT命令时发生的所有物理操作是LGWR进程将日志缓冲区的内容写入磁盘。DBWn进程完全没有执行任何操作。基于这个,某个事务涉及若干分钟或若干小时的更新操作,但这事务可以在不到一秒时间内被提交。因为LGWR进程写入操作接近于实时完成。

DBWn进程与提交处理没有关系,不过最终这个进程会将变化的或“脏的”数据块写入磁盘。在正常运行期间,DBWn进程只将某些脏缓冲区写入磁盘。在需要某个检查点时,DBWn进程会将所有的脏缓冲区写入磁盘。

2.6、DDL与事务控制

COMMIT和ROLLBACK只应用于DML,所以无法回滚DDL语句。DDL语句一旦被执行就会立即具有持久化状态。

例如:如果查看CREATE TABLE命令源代码,其原因就会知道,创建表时,都执行了用于保护数据字典的COMMIT命令。

2.7、所谓的“自动提交”

执行DDL语句就是一种情况,退出用户进程则是另一种情况。

Windows终端上使用SQL*Plus并执行一条DML语句,再执行“退出”,事务就会被提交,这是因为“退出”命令嵌入了一条COMMIT语句。但点击窗口右上角则发现,事务会回滚,因为关闭窗口代码中嵌入一条ROLLBACK语句。全用X Windows形式的SQL*Plus,那么关闭窗口会提交事务。

3、DML与完整性约束

如果多语句事务中的一条语句违反了某个约束,那么只有这条语句被回滚,该事务的其余语句保持完整和未提交状态。

OCP 认证考试指南(10):使用PL/SQL进行Oracle编程

1、编程语言与Oracle数据库

1.1、存储的与匿名的PL/SQL程序块

与存储的PL/SQL程序块相比,匿名的PL/SQL程序块效率较低,此外由于可能在多台机器中公布源代码,还会引发管理问题。

1.2、PL/SQL对象

PL/SQL对象具有下列5种类型:

    

过程 函数 程序包 程序包主体 触发器

2、过程、函数以及程序包

2.1、过程与函数

过程(Procedure)是一个执行某些动作的代码块。要运行一个过程,既可以在PL/SQL程序块内部调用这个过程,也可以使用交互式的 EXECUTE命令。

函数(Function)与过程的概念相似,但并不具有OUT型实参,并且无法使用EXECUTE命令来调用。函数应当通过RETURN返回一个值。

如果使用的是CREATE命令而不是CREATE OR REPLACE命令,那么在指定对象已存在的情况下必须先删除这个对象。

函数:

SQL> create or replace function odd_even(v1 number) 2 return varchar2 3 as 4 begin 5 if

6 mod(v1,2) = 0 7 then

8 return 'even'; 9 else 10 return 'odd'; 11 end if; 12 end odd_even; 13 /

Function created.

SQL> select odd_even(8) from dual;

ODD_EVEN(8)

------------------------------------------------------------------- even

SQL> select odd_even(9) from dual;

ODD_EVEN(9)

------------------------------------------------------------------- odd 过程:

SQL> conn system/oracle Connected.

SQL> create table integers ( 2 C1 number(2), 3 C2 varchar2(5));

Table created.

SQL> create or replace procedure ins_ints(v1 in number)

2 as 3 begin

4 for i in 1..v1 loop

5 insert into integers values (i, odd_even(i)); 6 end loop; 7 end ins_ints; 8 /

Procedure created.

SQL> execute ins_ints(5);

PL/SQL procedure successfully completed.

SQL> select * from integers;

C1 C2 ---------- ----- 1 odd 2 even 3 odd 4 even 5 odd

2.2、程序包

程序包(Package)由规范和主体两个对象组成。

使用CREATE PACKAGE命令可以创建一个程序包规范:

SQL> create or replace package numbers 2 as

3 function odd_even(v1 number) return varchar2; 4 procedure ins_ints(v1 in number); 5 end numbers; 6 /

Package created.

使用CREATE PACKAGE BODY创建程序包主体:

SQL> create or replace package body numbers 2 as

3 function odd_even(v1 number) 4 return varchar2 5 as 6 begin 7 if

8 mod(v1,2)=0 9 then 10 return 'even'; 11 else

12 return 'odd'; 13 end if; 14 end odd_even;

15 procedure ins_ints(v1 in number) 16 as 17 begin

18 for i in 1..v1 loop

19 insert into integers values (i, odd_even(i)); 20 end loop; 21 end ins_ints; 22 end; 23 /

Package body created. 查看:

SQL> desc numbers; PROCEDURE INS_INTS

Argument Name Type Default?

------------------------------ ----------------------- ------ --------

V1 NUMBER N

FUNCTION ODD_EVEN RETURNS VARCHAR2

Argument Name Type Default?

------------------------------ ----------------------- ------ --------

V1 NUMBER N 使用:

In/Out IIn/Out I

SQL> execute numbers.ins_ints(5);

PL/SQL procedure successfully completed.

SQL> select * from integers;

C1 C2 ---------- ----- 1 odd 2 even 3 odd 4 even 5 odd 1 odd 2 even 3 odd 4 even 5 odd

10 rows selected.

3、数据库触发器

常见的触发事件:

     

INSERT、UPDATE以及DELETE这些DML命令的执行 CREATE、DROP、ALTER以及TRUNCATE这些DDL命令的执行 会话登入与登出 数据库的启动与关闭

由于空间问题导致的某条语句的挂起 检测到服务器错误

只能通过触发事件来运行触发器。

SQL> create or replace trigger oe_check 2 after insert or update on integers 3 for each row 4 begin

5 if mod(:new.C1, 2) = 0 then

6 dbms_output.put_line(:new.C1 || ' is even '); 7 else

8 dbms_output.put_line(:new.C1 || ' is odd ');

9 end if; 10 end; 11 /

Trigger created.

SQL> set serveroutput on;

SQL> insert into integers values (2, 'odd'); 2 is even

1 row created.

SQL> rollback;

Rollback complete.

SQL> insert into integers values (3, 'odd'); 3 is odd

1 row created.

SQL> commit;

Commit complete.

4、用于PL/SQL的实例参数

PLSQL_V2_COMPATIBILITY(默认FALSE):为TRUE许可旧版本中合法的异常行为。 PLSQL_DEBUG(默认FALSE):为TRUE会以某种方式编译PL/SQL代码,有助于调试其他信息。

PLSQL_OPTIMIZE_LEVEL(默认为2):最高级别为2,支持使用编译器的所有优化功能,提供最佳运行时性能,但可能增加编译时间。低级别提供更快编译,但稍微影响执行性能。大量编译时,可修改。

PLSQL_WARNING(默认DISABLE:ALL):控制PL/SQL编译器应当显示的消息。 PLSQL_CODE_TYPE(默认INTERPRETED):默认PL/SQL代码只被编译为字节代码,在调用时被解释。如设置为NATIVE,与后面的PLSQL_NATIVE_LIBRARY_DIR参数一起用,PL/SQL代码预编译为C代码,这种方式可以改善性能。

PLSQL_NATIVE_LIBRARY_DIR(默认NULL):指定存储本地PL/SQL编译所生成的动态链接库的操作系统路径。

OCP 认证考试指南(11):保护Oracle数据库的安全

1、调整默认的安全设置

1.1、默认的用户

查看数据库的用户和状态,可以查询DBA_USERS视图。

SQL> select username,account_status from dba_users;

1.2、PUBLIC权限

Oracle中存在一个名为PUBLIC的伪用户。只要用PUBLIC授予某个权限,那么所有用户都会被授予这个权限。

SQL> select count(*) from dba_tab_privs where grantee = 'PUBLIC';

COUNT(*) ---------- 1991

SQL> select table_name from dba_tab_privs where grantee = 'PUBLIC' 2 and privilege = 'EXECUTE' and table_name like 'UTL%';

TABLE_NAME

------------------------------ UTL_RAW UTL_TCP UTL_INADDR UTL_SMTP UTL_HTTP UTL_URL UTL_ENCODE UTL_GDK UTL_COMPRESS UTL_I18N UTL_LMS

TABLE_NAME

------------------------------ UTL_NLA_ARRAY_DBL UTL_NLA_ARRAY_FLT UTL_NLA_ARRAY_INT UTL_NLA UTL_REF UTL_COLL UTL_MATCH

UTL_FILE

19 rows selected.

针对上面列出的,我们来看下某些使用起来比较危险的程序包:

   

UTL_FILE:这个程序包允许用户读写操作系统用户可访问的、运行Oracle进程的任务文件和目录,这些文件与目录包括所有的数据库文件以及ORACLE_HOME目录。

UTL_TCP:这个程序包允许用户为了连接网络中所有可访问的地址而打开服务机器上的TCP端口。

UTL_SMTP:使用UTL_TCP调用编写的这个程序包允许用户发送邮件消息。UTL_SMTP程序包受UTL_SMTP_SERVER实例参数限制,该参数给出了输出邮件服务器的地址。

UTL_HTTP:这个程序包同样使用UTL_TCP调用进行编写,并且允许发送HTTP消息和接收响应,结果是将数据库转换为Web浏览器。

记住:默认情况下,登入数据库的任何用户都能使用上述程序包。

虽然应用软件可以为PUBLIC用户授予执行UTL程序包的权限,但我们应当取消PUBLIC用户的这个权限。

SQL> revoke execute on utl_file from public;

Revoke succeeded.

2、对安全性至关重要的实例参数

提醒:这里说的参数都是静态的,被修改后必须重启实例才会有效。

2.1、UTL_FILE_DIR实例参数

UTL_FILE_DIR实例参数默认为NULL,因此不是一个安全性问题。但在设置这个参数时,要特别小心。UTL_FILE_DIR参数允许 PL/SQL通过UTL_FILE补充程序包来访问服务器的系统。UTL_FILE程序包具有打开并读写文件的过程,唯一的限制是Oracle拥有者必须能够访问所列出的目录。

使用这个实例参数的难点:因为在实例层次上进行设置,所以无法允许某些用户访问一些目录以及其他用户访问另外一些目录。对UTL_FILE程序包具有执行权限的所有用户有权访问UTL_FILE_DIR参数中列出的所有目录。

UTL_FILE_DIR参数接受一个用逗号分隔的目录列表,并且是静态的(参数可以包含通配符,不要将其设置为“*”)。

SQL> alter system set utl_file_dir = '/ora01/tmp', '/dp_dir/dp' 2 scope = spfile;

2.2、REMOTE_OS_AUTHENT与OS_AUTHEN_PREFIX实例参数

REMOTE_OS_AUTHENT实例参数默认为FALSE。这个参数控制某个用户是否能够在不需要给出口令的情况下从远程计算机上连接数据库。

通常用下面语法创建用户:

SQL> create user jon identified externally;

这样,身份验证操作就委托给服务器的操作系统完成。

无论本地的还是远程的外部身份验证都涉及到OS_AUTHEN_PREFIX实例参数。该参数有个默认值OPS$。这里我们要清空这个默认值。不然,Oracle的用户名就是OPS$jon了。

SQL> create user jon identified externally;

User created.

SQL> grant create session to jon;

Grant succeeded.

SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> exit

在Oracle建了新的用户后,我们就要在操作系统也建立用户。

$ vi $ORACLE_HOME/dbs/initora.ora #################################### # 最后一行加上

#################################### REMOTE_OS_AUTHENT=true OS_AUTHENT_PREFIX=\"\"

$ su - root 口令:

# /usr/sbin/useradd jon -m -g oinstall -G dba # rm /home/jon/.bash_profile

rm:是否删除 一般文件 “/home/jon/.bash_profile”? y

# cp /home/oracle/.bash_profile /home/jon # source /home/jon/.bash_profile $ su - oracle 口令

$ sqlplus / as sysdba

SQL> create spfile from pfile;

File created.

SQL> startup

SQL> exit

SQL> exit

$ su - jon 口令: $ sqlplus /

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Sep 28 22:00:22 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options

启用远程操作系统身份验证通常被认为是一种不好的做法。

2.3、O7_DICTIONARY_ACCESSIBILITY实例参数

O7_DICTIONARY_ACCESSIBILITY实例参数控制使用ANY关键字授予对象权限的效果。默认FALSE。

SQL> grant select any talbe to jon;

授权查看数据库中所有表。

O7_DICTIONARY_ACCESSIBILITY实例参数为FALSE,ANY权限不被授予给SYS拥有的对象,从而保护数据字典,此时 JON无法查看SYS拥有的对象。如果为TRUE,则反之,可以查看。

提示:我们可以考虑为有些用户授予SELECT ANY DICTIONARY权限,这样用户可以查看数据字典以及动态性能视图。

2.4、REMOTE_LOGIN_PASSWORDFILE实例参数

远程的REMOTE_LOGIN_PASSWORDFILE实例参数控制具有SYSDBA权限的用户是否能够通过网络连接实例。这个参数在默认值 NONE的时候,得到SYSDBA连接的唯一方法是作为拥有Oracle软件的操作系统组的成员登入服务器的操作系统。

将REMOTE_LOGIN_PASSWORDFILE实例参数设置为EXCLUSIVE或SHARED时,用户可以通过下列的不同方法得到 SYSDBA连接:即使没有作为Oracle软件拥有组的成员登入服务器或者需要通过网络进行连接,但是只要知道相应的口令,一样能作为SYSDBA连接实例。这个口令以加密形式嵌入$ORACLE_HOME/dbs(Windows是%ORACLE_HOME%/database)系统文件。设置值为 SHARED意味着同一个Oracle主目录内运行的所有实例共享一个公有的口令文件,对于所有实例公有的SYS用户来说,这个主目录内只有一个口令。设置值为EXCLUSIVE意味着实例会寻找一个其名称包含实例名的文件(Windows系统PWD.ora,Linux系统orapw)。

3、口令配置文件

3.1、口令配置文件的限制

每个用户(甚至是SYS)都被指派一个配置文件,文件的名称默认情况为DEFALULT。

SQL> select profile, resource_name from dba_profiles 2 where profile = 'DEFAULT';

PROFILE RESOURCE_NAME ------------------------------ -------------------------------- DEFAULT COMPOSITE_LIMIT DEFAULT SESSIONS_PER_USER DEFAULT CPU_PER_SESSION DEFAULT CPU_PER_CALL

DEFAULT LOGICAL_READS_PER_SESSION DEFAULT LOGICAL_READS_PER_CALL DEFAULT IDLE_TIME DEFAULT CONNECT_TIME DEFAULT PRIVATE_SGA

DEFAULT FAILED_LOGIN_ATTEMPTS DEFAULT PASSWORD_LIFE_TIME

PROFILE RESOURCE_NAME ------------------------------ --------------------------------

DEFAULT PASSWORD_REUSE_TIME DEFAULT PASSWORD_REUSE_MAX DEFAULT PASSWORD_VERIFY_FUNCTION DEFAULT PASSWORD_LOCK_TIME DEFAULT PASSWORD_GRACE_TIME

16 rows selected.

安全性相关的口令限制:

      

FAILED_LOGIN_ATTEMPTS:连续使用不正确口令请求连接的次数达到这个限制所指定的次数之后,帐户会被锁定。

PASSWORD_LOCK_TIME:指定达到FAILED_LOGIN_ATTEMPTS限制后帐户被锁定的天数。例如:(30/1440)等价于30分钟。

PASS_LIFE_TIME:指定提示用户修改口令之前需要经过的天数。

PASSWORD_GRACE_TIME:指定达到PASS_LIFE_TIME限制值后可以维持成功登录的天数。 PASSWORD_REUSE_TIME:指定可以重用某个口令之前所经过的天数。这个限制阻止用户修改口令时,修改同样口令来回避 PASS_LIFE_TIME限制的设置。 PASSWORD_REUSE_MAX:某个口令可以被重用的次数。

PASSWORD_VERIFY_FUNCTION:这个限制是一个在修改口令时会执行复杂度检查。

除了用配置文件可以自动终止口令和锁定帐户,还可以通过SQL命令来提示用户。

在下次登录时,修改口令:

SQL> alter user test password expire;

User altered.

锁定帐户:

SQL> alter user test account lock;

User altered.

3.2、口令验证功能

口令配置文件包含对某个PL/SQL函数(口令验证函数)的引用。使用配置文件修改用户的口令或通过管理员修改用户的口令,那么就会执行该函数。这个函数必须驻留在SYS模式中,并接受下列3个实参:用户名、新的口令以及旧的口令。该函数返回值为TRUE或FALSE,如果是FALSE,则拒绝修改口令。

Oracle标准安装过程提供了一个示例函数。为了创建这个函数,必须以SYS进行连接运行一个脚本。

SQL> @?/rdbms/admin/utlpwdmg.sql

Function created.

Profile altered.

所创建的口令验证对新的口令执行下列检查,没有通过任何检查的情况下拒绝修改口令:

    

新口令与用户名不能相同。不区分大小写,比较之前,用户名与口令都会被转换为小写字母。 新口令至少必须具有4个字符。

针对一个包含6个常用口令的硬编码列表,检查同样会被转换为小写字母的新口令。 检查新口令,从而确保其至少包含一个数字、一个大写或小写字母以及一个标点符号。 新口令至少包含3个与旧口令不同的字母,或者至少比旧口令多3个字符。

3.3、创建、指派以及修改口令配置文件

因为所有用户都被自动指派给名为DEFAULT的配置文件,所以实现安全策略的最快方法是更改DEFAULT配置文件。之后,所有用户都可以在其进行下一次登录时获取所做的变化。前面的UTLPWDMG.SQL脚本完成了上述功能,这脚本最后一条命令如下:

ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 60 PASSWORD_GRACE_TIME 10 PASSWORD_REUSE_TIME 1800 PASSWORD_REUSE_MAX UNLIMITED FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1/1440

PASSWORD_VERIFY_FUNCTION verify_function;

运行这条命令的结果是:在6天之后提示所有用户修改口令,并且允许用户在随后的10天内完成修改,否则将锁定帐户;在1800天的时间内,口令无法重用;连续3次输入错误的口令,账户会被锁定一分钟;任何被修改的口令都将通过一个名为SYS.VERIFY_FUNCTION的函数进行检查。

OCP 认证考试指南(12):配置Oracle互联

1、Oracle Net与通信协议简介

Oracle的网络支持被限制于TCP、命名管道(Named Pipes,简写SDP)。所有的操作系统都具有一个本操作系统专有的进程间通信(Inter-Process Communication,简写IPC)协议。

2、建立会话

通过用户进程建立针对实例的会话,可以执行:

SQL> connect scott/tiger@ora

首先,将这个命令分解为下列组件:数据库用户名“scott”,口令“tiger”,分隔用户与口令的“/”,“@”符号,连接串“ora”。其中 “@”符号指示了网络连接所需的用户进程。如果省略“@”符号与连接串,那么用户进程被认定连接实例在本地机器上运行,并且始终能够使用IPC协议。如果命令中包含“@”符号与字符串,用户里程认定是请求连接远程机器上的一个实例。

2.1、连接本地实例

所有Oracle会话都使用了网络协议。不过本地连接所使用的网络协议为IPC。IPC由操作系统提供,并允许各种进程在主机内进行通信。本地连接是唯一不需要侦听器的连接类型。本地连接不必进行任何配置。本地计算机可以运行若干实例,通过环境变量为用户进程提供希望连接的实例。

$ export ORACLE_SID=ocp

$ sqlplus / as sysdba

SQL> startup

SQL> select instance_name from v$instance;

INSTANCE_NAME ---------------- ocp

SQL> exit

$ export ORACLE_SID=ora

$ sqlplus / as sysdba

SQL> startup

SQL> select instance_name from v$instance;

INSTANCE_NAME ---------------- ora

2.2、名称解析

使用Oracle Net进行连接时,第一个阶段是发现实际希望连接的实例。这个阶段就是名称解析过程。如果连接串为“ora”,那Oracle Net就必须理解“ora”的含义。连接串的含义被解析为下列4部分:希望使用的协议(通常认定为TCP),运行数据库侦听器的IP地址(主机名也可,主机名也会被解析成IP),侦听器监视引入连接请求的端口,希望连接的实例名称(可能是“服务”名称,因为RAC一个“服务”名由许多实例组成)。

2.3、启动服务器进程

服务器上运行数据库侦听器使用一种或多种协议在若干网络接口卡上的若干端口监视引入连接请求。如果是一台机器运行多个侦听器,并且每个侦听器可以接受对许多实例的连接请求,那情况就复杂了。如果连接一个请求,侦听器首先验证这个连接是否有效。如果有效,侦听器会启动一个为用户进程服务的新服务器进程。如果1000个用户同时登录实例,就会启动1000个服务器进程。

3、创建与管理侦听器

侦听器在listener.ora文件中定义,默认存储位置$ORACLE_HOME/network/admin目录下。 listener.ora至少必须声明侦听器的名称及其使用的协议与侦听地址,我们可以在一个文件中配置多个侦听器,不过必须具有不同的名称与地址。

4、数据库注册

如果没有使用RAC,侦听器与实例必须在相同的计算机上运行。在RAC环境中,群集中任何计算机上的任何侦听器能够连接任何计算机上的任何实例。

向数据库注册实例的方法表静态注册和动态注册。

4.1、静态注册(不太明白,以后补)

4.2、动态注册(不太明白,以后补)

5、侦听器控制实用程序

运行lsnrctl命令。

$ lsnrctl start

如果没使用默认名称LISTENER,必须指定侦听器名称。

$ lsnrctl start listener2

6、名称解析技术

Oracle提供4种名称解析方法:Easy Connect、本地名称解析方法、目录名称解析方法、外部名称解析方法。

6.1、Easy Connect名称解析方法

C:\\> sqlplus test/test@192.168.0.5:1522/ora

很容易理解吧,其实就是把客户端要用的侦听器的信息写在了connect的地方。

如果侦听器使用1521端口,并向侦听器注册的服务的名称与计算机名相同,可以用更简单的命令。

C:\\> sqlplus test/test@192.168.0.5

6.2、本地名称解析方法

这个方法很常见,找到$ORACLE_HOME/netword/ADMIN/tnsnames.ora文件 ORA =

(DESCRIPTION = (ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.5)(PORT = 1521)) )

(CONNECT_DATA = (SID = ora) ) )

在连接的时候,只要发出连接串“@ORA”,用户进程应当使用TCP协议到达机器192.168.0.5并连接端口1521,同时请求监视该端口的侦听器使用服务名ora建立针对指定实例的会话。

6.3、目录名称解析方法

目录名称解析方法为所有名称解析细节提供了一个中心仓库,目录服务器。

6.4、外部名称解析方法

类似于目录名称解析方法,不过使用了第三方名称解析服务。

7、高级的连接选项

关于连接容错和负载均衡。

OCP 认证考试指南(13):管理共享服务器

1、共享服务器体系结构

共享服务器由作为指定实例一部分的其他进程实现。这些进程是在实例启动阶段被启动的后台进程。此时存在两种新进程:调度进程和共享服务器进程。 SGA内还存在一些特殊的队列存储结构。

启动共享服务器的实例时,除了启动常见的后台进程,还会启动一个或多个调度进程,与其他TCP进程一样,调度进程在操作系统的端口映射程序所分配的一个单一TCP端口上运行,并且使用侦听器LOCAL_LISTENER参数与指定的侦听器相联系并向其进行注册。此时还会启动一个或多个服务器进程。

上述进程类似于一个普通的专用服务器进程,只不过不依赖于会话。这些进程会接收、分析和执行SQL语句以及产生结果集,但它们并不是直接从一个用户进程接收SQL语句,而是从一个队列中读取这些语句,这个队列填充了来自任意数目用户进程的SQL语句。同样,共享服务器并不直接将结果集取回至一个用户进程,而将结果集填入一个响应队列。

问题来了,用户进程生成的SQL语句怎样进入被服务器进程读取的队列?结果集怎样被取回至用户进程?此时就需要使用调度程序。用户进程联系侦听器时,侦听器的动作是传回某个调度程序的地址,而不是启动一个服务器进程与这个用户进程联系在一起。只存在一个调度进程,那侦听器会连接这个调度进程与所有用户的连接。如果存在多个调度进程,那么侦听器会在这些调度进程之间实现对引入连接请求的负载均衡,最终结果是许多用户进程分别连接一个调度进程。

为了保护一个会话,与调度进程的连接必须持久,而与侦听器的连接可以是短暂的。

用户进程生成一条SQL语句时,这条语句会被发送至调度进程。调度进程将其接收到的所有SQL语句放入一个队列。因为所有调度进程共享这个队列,所以该队列被称为“公共”队列。所有共享服务器进程都监视公共队列。在一条SQL语句到达公共队列时,第一个可用的共享服务器会获取这条语句。随后的语句执行过程会经过通常的分析-绑定-执行阶段,不过进入取出阶段时,因为用户进程与这个共享服务器之间不存在连接,所以共享服务器无法将结果集取回至用户进程。此时,共享服务器只能将结果放入最初接收到指定作业的调度进程专用的响应队列。每个调度进程都会监视自己的响应队列,一旦在响应队列中放入了结果集,相应的调度进程就会获得结果集并将其返回至先前发出SQL语句的用户进程。

所有调度进程共享一个公共的输入队列,但是每个调度进程都具有自己的响应队列。

调度进程与队列机制的一个结果是任何可用的共享服务器都能够执行来自己任何用户进程的任何SQL语句。又有一问题,怎么处理锁定状态的呢?为了解决这问题,共享服务器会话在共享池中(而不是在PGA中)存储大量的会话数据。只要某个共享服务器从公共队列中获取一个作业,那么就会进入SGA并连接适当的内存块,从而找出会话的状态。SGA中用于每个共享服务器会话的内存被称为用户全局区(User Global Area,简写UGA)。除了会话的堆栈空间之外,UGA还包含了PGA中的所有存储结构,并且是进行存储器存储的来源。

在共享服务器中,不进入SGA的PGA存储结构为堆栈空间。

2、配置共享服务器

在服务器端,共享服务器与数据库无关,而是只与实例有关。通过动态实例注册,侦听器会被自动配置以用于共享服务器。可以断定:共享服务器通过实例初始化参数进行配置。虽然存在若干可选的实例参数,但只有一个参数是必需的。

用于共享服务器的实例参数 参数 SHARED_SERVERS DISPATCHERS MAX_SHARED_SERVERS MAX_DISPATCHERS LOCAL_LISTENER LARGE_POOL_SIZE CIRCUITS SHARED_SERVER_SESSIONS PROCESSES SESSIONS

无论是否为高级参数,只要使用了共享服务器,就应当设置实例参数SHARED_SERVERS、DISPATCHERS和 LARGE_POOL_SIZE。在任何情况下始终应当设置的实例参数为PROCESSES和SESSIONS。此外,如果侦听器没有使用1521端口,那么还必须设置实例参数LOCAL_LISTENER。

是否必须 否 是 否 否 否 否 否 否 否 否 高级参数或基本参数 基本参数 高级参数 高级参数 高级参数 高级参数 高级参数 高级参数 高级参数 基本参数 基本参数 SHARED_SERVERS:这个参数控制在实例启动阶段被启动的共享服务器的数目。默认情况下,如果设置了实例参数DISPATCHERS,那么SHARED_SERVERS参数就被设置为1.MAX_SHARED_SERVERS参数被默认为PROCESSES参数值的八分之一。

 DISPATCHERS:参数控制在实例启动阶段所启动的进程数以及这些进程的行为。这个参数是共享服务器必须的唯一参数。 DISPATCHERS参数存在许多选项,通常只需要使用其中两个选项:启动的调度进程数,这些调度进程应当侦听的侦听器的地址。 MAX_DISPATCHERS参数是指能够启动的进程数的上限值,与共享服务器不一样的是,Oracle不会根据需求启动额外的调度进程。

 

LOCAL_LISTENER:与动态实例注册有关,该参数告知实例其应当注册的侦听器的地址。共享服务器环境中,调度进程也会使用这个参数进行注册,否则侦听器无法知道调度进程所处的位置。 LARGE_POOL_SIZE:参数不是必须的,但应当总是对其进行设置。会话PGA中相当大的部分是UGA。UGA会被存储在SGA内,默认情况下,用于所有会话的UGA都进入共享池。如果存在许多共享服务器会话,内存需求以及根据需要管理分配和释放内存方面对共享池造成很大压力。指定 LARGE_POOL_SIZE参数,就可以在SGA中创建一个单独区域,代替共享池的UGA使用。

 

CIRCUITS、SHARED_SERVER_SESSIONS:限制了允许通过共享服务器进行连接的用户数。 PROCESSES:限制了能够连接SGA的操作系统进程数,这个总数必须足够大,从而能够适用于后台进程与所有的专用服务器进程,共享服务器进程与调度进程的数目也被计算在内。这是专用服务器中限制并发连接数的方法。

 SESSION:应用于Oracle层次而非操作系统层次。限制对指定实例的并发登录数。

配置共享服务器:

############################################### # 启动监听,启动实例,用命令设置启用共享服务器 ###############################################

$ lsnrctl start

$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 3 21:19:10 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup

ORACLE instance started.

Total System Global Area 264241152 bytes

Fixed Size 1218868 bytes Variable Size 88082124 bytes Database Buffers 171966464 bytes Redo Buffers 2973696 bytes Database mounted. Database opened. SQL> alter system set

2 dispatchers='(protocol=tcp)(dispatchers=2)' 3 scope=spfile;

System altered.

SQL> alter system set shared_servers=3 scope=spfile;

System altered. SQL> startup force;

ORACLE instance started.

Total System Global Area 264241152 bytes

Fixed Size 1218868 bytes Variable Size 88082124 bytes Database Buffers 171966464 bytes Redo Buffers 2973696 bytes Database mounted. Database opened.

############################################### # 确认启动调度进程与共享服务器进程

# 可以看到调度进程(D000、D001)和三个共享服务器进程(S001、S002、S003) # 书上共享服务器进程S开头,我电脑上怎么P开头? ###############################################

SQL> select program from v$process;

SQL> exit

###############################################

# 下面的输入相似就行了,lsnrctl确认侦听器注册了调试进程 ###############################################

$ lsnrctl services

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 03-OCT-2008 21:20:22

Copyright (c) 1991, 2005, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1))) Services Summary...

Service \"PLSExtProc\" has 1 instance(s).

Instance \"PLSExtProc\ Handler(s):

\"DEDICATED\" established:0 refused:0 LOCAL SERVER Service \"ora\" has 1 instance(s).

Instance \"ora\ Handler(s):

\"DEDICATED\" established:0 refused:0 state:ready LOCAL SERVER

\"D001\" established:0 refused:0 current:0 max:972 state:ready

DISPATCHER

(ADDRESS=(PROTOCOL=tcp)(HOST=OracleServer)(PORT=60422)) \"D000\" established:0 refused:0 current:0 max:972 state:ready DISPATCHER

(ADDRESS=(PROTOCOL=tcp)(HOST=OracleServer)(PORT=39547)) Service \"ora_XPT\" has 1 instance(s).

Instance \"ora\ Handler(s):

\"DEDICATED\" established:0 refused:0 state:ready LOCAL SERVER

\"D001\" established:0 refused:0 current:0 max:972 state:ready DISPATCHER

(ADDRESS=(PROTOCOL=tcp)(HOST=OracleServer)(PORT=60422)) \"D000\" established:0 refused:0 current:0 max:972 state:ready DISPATCHER

(ADDRESS=(PROTOCOL=tcp)(HOST=OracleServer)(PORT=39547)) The command completed successfully

############################################### # 远程连接,通过侦听器登录实例

###############################################

C:\\>sqlplus test/test@ora

SQL*Plus: Release 10.2.0.3.0 - Production on 星期五 10月 3 20:23:13 2008

Copyright (c) 1982, 2006, Oracle. All Rights Reserved. 连接到:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options

###############################################

# 查询会返回一条记录,说明新会话经过调试进程以及会话地址

# 我这里没成功,可能是版本问题,别人在10.1的版本上成功查询出结果,我的10.2版本

###############################################

SQL> select dispatcher, saddr, circuit from v$circuit;

3、监视共享服务器

下面介绍的视图能说明共享服务器环境的状态。

V$CIRCUIT视图:给出一条记录说明通过共享服务器的所有并发连接。其中,CIRCUIT列是唯一标识符。通过连接这个列与 V$SESSION视图中的SADDR列以及V$DISPATCHER视图中的DISPATCHER列,可以将会话映射至调度进程。

V$SHARED_SERVER视图:每个共享服务器进程状态。其中,IDLE和BUSY列说明了每个进程实际服务于讲求所花费的时间量,而不是等待作业到达公共队列所花的时间量。 V$DISPATCHER视图:为每个调度进程给出一条记录。重要点的列IDLE和BUSY。 V$SHARED_SERVER_MONTTOR视图:给出一记录说明经过共享服务器的最大连接数与最大会话数(通常相同)。此外,该记录还说明已被动态启动的共享服务器进程数。如果这个数大于零,说明最初没有启动足够多的共享服务器进程。

V$QUEUE视图:给出一条用于公共队列的记录以及一条用于所有调度进程的响应队列的记录。QUEUE列十分重要,这个列说明队列中数据项的数目。记住,理想情况下应当不存在排队。如果公共队列中存在数据项,说明没有足够的共享服务器进程被用于清空队列。如果响应队列中存在数据项,说明调度进程处理超负荷状态。

V$MTS视图:提供向后兼容能力。和V$SHARED_SERVER_MONTTOR视图完全相同。

OCP 认证考试指南(14):管理数据库性能

1、无效的对象

Oracle总是会尝试自动重编译无效的PL/SQL对象和视图,但是可能不会成功。虽然Oracle可能建议手动地进行编译,不过我们并非必须进行这个操作。

1.1、标识无效的对象

为了标识数据库中的所有无效的对象,我们可以作为SYSTEM用户或其他有权限的用户做如下查询。

SQL> select owner, object_name, object_type 2 from dba_objects 3 where status = 'INVALID';

1.2、修正无效的对象 编译对象

SQL> alter procedure ADD_NUMS compile;

Procedure altered.

如果编译成功,就不存在问题,如果编译失败,就需要找出失败的原因。

SQL> show errors

如果希望确定编译错误的原因,通常需要首先使用DBA_DEPENDENCIES视图。

SQL> desc dba_dependencies;

Name Null? Type ----------------------------------------- -------- ---------------

OWNER NOT NULL VARCHAR2(30) NAME NOT NULL VARCHAR2(30) TYPE VARCHAR2(17)

REFERENCED_OWNER VARCHAR2(30) REFERENCED_NAME VARCHAR2(64) REFERENCED_TYPE VARCHAR2(17) REFERENCED_LINK_NAME VARCHAR2(128) DEPENDENCY_TYPE VARCHAR2(4)

如果要重新编译成百上千的的无效对象,可以运行下面命令。

SQL> @?/rdbms/admin/utlrp

2、无用的索引

2.1、标识无用的索引

旧版本中执行SQL语句时,如果指定会话试图使用无用的索引,就会立即返回一条错误的消息,同时语句执行失败。如果希望10G数据库实现旧版本中无用索引导致返回错误消息的功能,可以执行以下命令。(默认为TRUE)

SQL> alter system set skip_unusable_indexes = false;

检测就得无用的索引

SQL> select owner, index_name from dba_indexes where status = 'UNUSABLE';

2.2、修正无用的索引

如果rowid不正确,索引就会标记为无用。为了修复无用索引,必须使用ALTER INDEX…REBUILD命令。索引重建过程需要额外的存储空间。

REBUILD命令语法具有多种选项,其中最重要的选项是TABLESPACE、ONLINE以及NOLOGGING。在默认情况下,索引在其当前表空间内重建,不过如果使用TABLESPACE关键字指定某个表空间,重建就会动至这个表空间内进行。同样在默认情况下,重建过程会为DML命令锁定指定的表,不过使用ONLINE关键字可以避免这种状况。NOLOGGING关键字则指示不为索引重建操作生成重做,这样能更快速完成重建。

启用NOLOGGING选项只是为索引重建禁用重做生成,在索引重建之后,针对该索引的所有DML命令都会像平时一样生成重做。

############################################# # 用上面测试过的用户和表,创建两个索引 #############################################

SQL> create index n1_idx on testtab(n1);

Index created.

SQL> create index d1_idx on testtab(d1);

Index created.

#############################################

# 查看索引状态有效,之后我们移动指定的表,再查状态变成无用索引 #############################################

SQL> select index_name, status from user_indexes;

INDEX_NAME STATUS ------------------------------ -------- N1_IDX VALID D1_IDX VALID

SQL> alter table testtab move;

Table altered.

SQL> select index_name, status from user_indexes;

INDEX_NAME STATUS ------------------------------ --------

N1_IDX UNUSABLE D1_IDX UNUSABLE

############################################# # 重建索引

#############################################

SQL> alter index n1_idx rebuild online nologging;

Index altered.

SQL> select index_name, status from user_indexes;

INDEX_NAME STATUS ------------------------------ -------- N1_IDX VALID D1_IDX UNUSABLE OCP 认证考试指南(16):管理撤销

1、撤销数据

如果数据库已被转换使用撤销段,并且自动进行撤销管理,那么任何现有的回滚段都必须处于脱机模式中,而且不能被设置为联机。根据 UNDO_MANAGEMENT参数的不同设置,Oracle数据库要么使用撤销段,要么使用回滚段。

2、撤销表空间

一个数据库可以存在多个撤销表空间,但是在任意给定时刻都只能使用一个撤销表空间。撤销表空间必须被创建为持久的、本地管理的并且能够自动扩展分配空间的表空间。

3、事务与撤销段

在某个事务启动时,Oracle会为其指派一个撤销段。任何一个事务都只能受一个撤销段保护,一个事务生成的撤销数据无法被分配到多个撤销段中。

在某个事务更新表和索引数据块时,回滚该变化所需的信息会被写入指定撤销表空间的数据块。 撤销数据在提交后过期的事实意味着可以采用循环方式使用撤销段。

如果使用原有的、人工管理的回滚段,那么调整的重要环节是控制具体事务分别受哪些回滚段保护。

4、管理撤销

4.1、与撤销相关的错误条件

管理撤销的原则十分简单:首先,应当始终存在允许所有事务继续进行的足够撤销空间;其次,应当始终存在保证查询成功的足够撤销数据。

如果某个事务耗尽了撤销空间,那么这个事务就会由于Oracle错误“ORA-30036 unable to extend segment in undo tablespace(无法扩展撤销表空间内的撤销段)”而失败。

4.2、用于撤销管理与撤销保留保证的参数

下面3个初始化参数可以控制撤销:

 

UNDO_MANAGEMENT:默认为manual,就是不会使用撤销段。默认设置是为了实现向后兼容性,最后不要使用默认。建议设置为 AUTO,启用使用撤销段的自动撤销管理。参数是静态的。 UNDO_TABLESPACE:如果使用了“UNDO_MANAGEMENT=AUTO”,就一定要指定该参数。该参数指定了一个作为有效撤销表空间的表空间,并且该表空间必须已被创建为一个撤销表空间,同时其内部的所有撤销段都会被自动联机。

 UNDI_RETENTION:可选,以秒为单位进行设置的参数。指定了保留过期撤销数据的目标位置。如果配置了保证撤销保留,那么该参数就不是可选的。针对撤销的默认模式是:对于事务与查询来说,Oracle更倾向于维护事务。10G版本中存在保证撤销保留的选项,意味着经过 UNDO_RETENTION参数所指定的时间之前,撤销数据决不会被重写。

可以用SQL*Plus更改某个表空间的撤销保留保证,但是无法通过EM完成相同的功能。

4.3、调整与监视撤销表空间

撤销表空间应当足够大,算法的话,首先计算在最高工作负荷时生成撤销的速度,然后再乘以耗时最长的查询的时间长度。

4.4、删除与缩小撤销表空间

创建一个撤销表空间时,Oracle会在这个表空间内创建一个撤销段池 OCP 认证考试指南(17):处理锁定

1、共享锁与排他锁

Oracle数据库中锁定的标准级别保证了最大可能的并发级别。就是说,如果某个会话正在更新一条记录,那么只有这条记录会被锁定。此外,锁定这条记录只是为了防止其他会话对其进行更新,其他会话可以随时执行读取操作。只有在使用COMMIT或ROLLBACK命令结束事务后,锁定才会被解除。这种锁定是“排他(exclusive)”锁:在指定记录上请求排他锁的第一个会话会得到这个锁定,其他请求对该记录进行写访问的会话则必须等待。

对于一条记录或一个完整表上的一个排他锁来说,每次只能有一个会话可以获得这个排他锁,不过许多会话可以同时获得相同对象上的“共享(shared)”锁。在一个表上放置共享锁的目的是为了防止另一个会话获得这个表上的排他锁。

2、DML锁与DDL锁

所有DML语句都至少需要两种锁定:受影响记录上的排他锁,以及包含受影响记录的表上的共享锁。排他锁能够防止其他会话干预指定的记录,而共享锁则能够阻止其他会话使用DDL语句修改表的定义。

执行DDL命令需要使用所涉及对象上的排他锁。只有在针对指定表的所有DML事务结束,且记录上的排他锁以及表上的共享锁都被解锁后,才可以获得执行DDL命令所需的排他

锁。

######################################## # 第一个用户连接,建表修改记录后,不提交 ########################################

SQL> conn system/oracle Connected.

SQL> create table t1 (c1 number);

Table created.

SQL> insert into t1 values (1);

1 row created.

SQL> commit;

Commit complete.

SQL> update t1 set c1 = 2 where c1 = 1;

1 row updated.

######################################## # 第二个用户连接,给表增加列,失败!

# 第一个用户的DDL语句放了排他锁与第二用户DML语句放置共享锁冲突 # 相似的情况下,DDL语句会被挂起 ########################################

$ sqlplus system/oracle

SQL*Plus: Release 10.2.0.1.0 - Production on Thu Oct 9 20:15:29 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options

SQL> alter table t1 add (c2 date); alter table t1 add (c2 date) *

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified

######################################## # 第一个用户提交

########################################

SQL> commit;

Commit complete.

######################################## # 第二个用户再执行增加列SQL,成功 ########################################

SQL> alter table t1 add (c2 date);

Table altered.

######################################## # 再来,第一个用户锁定整个表

########################################

SQL> lock table t1 in exclusive mode;

Table(s) Locked.

######################################## # 第二个用户增加记录,会被挂起

########################################

SQL> insert into t1 values (2, sysdate);

######################################## # 第一个用户COMMIT或ROLLBACK,表解锁 ########################################

SQL> commit;

Commit complete.

######################################## # 第二个用户执行成功

########################################

1 row created.

SQL> commit;

Commit complete.

3、排除机制

请求锁定需要排除。如果某个会话请求一个锁定,但由于其他会话已经锁定指定记录或对象,那这个会话将会等待。可能有多个会话都在等待的情况下,Oracle会跟踪这些会话的请求顺序,使用锁定的会话解除锁定时,下一个会话又将在记录或对象上放置锁定。这种机制称为“排队(enqueue)” 机制。

如果不希望排队,避免排除的唯一方式是使用SELECT …FOR UPDATE命令的WAIT或NOWAIT子句。

######################################## # 第一个用户锁定T1表

########################################

SQL> select * from t1 for update;

C1 C2 ---------- --------- 2

2 09-OCT-08

######################################## # 第二个用户NOWAIT关键字锁定T1表 # 再次锁定T1表,指定10秒等待时间 ########################################

SQL> select * from t1 for update nowait; select * from t1 for update nowait * ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified

SQL> select * from t1 for update wait 10; select * from t1 for update wait 10 *

ERROR at line 1:

ORA-30006: resource busy; acquire with WAIT timeout expired

######################################## # 第二个用户再次锁定T1表,指定10秒等待时间 ########################################

SQL> select * from t1 for update wait 10;

######################################## # 在10秒的等待时间内,第一用户解锁 ########################################

SQL> commit;

Commit complete.

######################################## # 第二用户马上查询成功

########################################

C1 C2 ---------- --------- 2

2 09-OCT-08

4、锁定争用

当某个会话请求一条记录或一个对象上的锁定,但是由于其他会话已经获得该记录或对象上的排他锁而无法获得锁定时,这个会话将被挂起。这种现象称为锁定争用。锁定争用会导致数据库的性能急剧恶化。

4.1、锁定争用的原因

* 运行时间很长的事务会导致某些问题。

* 批量处理进程在被不恰当地设计为长事务时也会导致某些问题。 * 第三方用户进程产品会带来过高的锁定级别。

4.2、检测锁定争用

锁定争用是由许多同时访问相同数据的用户导致的。我们可以通过EM或ALTER SYSTEM KILL SESSION命令终止一个会话。

4.3、解决锁定争用

DBA能够通过终止过长时间拥有过多锁定的会话来解决锁定争用问题。

######################################## # 第一个用户锁定表

########################################

SQL> select * from t1 for update;

C1 C2 ---------- --------- 2

2 09-OCT-08

######################################## # 第一个会话修改表

########################################

SQL> update t1 set c2 = sysdate where c1 =2;

这时候会被挂起,我们用EM来查看,方法见上一节:检测锁定争用。

可以看到Session ID:134,Session Serial Number 301阻塞会话。把它KILL掉,就不会有争用了。

######################################## # 第三个会话登录

########################################

SQL> alter system kill session '134, 301';

System altered.

######################################## # 第二个会话执行成功

########################################

2 rows updated. 5、死锁

两个会话相互阻塞,这两个会话都被挂起,每个会话都在等待另一个会话释放其锁定。这种场景称为“死锁(deadlock)”。死锁问题是由 Oracle数据库自动解决的。 OCP 认证考试指南(18):配置数据库的备份与恢复

1、备份与恢复问题

考虑业务需求、性能以及资金成本的最终结果通常是一个折衷的方案。记录这个方案极其重要,记录的形式通常是一个服务级别协议(service level agreemenet)。

服务级别协议与备份和恢复相关的3个方面为:

  

平均失败时间(mean time betwwen failures,简写MTBF) 平均恢复时间(mean time to recover,简写MTTR) 数据损失量

DBA的目标就是减少MTTR和数据损失的同时增加MTBF。

MTBF指的是数据库出现失败的频繁度。Oracle提供两种有助于百分之百可用性的高级选项:RAC和Streams。

MTTR指的是数据库出现失败后的停机时间。 第三个目标将数据的损失量最小化。

2、失败类别

2.1、语句失败

导致语句失败的4个常见原因为:

无效数据(invaild data):这种情况通常是由于违反了格式或完整性约束所造成的。 缺少权限(space management):

空间分配问题:相关的语句失败原因包括:由于表空间已满而无力扩展某个段;耗尽撤销空间;运行使用磁盘排序的查询时临时空间不足;某个用户达到配额;某个对象达到最大区间限制。

逻辑错误(logic error):在某些情况下,编程人员完全可能开发数据库无法运行的代码。

2.2、用户进程失败

用户进程可能由于多种原因而失败,包括:用户并非登出的异常退出;终端的重新启动;导致地址违规的程序。

2.3、网络失败

需要考虑3个方面:侦听器、网络接口卡以及路由。

2.4、用户错误

解决用户错误的理想方式是首先防止这些错误的出现。闪回查询是针对过某时存在的数据所运行的查询。通过使用撤销数据,就可以只为当前会话构造读一致的数据库。

SQL> conn scott/tiger

Connected.

SQL> delete from emp;

14 rows deleted.

SQL> commit;

Commit complete.

SQL> select count(*) from emp;

COUNT(*) ---------- 0

################################################

# 这里的时间1/24是1小时,1/24/60是1分钟,恢复2分钟前被delete的记录 ################################################

SQL> insert into emp select * from emp as of timestamp(sysdate - 2/24/60);

14 rows created.

SQL> commit;

Commit complete.

SQL> select count(*) from emp;

COUNT(*) ---------- 14

SQL> drop table emp;

Table dropped.

SQL> select count(*) from emp; select count(*) from emp

* ERROR at line 1:

ORA-00942: table or view does not exist

SQL> flashback table emp to before drop;

Flashback complete.

SQL> select count(*) from emp;

COUNT(*) ---------- 14

Log Miner是一种从联机和归档的重做日志中抽取信息的高级工具。重做包含数据块发生的所有变化。通过抽取表数据块的变化,可以重新构造所做的变化,所以重做能够用于早先时间的还原备份。如果具有相关日志的副本,那么Log Miner能够返回至先前的任意时刻,闪回查询只能返回至撤销表空间所允许的时刻。

对于修正用户错误来说,不完全恢复与闪回数据库是作用更为显著的方法。

2.5、介质失败

介质失败意味着对磁盘的损坏,因此磁盘上存储的文件会受到损坏。为了应对介质失败,必须生成控制文件、联机重做日志以及归档的重做日志文件的多个副本,此外还必须对控制文件、数据文件以及归档日志文件进行备份。不必备份重做日志,事实上,重做日志在被复制至归档日志时会进行备份。复用并不能保护数据文件,数据文件必须通过硬件冗余受到保护。

2.6、实例失败

实例失败(instance failure)是实例的无序关闭,通常称为崩溃(crash)。断电、关闭或重启服务器以及许多至关重要的硬件问题都会导致实例失败。在后台进程可能失败的某些情况下,也会触发即时的实例失败。其结果都与执行SHUTSOWN ABORT命令的结果相同。

实例失败后,数据库完全可能丢失已提交的事务以及存储未提交的事务,从而使数据库会出现讹误。这是因为服务器进程在内存中进行工作,进程更新了数据库高速缓存区内的数据块与撤销块。而这时候,DBWn进程并没有完全将更新后的数据块写至数据文件。不过LGWR进程尽可能实时地进行写操作。

3、实例恢复

3.1、实例恢复的过程

实例恢复只不过是使用联机日志文件的内容将数据库高速缓存区重新构建至崩溃之前的状态。这个过程将重演从崩溃时未被写至磁盘的数据块的相关重做日志中抽取出的所有变化。完成上述操作后,就能打开数据库。此时,数据库仍然存在讹误,但由于用户看到的实例

已被修复,因此允许用户进行连接。实例恢复的这个阶段称为前滚,该阶段将恢复所有变化。每条重做记录都具有重新构造一个变化所需的最少信息:数据块的地址以及新值。前滚期间,会读取每条重做记录,相应的数据块从数据文件载入数据库高速缓存区,并且应用相应的变化。之后,数据块会被写回磁盘。

实例恢复是自动的和不可避免的,使用STARTUP调用实例恢复。首先,数据库过度到加载模式时,SMON进程会读取控制文件。之后,数据库过度到打开模式时,SMON进程会查看所有数据文件和联机重做日志文件的文件头。此时,如果已经出现实例失败,由于文件头没有全部同步,SMON进程会发现实例失败,从而进入实例恢复例程,数据库只能在前滚阶段结束之后才能被真正地打开。

如果执行了STARTUP命令,那么决不会丢失任何数据。在发生任何崩溃之后,都应当尝试执行STARTUP命令并查看崩溃的程度。

3.2、实例恢复不可能导致数据库出现讹误

因为LGWR进程总是先于DBWn进程进行写操作,并且在提交的同时进行实时的写操作,所以在重做流中始终存在足够的信息,从而能重新构建任何未被写入数据文件的已提交变化以及回滚任何已被写入数据文件的未提交变化。重做与回滚的这种实例恢复机制能够使Oracle数据库绝对不可能出现讹误。

3.3、调整实例恢复

MTTR(各种事件出现之后的平均恢复时间)是许多服务级别协议的一个重要部分。实例恢复能够保证不产生讹误,但是在数据库打开之前需要耗费大量的时间来完成实例恢复的前滚。这个时间取决于两个因素:需要读取的重做数,以及应用重做时需要在数据文件上完成的读/写操作数。这两个因素都受检查点的控制。

检查点()保证了某个特定的时间,DBWn进程将构成一个特定系统更改号(System Change Number,简写为SCN)的所有数据变化都已写入数据文件。在一个实例崩溃事件中,只有SMON进程需要重演从上一个检查点位置开始生成的重做。无论是否被提交,在这个检查点位置之前的所做的全部变化都已被写入数据文件。因此,显然不需要使用重做来重新构造在该检查点位置之前已提交的事务。此外,在这个检查点之前未提交事务所做的变化也会被写入数据文件,因此也不需要重新构造该检查点之前的撤销数据,回滚需要使用的这些数据已经存在于磁盘上的撤销段内。

检查点位置越近,实例恢复就越快。

参数FAST_START_MTTR_TARGET使得实例恢复时间的控制变得十分容易。以秒为单位指定该参数,Oracle随后将确认DBWn进程在实例崩溃后能够以足够快的速度将数据块写至磁盘,从而不会超过指定的秒数。因此,设置的FAST_START_MTTR_TARGET参数值越小,DBWn进程将会更努力的尝试最小化检查点位置与实际时间之间的间隔。须要注意,如果设置了一个不实际的较小值,那到DBWn进程无论如何也不可能达到要求。

SQL> conn system/oracle Connected.

################################################

# fast_start_mttr_target参数设置为0,从而禁用检查点调整功能 ################################################

SQL> alter system set fast_start_mttr_target = 0;

System altered.

################################################ # 建表和启动事务,模拟工作负荷

################################################

SQL> create table t1 as select * from all_objects where 1 = 2;

Table created.

SQL> insert into t1 select * from all_objects;

11185 rows created.

################################################

# 查询显示实例恢复期间需要在数据文件上进行的读/写操作数以及必须处理的重做数据块

# estimated_mttr显示了以秒为单位的实例恢复时间 ################################################

SQL> select recovery_estimated_ios, actual_redo_blks, estimated_mttr 2 from v$instance_recovery;

RECOVERY_ESTIMATED_IOS ACTUAL_REDO_BLKS ESTIMATED_MTTR ---------------------- ---------------- --------------

1311 17326 16

SQL> commit;

Commit complete.

################################################

# 这是提交后的查询,可以看见结果变化不大,因为COMMIT不会对DBWn进程产生影响 ################################################

SQL> select recovery_estimated_ios, actual_redo_blks, estimated_mttr 2 from v$instance_recovery;

RECOVERY_ESTIMATED_IOS ACTUAL_REDO_BLKS ESTIMATED_MTTR ---------------------- ---------------- --------------

1311 17343 16

################################################

# 手动执行检查点进程,可以看到,recovery_estimated_ios、actual_redo_blks已经清零

# estimated_mttr不会变小因为该列的内容不会被实时更新 ################################################

SQL> alter system checkpoint;

System altered.

SQL> select recovery_estimated_ios, actual_redo_blks, estimated_mttr 2 from v$instance_recovery;

RECOVERY_ESTIMATED_IOS ACTUAL_REDO_BLKS ESTIMATED_MTTR ---------------------- ---------------- --------------

10 6 13

OCP 认证考试指南(19):备份Oracle数据库

1、备份工具

直接使用操作系统实用程序copy、cp就可以进行备份操作。但,Oracle强烈建议使用Recovery Manager(恢复管理器,简写RMAN)。

RMAN能够备份数据文件、控制文件、归档日志以及服务器参数文件(spfile)。备份可以被写入磁盘或磁带。

2、概念与术语

2.1、全部备份与部分备份

全部备份(whole backup)是所有数据文件、控制文件以及服务器参数文件的备份。控制文件的所有复用副本都是完全相同的,因此只需要备份其中一个副本。要注意的是,并不需要备份联机重做日志!联机重做日志文件通过复用与可选的归档受到保护。还有,只有用于永久表空间的数据才会被备份。RMAN不能备份临时表空间文件,这些临时文件也不能被置入用于操作系统备份的备份模式。

部分备份(partial backup)包括了一个或多个数据文件以及控制文件。部分备份与数据库的剩余部分肯定不会同步。部分备份只是特定时刻数据库某部分的副本。如果有必要从部分备份中还原一个文件,那么这个文件在能够使用之前必须与数据库的其余部分同步,这意味着需要通过应用归档和联机重做日志文件中的变化使恢复的文件是最新的。

只有在数据库位于archivelog模式时,部分备份才有效。

2.2、完整备份与增量备份

完整备份(full backup)是一个或多个数据文件的一个完整副本。这个副本可以是全部备份,也可以是部分备份。

增量备份(incremental backup)只是数据文件的某些数据块的一个备份,这个备份只包含从最近一次完整备份完成以来被修改或添加的数据块。

无论数据库位于archivelog模式或noarchivelog模式中,增量备份都可以在数据库打开或关闭时进行。不过,只有RMAN才能进行增量备份。

2.3、脱机备份与联机备份

脱机备份(offline backup)是在数据库关闭时生成的备份。 联机备份(online backup)是在数据库正被使用时生成的备份。

联机备份可以是全部备份,也可以是部分备份,并且能够通过使用RMAN或操作系统命令来完成。不过,联机备份只有在数据库位于archivelog 模式中才能进行。在联机备份期间,因为存在额外的磁盘活动,所以数据库性能会退化。

2.4、映像副本与备份集

映像副本(image copy)是某个文件的备份,并且每个字节都与源文件相同。

备份集(backup set)是由RMAN生成的一种专有结构。这是一种由一个或多个被称为片(piece)的物理文件所组成的逻辑结构。备份片包含了一个或多个数据库文件,这些数据库文件可以是数据文件、控制文件或归档日志文件。3种类型文件可以被任意组合在一个备份集内。只有RMAN才能译解备份集格式。

映像副本只能在磁盘上生成;备份集则可以在磁盘或磁带上生成。

数据文件、控制文件与归档日志的映像副本和备份集都可以是联机或脱机备份、全部或部

分备份以及完整或增量备份,并且在archivelog模式和 noarchivelog模式中都可以进行。不过,备份集只能通过RMAN生成或还原。

$ mkdir /u02/oradata/backup

$ rman target system/oracle

Recovery Manager: Release 10.2.0.1.0 - Production on Mon Oct 13 14:56:12 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database: ORA (DBID=1283726968)

RMAN> backup as backupset datafile 2> '/u01/db/oracle/oradata/ora/users01.dbf'

3> format '/u02/oradata/backup/rman_backup_users01.dbf';

Starting backup at 13-OCT-08

using target database control file instead of recovery catalog allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=147 devtype=DISK channel ORA_DISK_1: starting full datafile backupset channel ORA_DISK_1: specifying datafile(s) in backupset

input datafile fno=00004 name=/u01/db/oracle/oradata/ora/users01.dbf channel ORA_DISK_1: starting piece 1 at 13-OCT-08 channel ORA_DISK_1: finished piece 1 at 13-OCT-08 piece handle=/u02/oradata/backup/rman_backup_users01.dbf tag=TAG20081013T145636 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01 Finished backup at 13-OCT-08

3、RMAN的设置

3.1、设备的设置

用于磁盘备份的选项包括:并行度,目标目录,是生成备份集还是生成映像副本。并行度默认为1,这意味着RMAN进程只会产生一个被称为通道(channel)的服务器进程来实际创建备份。选择并行度时,需要考虑CPU数与磁盘子系统的性质。

用于磁带备份的选项指定了磁带设备的数据、磁带库专用的选项以及是否压缩备份表。指定磁带设备的数量相当于为磁盘备份指定并行度。

3.2、备份集的设置

第一个选项Maximum Backup Piece Size,默认情况下,备份片的大小没有限制:整个备份集被物理存储在一个片或文件中。因为RMAN并不备份未用的数据块,所以在知道备份之前无法知道备份集的大小。

3.3、策略的设置

第一个选项是确定生成备份时是否备份控制文件和服务器参数文件。备份上述两种文件通常被认为是一种优秀的策略。通过启用这种自动备份性能,可以确信始终具有上述两种重要文件的最新副本。默认的副本目的地由DB_RECOVERY_FILE_DEST参数决定。

接下来选项为是否通过排除最近一次备份以来未发生变化的文件来最优化备份。

此外还存在是否为加快增量备份启用数据块变化跟踪的选项。

Tablespace Excluded From Whole Database Backup部分允许指定完整备份操作期间不需要备份的一个或多个表空间。

最后一部分是Retention Policy。根据备份保留策略,RMAN可以删除被认为不再需要的备份。

4、调度自动的备份

运行数据库的一个完整备份例子,使用EM执行针对数据库的全面的、完整的联机备份。

选中Whole Database,输入操作系统用户以及相应口令,把下面的勾打上,点击NEXT按钮。

以上全都直接NEXT,都使用默认设置。

启动备份操作。

查看作业的运行。

通过刷新可以看到备份过程。

5、控制文件备份

由于控制文件十分重要,因此还应当采用另一种定期执行的备份选项。用于跟踪的备份会使用CREATE CONTROLFILE命令生成一个控制文件创建脚本。CREATE CONTROLFILE命令的语法与CREATE DATABASE类似。

SQL*Plus中执行BACKUP CONTROLFILE TO TRACE命令可以在USER_DUMP_DEST参数指定的目录中创建一个文件。应当重命名为一个有意义的名称后将其复制安全的位置。只要添加或重命名任何数据文件或联机重做日志文件、创建或删除表空间,都应当备份控制文件。

SQL> alter database backup controlfile to trace;

Database altered.

SQL> show parameter user_dump_dest;

NAME TYPE VALUE

-------------------------- ----------- ------------------------------

user_dump_dest string /u01/db/oracle/admin/ora/udump

SQL> exit

$ cd /u01/db/oracle/admin/ora/udump $ ls -ltr

最后一个文件,就是我们才备份的最新的文件。用vi打开,可以看到中间有一段很重要的部分。

CREATE CONTROLFILE REUSE DATABASE \"ORA\" NORESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 (

'/u01/db/oracle/oradata/ora/redo01.log', '/u01/db/oracle/oradata/ora/redo01b.log' ) SIZE 50M, GROUP 2 (

'/u01/db/oracle/oradata/ora/redo02.log', '/u01/db/oracle/oradata/ora/redo02b.log' ) SIZE 50M, GROUP 3 (

'/u01/db/oracle/oradata/ora/redo03.log', '/u01/db/oracle/oradata/ora/redo03b.log' ) SIZE 50M

-- STANDBY LOGFILE DATAFILE

'/u01/db/oracle/oradata/ora/system01.dbf', '/u01/db/oracle/oradata/ora/undotbs01.dbf', '/u01/db/oracle/oradata/ora/sysaux01.dbf', '/u01/db/oracle/oradata/ora/users01.dbf', '/ora02/oradata/ocp/mydemo.dbf', '/ora02/oradata/ocp/ats.dbf', '/ora02/oradata/ocp/bts.dbf', '/ora02/oradata/ocp/cts.dbf' CHARACTER SET WE8ISO8859P1;

6、管理RMAN备份

上图概述了4个备份集的信息,这4个备份集的Key分别是1、2、3、4。备份集2和3一同构成了数据文件、控制文件以及服务器参数文件的完整备份。

Catalog Additional Files按钮会将使用操作系统实用程序所生成的备份告知RMAN。 Crosscheck All按钮会指示RMAN查看所创建的备份集与映像副本实际上是否仍然可用。 Delete All Expired按钮能够删除对交叉检查发现丢失的备份的所有引用。 Delete All Obsolete按钮可以删除遵循保留策略但不再需要的所有备份。

7、默认的备份目的地

闪回恢复区基于磁盘的存储结构。闪回恢复区被用作存储与恢复相关的数据的默认位置,包括:控制文件和联机重做日志文件的复用副本;归档日志目的地;RMAN备份集与映像

副本;闪回日志。闪回恢复区受

DB_RECOVERY_FILE_DEST和

DB_RECOVERY_FILE_SIZE参数的控制。两个参数是静态的。

一旦写至闪回恢复区的大量数据到达所指定的大小,就可能会出现问题。在archivelog模式中,Oracle不允许重写尚未被归档的联机日志文件。

SQL> select * from v$recovery_file_dest; NAME

-------------------------------------------------------------------

SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES ----------- ---------- ----------------- --------------- /u01/db/oracle/flash_recovery_area

2147483648 440984064 0 3 OCP 认证考试指南(20):恢复Oracle数据库 1、恢复结构与进程

在介质失败后,根据受损文件的类型,存在不同的恢复方法。数据库由控制文件、联机重做日志文件以及数据文件组成。如果复用了控制文件或联机重做日志文件,那么恢复受损的这些文件十分容易。

对于受损的控制文件,可以将其替换为某个复用副本,也可以使用CREATE CONTROLFILE命令重建。

受损的联机重做日志文件可以被重新生成。Oracle提供了一个ALTER DATABASE CLEAR LOGFILE GROUP #(#代表受损成员的日志文件组号)命令,使用这个命令可以删除与重建某个日志文件组的成员。如果数据库在archivelog模式中运行,那么日志文件组必须在Oracle允许执行清除日志文件命令之前已被归档。上述命令的一种变化是ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP #,执行这个命令可以删除和重建一个即时已被成功归档的日志文件,但执行之后必须对整个数据库进行备份。

恢复受损数据文件需要使用备份与归档日志。在导致某个数据文件受损的介质失败之后,存在下列两种恢复选项:完全恢复,不会丢失任何数据;不完全恢复,通过在完成之前停止恢复进程来故意丢失一些数据。不完全恢复是一个高级过程;完全恢复是一个两阶段过程:首先,必须从备份中还原受损文件;之后,必须使用归档日志文件中的信息将数据库提前至被还原的文件与数据库其余部分同步的时刻,从而恢复这个文件。

在Oracle环境中,“还原”意味着使用备份替换受损的或丢失的文件,“恢复”意味着通过使用归档日志来同步受损文件与数据库的剩余部分。

因为RMAN从不备份联机重做日志,所以RMAN无法用于恢复受损的联机日志文件。RMAN能够还原与恢复控制文件和数据文件。

为了打开数据库,所有控制文件副本、每个联机日志文件组的至少一个成员以及所有联机数据文件都必须存在且同步。如果SMON进程在启动期间发现情况并非如此,那么启动就不会完成。如果某个控制文件副本受损或丢失,那么启动会停止在NOMOUNT模式中,告警日志中会写下受损控制文件副本的详细信息。假如控制文件没有任何问题,SMON进程会将继续打开数据库。

如果一个或多个数据文件是通过备份还原的,那么这些文件几乎肯定已过期较长时间,联机重做日志也无法返回至恢复上述文件的时间。此时,我们必须使用归档日志文件来进行恢复,这是一个必须手动启动的过程。

如果在数据库打开时出现介质损坏,那结果取决于受影响的文件。任何控制文件副本受损都会导致实例立即终止。作为SYSTEM表空间或活动的撤销表空间一部分的数据文件受损也会造成同样的结果。但是,在联机日志受损时,只要日志文件组中存在幸存的成员,那么就不会造成实例的终止。

和备份一样,RMAN也可以完成还原操作。如果RMAN备份操作生成的是备份集而非映像副本,那就只能使用RMAN进行还原操作,否则无法从备份集中抽取出数据文件。SQL*Plus命令或RMAN可以完成还原之后的恢复操作,但此时存在同样的限制,只有使用RMAN才能从备份集中抽取出归档日志。

2、介质失败后的恢复

2.1、恢复受损的复用控制文件

只要存在幸存的复用控制文件的副本,恢复丢失的控制文件就十分简单:只需要将其替换为幸存的控制文件副本。

控制文件受损,实例会立即终止。第一反应仍然是尝试启动崩溃的实例。启动在NOMOUNT模式中失败,同时会给出错误消息。

我们有3个选择:

第一选择,编辑参数文件,从而删除对受损或丢失的控制文件的引用。,能够解决问题,但数据库会在缺少一个复用控制文件副本的情况下运行,可能违背了指定的安全性原则。 第二选择,使用幸存的控制文件副本来替换受损的文件。

第三选择,修改CONTROL_FILES初始化参数,将对受损文件的引用替换为对某个新文件的引用,并将这个新文件复制为幸存的控制文件副本。

恢复受损的控制文件时必须数据库停机,这个操作无法在联机状态下完成。

做个例子试着恢复受损的控制文件

SQL> select * from v$controlfile;

STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS ------- ------------------------------ --- ---------- --------------

/u02/oradata/ora/control01.ctl NO 16384 430 /u02/oradata/ora/control02.ctl NO 16384 430 /u02/oradata/ora/control03.ctl NO 16384 430

SQL> shutdown Database closed. Database dismounted. ORACLE instance shut down.

SQL> exit

进入root,把这3个控制文件,剪切到别的地方。

$ su - root 口令:

# mv /u02/oradata/ora/control01.ctl /control01.ctl; # mv /u02/oradata/ora/control02.ctl /control02.ctl; # mv /u02/oradata/ora/control03.ctl /control03.ctl; # su - oracle

再尝试启动Oracle,失败!之后,我们进入恢复操作。

$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Oct 14 23:44:41 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup

ORACLE instance started.

Total System Global Area 264241152 bytes Fixed Size 1218868 bytes Variable Size 79693516 bytes Database Buffers 180355072 bytes Redo Buffers 2973696 bytes

ORA-00205: error in identifying control file,check alert log for more info

SQL> shutdown

ORA-01507: database not mounted

ORACLE instance shut down. SQL> startup nomount ORACLE instance started.

Total System Global Area 264241152 bytes Fixed Size 1218868 bytes Variable Size 79693516 bytes Database Buffers 180355072 bytes Redo Buffers 2973696 bytes

SQL> alter system set

2 control_files = '/u02/oradata/ora/control01.ctl' 3 scope = spfile;

System altered.

SQL> shutdown

ORA-01507: database not mounted

ORACLE instance shut down. SQL> startup

ORACLE instance started.

Total System Global Area 264241152 bytes Fixed Size 1218868 bytes Variable Size 79693516 bytes Database Buffers 180355072 bytes Redo Buffers 2973696 bytes Database mounted. Database opened.

SQL> select * from v$controlfile;

STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS ------- ------------------------------ --- ---------- --------------

/u02/oradata/ora/control01.ctl NO 16384 430

2.2、恢复受损的复用联机重做日志文件

如果希望在数据库打开时恢复受损的复用联机重做日志文件,那么需要使用ALTER DATABASE CLEAR LOGFILE命令删除已有的日志文件,并且创建新的文件。上述操作只

在这些日志文件不活动时进行。如果试图清空当前的日志文件组,或前一个日志文件组仍然是活动的,就会接收到出错消息。此外,如果数据库位于archivelog模式,日志文件组必须已归档。

尝试恢复受损的复用联机日志文件

SQL> conn / as sysdba Connected.

SQL> select group#, status, member from v$logfile order by group#;

GROUP# STATUS MEMBER

---------- ------- ---------------------------------------- 1 /u01/db/oracle/oradata/ora/redo01.log 1 /u01/db/oracle/oradata/ora/redo01b.log 2 STALE /u01/db/oracle/oradata/ora/redo02b.log 2 STALE /u01/db/oracle/oradata/ora/redo02.log 3 STALE /u01/db/oracle/oradata/ora/redo03b.log 3 STALE /u01/db/oracle/oradata/ora/redo03.log

6 rows selected.

##########################################

# 以上查询,STATUS列不为NULL,可以执行下面命令多次,让日志文件组完成一次循环

##########################################

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> select group#, status, member from v$logfile order by group#;

GROUP# STATUS MEMBER

---------- ------- ---------------------------------------- 1 /u01/db/oracle/oradata/ora/redo01.log 1 /u01/db/oracle/oradata/ora/redo01b.log 2 /u01/db/oracle/oradata/ora/redo02b.log 2 /u01/db/oracle/oradata/ora/redo02.log

3 /u01/db/oracle/oradata/ora/redo03b.log 3 /u01/db/oracle/oradata/ora/redo03.log

6 rows selected.

SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down.

SQL> host rm /u01/db/oracle/oradata/ora/redo01.log;

SQL> startup

ORACLE instance started.

Total System Global Area 264241152 bytes Fixed Size 1218868 bytes Variable Size 79693516 bytes Database Buffers 180355072 bytes Redo Buffers 2973696 bytes Database mounted. Database opened.

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> select group#, status, member from v$logfile order by group#;

GROUP# STATUS MEMBER

---------- ------- ---------------------------------------- 1 INVALID /u01/db/oracle/oradata/ora/redo01.log 1 /u01/db/oracle/oradata/ora/redo01b.log 2 /u01/db/oracle/oradata/ora/redo02b.log 2 /u01/db/oracle/oradata/ora/redo02.log 3 /u01/db/oracle/oradata/ora/redo03b.log 3 /u01/db/oracle/oradata/ora/redo03.log

6 rows selected.

可以看到,丢失的文件的此时被标记为INVALID。我们通过EM来让它可以使用。

选择Redo Log Group点击GO后,会把Redo Log显示出来。

在Actions下拉列表选中Clear Logfile选项,日志单选按钮选中无效的1,点击GO。

SQL> select group#, status, member from v$logfile order by group#;

GROUP# STATUS MEMBER

---------- ------- ---------------------------------------- 1 /u01/db/oracle/oradata/ora/redo01.log 1 /u01/db/oracle/oradata/ora/redo01b.log 2 /u01/db/oracle/oradata/ora/redo02b.log 2 /u01/db/oracle/oradata/ora/redo02.log 3 /u01/db/oracle/oradata/ora/redo03b.log 3 /u01/db/oracle/oradata/ora/redo03.log

6 rows selected.

3、恢复受损的数据文件

如果介质失败导致一个或多个数据文件受到损坏,就需要使用还原与恢复:必须先还原数据文件的一个备份,再应用归档日志同步数据文件与数据库的其余部分。根据数据库是否位于archivelog模式中、受损文件是运行Oracle所需的重要文件还是“只”包含用户数据的非重要文件,恢复数据文件时存在多种可用的选项。

3.1、noarchivelog模式中数据文件的恢复

因为不存在恢复所需的归档日志文件,所以在noarchivelog模式中无法执行恢复操作。因此,只能完成还原操作。如果没有通过应用归档重做日志文件来同步一个被还原的数据文件与数据库的其余部分,数据库就不能被打开。因此,noarchivelog模式中的唯一选项是还

原整个数据库(包括所有数据文件以及控制文件)。

因为RMAN不会备份联机重做日志文件,所以在执行完整的还原操作之后,数据库仍然会丢失这些文件。因为这个,还原之后的启动操作会失败,数据库将停止在加载模式中。因为位于加载模式,所以可以通过执行ALTER DATABASE CLEAR LOGFILE GROUP 命令重建所有日志文件组。之后,数据库会被打开。

3.2、archivelog模式中非重要文件的恢复

Oracle中组成SYSTEM表空间以及当前活动的撤销表空间(由UNDO_TABLESPACE参数决定)的数据文件被视为“重要文件”。任何重要的数据文件受损都会导致实例立即终止。

如果备份是使用RMAN生成的,那么受损数据文件的还原与恢复操作是完全自动的。只有在最近一次备份之后生成的所有归档日志文件都可用的情况下,才可以成功地完成数据文件的还原与完全恢复操作。

3.3、恢复受损的重要数据文件

重要的数据文件应当位于具有硬件冗余的磁盘系统中,从而在出现介质失败时保证这些文件能够幸存以及数据库保持打开状态。

重要数据文件与非重要数据文件的还原和恢复完全相同,不过重要数据文件应当在加载模式中完成还原和恢复。

重要数据文件受损并不意味着丢失数据,而是意味着会损失时间。

OCP 认证考试指南(21):管理Oracle数据库中的全球化特性

1、全球化特性

1.1、字符集

字符集(charcater set)是一种用于将字符表示为比特序列的定义编码模式。它由许多已定义的不同字符组成。

我们至少需要大写字母、小写字母、0~9的数字、某些标点符号以及特殊的字符。一个7比特字符集能够表示的字符总数为127(27);8 比特字符集能够表示256(28)个不同的字符。

1.2、语言支持

Oracle所支持的语言种类取决于平台、版本以及产品的补丁程序级别。为了决定任何一个安装软件的可用范围,查以查询 V$NLS_VALID_VALUES视图。

SQL> select * from v$nls_valid_values 2 where parameter = 'LANGUAGE';

PARAMETER VALUE ISDEP ---------- ---------- ----- LANGUAGE AMERICAN FALSE LANGUAGE GERMAN FALSE LANGUAGE FRENCH FALSE LANGUAGE BENGALI TRUE ......

64 rows selected.

Oracle使用的语言决定了显示错误消息的语言,并且设置了默认的日期语言与排序顺序。

1.3、地区支持

选中某个地区可以默认设置许多全球化特性。为了确定数据库所支持的地区,同样可以查询V$NLS_VALID_VALUES视图。

SQL> select * from v$nls_valid_values 2 where parameter = 'TERRITORY';

PARAMETER VALUE ISDEP ---------- ---------- ----- TERRITORY AMERICA FALSE TERRITORY GERMANY FALSE TERRITORY FRANCE FALSE TERRITORY CANADA FALSE TERRITORY SPAIN FALSE TERRITORY ITALY FALSE ......

96 rows selected.

选择地区还可以默认设置日期和周的编号、收支符号、日期格式、小数点分隔符与组分隔符以及货币符号。下面给出与地区相关的设置的默认值。

与地区相关的设置的默认值

NLS_TERRITORY AMERICA / 地理位置 NLS_CURRENCY $ / 当地货币符号

NLS_DUAL_CURRENCY $ / 指定地区次要货币符号 NLS_ISO_CURRENCY AMERICA / 指定ISO地区货币符号 NLS_DATE_FORMAT DD-MM-RR / DATE数据类型列所使用的格式 NLS_NUMERIC_CHARACTERS ., / 小数点分隔符与组分隔符

NLS_TIMESTAMP_FORMAT DD-MM-RRHH.MI.SSXFF AM / 是TIMESTAMP数据类型列所使用的格式

NLS_TIMESTAMP_TZ_FORMAT DD-MM-RRHH.MI.SSXFF AM TZR / 是TIMESTAMP WITH LOCAL TIMEZONE数据类型列所使用的格式

SQL> alter session set nls_territory = 'AMERICA';

Session altered.

SQL> select systimestamp from dual;

SYSTIMESTAMP

------------------------------------------------------------ 16-OCT-08 12.24.59.641297 AM +08:00

SQL> alter session set nls_territory = 'GERMANY';

Session altered.

SQL> select systimestamp from dual;

SYSTIMESTAMP

------------------------------------------------------------ 16.10.08 00:25:28,960439 +08:00

SQL> alter session set nls_territory = 'CHINA';

Session altered.

SQL> select systimestamp from dual;

SYSTIMESTAMP

------------------------------------------------------------ 16-OCT-08 12.26.03.817205 AM +08:00

2、使用全球化支持功能

可以在下列任意级别上或所有5个级别上指定全球化。

   

数据库 实例 客户机环境 会话

 语句

这些级别按从低到高的优先级顺序列出。

须要记住能够指定全球化的各种级别的优先顺序。在服务器端,实例设置优先于数据库设置,但是服务器上的所有相关设置都会被客户端重写,从低到高的级别优先顺序为:客户端环境、会话级别、语句级别。

2.1、选择字符集

在数据库创建阶段,选择字符集是我们需要作出的最重要的两个决定之一。创建阶段中必须正确完成的两个设置,DB_BLOCK_SIZE参数(这个参数值绝对不能改变)与数据库字符集(理论上可以被改变,事实上不可行)。

2.2、改变数据库字符集

Oracle提供了上列两种有助于决定字符集修改的工具:数据库字符集扫描程序(Database Character Set Scanner)和语言与字符集文件扫描程序(Language and Character Set File Scanner)。

csscan system/liguanghu full=y tochar=utf8

以SYSTEM连接数据库,通过扫描所有数据文件来查看转换至UTF8是否会导致若干问题。为了使数据库能够运行数据库字符集扫描程序,必须首先运行csminst.sql脚本。

判断能够无损地改变数据库字符集后,可以通过执行ALTER DATABASE CHARACTER SET „命令来完成字符集的修改。

2.3、数据库内的全球化

在数据库创建阶段,根据执行CREATE DATABASE命令以及指定字符集所影响的实例参数就可以确定数据库的全球化设置。

SQL> select * from nls_database_parameters;

PARAMETER VALUE

------------------------------ ------------------------------------- NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_NUMERIC_CHARACTERS .,

NLS_CHARACTERSET WE8ISO8859P1 NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_SORT BINARY NLS_TIME_FORMAT HH.MI.SSXFF AM

PARAMETER VALUE

------------------------------ ------------------------------------- NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR NLS_DUAL_CURRENCY $

NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_RDBMS_VERSION 10.2.0.1.0

20 rows selected.

2.4、实例级别的全球化

实例参数设置会重写数据库设置。在RAC环境中,不同的实例可以具有不同的设置。全球化参数是静态的。

2.5、客户端环境设置

NLS_LANG是一个关键的环境变量。完整规范包括语言、地区以及字符集。

2.6、会话级别的全球化设置

一旦完成连接,用户就可以通过执行ALTER SESSION命令来建立自己的全球化首选项。补充软件包DBMS_SESSION可以代替ALTER SESSION命令。

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> select sysdate from dual; SYSDATE ----------

16.10.2008

SQL> execute dbms_session.set_nls('nls_date_format','''yyyy-MM-dd''');

PL/SQL procedure successfully completed.

SQL> select sysdate from dual; SYSDATE ---------- 2008-10-16

2.7、语句级别的全球化设置

全球化设置的最优控制级别是在语句内进行编程控制,此时必然会在SQL函数中使用NLS参数。

SQL> select

2 to_char(hiredate,'Day dd, Month YYYY', 'NLS_DATE_LANGUAGE=DUTCH'), 3 to_char(hiredate,'Day dd, Month YYYY', 'NLS_DATE_LANGUAGE=GERMAN') 4 from scott.emp;

TO_CHAR(HIREDATE,'DAYDD,MONT TO_CHAR(HIREDATE,'DAYDD,MONTH ---------------------------- ----------------------------- Woensdag 17, December 1980 Mittwoch 17, Dezember 1980 Vrijdag 20, Februari 1981 Freitag 20, Februar 1981 Zondag 22, Februari 1981 Sonntag 22, Februar 1981 Donderdag 02, April 1981 Donnerstag 02, April 1981 Maandag 28, September 1981 Montag 28, September 1981 Vrijdag 01, Mei 1981 Freitag 01, Mai 1981 Dinsdag 09, Juni 1981 Dienstag 09, Juni 1981 Zondag 19, April 1987 Sonntag 19, April 1987 Dinsdag 17, November 1981 Dienstag 17, November 1981 Dinsdag 08, September 1981 Dienstag 08, September 1981 Zaterdag 23, Mei 1987 Samstag 23, Mai 1987

SQL函数是能够在数据类型之间进行转换的类型强制转换函数。根据所使用的类型强制转换函数可以使用各种参数。

3、语言排序与选择

Oracle默认使用二进制排序。要排序的串从左至右被读取,并且每个字符都简化为它的ASCII(或EBCDIC)数字值。

4、Locale Builder

Locale Builder是一个图形工具,这个工具能够通过为语言、地区、字符集以及语言排序生成定义而创建自定义的全球化环境。

$ $ORACLE_HOME/nls/lbuilder/lduilder

5、使用时区

使用CREATE DATABASE命令创建数据库时能设置数据库时区,之后可以使用ALTER DATABASE SET TIME_ZONE = „命令进行调整。没有设置,默认为主机操作系统的时区。客户机时区默认为客户机操作系统的时区,此外使用ORA_STDZ环境变量也可以设置客户机时区。会话内,全用ALTER SESSION SET TIME_ZONE = „命令也可以设置时区。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrd.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务