Oracle程序开发范例宝典
上QQ阅读APP看书,第一时间看更新

第3章 表及表空间基本操作

数据表对象

数据表的常用操作

表空间的常用操作

撤销表空间的使用

使用临时表空间

实例043 创建一个学生档案信息表students

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\043

实例说明

本实例创建了一个学生档案信息表 students,该表包括了学生编号、学生姓名、性别、年龄、系别编号、班级编号和建档日期等信息。用户在创建students表后,可以通过DESCRIBE命令查看表的描述。

本例运行结果如图3.1所示。

图3.1 创建students表后,查询students表的结构

技术要点

在讲解如何创建数据表之前,首先介绍下数据表。

在关系型数据库中,数据表可以对应于现实世界中的实体(如雇员、岗位等)或联系(如雇员工资)。在进行数据库设计时,需要首先设计E-R图(实体联系图),然后再将E-R图转变为数据库中的表。

从用户的角度来看,数据表的逻辑结构是一张二维的平面表,即表由纵向的标记——列和横向的标记——行两部分组成。表通过行和列来组织数据。通常称表中的一行为一条记录,表中的一列为属性列。一条记录描述一个实体,一个属性列描述实体的一个属性。例如,雇员有雇员编号、雇员姓名、雇员岗位等属性,学生有学生编号、姓名、所在学校等属性。每个列都具有列名、列数据类型、列长度,可能还有约束条件、默认值等,这些内容在创建表时即被确定。

在Oracle中,有多种类型的表。不同类型的表各有一些特殊的属性。适应于保存某种特殊的数据,进行某些特殊的操作,即在某些方面可能比其他类型的表性能更好,如处理速度更快、占用磁盘空间更少。

表一般指的是一个关系表,也可以生成对象表及临时表。其中,对象表是通过用户定义的数据类型生成的,临时表用于存储专用于某个事务或者会话的临时数据。

表是最常见的一种组织数据的方式,一张表一般都具有多个列(即多个字段)。每个字段都具有特定的属性,包括字段名、数据类型、字段长度、约束、默认值等,这些属性在创建表时被确定。从用户的角度来看,数据库中数据的逻辑结构是一张二维的平面表,在表中通过行和列来组织数据。在表中每一行存放一条信息,通常称表中的一行为一条记录。

创建表通常使用 CREATE TABLE 语句。如果用户在自己的模式中创建一个表,则用户必须具有CREATE TABLE 系统权限。创建表通常使用CREATE TABLE 语句。如果用户在自己的模式中创建一个表,则用户必须具有CREATE TABLE 系统权限。

用户在创建students表后,可以通过DESCRIBE命令查看表的描述。

例如,使用describe命令查看新创建的students表的数据结构,代码如下:

SQL> describe students;

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用create table 创建表。

(3)主要程序代码如下:

SQL> create table students(

stuno number(10) not null,     --学号

stuname varchar2(8),       --姓名

sex char(2),          --性别

age int,           --年龄

departno varchar2(2) not null,    --系别编号

classno varchar2(4) not null,     --班级编号

regdate date default sysdate     --建档日期

);

(4)使用describe命令查看新创建的students表的数据结构,代码如下:

SQL> describe students;

运行结果如图3.2所示。

图3.2 查询students表的结构

举一反三

根据本实例,读者可以进行以下操作。

创建一个学生成绩表grade。

创建一个员工工资信息表salary。

实例044 创建students表的一个副本

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\044

实例说明

本实例要求在HR模式下,通过一条简单的SQL语句创建employees表的一个副本,查询完毕之后,再查看该表的数据结构。程序运行结果如图3.3所示。

图3.3 创建students表的一个副本

技术要点

当使用CREATE TABLE AS SELECT 语句创建表时,Oracle 将通过从students 表中复制列来建立表。在创建表后,Oracle就会使用从SELECT语句中返回的行来填充新表。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用create table…as…创建students 表的副本。

(3)主要程序代码如下:

SQL> create table students_2

as select *

from students;

举一反三

根据本实例,读者可以进行以下操作。

创建Books_1表的一个副本。

创建employees表的副本。

实例045 用alter table命令修改字段

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\045

实例说明

除了在表中增加和删除字段外,还可以根据实际情况修改字段的有关属性,包括修改字段的数据类型的长度、数字列的精度、列的数据类型和列的默认值等。本实例将 students_6 表中的departno字段的长度由2更改为4。使用desc命令查看修改后students_6表的DEPARTNO字段的长度,如图3.4所示,可以看到其长度由2变为4。

图3.4 修改departno字段的长度为4

技术要点

修改字段通常使用ALTER TABLE…MODIFY 语句,其语法格式如下:

alter table table_name modify column_name column_property

● table_name:表示要修改的列所在的表名称。

● column_name:要修改的列名称。

● column_property:要修改列的属性,包括数据类型的长度、数字列的精度、列的数据类型和列的默认值等。

这里需要注意的是,用户在修改字段时,并不可以随意修改。通常情况下,把某种数据类型改变为兼容的数据类型时,只能把数据的长度从低向高改变,不能从高向低改变,否则会出现数据溢出情况,影响原有数据的精度。如果表中没有数据时,用户既可以把数据的长度从高向地改变,也可以把某种数据类型改变为另外一种数据类型。

说明:修改某个字段的默认值只对今后的插入操作起作用,对于先前已经插入的数据并不起作用。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用alter table 修改字段。

(3)主要程序代码如下:

SQL> alter table students_6 modify departno varchar2(4);

表已更改。

举一反三

根据本实例,读者可以进行以下操作。

将students_6表中的departno字段的长度由4更改为6。

将students_6表中的stuname字段的长度由8更改为12

实例046 用alter table命令删除字段

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\046

实例说明

既然可以为数据表添加字段,自然也可以删除数据表中的指定字段,本实例实现了在students_6表中删除province(省份)这个字段。删除province字段后,使用desc命令查看该表结构,如图3.5所示,PROVINCE字段不存在了。

图3.5 删除PROVINCE字段后student_6表的结构

技术要点

本实例是通过ALTER TABLE…DROP 语句删除表中的指定字段。但是不能删除表中所有的字段。也不能删除SYS模式中任何表的字段。如果仅需要删除一个字段,则必须在字段名前指定COLUMN关键字。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用alter table…drop 删除字段。

(3)主要程序代码如下:

SQL> alter table students_6 drop column province;

表已更改。

举一反三

根据本实例,读者可以进行以下操作。

在students_6表中删除classno字段。

在students_6表中同时删除sex和age字段。

实例047 用alter table命令增加新字段

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\047

实例说明

在创建表后,可能会需要根据应用需求的变化向表中增加或删除列,本实例在 students_6表中增加一个province(省份)新字段。

技术要点

用户可以使用ALTER TABLE…ADD 语句能够向表中添加新的字段。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用alter table…add 命令增加新字段。

(3)主要程序代码与结果如下:

SQL> alter table students_6 add(province varchar2(10));

表已更改。

在为student_6添加了新的字段之后,用户可以使用desc命令来查看该表的结构,如图3.6所示,最后一个字段(PROVINCE)就是新添加的字段。

图3.6 增加PROVINCE字段后student_6表的结构

举一反三

根据本实例,读者可以进行以下操作。

在students_6表中增加一个Grade(成绩)新字段。

在students_6表中同时增加MathGrade(数学成绩)和EngGrade(英语成绩)两个字段。

实例048 用alter table命令重命名表名

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\048

实例说明

在创建表后,用户可以修改指定表的名称,但用户只能对自己模式中的表进行重命名。本实例要求将students_6表重命名为students_7。实例运行结果如图3.7所示。

图3.7 用alter table命令重命名表名

技术要点

重命名表通常使用ALTER TABLE…RENAME 语句,其语法格式如下:

alter table table_old_name rename to table_new_name

● table_old_name:表示原表名称。

● table_new_name:表示新表名称。

对表进行重命名非常容易,但是影响却非常大,在对表的名称进行修改时要格外小心。虽然Oracle可以自动更新数据字典中的外键、约束定义以及表关系,但是它不能更新数据库中的存储过程、客户应用以及依赖该对象的其他对象。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用alter table…rename 命令将students_6 表重命名为students_7。

(3)主要程序代码如下:

SQL> alter table students_6 rename to students_7;

举一反三

根据本实例,读者可以进行以下操作。

将students_7表重命名为students_8。

实例049 用alter table命令修改表空间

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\049

实例说明

在创建表时,可以通过一些参数指定表的表空间、存储参数等,当然也可以不指定参数而使用默认值。在创建表之后,如果发现这些参数设置得不合适,管理员可以对其进行修改。接下来就讲解在维护数据表时经常遇到的两种修改数据表参数的情况——改变表空间和存储参数。本实例介绍如何改变表空间,将students_6表由tbsp_1表空间移动到tbsp_2表空间。实例运行结果如图3.8所示。

图3.8 用alter table命令修改表空间

技术要点

若要将一个“非分区”表移动到一个新的表空间,则可以使用 ALTER TABLE…MOVE TABLESPACE语句。

说明:由于表空间对应的数据文件不同,所以在移动表空间时会将数据在物理上移动到另一个数据文件。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用ALTER TABLE…MOVE TABLESPACE语句将students_6表由tbsp_1表空间移动到tbsp_2表空间。

(3)主要程序代码如下:

SQL> alter table students_6 move tablespace tbsp_2;

(4)在user_tables数据字典中查询students_6现在所在的表空间,如图3.9所示,现在的表空间为TBSP_2。

图3.9 查询students_6表所在的新表空间

举一反三

根据本实例,读者可以进行以下操作。

将students_3表由tbsp_1表空间移动到tbsp_2表空间。

实例050 使用存储参数为表分配第一个盘区的大小

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\050

实例说明

在存储参数中,主要是设置INITIAL参数。该参数用于为表指定分配的第一个盘区大小。本实例创建一个用于存储学生档案信息的students_3数据表,并通过storage子句中的initial存储参数为该表分配第一个盘区的大小。运行结果如图3.10所示。

图3.10 使用存储参数为表分配第一个盘区的大小

技术要点

当用户在Oracle中创建表时,Oracle允许用户指定该表如何使用磁盘上的存储空间。如果仅为表指定了表空间,而没有设置存储参数,则该表将采用其所属表空间的默认存储参数。然而,表空间的默认存储参数不一定对表空间中的每一个表都适用,因此,当表所需要的存储参数与表空间的默认存储参数不匹配时,需要用户在创建表时显式指定存储参数以替换表空间的默认存储参数。

