08表空间和数据文件

8.1 表空间概述

8.1.1 表空间分类

表空间可分为:永久表空间(permanent tablespace)(SYSTEM表空间和SYSAUX表空间都属于此)、撤销表空间(undo tablespace)、临时表空间(temporary tablespace)三类;大文件表空间可以用于其中任何一种。

8.1.2 表空间与数据文件的关系

两者相互依存:创建表空间必须创建数据文件,增加数据文件必须指定表空间,一个表空间包含一个或多个数据文件。表空间是逻辑结构,数据文件是物理结构。

由于表空间在物理磁盘上包含操作系统中的一个或多个数据文件,因此表空间中创建的数据对象存在以下两种情况:1、若表空间只包含一个数据文件,则该表空间中的所有对象都储存在这个数据文件中;2、若表空间包含多个数据文件,则Oracle即可将数据对象存储在该表空间的任意一个数据文件中,也可以将同一个数据对象中的数据分布在表空间的多个数据文件中。

Oracle物理结构:数据文件、控制文件、重做日志文件、归档日志文件、参数文件、密码文件、警告日志文件等物理文件。

Oracle逻辑结构:最高层是表空间(tablespace);下一层是(segment),一个段只能在一个表空间内,一个表空间可以包含若干段;下一层是盘区(extent),若干个盘区组成一个段;下一层是数据块(block),它是磁盘空间管理中的逻辑最底层,一组连续的数据块可以组成一个盘区。若一个段跨越多个数据文件,它只能由多个驻留在不同数据文件中的盘区构成

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

可以通过dba_data_files数据字典中查询表空间及其数据文件:

select tablespace_name,file_name,bytes from dba_data_files order by tablespace_name;

8.2 默认表空间

表空间说明
EXAMPLE如果安装时选择“实例方案”,则此表空间存放各样例的数据
SYSAUXSYSTEM表空间的辅助空间。一些选件的对象都存放在此表空间内,这样可以减少SYSTEM表空间的负荷
SYSTEM存放数据字典,包括表、视图、存储过程的定义等
TEMP存放SQL语句处理的表和索引信息,比如数据排序就占用此空间
UNDOTBS1存放撤销数据的表空间
USERS通常用于存放“应用系统”所使用的数据库对象

8.2.1 SYSTEM表空间

存放内部数据数据字典,还用于存放SYS用户的各个对象和其他用户的少量对象。用户可以从dba_segments数据字典中查询到某个表空间所存放的数据对象及其类型和拥有者。

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

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

8.2.2 SYSAUX表空间

存放除数据字典以外的其他数据对象。用户可以对SYSAUX表空间进行增加数据文件和监视等操作,但不能对其执行删除、重命名或设置只读等操作。

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

select owner,count(segment_name) from dba_segment where tablespace_name='SYSAUX' group by owner;

8.3 创建表空间

Oracle建议将不同类型的的数据对象存放到不同的表空间中,因此在创建数据库后数据库管理员应根据具体应用的情况建立不同类型的表空间。表空间可分为:永久表空间(permanent tablespace)(SYSTEM表空间和SYSAUX表空间都属于此)、撤销表空间(undo tablespace)、临时表空间(temporary tablespace)三类;大文件表空间可以用于其中任何一种。

考虑以下几个问题:

  • 是创建小文件表空间,还是大文件表空间(默认是小文件表空间)
  • 是使用局部盘区管理方式,还是使用传统的目录盘区管理方式(默认是局部盘区管理方式)
  • 是手工管理段空间,还是自动管理段空间(默认是自动)
  • 是否是用于临时段或撤销段的特殊表空间

8.3.1 创建表空间的语法

(|表示或者,{}表示其中内容不可分割,[]表示其中内容可选)

CREATE [SMALLFILE|BIGFILE] TABLESPACE tablespace_name
DATAFILE
    '\path\filename.dbf' SIZE number[K|M|G] [REUSE]
	[,'\path\filename.dbf' SIZE number[K|M|G] [REUSE],...]