在创建表时,可以通过使用STORAGE子句来设置存储参数,这样可以控制表中盘区的分配管理方式。对于本地化管理的表空间而言,如果指定盘区的管理方式为AUTOALLOCATE(即自动化管理),则可以在STORAGE子句中指定INITIAL、NEXT和MINEXTENTS这3个存储参数,Oracle将根据这3个存储参数的值为表分配的数据段初始化盘区大小,以后盘区的分配将由 Oracle 自动管理。如果指定的盘区管理方式为 UNIFORM(即等同大小管理),这时不能为表指定任何STORAGE子句,盘区的大小将是统一大小。

参数NEXT用于指定为存储表中的数据分配的第二个盘区大小。该参数在字典管理的表空间中起作用,而在本地化管理的表空间中不再起作用,因为随后分配的盘区将由Oracle自动决定其大小。参数MINEXTENTS用于指定允许为表中的数据所分配的最小盘区数目,同样在本地化管理的表空间中该参数也不再起作用。因此,在存储参数中,主要是设置INITIAL参数。该参数用于为表指定分配的第一个盘区大小,以KB或MB为单位。当为已知大小的数据建立表时,可以将INITIAL设置为一个可以容纳所有数据的数值,这样可以将表中所有数据存储在一个盘区从而避免产生碎片。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)通过storage子句中的initial存储参数为该表分配第一个盘区的大小。

(3)主要程序代码及运行结果如下:

SQL> create table students_3(

stuno number(10) not null,      --学号

stuname varchar2(8),       --姓名

sex char(2),          --性别

age int,            --年龄

departno varchar2(2) not null,     --系别编号

classno varchar2(4) not null,     --班级编号

regdate date default sysdate     --建档日期

)tablespace tbsp_1        --表空间

storage(initial 256k);       --指定为该表分配的第一个盘区的大小

表已创建。

举一反三

根据本实例,读者可以进行以下操作。

创建一个用于存储学生档案信息的students_2数据表,并通过storage子句中的initial存储参数为该表分配第一个盘区的大小。

实例051 查询表STUDENTS_3的第一个盘区的大小

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\051

实例说明

在USER_TABLES数据字典表中查询表STUDENTS_3的第一个盘区的大小。运行结果如图3.11所示。

图3.11 查询表STUDENTS_3的第一个盘区的大小

技术要点

如果用户要查看students_3表的存储参数情况,可以通过查询USER_TABLES来实现。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)通过USER_TABLES来查询students_3表的存储参数情况。

(3)主要程序代码及运行结果如下:

SQL> select initial_extent

from user_tables

where table_name = 'STUDENTS_3';

INITIAL_EXTENT

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

262144

举一反三

根据本实例,读者可以进行以下操作。

查询表STUDENTS_2的第一个盘区的大小。

实例052 创建student_4数据表,并设置其PCTFREE和PCTUSED参数分别为20和40

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\052

实例说明

在CREATE TABLE 语句中,可以通过PCTFREE 和PCTUSED 子句来设置相应的参数。本实例创建了student_4数据表,并设置其PCTFREE和PCTUSED参数分别为20和40。运行结果如图3.12所示。

图3.12 创建student_4数据表,并设置其PCTFREE和PCTUSED参数分别为20和40

技术要点

PCTFREE和PCTUSED,这两个参数用于控制数据块中空闲空间的使用方法。

对于本地化管理的表空间而言,如果使用SEGMENT SPACE MANAGEMENT 子句设置段的管理方式为AUTO(自动),则Oracle会对数据库的空闲空间进行自动管理。对于这种情况,不需要用户设置数据块管理参数PCTFREE和PCTUSED。

如果表空间的段管理方式为SEGMENT SPACE MANAGEMENT MANUAL(手动管理),则用户可以通过设置PCTFREE与PCTUSED参数对数据块中的空闲空间手工管理。其中, PCTFREE用于指定数据库中必须保留的最小空闲空间比例,当数据块达到 PCTFREE参数的限制后,该数据块将被标记为不可用,默认值为 10。例如,如果在 CREATE TABLE 语句中指定 PCTFREE 为 30,则说明对于该表的数据段,系统将会保留 30%的空闲空间,这些空闲空间将用于保存更新记录时增加的数据。很显然,PCTFREE参数值越小,为现有数据行更新所预留的空间越少。如果 PCTFREE 参数值设置得过高,则浪费磁盘空间;如果PCTFREE设置得太低,则可能会导致由于一个数据块小到无法容纳一行记录而产生迁移记录和链接记录。

而参数PCTUSED用于设置数据块是否可用的界限,换言之,为了使数据块能够被再次使用,已经占用的存储空间必须低于PCTUSED设置的比例。

设置数据块的PCTFREE和PCTUSED时,用户需要根据数据库的具体应用情况来决定。下面是设置PCTUSED和PCTFREE参数的几种情况。

● 在实际应用中,当使用 UPDATE 操作较多,并且更新操作会增加记录的大小时,可以将PCTFREE值设置得大一点儿,这样当记录变大时,记录仍然能够保存在原数据块中;而将PCTUSED值设置的比较小,这样在频繁地进行更新操作时,能够减少由于数据块在可用与不可用状态之间反复切换而造成的系统开销。推荐设置 PCTFREE 为 20,而PCTUSED为40。

● 在实际应用中,当使用INSERT 和DELETE 操作较多,并且UPDATE 操作不会增加记录的大小时,可以将PCTFREE参数设置的比较小,因为大部分更新操作不会增加记录的大小;而 PCTUSED 参数设置得比较大,以便尽快重新利用被 DELETE 操作释放的存储空间。推荐设置参数PCTFREE为5,而PCTUSED为60。

说明:用户如果要查看表student_4的PCTFREE和PCTUSED参数设置情况,可以通过查看USER_TABLES数据字典视图来实现。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)设置其PCTFREE和PCTUSED参数。

(3)主要程序代码如下:

SQL> create table students_8(

stuno number(10) not null,      --学号

stuname varchar2(8),       --姓名

sex char(2),          --性别

age int,            --年龄

departno varchar2(2) not null,     --系别编号

classno varchar2(4) not null,     --班级编号

regdate date default sysdate     --建档日期

)tablespace tbsp_1        --表空间

storage(initial 256k)        --该表分配第一个盘区的大小

pctfree 20           --数据块管理参数

pctused 40;          --数据块管理参数

举一反三

根据本实例,读者可以进行以下操作。

创建student_4_1数据表,并设置参数PCTFREE为30,而PCTUSED为60。

实例053 创建students_5表,并指定在数据块头部存放10个事务

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\053

实例说明

INITRANS 参数用于指定一个数据块所允许的并发事务数目。本实例详细讲解了 INITRANS参数,创建students_5表,并指定在数据块头部存放10个事务条目。运行结果如图3.13所示。

图3.13 创建students_5表,并指定在数据块头部存放10个事务

技术要点

本实例主要用到了INITRANS参数。该参数用于指定一个数据块所允许的并发事务数目。当一个事务访问表中的一个数据块时,该事务会在数据块的头部保存一个条目,以标识该事务正在使用这个数据块。当该事务结束时,它所对应的条目将被删除。

在创建表时,Oracle会在表的每个数据块头部分配可以存储INITRANS个事务条目的空间,这部分空间是永久的,只能用于存储事务条目。当数据块的头部空间已经存储了INITRANS个事务条目后,如果还有其他事务要访问这个数据块,Oracle将在数据块的空闲空间中为事务分配空间,这部分空间是动态的。当事务结束后,这部分存储空间将被回收以存储其他数据。能够访问一个数据块的事务总数由MAXTRANS 参数块决定,在Oracle 11g 中,对于单个数据块而言,Oracle默认最大支持255个并发事务。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)设置INITRANS参数。

(3)主要程序代码如下:

SQL> create table students_5(

stuno number(10) not null,      --学号

stuname varchar2(8),       --姓名

sex char(2),          --性别

age int,            --年龄

departno varchar2(2) not null,     --系别编号

classno varchar2(4) not null,     --班级编号

regdate date default sysdate     --建档日期

)tablespace tbsp_1

storage(initial 256k)

pctfree 20

pctused 40

initrans 10;          --数据块管理参数,10个事务条目

举一反三

根据本实例,读者可以进行以下操作。

创建students_5_1表,并指定在数据块头部存放20个事务。

实例054 查询INITRANS和MAXTRANS参数的设置情况

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\054

实例说明

在user_tables数据字典中查询students_5表的ini_trans和max_trans参数值。本例运行结果如图3.14所示。

图3.14 查询ini_trans和max_trans参数值

技术要点

用户若要了解students_5表中的INITRANS和MAXTRANS参数的设置情况,可以通过查询数据字典USER_TABLES来实现。

说明:用于每个表的应用特性不同,所以应当为各个表分别设置不同的INITRANS参数。在设置INITRANS参数时,如果设置的INITRANS参数值较大,则事务条目将占用过多的存储空间,从而减少用来存储实际数据的存储空间。只有当一个表有较多的事务同时访问时,才应当为其设置较高的INITRANS参数值。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)在USER_TABLES数据字典中查询ini_trans和max_trans参数值。

(3)主要程序代码如下:

SQL> select ini_trans,max_trans from user_tables

where table_name = 'STUDENTS_5';

举一反三

根据本实例,读者可以进行以下操作。

在user_tables_1数据字典中查询students_5表的ini_trans和max_trans参数值。

实例055 使用NOLOGGING子句创建students_6表

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\055

实例说明

本例是一个使用 NOLOGGING 子句的实例。创建 students_6 表,并且在创建该表时使用NOLOGGING子句,使用户对该表的创建、删除、修改等操作不被记录到重做日志文件中。运行结果如图3.15所示。

图3.15 使用NOLOGGING子句创建students_6表

技术要点

重做日志记录了数据库中数据的改变情况,这样,如果发生故障导致数据不能从内存中写入到数据文件中时,就可以从重做日志中获取被操作的数据。这样就可以防止数据丢失,从而提高表中数据的可靠性。

当使用CREATE TABLE 语句创建表时,如果使用了NOLOGGING 子句,则对该表的创建、删除、修改等操作(即DDL操作)就不会记录到日志中,但对该表进行DML操作时(如INSERT、UPDATE、DELETE 等)时,系统仍然会产生重做日志记录。在创建表时,默认情况下使用LOGGING 子句,这样对该表的所有操作(包括创建、删除、重命名等操作)都会被记录到重做日志中。

在决定是否使用 NOLOGGING 子句时,用户必须综合考虑所获取的收益和风险。使用NOLOGGING子句时,可以节省重做日志文件的存储空间,并减少创建表所需要的时间。但如果没有在重做日志文件中记录对表的操作,可能会无法用数据库恢复操作来恢复丢失的数据。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用NOLOGGING子句创建students_6表。

(3)主要程序代码如下:

SQL> create table students_6(

stuno number(10) not null,      --学号

stuname varchar2(8),        --姓名

sex char(2),           --性别

age int,            --年龄

departno varchar2(2) not null,     --系别编号

classno varchar2(4) not null,      --班级编号

regdate date default sysdate      --建档日期

)tablespace tbsp_1