[AUTOEXTEND [{ON NEXT [number[K|M|G]] [MAXSIZE {{number[K|M|G]}|UNLIMITED}]}|OFF]]
[MININUM EXTENT number[K|M|G]]
[DEFAULT STORAGE parameter]
[BLOCKSIZE number[K|M|G]]
[ONLINE|OFFLINE]
[LOGGING|NOLOGGING]
[PERMANENT|TEMPORARY]
[EXTENT MANAGEMENT {LOCAL [AUTOALLOCATE|{UNIFORM SIZE [number[K|M|G]]}]}|DICTIONARY];

对以上参数讲解:

tablespace_name:要创建的表空间名。

‘\path\filename’:表示数据文件的路径与名字。REUSE表示若该文件存在则清除重建该文件;若文件不存在则创建该文件,默认为?。可指定多个数据文件。

SMALLFILE|BIGFILE:表示创建的是小文件表空间还是大文件表空间,默认为小文件表空间。

AUTOEXTEND[ON|OFF] NEXT:表示数据文件为自动扩展(ON)或不自动扩展(OFF),如果是自动扩展需要设置 NEXT 的 [number[K|M|G]] 值,默认为?。

MAXSIZE:表示当数据文件自动扩展时,允许数据文件扩展的最大字节数,如果指定unlimited,则不需要指定字节长度,默认为?。

MININUM EXTENT:指定最小的长度,由操作系统和数据库块决定,默认为?。

DEFAULT STORAGE:指定以后要创建的表、索引和簇的存储参数值,默认为?。

BLOCKSIZE:Oracle11g中允许指定与基本块大小不同的表空间。此时用此参数指定块大小。注意,自定义的大小必须是基本块大小(8KB)的倍数。注意,Oracle11g使用 SGA 自动共享内存管理时,还需要设置初始化参数db_number[k|m|g]_cache_size=number[k|m|g]。具体看8.3.4的示例。

ONLINE|OFFLINE:表示创建的表空间是在线还是离线,默认为?。

LOGGING|NOLOGGING:表示该表空间内表在加载数据时是否产生日志,默认为产生日志。

PERMANENT|TEMPORARY:表示创建的表空间是永久表空间还是临时表空间,默认为永久表空间。

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

AUTOALLOCATE|UNIFORM SIZE:如果采用本地化管理表空间,在表空间扩展时,指定每次盘区扩展的大小是由系统自动指定还是按照等同大小进行,默认为?。若按照等同大小进行,可以设置每次扩展大小number[K|M|G],默认为1MB。

示例(以Oracle10g为例):

create tablespace TEST_TS
datafile 'C:\oracle\product\10.2.0\oradata\orcl\TEST_TS.dbf'size 50m
autoextend on next 10m maxsize unlimited
online
logging
permanent
extent management local autoallocate;

8.3.2 本地化管理的表空间

只有本地化管理的表空间可以指定每次盘区扩展的大小。

具有以下优点:

  • 使用本地化的扩展管理功能(包括自动大小和等同大小两种),可以避免发生重复的空间管理操作。
  • 本地化管理的自动扩展能够跟踪临近的自由空间,这样可以消除结合自由空间的麻烦。本地化的扩展大小可以由系统自动确定,也可以选择所有扩展由同样的大小。通常使用extent management local子句创建本地化的可变表空间。

8.3.3 通过段空间管理方式创建表空间

只有本地化管理的表空间才能进一步建立段空间管理方式。段空间管理分为手工段和自动段两种空间管理方式。

SEGMENT SPACE MANAGEMENT MANUAL/AUTO;

MANUAL/AUTO:表示段空间管理方式为手工(MANUAL)段空间管理方式还是自动(AUTO)段空间管理方式,默认为手工(MANUAL)段空间管理方式。。

1、手工段空间管理方式

为了向后兼容而保留的,数据库使用自由块列表 PCT_FREE 和 PCT_USED 参数来标识可供插入操作使用的数据块。

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

2、自动段空间管理方式

数据库使用位图而不是自由列表标识哪些数据块用于 INSERT 操作,哪些数据块需要从自由块列表上将其取下。此时表空间段的 PCT_FREE 和 PCT_USED 参数会被忽略。创建表空间时首选自动段空间管理方式

注意自动段空间管理的两种情况

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

8.3.4 创建非标准块表空间

通常在Oracle数据库中块大小是8192B即8KB,Oracle11g允许块大小与基本块不同的表空间。

注意以下三点:

  • 表空间的非标准块的大小为基本块大小(8KB)的倍数。比如为16KB、128KB等。
  • Oracle11g通常使用SGA自动共享内存管理,因此需要设置初始化参数db_number[k|m|g]_cache_size=number[k|m|g]。
  • 这种块比较大的表空间通常用来存放大对象(LOB)类型。

示例:创建一个非标准块表空间,块的大小为标准块的2倍。

SQL>alter system set db_16k_cache_size=16k scope=both;
SQL>create tablespace tbs_test datafile 'D:\OracleFiles\datafile5.dbf'
 2  size 64m reuse
 3  autoextend on next 4m maxsize unlimited
 4  blocksize 16k
 5  extent management local autoallocate
 6  segment space management auto;

8.3.5 建立大文件表空间

从Oracle11g开始,引进了一个新的表空间类型:大文件(BIGFILE)。大文件表空间可以根据选择的块的大小而变化,从32TB增至128TB。创建一个大文件表空间只需要在 CREATE 语句中使用 BIGFILE 关键字即可。大文件表空间只有一个数据文件

1、创建大文件表空间

示例:创建一个数据文件大小为2GB的大文件表空间。

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

注意创建大文件表空间时,由于文件较大,创建过程较慢,不要急于结束操作。

2、修改大文件表空间大小

因为大文件表空间只有一个数据文件,因此不需要指定数据文件。

alter tablespace tbs_test_big resize 1g;

8.4 维护表空间和数据文件

8.4.1 设置默认表空间

在Oracle数据库中创建用户如果不指定表空间,则默认的临时表空间是TEMP,默认的永久表空间是SYSTEM,这样导致应用系统与Oracle系统竞争使用SYSTEM表空间。

Oracle建议将非SYSTEM表空间设置为应用系统的默认永久表空间。

使用alter database default temporary tablespace tablespace_name语句更改默认临时表空间为tablespace_name;

使用alter database default tablespace tablespace_name语句更改默认永久表空间为tablespace_name。

8.4.2 更改表空间的状态

表空间有只读可读写两种状态。

设置表空间为只读的前提:该表空间为 ONLINE 状态、该表空间不能包含任何回滚段、该表空间不能在归档模式下。

使用alter tablespace tablespace_name read only语句设置tablespace_name表空间为只读状态;

使用alter tablespace tablespace_name read write语句设置tablespace_name表空间为可读写状态。

8.4.3 重命名表空间

在Oracle11g之前,表空间无法重命名。注意,只能对普通的表空间进行重命名,不能对 SYSTEM 和 SYSAUX 表空间进行重命名,也不能对处于 OFFLINE 状态的表空间进行重命名。

使用alter tablespace tablespace_name_old rename to tablespace_name_new语句重命名tablespace_name_old表空间为tablespace_name_new。

8.4.4 删除表空间

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

DROP TABLESPACE tablespace_name [INCLUDING CONTENTS] [CASCADE CONSTRAINTS];

tablespace_name:要删除的表空间名。

INCLUDING CONTENTS:表示删除表空间的同时删除表空间中的数据。如果不指定此参数,且表空间中存有数据,则Oracle会提示错误。

CASCADE CONSTRAINTS:表示删除表空间的同时也删除相关的完整性约束。如果不指定此参数,且表空间中有完整性约束,则Oracle会提示错误,并且不会删除该表空间。

8.4.5 维护数据文件

维护表空间的数据文件主要包括向表空间中添加数据文件、从表空间中删除数据文件和对表空间中的数据文件进行自动扩展设置。

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