storage(initial 256k)

pctfree 20

pctused 40

initrans 10

nologging;           --对DDL操作不产生日志

举一反三

根据本实例,读者可以进行以下操作。

创建students_6_1表,并且在创建该表时使用NOLOGGING子句,使用户对该表的创建、删除、修改等操作不被记录到重做日志文件中。

实例056 查询STUDENTS_6表是否启用了缓存功能

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\056

实例说明

在创建表时默认使用NOCACHE子句。对于比较小且又经常查询的表,用户在创建表时指定CACHE子句,以便利用系统缓存来提高对该表的查询执行效率。例如,在 USER_TABLE 数据字典中查询 STUDENTS_6 表是否启用了缓存功能。本例运行结果如图3.16所示。

图3.16 查询STUDENTS_6表是否启用了缓存功能

技术要点

当在Oracle中执行全表搜索时,读入缓存中的数据块将会存储在LRU列表的最近最少使用的一端。这意味着如果进行查询操作,并且必须向缓存中存储数据时,就会将刚读入的数据块换出缓存。

在建立表时,可以使用CACHE子句改变这种行为,使得当在使用CACHE子句建立的表中执行全表搜索时,将读入的数据块放置到LRU中最近最常用使用的一端。这样,数据库缓存中利用LRU算法对缓存块进行换入、换出调度时,就不会将属于这个表的数据块立即换出,从而提高了针对该表的查询效率。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用CACHE子句查询STUDENTS_6表是否启用了缓存功能。

(3)主要程序代码如下:

SQL> select table_name,cache

from user_tables

where table_name = 'STUDENTS_6';

举一反三

根据本实例,读者可以进行以下操作。

查询STUDENTS_6_1表是否启用了缓存功能

实例057 用drop table命令删除表

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\057

实例说明

数据表在创建之后,根据实际需求情况,用户还可以将其删除。但需要注意的是,一般情况下用户只能删除自己模式中的表,如果要删除其他模式中的表,则必须具有 DROP ANY TABLE系统权限。本实例讲解了如何删除表students_5以及所有引用这个表的视图、约束或触发器等。本例运行结果如图3.17所示。

图3.17 用drop table命令删除表

技术要点

删除表通常使用DROP TABLE 语句,其语法格式如下:

drop table table_name [cascade constraints];

参数table_name表示要删除的表名称。如果该表存在约束、关联的视图和触发器等,则必须使用“cascade constraints”这个可选的子句才能将其删除。

删除表与删除表中的所有数据不同,当用使用DELETE语句进行删除操作时,删除的仅是表中的数据,该表的数据结构仍然存在于子数据库中;使用DROP TABLE 语句删除表,不仅表中的数据将丢失,而且该表的定义信息(数据结构)也将从数据库中删除,用户就再也不可以向该表中添加数据了,因为该表对象在数据库中已经不存在了。

在删除一个表的结构时,通常Oracle会执行以下操作。

● 删除表中所有的数据。

● 删除与该表相关的所有索引和触发器。

● 如果有视图或PL/SQL 过程依赖于该表,这些视图或PL/SQL 过程将被置于不可用状态。

● 从数据字典中删除该表的定义。

● 回收为该表分配的存储空间。

DROP TABLE 语句有一个可选子句CASCADE CONSTRAINTS。当使用该参数时,DROP TABLE不仅仅删除该表,而且所有引用这个表的视图、约束或触发器等也都被删除。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用drop table 命令删除表。

(3)主要程序代码如下:

SQL> drop table students_5 cascade constraints;

举一反三

根据本实例,读者可以进行以下操作。

删除数据表students_6。

实例058 闪回功能快速恢复被删除的表

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\058

实例说明

一般情况下,当某个表被删除之后,实际上它并没有被彻底删除(仅仅是在数据字典中被除名),而是把该表放到了回收站中(即它依然占用存储空间),这样当用户需要还原该表时,就可以使用FLASHBACK TABLE 语句(这是一种闪回技术)进行还原。本实例介绍如何利用Oracle 11g 的闪回功能快速恢复被删除的表students_5。

技术要点

使用FLASHBACK TABLE 语句可以恢复被删除的表。语法为:

flashback table 被删除的表 to before drop;

实现过程

利用Oracle 11g 的闪回功能快速恢复被删除的表students_5,具体操作步骤如下。使用drop table命令删除表。

(1)首先确认students_5表是否已经被删除,代码如下:

SQL> select * from students_5;

代码执行后,运行结果如图3.18所示。

图3.18 确认students_5表是否已经被删除

(2)从上面的查询结果中可以看出该表已经被删除,那么用户就可以通过查询数据字典视图RECYCLEBIN来了解该表是否在回收站中,代码如下:

SQL> select object_name,original_name

from recyclebin where original_name = 'STUDENTS_5';

代码执行后,运行结果如图3.19所示。

图3.19 表STUDENTS_5在回收站中的情况

(3)使用FLASHBACK TABLE 语句恢复被删除的students_5 表,代码如下:

SQL> flashback table students_5 to before drop;

代码执行后,运行结果如图3.20所示。

图3.20 使用FLASHBACK TABLE语句恢复被删除的students_5表

(4)这时候,在通过select语句查询表students_5,发现该表被恢复了,代码如下:

SQL> select * from students_5;

代码执行后,运行结果如图3.21所示。

图3.21 查询表students_5

如果用户想在删除表时立即释放空间,并且不希望将其放置到回收站中,则可以在 DROP TABLE 语句中使用PURGE选项,这样该表就被彻底删除了。

举一反三

根据本实例,读者可以进行以下操作。

恢复被删除数据表students_6。

实例059 将表students_5置于只读的read only状态值

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\059

实例说明

Oracle 11g 推出了一个新的特性,用户可以将表置于READ ONLY(只读)状态。处于该状态的表不能执行DML和某些DDL操作。在Oracle 11g之前,为了使某个表处于READ ONLY状态,只能通过整个表空间或者数据库置于READ ONLY 状态,这样影响范围太大,不利益实际操作。对于如何设置表的状态,本例将详细介绍。

技术要点

本实例使用alter table…read only 语句来设置表的只读状态,其语法格式如下:

alter table table_name read only;

技术要点

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用alter table…read only 语句来设置表的只读状态。

(3)主要程序代码如下:

SQL> alter table students_5 read only;

代码执行后,运行结果如图3.22所示。

图3.22 设置表的只读状态

(4)在user_tables中查询该表的状态,如图3.23所示,表students_5现在的状态为只读。

图3.23 查询表students_5的状态

(5)对于处于READ ONLY 状态的表,用户不能执行DML 操作。尝试把students_5 表中学号大于5000的学生性别都修改为“男”,代码如下:

SQL> update students_5 set sex = '男'

where stuno > 5000;

运行结果如图3.24所示。

图3.24 只读状态的表用户不能执行DML操作

从运行结果中可以看出,处于只读状态的表不能执行DML操作。

(6)可以将处于只读状态的表从一个表空间移动到另一个表空间。把表students_5从tbsp_1表空间移动到tbsp_2表空间,代码如下:

SQL> alter table students_5 move tablespace tbsp_2;

运行结果如图3.25所示。

图3.25 只读状态的表可以修改表空间

(7)处于READ ONLY 状态的表,用户还可以将其重新置于可读写的READ WRITE 状态。把表students_5 从read only 状态更改为read write 状态,代码如下:

SQL> alter table students_5 read write;

这时,再通过数据字典user_tables来查询students_5的状态,就会发现students_5的状态变为可读写(read write)状态,如图3.26 所示。

图3.26 查询表students_5的状态

举一反三

根据本实例,读者可以进行以下操作。

将表students_6 置于只读的read only状态,并还原。

实例060 通过表其他列修改单列值

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\060

实例说明

本实例通过SQL来修改单列。把系别号为“03”的学生的班级号改为“200”,程序运行结果如图3.27所示。

图3.27 通过表其他列修改单列

技术要点

本实例使用 update 语句来修改列值。把 departno 列值为“03”的classno列值改为“200”。代码如下。

update students set classno = 200 where departno = 03;

技术要点

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用update语句修改列值。

(3)主要程序代码如下:

SQL> update students

set classno = 200

where departno = 03;

举一反三

根据本实例,读者可以进行以下操作。

在students表中,把学生姓名为“zhangwen”的性别改为“女”。

实例061 修改多行的单个列值

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\061

实例说明

如果表中的数据不正确或不符合需求,那么就需要对其进行修改。Oracle数据库通过UPDATE语句来实现修改现有的数据记录。本实例实现的是通过UPDATE语句实现修改多行的单个列值。本例运行结果如图3.28所示。

图3.28 修改多行的单个列值

技术要点

在修改数据时,修改的列数可以由用户自己指定,列于列之间用逗号(“,”)分隔;修改的条数可以通过WHERE子句来加以限制,使用WHERE子句时,系统只修改符合WHERE条件的记录信息。UPDATE语句的语法格式如下:

UPDATE table_name

SET column_name=express

[WHERE condition]

● table_name:表示要修改的表名。

● column_name:表示指定要修改的列名。

● condition:筛选条件表达式,只有符合筛选条件的记录才被修改。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用update语句修改单个列值。

(3)主要程序代码如下:

SQL> update emp

set sal = sal*1.2

where job='SALESMAN';

上面的代码中,UPDATE语句修改记录的数量通过WHERE子句实现控制的,这里限制只修改销售员的工资,若取消WHERE子句的限制,则系统会将emp表中所有人员的工资都上调20%。

举一反三

根据本实例,读者可以进行以下操作。

在students表中把系别号为“02”的学生班级改为“18”。

实例062 修改单行的多个列值

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\062

实例说明

本实例通过UPDATE语句来修改多个列值,在students表中,把学生姓名为“lixi”的姓名改为“liuxing”性别改为“女”。运行结果如图3.29所示。

图3.29 修改单行的多个列值

技术要点

本实例主要用到UPDAET语句来修改多个列值,与实例039类似,本实例用到的UPDATE语句的语法格式如下:

UPDATE table_name

SET {column_name1=express1[,column_name2=express2...]

| (column_name1[,column_name2…])=(selectSubquery)}

[WHERE condition]

● table_name:表示要修改的表名。

● column_name1 和column_name2:表示指定要修改的列名。

● selectSubquery:任何合法的SELECT 语句,其所选列的个数和类型要与语句中的column对应。

● condition:筛选条件表达式,只有符合筛选条件的记录才被修改。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用update语句修改多个列值。

(3)主要程序代码如下:

SQL>update students set stuname = 'liuxing', sex = '女' where stuname = 'lixi';

举一反三

根据本实例,读者可以进行以下操作。

在students表中修改学生姓名为“liuxing”的系别号和班号。