当某个非自动扩展表空间的扩展能力不满足新的扩展要求时,需要向表空间中添加新的可扩展的数据文件,以满足数据对象的扩展需要。(可以一句语句添加多个数据文件吗?就类似于创建表空间的语法一样)

(|表示或者,{}表示其中内容不可分割,[]表示其中内容可选)

ALTER TABLESPACE tablespace_name ADD DATAFILE
'\path\filename.dbf' SIZE number[K|M|G]
[AUTOEXTEND [{ON NEXT [number[K|M|G]] [MAXSIZE {number[K|M|G]|UNLIMITED}]}|OFF]];

其中各项参数说明见8.3.1创建表空间的语法。

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

在Oracle 11g R2以前的版本中,Oracle不允许从表空间中删除数据文件。从Oracle 11g R2开始,允许从表空间中删除无数据的数据文件。(如果删除有数据的数据文件会报错吗?)

ALTER TABLESPACE tablespace_name DROP DATAFILE '\path\filename.dbf';

3、对数据文件的自动扩展设置

通过以下语句查看 tablespace_name 表空间是否为自动扩展。

select file_name,autoextensible from dba_data_files where tablespace_name='tablespace_name';

可以通过以下4种方式设置数据文件的自动扩展功能。一般来讲都是使用 ALTER 语句,因为一旦创建好数据库后就不需要使用 CREATE DATABASE 语句了。

1、使用 CREATE DATABASE 语句设置

(?这种方式如何编写语句?)

2、使用 ALTER DATABASE 语句设置

ALTER DATABASE DATAFILE '\path\filename.dbf'
[AUTOEXTEND [{ON NEXT [number[K|M|G]] [MAXSIZE {number[K|M|G]|UNLIMITED}]}|OFF]];

3、使用 CREATE TABLESPACE 语句设置

同表空间创建语句。

4、使用 ALTER TABLESPACE 语句设置

ALTER TABLESPACE DATAFILE '\path\filename.dbf'
[AUTOEXTEND [{ON NEXT [number[K|M|G]] [MAXSIZE {number[K|M|G]|UNLIMITED}]}|OFF]];

8.5 撤销表空间

8.5.1 撤销表空间简介

撤销表空间,也称为 UNDO 表空间,此表空间中的段称为撤销段或 UNDO 段。

主要有以下4个作用:

1、读写一致。

在不同的进程或用户模式下检索数据时,Oracle只能给用户提供被提交的数据,这样可以保持数据一致性。

2、回退事务。

当执行修改(update)数据操作时,旧的数据被存放到 UNDO 段,而新的数据被存放到数据段中。

3、事务恢复。

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

4、闪回操作。

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

8.5.2 撤销表空间的初始化参数

1、UNDO_TABLESPACE

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

2、UNDO_MANAGEMENT

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

注意:使用自动撤销管理模式时,如果没有配置默认选择第一个可用的 UNDO 表空间存放 UNDO 数据,如果没有可用的 UNDO 表空间,Oracle 会使用 SYSTEM 回滚段存放UNDO数据,并在 ALTER 文件中记载警告

3、UNDO_RETENTION

用于指定UNDO数据的最大保留时间;默认900秒。

用户可以使用 SHOW PARAMETER 命令查看UNDO表空间的参数。

8.5.3 撤销表空间的基本操作

对撤销表空间的基本操作包括创建、修改、删除和切换等。

1、创建撤销表空间

CREATE UNDO TABLESPACE tablespace_name DATAFILE '\path\filename.dbf' SIZE number[K|M|G];

撤销表空间的数据文件大小通常由 DML(Data Manipulation Language)操作产生的最大数据量来确定,通常至少在1GB以上。不要在撤销表空间内建立任何数据对象

2、修改撤销表空间

与修改永久表空间类似,使用 ALTER TABLESPACE 语句修改撤销表空间。

3、切换撤销表空间

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

ALTER SYSTEM SET UNDO_TABLESPACE=tablespace_name;
--切换至撤销表空间tablespace_name

4、删除撤销表空间

与删除永久表空间类似,使用 DROP TABLESPACE 语句。无法删除当前正在使用的撤销表空间,只能先切换后再删除。