实例063 UPDATE和SELECT语句结合使用来修改数据

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\063

实例说明

同INSERT语句一样,UPDATE语句也可以与SELECT语句组合使用来达到修改数据的目的。例如,在SCOTT模式下,把emp表中工资小于2000的雇员工资调整为管理者的平均工资水平。本例运行结果如图3.30所示。

图3.30 UPDATE和SELECT语句结合使用来修改数据

技术要点

在将UPDATE语句与SELECT语句组合使用时,必须保证SELECT语句返回单一的值,否则会出现错误提示,导致修改数据失败。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用update和select语句修改列值。

(3)主要程序代码如下:

SQL> update emp

set sal = (select avg(sal)

from emp where job = 'MANAGER')

where sal < 2000;

举一反三

根据本实例,读者可以进行以下操作。

把emp表中工资小于1000的售货员工资调整为售货员的平均工资水平。

实例064 删除单行数据

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\064

实例说明

Oracle系统提供了向数据库添加记录的功能,自然也提供了从数据库删除记录的功能。本实例用到了DELETE语句来删除单行数据。例如,在HR模式下,删除jobs表中职务编号(job_id)是“PRO”的记录。本例运行结果如图3.31所示。

图3.31 删除单行数据

技术要点

DELETE语句用来删除数据库中的所有记录和指定范围的记录,若要删除指定范围的记录,同UPDATE语句一样,要通过WHERE子句进行限制,其语法格式如下:

DELETE FROM table_name

[WHERE condition]

● table_name:表示要删除记录的表名。

● condition:筛选条件表达式,是个可选项,当该刷选条件存在时,只有符合筛选条件的记录才被删除掉。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用delete语句删除单行数据。

(3)主要程序代码如下:

SQL> delete from jobs where job_id='PRO';

上面的代码中,DELETE语句删除记录的数量通过WHERE子句实现控制的,这里限制只删除职务编号(job_id)是“PRO”记录,若取消WHERE子句的限制,则系统会将jobs表中所有人员的记录都删除。

举一反三

根据本实例,读者可以进行以下操作。

删除students表中学生姓名(stuname)为“liuxing”的记录。

实例065 删除多行数据

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\065

实例说明

一条记录一条记录的删除会很麻烦,本实例实现了多行数据的删除。在temp表中,删除工资为“1250”的员工记录。本例运行结果如图3.32所示。

图3.32 删除多行数据

技术要点

本实例主要用到了DELETE语句,与实例064一样,其语法格式如下:

DELETE FROM table_name

[WHERE condition]

● table_name:表示要删除记录的表名。

● condition:筛选条件表达式,是个可选项,当该刷选条件存在时,只有符合筛选条件的记录才被删除掉。本实例中符合条件的记录有多条,在删除时,实现了多行数据的删除。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用delete语句删除多行数据。

(3)主要程序代码如下:

SQL> delete from temp where sal =‘1250’;

举一反三

根据本实例,读者可以进行以下操作。

在temp表中删除job为“clerk”的记录。

实例066 删除所有行

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\066

实例说明

如果用户确定要删除表中的所有记录,则除了可以使用DELETE语句之外,还可以使用TRUNCATE语句,而且Oracle本身也建议使用TRUNCATE语句。例如,在HR模式下,使用truncate语句清除自定义表jobs_temp中的所有记录。本例运行结果如图3.33所示。

图3.33 删除所有行

技术要点

使用 TRUNCATE 语句删除表中的所有记录要比 DELETE 语句快得多。这是因为使用TRUNCATE语句删除数据时,它不会产生回滚记录。当然,执行了TRUNCATE语句的操作也就无法使用ROLLBACK语句撤销。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)使用TRUNCATE语句删除所有行行数据。

(3)主要程序代码如下:

SQL> truncate table jobs_temp;

SQL> select * from jobs_temp;

另外,需要补充说明的是,在TRUNCATE 语句中还可以使用REUSE STORAGE 关键字或DROP STORAGE 关键字,前者表示删除记录后仍然保存记录所占用的空间;后者表示删除记录后立即回收记录占用的空间。默认情况下TRUNCATE 语句使用DROP STORAGE 关键字。

举一反三

根据本实例,读者可以进行以下操作。

在HR模式下,使用truncate语句清除自定义表stus_temp中的所有记录。

实例067 从DBA_DATA_FILES数据字典中查询表空间及其数据文件

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\03\067

实例说明

如果要查询表空间与对应的数据文件的相关信息,可以从DBA_DATA_FILES数据字典获得,如本实例。运行结果如图3.34所示。

图3.34 查询表空间及其包含的数据文件

技术要点

在Oracle数据库中,表空间与数据文件之间的关系非常密切,这两者之间相互依存着,也就是说,创建表空间是必须创建数据文件,增加数据文件时也必须指定表空间。

Oracle 磁盘空间管理中的最高逻辑层是表空间( TABLESPACE ),它的下一层是段(SEGMENT),并且一个段只能驻留在一个表空间内。段的下一层就是盘区,一个或多个盘区(EXTENT)可以组成一个段,并且每个盘区只能驻留在一个数据文件中。如果一个段跨越多个数据文件,它就只能由多个驻留在不同数据文件中的盘区构成。盘区的下一层就是数据块,它是磁盘空间管理中逻辑划分的最底层,一组连续的数据块可以组成一个盘区。如图 3.35 所示,展示了数据库、表空间、数据文件、段、盘区、数据块及操作系统块之间的相互关系。

图3.35 Oracle磁盘空间管理的逻辑结构图

实现过程

(1)启动SQL*Plus,以system身份连接数据库。

(2)在DBA_DATA_FILES数据字典中查询表空间及其数据文件。

(3)主要程序代码如下:

SQL> col tablespace_name for a10

SQL> col file_name for a50

SQL> col bytes for 999,999,999

SQL> select tablespace_name,file_name,bytes from dba_data_files order by tablesp

ace_name;

从查询结果来看,一个数据库包括多个表空间,如 SYSTEM 表空间、USERS 表空、TBSP_1 表空间等。而每一个表空间又包含一个或多个数据文件,如 USERS 表空间包含一个数据文件USERS01.DBF,而TBSP_1表空间包含TBSP_1.DBF和TBSP_2.DBF两个数据文件。表空间可以看成Oracle数据库的逻辑结构,而数据文件可以看成Oracle数据库的物理结构。

举一反三

根据本实例,读者可以进行以下操作。

查看表空间对应的数据文件。

实例068 查询USERS表空间内存放的数据对象及其类型和拥有者

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\068

实例说明

Oracle数据库的每个版本都使用SYSTEM表空间存放内部数据和数据字典。SYSTEM表空间主要存放SYS用户的各个对象和其他用户的少量对象。用户可以从DBA_SEGMENTS数据字典中查询到某个表空间所存放的数据对象及其类型(如索引、表、簇等)和拥有者。本实例实现了查询USERS表空间内存放的数据对象及其类型和拥有者的功能。本例部分运行结果如图3.36所示。

图3.36 USERS表空间内存放的数据对象

技术要点

本实例默认表空间是指在创建Oracle数据库时,系统自动创建的表空间,这些表空间通常用于存放Oracle 系统内部数据和提供样例所需要的逻辑空间。Oracle 11g 默认的表空间及其说明如表3.1所示。

表3.1 Oracle 11g默认的表空间及其说明

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)在USERS表空间内查询数据对象及其类型和拥有者。

(3)主要程序代码如下:

SQL> col owner for a10;

SQL> col segment_name for a30;

SQL> col segment_type for a20;

SQL> select segment_type,segment_name,owner from dba_segments where tablespace_name='USERS';

从运行结果中可以看出,USERS表空间存放了SCOTT用户的表和索引,以及OE用户的大对象索引、索引等数据对象。

举一反三

根据本实例,读者可以进行以下操作。

查询SYSAUX表空间所存放的用户及其所拥有的对象数量。

实例069 查询SYSAUX表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\069

实例说明

SYSTEM 表空间主要用于存放 Oracle 系统内部的数据字典,而 SYSAUX 表空间充当SYSTEM的辅助表空间,主要用于存储除数据字典以外的其他数据对象,它在一定程度上降低了SYSTEM表空间的负荷。本例运行结果如图3.37所示。

图3.37 查询SYSAUX表空间的信息

技术要点

可以通过DBA_SEGMENTS数据字典来查询SYSAUX表空间的相关信息。

注意:用户可以对SYSAUX表空间进行增加数据文件和监视等操作,但不能对其执行删除、重命名或设置只读(READ ONLY)等操作。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)通过DBA_SEGMENTS数据字典来查询SYSAUX表空间的相关信息。

(3)主要程序代码如下:

SQL> select owner as 用户,count(segment_name) as 对象数量 from dba_segments where tablespace_name='SYSAUX' group by owner;

举一反三

根据本实例,读者可以进行以下操作。

查询UNDOTBS1表空间。

实例070 创建一个扩展大小为256k的表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\070

实例说明

通过本地化管理方式(LOCAL)创建一个表空间,有两种方法:一个是指定等同的扩展大小,另一个是由系统自动指定扩展大小。本实例使用第一种方法创建一个扩展大小为 256K 的表空间。本例运行结果如图3.38所示。

图3.38 创建一个扩展大小为256k的表空间

技术要点

创建表空间的语法如下:

CREATE [SMALLFILE/BIGFILE] TABLESPACE tablespace_name

DATAFILE ‘/path/filename’SIZE num[k/m] REUSE

[,’/path/filename’SIZE num[k/m] REUSE]

[,…]

[AUTOEXTEND [ON | OFF] NEXT num[k/m]

[MAXSIZE [UNLIMITED | num[k/m]]]]

[MININUM EXTENT num[k/m]]

[DEFAULT STORAGE storage]

[ONLINE | OFFLINE]

[LOGGING | NOLOGGING]

[PERMANENT | TEMPORARY]

[EXTENT MANAGEMENT DICTIONARY | LOCAL [AUTOALLOCATE | UNIFORM SIZE num[k/m]]]]

在上面的语法中出现了大量的关键字和参数,为了让大家比较清晰地理解这些内容,下面对这两方面的内容分开进行讲解。

1.语法中的关键字

● SMALLFILE/BIGFILE:表示创建的是小文件表空间还是大文件表空间。

● AUTOEXEND [ON | OFF] NEXT:表示数据文件为自动扩展(ON)或非自动扩展(OFF),如果是自动扩展,则需要设置NEXT的值。

● MAXSIZE:表示当数据文件自动扩展时,允许数据文件扩展的最大长度字节数,如果指定UNLIMITED关键字,则不需要指定字节长度。

● MINIMUN EXTENT:指定最小的长度,由操作系统和数据库的块决定。

● ONLINE | OFFLINE:创建表空间时可以指定为在线或离线。

● PERMANENT|TEMPORARY:指定创建的表空间是永久表空间或临时表空间,默认为永久性表空间。

● LOGGING | NOLOGGING:指定该表空间内的表在加载数据时是否产生日志,默认为产生日志(LOGGING)。即使设置为 NOLOGGING,但在进行 INSERT、UPDATE 和DELETE 操作时,Oracle 仍会将操作信息记录到Redo Log Buffer 中。

● EXTENT MANAGEMENT DICTIONARY | LOCAL:指定表空间的扩展方式是使用数据字典管理还是本地化管理,默认为本地化管理。Oracle不推荐使用数据字典管理表空间。

● AUTOALLOCATE | UNIFORM SIZE:如果采用本地化管理表空间,在表空间扩展时,指定每次盘区扩展的大小是由系统自动指定还是按照等同大小进行。若是按照等同大小进行,则默认每次扩展的大小为1MB。

2.语法中的参数

● tablespace_name:该参数表示要创建的表空间的名称。

● ‘/path/filename’:该参数表示数据文件的路径与名字。EUSE 表示若该文件存在,则清除该文件在重新建立该文件,若该文件不存在,则创建该文件。

● DEFAULT STORAGE storage:指定以后要创建的表、索引及簇的存储参数值,这些参数将影响以后表等的存储参数值。

本地化表空间是如何管理的呢?

本地化表空间管理使用位图跟踪表空间所对应的数据文件的自由空间和块的使用状态,位图中的每个单元对应一个块或一组块。当分配或释放一个扩展时,Oracle会改变位图的值以指示该快的状态。这些位图值的改变不会产生回滚信息,因为它们不更新数据字典的任何表。所以,本地管理表空间具有以下优点。

● 使用本地化的扩展管理功能(包括自动大小和等同大小两种),可以避免发生重复的空间管理操作。

● 本地化管理的自动扩展(AUTOALLOCATE)能够跟踪临近的自由空间,这样可以消除结合自由空间的麻烦。本地化的扩展大小可以由系统自动确定(AUTOALLOCATE),也可以选择所有扩展有同样的大小(UNIFORM)。通常使用EXTENT MANAGEMENT LOCAL子句创建本地化的可变表空间。

在本实例中,使用extent management local 子句创建本地化的可变表空间。当创建扩展大小等同的表空间时,使用uniform关键字,并指定每次扩展时的大小。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)使用extent management local uniform子句创建扩展大小为256K 的表空间。

(3)主要程序代码如下:

SQL> create tablespace tbs_test_1 datafile 'D:\ datafile1.dbf'

size 10m

extent management local uniform size 256K;

举一反三

根据本实例,读者可以进行以下操作。

创建一个扩展大小为512k的表空间。

实例071 创建一个扩展大小为自动管理的表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\071

实例说明

在实例50中,讲解了创建指定等同的扩展大小的表空间。在本实例中则讲解了创建表空间的另一种方法,创建一个由系统自动指定扩展大小的表空间。本例运行结果如图3.39所示。

图3.39 创建一个扩展大小为自动管理的表空间

技术要点

在上一实例和本实例中,由于创建的都是本地化管理方式的表空间,所以都是用 extent management local 子句。当创建扩展大小等同的表空间时,使用uniform 关键字,并指定每次扩展时的大小;当创建扩展大小为自动管理时,使用autoallocate关键字,并且不需要指定扩展时的大小。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)使用 extent management local autoallocate 子句创建一个扩展大小为自动管理的表空间。

(3)主要程序代码如下:

SQL> create tablespace tbs_test_2 datafile 'D:\ datafile2.dbf'

size 10m

extent management local autoallocate;

举一反三

根据本实例,读者可以进行以下操作。

通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为256kB。

实例072 通过段空间管理方式创建表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\072

实例说明

段空间管理方式是建立在本地化空间管理方式基础之上的,即只有本地化管理方式的表空间,才能在其基础上进一步建立段空间管理方式,它使用“SEGMENT SPACE MANAGEMENT MANUAL/LOCAL”语句,段空间管理又可分为手工段和自动段两种空间管理方式。

技术要点

1.手工段空间管理方式

手工段空间管理方式是为了往后兼容而保留的,它使用自由块列表和 PCT_FREE 与PCT_USED参数来标识可供插入操作使用的数据块。

在每个INSERT或UPDATE操作后,数据库都会比较该数据块中的剩余自由空间与该段的PCT_FREE设置。如果数据块的剩余自由空间少于PCT_FREE自由空间(也就是说剩余空间已经进入系统的下限设置),则数据库就会从自由块列表上将其取下,不再对其进行插入操作。剩余的空余空间保留给可能会增大该数据块中行大小的UPDATE操作。

而在每个 UPDATE 操作或 DELETE 操作后,数据库会比较该数据块中的已用空间与PCT_USED 设置,如果已用空间少于 PCT_USED 已用空间(也就是已用空间未达到系统的上限设置),则该数据块会被加入到自由列表中,供INSERT操作使用。

2.自动段空间管理方式

如果采用自动段空间管理方式,那么数据库会使用位图而不是自由列表来标识哪些数据块可以用于插入操作,哪些数据块需要从自由块列表上将其取下。此时,表空间段的PCT_FREE和PCT_USED参数会被自动忽略。

由于自动段空间管理方式比手工段空间管理方式具有更好的性能,所以它是创建表空间时的首选方式。

对于使用自动段空间管理方式,用户需要注意以下两种情况。

● 自动段空间管理方式不能用于创建临时表空间和系统表空间。

● Oracle 本身推荐使用自动段空间管理方式管理永久表空间,但其默认情况下却是MANUAL(手工)管理方式,所以在创建表空间时需要明确指定为AUTO。

实现过程

(1)启动SQL*Plus,以system身份连接数据库。

(2)通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为自动管理,其段空间管理方式为手工,代码如下:

SQL> create tablespace tbs_test_3 datafile 'D:\OracleFiles\OracleData\datafile3.dbf'

size 20m

extent management local autoallocate

segment space management manual;

运行结果如图3.40所示。

图3.40 创建一个表空间,段空间管理方式为手工

(3)通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为自动管理,其段空间管理方式为自动,代码如下:

SQL> create tablespace tbs_test_4 datafile 'D:\OracleFiles\OracleData\datafile4.dbf'

size 20m

extent management local autoallocate

segment space management auto;

运行结果如图3.41所示。

图3.41 创建一个表空间,段空间管理方式为自动

举一反三

根据本实例,读者可以进行以下操作。

通过本地化管理方式(LOCAL)创建一个表空间。

实例073 创建一个块大小为标准块2倍的表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\073

实例说明

创建一个非标准块的表空间,块的大小为标准块的2倍。本例运行结果如图3.42所示。

图3.42 创建一个块大小为标准块2倍的表空间

技术要点

在Oracle 数据库中,通常的块大小为8192 字节,即8KB,但Oracle 11g 允许创建块大小与基本块不同的表空间,块大小可由创建表空间时的blocksize参数指定,这样有利于存储不同大小的对象,但用户需要注意以下3点。

● 表空间的非标准块的大小为基本块的倍数。比如,大小为16KB、64KB、128KB……

● Oracle 11g 通常使用SGA 自动共享内存管理,因此需要设置初始化参数db_16k_cache_size=16K。

● 这种块较大的表空间通常用来存放大对象(LOB)类型。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)blocksize 设置块大小。

(3)主要程序代码如下:

SQL> alter system set db_16k_cache_size = 16M scope=both;

SQL> create tablespace tbs_test_5 datafile 'D:\ datafile5.dbf'

size 64m reuse

autoextend on next 4m maxsize unlimited

blocksize 16k

extent management local autoallocate

segment space management auto;

说明:若不设置初始化参数“db_16k_cache_size”,则Oracle会显示“ORA-29339:表空间块大小16384与配置的块大小不匹配”这样的提示信息。

举一反三

根据本实例,读者可以进行以下操作。

创建一个块大小为标准块8倍的表空间。

实例074 创建一个数据文件大小为2GB的大文件表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\074

实例说明

从Oracle 11g 版本开始,引进了一个新的表空间类型——大文件(BIGFILE)。与以前版本的最多可由1022个文件组成的表空间不同,大文件表空间存放在一个单一的数据文件中,并且它需要更大的磁盘容量来存放数据,大文件表空间可以根据选择的块的大小变化,从 32TB 增至128TB。

大文件表空间是为超大型数据库而设计的。当一个超大型数据库具有上千个读/写数据文件时,必须更新数据文件头部(比如检查点)的操作可能会花费相当长的时间。如果降低数据文件的数量,那么,这些操作完成起来就可能会快得多。创建一个大文件表空间,只需要在CREATE语句中使用BIGFILE关键字即可,下面来看本实例,创建一个大文件表空间,指定一个数据文件,并且数据文件的大小为2GB。本例运行结果如图3.43所示。

图3.43 创建一个数据文件大小为2GB的大文件表空间

技术要点

大文件(BIGFILE)表空间主要被使用在存储区域网络上(SAN)、磁盘阵列上、自动存储管理(ASM)上和类似的提供禁止数据访问多设备的存储解决方案上。

实现过程

(1)启动SQL*Plus,以system身份连接数据库。

(2)使用create bigfile 创建一个大文件表空间。

(3)主要程序代码如下:

SQL> create bigfile tablespace tbs_test_big datafile 'D:\ datafilebig.dbf' size 2g;

注意:在创建大文件表空间时,由于指定的数据文件都比较大,所以通常这个创建过程都比较慢一些,用户要耐心等待,不要急于结束操作。

举一反三

根据本实例,读者可以进行以下操作。

创建一个大文件表空间tbs_test_big_2。

实例075 修改大文件表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\075

实例说明

本例修改上一实例创建的大文件表空间 tbs_test_big,将其空间大小由2GB改变为1GB。本例运行结果如图3.44所示。

图3.44 修改大文件表空间

技术要点

由于大文件(BIGFILE)表空间只有一个数据文件,所以,当需要重新设置其大小时不需要标识数据文件的具体路径和名称,只需要使用 ALTERTABLESPACE 命令指定大文件表空间的名称,即可很方便地修改其大小。另外,需要注意的是,在创建表空间的语法中使用size来标识数据文件的大小,而在修改表空间时,要使用resize关键字来重置数据文件的大小。

与大文件表空间不同的是,传统表空间可能包含多个数据文件,如果要改变其大小,则需要在 ALTER DATABASE 语句后面指定完整的操作系统路径名或内部文件号辨别每个数据文件,然后再重新设置他们的大小。

实现过程

(1)启动SQL*Plus,以system身份连接数据库。

(2)使用resize关键字来重置数据文件的大小。

(3)主要程序代码如下:

SQL> alter tablespace tbs_test_big resize 1g;

举一反三

根据本实例,读者可以进行以下操作。