5、查询撤销表空间

使用自动撤销管理模式的撤销表空间,Oracle会在其中自动创建10个撤销段

SQL>show parameter undo_tablespace;--查询正在使用的撤销表空间
SQL>select tablespace_name from dba_tablespaces where contents='UNDO';--查询当前实例拥有的所有撤销表空间
SQL>select * from v$undostat;--查询撤销表空间的统计信息
SQL>select * from v$rollname;--查询撤销段的名称
SQL>select * from v$rolllilstat;--查询撤销段的统计信息
SQL>select * from v$session;--查询会话信息
SQL>select * from v$transaction;--查询事务信息
SQL>select * from dba_undo_extents;--查询撤销表空间中各个盘区信息

8.6 临时表空间

8.6.1 临时表空间简介

临时表空间是在内存排序区不足而必须将数据写到磁盘的那个逻辑区域,是一个磁盘空间,该区域在排序完成后可以由Oracle自动释放。

(为什么不讲临时表空间的各项参数?)

8.6.2 临时表空间的基本操作

临时表空间的部分操作,比如重命名、删除等于永久表空间操作相同见8.4,此处不再赘述。

1、创建临时表空间

临时表空间使用临时文件而不是数据文件创建,临时表空间不需要备份,其中的数据修改也不会记录到重做日志中。

CREATE TEMPORARY TABLESPACE tablespace_name TEMPFILE '\path\filename.tpf' SIZE number[K|M|G];

2、切换默认临时表空间

有多个临时表空间时,可以通过 ALTER DATABASE 命令修改默认的临时表空间。

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tablespace_name;
--修改默认临时表空间为tablespace_name

3、查询临时表空间

在 v$tempfile 视图中,可以查看临时表使用情况。可以通过 dba_temp_files 数据字典查看临时表空间的临时文件信息,dba_tablespace_groups 数据字典查看临时表空间组信息。

SQL>select * from v$tempfile;--查询临时表使用情况
SQL>select * from dba_temp_files;--查询临时表空间的临时文件信息
SQL>select * from dba_tablespace_groups;--查询临时表空间组信息

8.6.3 临时表空间组

在Oracle 11g中,可以创建多个临时表空间,然后将它们组成一个临时表空间组。

临时表空间组具有以下作用:

  • 避免因大量的排序数据而导致单一临时表空间容量不足
  • 当一个用户同时有多个会话时,可以使得它们使用组中的不同临时表空间
  • 使并行的服务器在单节点上能够使用多个临时表空间

1、创建临时表空间组

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

SQL>CREATE TEMPORARY TABLESPACE tablespace_name1 TEMPFILE '\path\filename1.tpf'
 2  SIZE number[K|M|G] GROUP group_name1;
SQL>CREATE TEMPORARY TABLESPACE tablespace_name2 TEMPFILE '\path\filename2.tpf'
 2  SIZE number[K|M|G] GROUP group_name1;
--将tablespace_name1和tablespace_name2两个临时表空间加入到同一个临时表空间组group_name1中。

2、转移临时表空间

SQL>ALTER TABLESAPCE tablespace_name1 TABLESAPCE GROUP group_name2;
--将tablespace_name1临时表空间转移到另一个临时表空间组group_name2中。

可以通过 dba_tablespace_groups 数据字典查看临时表空间组信息。

3、设置默认临时表空间组

ALTER DATABASE sid_name DEFAULT TEMPORARY TABLESPACE group_name;
--将数据库sid_name的默认临时表空间组设置为group_name

4、删除临时表空间组

临时表空间组无法直接删除,只能通过删除临时表空间组中的每一个临时表空间来实现。

DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;
--删除tablespace_name临时表空间,删除语句对于所有类型的表空间都一样

删除完成后,通过 dba_tablespace_groups 数据字典查看临时表空间组信息,会无查询结果。

5、分配临时表空间组给指定用户

ALTER USER username TEMPORARY TABLESPACE group_name;
--将group_name临时表空间组分配给username用户使用

8.7 小结

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值