把数据文件datafile3.dbf的大小由原来的20MB修改为100MB。

实例076 更改表空间的读写状态

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\076

实例说明

表空间有只读和可读写两种状态,若设置某个表空间为只读状态,则用户就不能够对该表空间中的数据进行DML操作(INSERT、UPDATE、DELETE),但对某些对象的删除操作还是可以进行的,比如,索引和目录就可以被删除掉。若设置某个表空间为可读写状态,则用户就可以对表空间中的数据进行任何正常的操作,这也是表空间的默认状态。本实例介绍如何把表空间设置为只读或可读写状态。本例运行结果如图3.45所示。

图3.45 更改表空间的读写状态

技术要点

设置表空间为只读状态,可以保证表空间数据的完整性。通常在进行数据库的备份、恢复及历史数据的完整性保护时,可将指定的表空间设置成只读状态。但设置表空间为只读并不是可以随意进行的,必须要满足下列条件。

● 该表空间必须为ONLINE 状态。

● 该表空间不能包含任何回滚段。

● 该表空间不能在归档模式下。

更改表空间的读写状态需要使用ALTER TABLESPACE…READ|READ WRITE 语句。

实现过程

(1)启动SQL*Plus,以system身份连接数据库。

(2)修改tbs_test_3表空间为只读状态,代码如下:

SQL> alter tablespace tbs_test_3 read only;

(3)修改tbs_test_3表空间为可读写状态,代码如下:

SQL> alter tablespace tbs_test_3 read write;

举一反三

根据本实例,读者可以进行以下操作。

修改tbs_test_2表空间为只读状态。

修改tbs_test_2表空间为可读写状态。

实例077 重命名表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\077

实例说明

在Oracle 11g 以前的版本中,表空间无法重命名,但Oracle 11g 提供了对表空间进行重命名的新功能,这对于一般的管理和移植来说是非常方便的。本例把 tbs_test_3 表空间重命名为tbs_test_3_new。本例运行结果如图3.46所示。

图3.46 重命名表空间

技术要点

重命名表空间需要使用alter tablespace…rename to 语句。

但要注意的是,数据库管理员只能对普通的表空间进行更名,不能够对 SYSTEM 和SYSAUX表空间进行重命名,也不能对已经处于OFFLINE状态的表空间进行重命名。

说明:在修改完表空间名称之后,原表空间中所存放的数据库对象(如表、索引、簇等)会被存放到新表空间名下。

实现过程

(1)启动SQL*Plus,以system身份连接数据库。

(2)使用 ALTER TABLESPACE…RENAME TO 语句,把 tbs_test_3 表空间重命名为tbs_test_3_new。

(3)代码如下:

SQL> alter tablespace tbs_test_3 rename to tbs_test_3_new;

举一反三

根据本实例,读者可以进行以下操作。

把tbs_test_2表空间重命名为tbs_test_2_new。

实例078 删除表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\078

实例说明

当某个表空间中的数据不再需要时,或者新创建的表空间不符合要求时,可以考虑删除这个表空间。本实例要求删除表空间tbs_test_2及其包含的所有内容。本例运行结果如图3.47所示。

图3.47 删除表空间

技术要点

若要删除表空间,则需要用户具有DROP TABLESPACE 权限。

在默认情况下,Oracle 系统不采用Oracle Managed Files 方式管理文件,这样删除表空间实际上仅是从数据字典和控制文件中将该表空间的有关信息清除掉,并没有真正删除该表空间包含的所有物理文件。因此,要想彻底删除表空间来释放磁盘空间,那么在执行删除表空间的命令之后,还需要手工删除该表空间包含的所有物理文件。

当Oracle 系统采用Oracle Managed Files 方式管理文件时,删除某个表空间后,Oracle 系统将自动删除该表空间包含的所有物理文件。删除表空间需要使用 DROP TABLESPACE 命令,其语法格式如下:

DROP TABLESPACE tbs_name[INCLUDING CONTENTS] [CASCADE CONSTRAINTS]

● tbs_name:表示要删除的表空间名称。

● INCLUDING DONTENTS:表示删除表空间的同时删除表空间中的数据。如果不指定INCLUDING CONTENTS 参数,而该表空间又存在数据时,则Oracle 会提示错误。

● CASCADE CONSTRAINTS:表示当删除当前表空间时也删除相关的完整性限制。完整性限制包括主键及唯一索引等。如果完整性存在,而没有 CASCADE CONSTRAINTS参数,则Oracle会提示错误,并且不会删除该表空间。

实现过程

(1)启动SQL*Plus,以system身份连接数据库。

(2)使用drop tablespace 语句,删除表空间tbs_test_2 及其包含的所有内容。

(3)代码如下:

SQL> drop tablespace tbs_test_2

including contents

cascade constraints;

在上面的代码中,不但删除了表空间tbs_test_2,而且也删除了表空间中的数据(includingcontents)和完整性约束(cascade constraints)。

举一反三

根据本实例,读者可以进行以下操作。

删除表空间tbs_test_3及其包含的所有内容。

实例079 创建和删除users表空间中的users02.dbf数据文件

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\079

实例说明

维护表空间中的数据文件主要包括向表空间中添加数据文件、从表空间中删除数据文件和对表空间中的数据文件进行自动扩展设置,本实例主要讲解了如何向表空间中添加数据文件和如何删除数据文件。本例运行结果如图3.48所示。

图3.48 创建和删除users表空间中的users02.dbf数据文件

技术要点

1.向表空间中添加数据文件

当某个非自动扩展表空间的扩展能力不能满足新的扩展需求,数据库管理员就需要向表空间中添加新的数据文件(比如,添加一个能够自动扩展的表空间),以满足数据对象的扩展需要。

2.从表空间中删除数据文件

在Oracle 11g R2 以前的版本中,Oracle 系统一直只允许增加数据文件到表空间,而不允许从表空间中删除数据文件。从Oracle 11g R2 开始,允许从表空间中删除无数据的数据文件。要实现从表空间中删除数据文件,需要使用ALTER TABLESPACE…DROP DATAFILE 语句。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)使用使用ALTER TABLESPACE…ADD DATAFILE 和ALTER TABLESPACE…DROP DATAFILE语句分别实现添加和删除表空间中的数据文件。

(3)向users表空间中添加一个新的数据文件users02.dbf,该文件支持自动扩展,扩展能力为每次扩展5m,并且该文件的最大空间不受限制。代码如下。

SQL> alter tablespace users add datafile 'e:\app\Administrator\oradata\orcl\users02.dbf'

size 10m autoextend on next 5m maxsize unlimited;

(4)删除users表空间中的users02.dbf数据文件。代码如下。

SQL> alter tablespace users drop datafile 'E:\app\Administrator\oradata\orcl\users02.dbf';

举一反三

根据本实例,读者可以进行以下操作。

向users表空间中添加一个新的数据文件users03.dbf。

从users表空间中删除数据文件users03.dbf。

实例080 对数据文件的自动扩展设置

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\080

实例说明

Oracle数据库的数据文件可以设置成具有自动扩展的功能,当数据文件剩余的自由空间不足时,它会按照设定的扩展量自动扩展到指定的值。这样可以避免由于剩余表空间不足而导致数据对象需求空间扩展失败的现象。

技术要点

可以使用AUTOEXTEND ON 命令使数据文件在使用中能根据需求自动扩展。用户可以通过以下4种方式设置数据文件的自动扩展功能。

● 在CREATE DATABASE 语句中设置。

● 在ALTER DATABASE 语句中设置。

● 在CREATE TABLESPACE 语句中设置。

● 在ALTER TABLESPACE 语句中设置。

对于Oracle 数据库管理员来说,主要是用后3 种命令修改数据文件是否为自动扩展,因为数据库实例已经创建完成,所以不再需要使用 CREATE DATABASE 命令。本实例就是一个使用ALTER DATABASE 命令来设置数据文件具有自动扩展功能的例子。

实现过程

(1)启动SQL*Plus,输入用户名scott、口令tiger连接数据库。

(2)首先查询TBS_TEST_2表空间中的数据文件是否为自动扩展,若不是自动扩展,则修改为自动扩展,扩展量为10m,并且最大扩展空间不受限制。

(3)主要程序代码如下:

SQL> col file_name for a50;

SQL> select file_name ,autoextensible from dba_data_files where tablespace_name = 'TBS_TEST_2';

SQL> alter database datafile 'D:\ datafile2.dbf'

autoextend on next 10m maxsize unlimited;

其运行结果如图3.49所示。

图3.49 查询指定数据文件的自动扩展属性

(4)从上面的运行结果中可以看出,DATAFILE2.DBF数据文件不自动扩展(autoextensible属性值为NO),然后使用alter databas 语句修改该数据文件为自动扩展。

接下来再通过查询 dba_data_files 数据字典来查看 DATAFILE2.DBF 文件时是否为自动扩展,其运行结果如图3.50所示。

图3.50 查询指定数据文件的自动扩展属性

从运行结果中可以看到,DATAFILE2.DBF 数据文件被修改为自动扩展——autoextensible属性值为YES。

举一反三

根据本实例,读者可以进行以下操作。

向users表空间中添加一个新的数据文件users02.dbf。

实例081 创建一个数据文件大小为100MB的撤销表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\081

实例说明

对撤销表空间的基本操作包括创建、修改、删除和切换等,本实例介绍了创建UNDO表空间的方法,创建一个撤销表空间,并指定数据文件大小为100MB。本例运行结果如图3.51所示。

图3.51 创建一个数据文件大小为100m的撤销表空间

技术要点

在讲解如何创建一个撤销表空间之前,先介绍下什么叫做撤销表空间。

1.撤销表空间的作用

撤销表空间,通常也称为UNDO表空间。UNDO表空间中的段也称为撤销段或UNDO段。撤销段中存放的数据就是“撤销信息”,这些“撤销信息”也称为撤销数据或UNDO数据,可见撤销段是最直接管理“撤销信息”的逻辑层。下面将对撤销段的几种作用进行讲解和分析。

● 使读写一致

在不同的进程或用户模式下检索数据时,Oracle只能给用户提供被提交的数据,这样可以确保数据的一致性。例如,在 SCOTT 模式下,执行了 UPDATE emp SET sal=5500 WHERE empno=7788语句,这样旧的数据记录会被存放到UNDO段中,而新数据则会存放到emp段,假定此时该数据尚未提交(比如没有执行commit命令,也没有退出SQL*Plus环境),然后用户在SYSTEM 模式下执行SELECT sal FROM scott.emp WHERE empno=7788 语句,此时用户将取得“旧的工资数据”,而不是新数据5500,而该数据正是从UNDO段中读取的。

● 可以回退事务

当执行修改(UPDATE)数据操作时,旧的数据(即UNDO数据)被存放到UNDO段,而新的数据则被存放到数据段中。如果在修改操作中事务提交出现错误,就需要回退事务,从而取消数据的更改。比如,当用户使用UPDATE语句修改员工的工资时,发现原本打算修改某个人的工资,但由于误操作,而导致修改了全公司员工的工资(比如,没有使用where条件语句)。这样,用户就可以通过执行ROLLBACK语句来取消事务修改。当执行ROLLBACK语句时,Oracle会将UNDO段的UNDO数据(即旧的员工工资)全部写回到数据段中。

● 事务恢复

事务恢复是例程恢复的一部分,它是由Oracle服务器自动完成的,如果在数据库运行过程中出现例程失败(如断电、内存故障等),那么当重启Oracle 服务器时,后台进程SMON 会自动执行例程恢复。执行例程恢复时,Oracle 会重新处理所有未提交的数据记录,回退未提交事务。

● 闪回操作

Oracle 11g 新增了强大的闪回功能,其中,很多闪回技术都是基于UNDO 段实现的,如闪回表、闪回事务查询、闪回版本查询等。

2.撤销表空间的初始化参数

Oracle 11g 可以通过设置初始化参数来控制UNDO 表空间管理撤销数据,与UNDO 表空间有关的参数有以下几种。

● UNDO_TABLESPACE

该初始化参数用于指定例程所要使用的UNDO表空间,使用自动UNDO管理模式时,通过配置该参数可以指定例程所要使用的UNDO表空间。

● UNDO_MANAGEMENT

该初始化参数用于指定UNDO数据的管理模式,如果为AUTO,则为自动撤销管理模式,如果为MANUAL,则为回滚段管理模式。

需要注意的是,使用自动撤销管理模式时,如果没有配置初始化参数 UNDO_TABLESPACE,Oracle会自动选择第一个可用的UNDO表空间存放UNDO数据;如果没有可用的UNDO表空间,Oracle会使用SYSTEM回滚段存放UNDO记录,并在ALTER文件中记载警告。

● UNDO_RETENTION

该初始化参数用于控制UNDO数据的最大保留时间,默认为900秒,从9i版本开始,通过配置该初始化参数,可以指定UNDO数据的保留时间,从而也决定了基于UNDO数据的闪回操作能够闪回的最早时间点。

用户想要查询当前实例所设置的UNDO 表空间的参数,可以通过SHOW PARAMETER 命令来完成,查询效果如图3.52所示。

图3.52 查询UNDO表空间的初始化参数

3.在创建撤销表空间时,需要注意以下两个方面。

● UNDO 表空间对应的数据文件大小通常由DML 操作可能产生的最大数据量来确定,通常该数据文件的大小至少应在1GB以上。

● 由于UNDO 表空间只用于存放撤销数据,所以不要在UNDO 表空间内建立任何数据对象(如表、索引等)。

创建UNDO 表空间需要使用CREATE UNDO TABLESPACE 语句,语法如下:

create undo tablespace 表空间名

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)使用CREATE UNDO TABLESPACE 语句创建一个撤销表空间,并指定数据文件大小为100m。

(3)主要程序代码如下:

SQL> create undo tablespace undo_tbs_1

datafile 'D:\OracleFiles\OracleData\undotbs1.dbf'

size 100m;

举一反三

根据本实例,读者可以进行以下操作。

创建撤销表空间undo_tbs_2。

实例082 修改UNDO表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\082

实例说明

本例实现了向表空间undo_tbs_1中添加一个新的数据文件,指定该文件大小为2g,运行结果如图3.53所示。

图3.53 向表空间undo_tbs_1中添加一个新的数据文件

技术要点

与修改普通的永久性表空间比较类似,修改UNDO表空间也使用ALTER TABLESPACE语句。

当事务用尽了 UNDO 表空间后,可以使用 ALTER TABLESPACE…ADD DATAFILE 语句添加新的数据文件;当 UNDO 表空间所在的磁盘填满时,可以使用 ALTER TABLESPACE…RENAME DATAFILE 语句将数据文件移动到其他磁盘上;当数据库处于ARCHIVELOG 模式时,可以使用 ALTER TABLESPACE…BEGIN BACKUP/END BACKUP语句备份UNDO表空间。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)使用alter tablespace…add datafile 添加一个新的数据文件。

(3)主要程序代码如下:

SQL> alter tablespace undo_tbs_1

add datafile 'D:\OracleFiles\OracleData\undotbs_add.dbf'

size 2g;

举一反三

根据本实例,读者可以进行以下操作。

修改undo_tbs_1中数据文件的位置。

备份UNDO表空间。

实例083 切换UNDO表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\083

实例说明

本例实现了把当前系统的默认UNDO表空间切换到自定义撤销表空间undo_tbs_1,运行结果如图3.54所示。

图3.54 切换UNDO表空间

技术要点

启动例程并打开数据库后,同一时刻指定例程只能使用一个 UNDO 表空间,切换 UNDO表空间是指停止例程当前使用的UNDO表空间,启动其他UNDO表空间。

说明:通常情况下,Oracle 11g 默认的UNDO 表空间是UNDOTBS1。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)启动UNDOTBS1表空间,切换UNDO表空间。

(3)主要程序代码如下:

SQL> alter system set undo_tablespace=undo_tbs_1;

举一反三

根据本实例,读者可以进行以下操作。

切换UNDO表空间到undo_tbs_2。

实例084 删除UNDO表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\084

实例说明

如果某个自定义的UNDO表空间确定不再使用了,数据库管理员就可以删除掉。本例实现了把当前历程的UNDO表空间从“undo_tbs_1”切换到“undotbs1”,然户再删除“undo_tbs_1”表空间,运行结果如图3.55所示。

图3.55 删除“undo_tbs_1”表空间

技术要点

删除UNDO 表空间与删除普通的永久表空间一样,都使用DROP TABLESPACE 语句。

但需要注意的是,当前例程正在使用的UNDO表空间是不能被删除的,如果确定要删除当前例程正在使用的 UNDO 表空间,管理员应首先切换 UNDO 表空间,然后再删除切换掉的UNDO表空间。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)使用drop tablespace 删除UNDO 表空间。

(3)主要程序代码如下:

SQL> alter system set undo_tablespace=undotbs1;

SQL> drop tablespace undo_tbs_1;

举一反三

根据本实例,读者可以进行以下操作。

删除UNDO表空间undo_tbs_2。

实例085 查询当前例程正在使用的UNDO表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\085

实例说明

通过查询UNDO表空间的相关信息,可以给管理员提供决策和管理支持。本实例介绍了如何查询当前实例正在使用的UNDO表空间,运行结果如图3.56所示。

图3.56 查询当前例程正在使用的UNDO表空间

技术要点

查询当前例程正在使用的UNDO表空间,这个可以通过查询初始化参数“undo_tablespace”就可以实现。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)通过查询初始化参数“undo_tablespace”,实现查询当前例程正在使用的UNDO表空间。

(3)主要程序代码如下:

SQL> show parameter undo_tablespace;

举一反三

根据本实例,读者可以进行以下操作。

通过查询数据字典“dba_tablespaces”来查询实例的所有UNDO表空间。

实例086 统计UNDO表空间中“回退块”的生成信息

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\086

实例说明

本例实现了统计 UNDO表空间中“回退块”的生成信息的功能,运行结果如图3.57所示。

图3.57 统计“回退块”信息

技术要点

使用自动UNDO管理模式时,需要合理设置UNDO表空间的尺寸,为了合理规划UNDO表空间的尺寸,应在数据库运行的高峰期搜集UNDO表空间的统计信息,最终根据该统计信息来确定UNDO表空间的大小。

管理员通过查询动态性能视图“V$UNDOSTAT”可以搜集UNDO统计信息。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)从动态性能视图“V$UNDOSTAT”中搜索UNDO统计信息。

(3)主要程序代码如下:

SQL> select to_char(begin_time,'hh24:mi:ss') as 开始时间,

to_char(end_time,'hh24:mi:ss') as 结束时,

undoblks as 回退块数

from v$undostat

order by begin_time;

在上面的代码中,BEGIN_TIME用于标识起始统计时间,END_TIME用于标识结束统计时间,UNDOBLKS 用于标识 UNDO 数据所占用的数据块个数。另外,从图 3.35 中可以看出,Oracle每隔10分钟生成一行统计信息。

举一反三

根据本实例,读者可以进行以下操作。

查询当前实例拥有的所有UNDO表空间。

实例087 查询特定UNDO段的信息

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\087

实例说明

通过动态性能视图监视特定UNDO段的信息,包括段名称、活动事务个数和段中的扩展个数等信息,运行结果如图3.58所示。

图3.58 特定UNDO段的信息

技术要点

使用自动UNDO管理模式时,Oracle会在UNDO表空间上自动建立10个UNDO段。

若要显示所有联机UNDO段的名称,则可以通过查询动态性能视图V$ROLLNAME来实现;若要显示UNDO段的统计信息,则可以通过查询动态性能视图V$ROLLLISTAT来实现。如果在V$ROLLLNAME和V$ROLLLISTAT之间执行连接查询,则可以监视特定UNDO段的特定信息。

在运行结果中,name列用于标识UNDO段的名称,xacts列用于标识UNDO段所包含的活动事务个数,writes列用于标识在UNDO段上写入的字节数,extents列用于标识UNDO段的区个数。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)在V$ROLLLNAME和V$ROLLLISTAT之间执行连接查询,监视特定UNDO段的特定信息。

(3)主要程序代码如下:

SQL> select rn.name,rs.xacts,rs.writes,rs.extents

from v$rollname rn,v$rollstat rs

where rn.usn = rs.usn;

举一反三

根据本实例,读者可以进行以下操作。

显示UNDO区信息。

实例088 查询指定段的信息

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\088

实例说明

在数据字典DBA_UNDO_EXTENTS中,用户可以查询UNDO表空间中所有区的详细信息,包括UNDO区的大小和状态等信息。本实例实现了在DBA_UNDO_EXTENTS数据字典中,查询指定段的信息,包括段编号、段的大小和段的状态等,运行结果如图 3.59所示。

图3.59 查询指定段的信息

技术要点

在查询结果中,SEGMENT_NAME列用于标识指定的段名称,EXTENT_ID列用于标识区编号,BYTES列用于标识区尺寸,STATUS列用于标识区状态(ACTIVE表示该区处于活动状态,EXPIRED表示该区未用)。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)在DBA_UNDO_EXTENTS数据字典中,查询指定段的信息。

(3)主要程序代码如下:

SQL> select segment_name, extent_id,bytes,status from dba_undo_extents

where segment_name='_SYSSMU3_991555123$';

举一反三

根据本实例,读者可以进行以下操作。

通过查询V$TRANSACTION动态性能视图来显示事务的名称和状态。

实例089 查询临时表空间的信息

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\089

实例说明

前面介绍了永久性表空间和UNDO表空间,除此之外,Oracle还有一种比较重要的表空间,即临时表空间(TEMPORARY TABLESPACE)。本例查询系统的临时表空间信息,包括临时文件、空间大小和空间名称,运行结果如图3.60所示。

图3.60 查询临时表空间

技术要点

临时表空间是一个磁盘空间,主要用于内存排序区不够而必须将数据写到磁盘的那个逻辑区域,由于该空间在排序操作完成后可以由Oracle系统自动释放,所以也称作临时表空间。

临时表空间主要用于临时段,而临时段是由数据库根据需要创建、管理和删除的,这些临时段的生成通常与排序之类的操作有关,下面的几种操作经常会用到临时表空间。

● SELECT DISTINCT:不重复检索。

● UNION:联合查询。

● MINUS:计算。

● ANALYZE:分析。

● 连接两个没有索引的表。

Oracle 11g将临时表空间与相应的临时文件信息存放在DBA_TEMP_FILES数据字典当中。在V$TEMPFILES视图中,可以查看到临时表的使用情况。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)在DBA_TEMP_FILES数据字典当中查询查询临时表空间的信息。

(3)主要程序代码如下:

SQL> col file_name for a40;

SQL> col tablespace_name for a10;

SQL> select file_name,bytes,tablespace_name from dba_temp_files;

举一反三

根据本实例,读者可以进行以下操作。

创建一个临时表空间,空间大小为300MB。

实例090 创建临时表空间组

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\090

实例说明

创建一个临时表空间组,并向其中添加两个临时表空间,运行结果如图3.61所示。

图3.61 创建临时表空间组

技术要点

在Oracle 11g 中,可以创建多个临时表空间,然后把它们组成一个临时表空间组,这样,应用系统中的数据在排序时就可以使用组里的多个临时表空间,在一个临时表空间组里至少有一个临时表空间,其最大个数没有限制,但是组的名字不能和其中某个临时表空间的名字相同。用户使用临时表空间组来管理临时数据具有以下作用。

● 避免因大量的排序数据而导致单一临时表空间不足。

● 当一个用户同时有多个会话时,可以使得它们使用组中的不同临时表空间。

● 使并行的服务器在单节点上能够使用多个临时表空间。

用户可以在创建临时表空间的同时来创建临时表空间组,如果删除组中的全部临时表空间,那么该组也将消失。另外,用户也可以将一个临时表空间从一个组移动到另一个组,或是向组里添加新的表空间。

创建临时表空间组主要使用group子句。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)使用group子句创建临时表空间组。

(3)主要程序代码如下:

SQL> create temporary tablespace tp1 tempfile 'D:\OracleFiles\tempfiles\tp1.tpf' size 10m tablespace group group1;

SQL> create temporary tablespace tp2 tempfile 'D:\OracleFiles\tempfiles\tp2.tpf' size 20m tablespace group group1;

举一反三

根据本实例,读者可以进行以下操作。

创建临时表空间组group3,将组group1中的临时表空间tp1转移到group3中。

实例091 转移临时表空间到另外一个组

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\091

实例说明

创建临时表空间组group3,将组group1中的临时表空间tp1转移到group3中。运行结果如图3.62所示。

图3.62 转移临时表空间到另外一个组

技术要点

转移临时表空间到另外一个组主要使用alter tablespace 语句。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)创建临时表空间组group3,使用alter tablespace 语句将组group1 中的临时表空间tp1转移到group3中,主要程序代码如下:

SQL> create temporary tablespace tp3 tempfile 'D:\OracleFiles\tempfiles\tp3.tpf' size 10m tablespace group group3;

SQL> alter tablespace tp1 tablespace group group3;

(3)在将组 group1 中的临时表空间 tp1 转移到组 group3 中之后,用户可以通过查询dba_tablespacegroups数据字典来查看组group3中的临时表空间,代码如下:

SQL> select * from dba_tablespace_groups where group_name = 'GROUP3';

运行结果如图3.63所示。

图3.63 查询组group3中所包含的临时表空间

从上面的运行结果可以看出,原来在group1中的表空间tp1,现在被转移到group3中。

举一反三

根据本实例,读者可以进行以下操作。

把临时表空间组group2分配给scott用户使用。

实例092 把临时表空间组分配给指定的用户使用

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\092

实例说明

本实例实现了把临时表空间组分配给指定的用户使用,把临时表空间组group3分配给scott用户使用。运行结果如图3.64所示。

图3.64 把临时表空间组分配给指定的用户使用

技术要点

把临时表空间组分配给指定的用户需要使用alter user 语句。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)使用alter user 语句把临时表空间组分配给scott。

(3)主要程序代码如下:

SQL> alter user scott temporary tablespace group3;

举一反三

根据本实例,读者可以进行以下操作。

把临时表空间组group2分配给scott用户使用。

实例093 删除临时表空间组

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\093

实例说明

当一个表空间不再需要时,可以利用drop命令进行删除。但是,此时的表空间必须不再被其他用户引用。本实例实现了删除临时表空间组,删除group3中的tp1临时表空间。

技术要点

删除临时表空间组,主要通过删除组成临时表空间组的所有临时表空间来实现。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)使用drop语句删除group3中的tp1临时表空间,代码如下:

SQL> alter user scott temporary tablespace group3;

运行结果如图3.65所示。

图3.65 删除group3中的tp1临时表空间

(3)在删除group3中的一个表空间tp1之后,再通过查询“dba_tablespace_groups”数据字典来查看group3表空间是否存在,代码如下:

SQL> select * from dba_tablespace_groups where group_name = 'GROUP3';

运行结果如图3.66所示。

图3.66 查询group3中的表空间信息

通过上面的查询结果可以看出,临时表空间组group3仍然存在,用户只有删除该组中的全部临时表空间(即必须将临时表空间tp3也删除掉),组group3才能被删除掉。

(4)删除group3中的tp3临时表空间,代码如下:

SQL> drop tablespace tp3 including contents and datafiles;

运行结果如图3.67所示。

图3.67 删除group3中的tp3临时表空间

(5)在删除group3中的最后一个临时表空间tp3之后,再通过查询“dba_tablespace_groups”数据字典来查看group3表空间是否存在,代码如下:

SQL> select * from dba_tablespace_groups where group_name = 'GROUP3';

运行结果如图3.68所示。

图3.68 删除group3临时表空间组

通过上面的运行结果看以看出,在删除了组 group3 中的全部临时表空间之后,组 group3自身也被删除掉。

举一反三

根据本实例,读者可以进行以下操作。

删除临时表空间组group1。

实例094 创建并设置默认永久表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\094

实例说明

在Oracle 数据库中创建用户(使用CREATE USER 语句)时,如果不指定表空间,则默认的临时表空间是TEMP,默认的永久表空间是SYSTEM,这样就导致应用系统与Oracle系统竞争使用SYSTEM表空间,会极大地影响Oracle系统的执行效率。为此,Oracle建议将非SYSTEM表空间设置为应用系统的默认永久表空间,并且将非TEMP临时表空间设置为应用系统的临时表空间。这样有利于数据库管理员根据应用系统的运行情况适时调整默认表空间和临时表空间。本实例要求在Oracle数据库中创建一个表空间,表空间大小为100M,然后将其设置为默认永久表空间。程序运行效果如图3.69所示。

图3.69 创建并设置默认永久表空间

技术要点

更改默认永久表空间需要使用ALTER DATABASE DEFAULT TABLESPACE 语句。

例如,将表空间tbs_example设置为默认的永久表空间,代码如下:

SQL>alter database default tablespace tbs_example

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)首先创建一个100MB 的表空间,再使用alter database default tablespace语句设置该表空间为默认的永久表空间。

(3)创建大小为100MB表空间的代码如下:

SQL>create tablespace tbs_test datafile 'D:\ datafile_test.dbf'

size 100m

extent management local autoallocate

segment space management auto;

(4)将表空间设置为默认永久表空间的代码如下:

SQL>alter database default tablespace tbs_test;

举一反三

根据本实例,读者可以进行以下操作。

将表空间tbs_example设置为默认的永久表空间。

实例095 创建并设置默认临时表空间

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\095

实例说明

本实例要求在Oracle数据库中创建一个临时表空间,然后将其设置为默认临时表空间。运行程序,效果如图3.70所示。

图3.70 创建并设置默认临时表空间

技术要点

临时表空间是一个磁盘空间,主要用于内存排序区不够而必须将数据写到磁盘的那个逻辑区域,由于该空间在排序操作完成后可以由Oracle系统自动释放,所以也称作临时表空间。

临时表空间主要用于临时段,而临时段是由数据库根据需要创建、管理和删除的,这些临时段的生成通常与排序之类的操作有关,下面的几种操作经常会用到临时表空间。

● SELECT DISTINCT:不重复检索。

● UNION:联合查询。

● MINUS:计算。

● ANALYZE:分析。

● 连接两个没有索引的表。

通常使用CREATE TEMPORARY TABLESPACE 语句来创建临时表空间。

更改默认临时表空间需要使用ALTER DATABASE DEFAULT TEMPRORY TABLESPACE 语句。

例如,将临时表空间temp_1设置为默认的临时表空间,代码如下:

SQL>alter database default temprory tablespace temp_1

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)创建大小为100MB临时表空间的代码如下:

SQL>create temporary tablespace temp_test tempfile 'D:\ temp_test.tpf' size 100m;

(3)将表空间设置为默认临时表空间的代码如下:

SQL>alter database default temporary tablespace temp_test;

举一反三

根据本实例,读者可以进行以下操作。

创建一个临时表空间组,并向其中添加两个临时表空间。

实例096 将创建的数据表置于指定的表空间中

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\03\096

实例说明

本实例将创建一个students_test数据表,然后将其放置在自定义的tbs_test表空间里。运行程序,效果如图3.71所示。

图3.71 将创建的数据表置于指定的表空间

技术要点

本实例通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为自动管理,其段空间管理方式为自动。由于自动段空间管理方式比手工段空间管理方式具有更好的性能,所以它是创建表空间时的首选方式。创建一个数据表,通过“tablespace 表空间名称”把数据表放在指定的表空间中。

实现过程

(1)启动SQL*Plus,输入用户名system、口令连接数据库。

(2)创建tbs_test数据表空间的代码如下:

SQL>create tablespace tbs_test datafile 'D:\ datafile_test.dbf'

size 100m

extent management local autoallocate

segment space management auto;

(3)创建一个students_test数据表,并将该表置于tbs_test数据表空间中,代码如下:

SQL>create table students_test(

stuno number(10) not null,     --学号

stuname varchar2(8),      --姓名

sex char(2),         --性别

age int

)tablespace tbs_test;

举一反三

根据本实例,读者可以进行以下操作。

创建temp_test表,将其置于指定的表空间。