表空间和数据文件
•
表空间:
�C
某一时刻只能属于一个数据库
�C
由一个或多个数据文件组成
�C
可进一步划分为逻辑存储单元
•
数据文件:
�C
只能属于一个表空间和一个数据库
�C
是方案对象数据的资料档案库
表空间类型:
SYSTEM
表空间:
•
随数据库创建
•
所有数据库均需要
•
包括数据字典(内含存储程序单元)
•
包含
SYSTEM
还原段
•
应不包括用户数据,尽管允许这样做
非SYSTEM 表空间(包括永久表空间,还原表空间,临时表空间):
•
支持更灵活地管理数据库
•
将还原段、临时段、应用程序数据段和应用程序索引段分开
•
根据备份要求将数据分开
•
分开动态和静态数据
•
控制分配给用户对象的空间量
创建表空间
Tablespace
:是要创建的表空间的名称
DATAFILE
:指定组成表空间的一个或多个数据文件
MINIMUM EXTENT
:确保表空间内每个占用区的大小是整数
(integer)
的倍数。使用
K
或
M
以千字节或兆字节为单位指定该大小。
BLOCKSIZE
:
BLOCKSIZE
指定表空间的非标准块大小。要指定该子句,必须具有
DB_CACHE_SIZE
,并至少设置一个
DB_nK_CACHE_SIZE
参数,在该子句中指定的整数
(integer)
必须与一个
DB_nK_CACHE_SIZE
参数设置相对应。
LOGGING
:指定在缺省情况下,表空间内的所有表、索引和分区的所有更改都写入重做日志文件。
LOGGING
为缺省设置。
NOLOGGING
:指定在缺省情况下,表空间内的所有表、索引和分区的所有更改都不写入重做日志文件。
NOLOGGING
只影响某些
DML
和
DDL
命令,如直接加载。
DEFAULT
:
DEFAULT
指定表空间内创建的所有对象的缺省存储参数。
OFFLINE
:指定表空间从创建后就不可用。
PERMANENT
:指定表空间可用于保留永久对象。
TEMPORARY
:指定表空间仅用于保留临时对象,如:由
ORDER BY
子句引起的隐式排序所使用的段。不能指定
EXTENT MANAGEMENT LOCAL
或
BLOCKSIZE
子句。
extent_management_clause
:该子句指定如何管理表空间内的区。
segment_management_clause
:这只与永久的、且在本地管理的表空间相关。通过它可指定
Oracle
是否应使用空闲列表或位图来跟踪表空间段中的已占用空间和空闲空间。
datafile_clause:== filename [SIZE integer[K|M] [REUSE]
[ autoextend_clause ]
filename
:是表空间中的数据文件的名称。
SIZE
:指定文件大小。使用
K
或
M
以千字节或兆字节为单位指定大小。
REUSE
:允许
Oracle
服务器重新使用现有文件。
autoextend_clause
:该子句启用或禁用数据文件的自动扩展。
NEXT
:以字节为单位指定在需要更多区时自动分配的磁盘空间下一增量的大小。
MAXSIZE
:指定数据文件可以自动扩展到的最大磁盘空间。
UNLIMITED
:指定可分配给数据文件或
Tempfile
的磁盘空间是不受限制的。
查看已有表空间:
SQL> select * from v$tablespace;
TS# NAME INC
---------- ------------------------------ ---
3 CWMLITE YES
4 DRSYS YES
5 EXAMPLE YES
6 INDX YES
7 ODM YES
0 SYSTEM YES
8 TOOLS YES
1 UNDOTBS1 YES
9 USERS YES
10 XDB YES
2 TEMP YES
查看表空间对应的数据文件
:
SQL> select file_name, tablespace_name from dba_data_files;
FILE_NAME TABLESPACE_NAME
----------------------------------- ------------------------------
/u01/oradata/lty/system01.dbf SYSTEM
/u01/oradata/lty/undotbs01.dbf UNDOTBS1
/u01/oradata/lty/cwmlite01.dbf CWMLITE
/u01/oradata/lty/drsys01.dbf DRSYS
/u01/oradata/lty/example01.dbf EXAMPLE
/u01/oradata/lty/indx01.dbf INDX
/u01/oradata/lty/odm01.dbf ODM
/u01/oradata/lty/tools01.dbf TOOLS
/u01/oradata/lty/users01.dbf USERS
/u01/oradata/lty/xdb01.dbf XDB
表空间的空间管理
本地管理表空间 (Locally managed tablespace):在表空间内通过位图管理区。位图中的每个位对应于一个块或一组块。分配了某个区或释放了某个区可重新使用时,
Oracle
服务器更改位图值以显示块的新状态。从
Oracle9i
开始,在本地管理已成为缺省设置。
CREATE TABLESPACE userdata DATAFILE '/u01/oradata/userdata01.dbf' SIZE 500M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;
EXTENT MANAGEMENT
子句的
LOCAL
选项指定表空间在本地管理。缺省情况下,表空间在本地管理。
extent_management_clause:
[ EXTENT MANAGEMENT [ DICTIONARY | LOCAL
[ AUTOALLOCATE | UNIFORM [SIZE integer[K|M]] ] ] ]
其中:
DICTIONARY
:指定使用字典表来管理表空间。
LOCAL
:指定在本地通过位图管理表空间。如果指定了
LOCAL
,则不能再指定
DEFAULT storage_clause
、
MINIMUM EXTENT
或
TEMPORARY
。
AUTOALLOCATE
:指定表空间由系统管理。用户无法指定区大小。这是缺省设置。
UNIFORM
:指定按照大小统一为
SIZE
字节数的各个区来管理表空间。使用
K
或
M
以千字节或兆字节来指定区大小。缺省大小为
1 MB
。
EXTENT MANAGEMENT
子句可用于各种
CREATE
命令中:
•
对于非
SYSTEM
的永久表空间,可以在
CREATE TABLESPACE
命令中指定
EXTENT MANAGEMENT LOCAL
。
•
对于临时表空间,您可以在
CREATE TEMPORARY TABLESPACE
命令中指定
EXTENT MANGEMENT LOCAL
。
在本地管理表空间的优点:
本地管理的表空间相对于字典管理的表空间有如下优点:
•
本地管理可以避免循环空间管理操作,但是这种操作在字典管理的表空间中却有可能发生。一旦消耗或释放某个区的空间会产生另一个消耗或释放操作(消耗或释放还原段或数据字典表内的空间)时,它就会发生。
•
由于本地管理的表空间在数据字典表中不记录空闲空间,从而减少了对这些表的争用。
•
区的本地管理可自动跟踪邻近的空闲空间,因而无须合并空闲区。
•
本地管理的区大小可由系统自动确定。
•
对区的位图进行更改不会生成还原信息,因为它们不更新数据字典中的表(表空间限额信息等特殊情况除外)。
字典管理表空间(Dictionary-managed tablespace):由数据字典管理区。
Oracle
服务器将在分配或回收区时更新数据字典中对应的表。
字典管理的表空间内的段可具有自定义的存储设置。这比本地管理的表空间更灵活(存储在表空间中的每个段都可以有不同的存储子句),但效率要低得多。
CREATE TABLESPACE userdata DATAFILE '/u01/oradata/userdata01.dbf' SIZE 500M EXTENT MANAGEMENT DICTIONARY DEFAULT STORAGE (initial 1M NEXT 1M PCTINCREASE 0);
注意:从Oracle9i开始,如果system表空间是本地管理方式,那么其他的表空间管理方式一定是本地管理方式,而且以数据字典管理方式的表空间也无法创建。
还原表空间
•
用于存储还原段
•
不能包含任何其它对象
•
其中的区要在本地管理
•
只能使用DATAFILE 和EXTENT MANAGEMENT 子句
CREATE UNDO TABLESPACE undo1 DATAFILE '/u01/oradata/undo01.dbf' SIZE 40M;
临时表空间
•
用于排序操作
•
不能包含任何永久对象
•
建议在本地管理区
本地管理的临时表空间具有临时数据文件
(Tempfile)
,它与普通数据文件很相似,只有以下几点不同:
• Tempfile
始终设为
NOLOGGING
模式。
•
无法将
Tempfile
设置为只读。
•
无法重命名
Tempfile
。
•
无法通过
ALTER DATABASE
命令创建
Tempfile
。
• Tempfile
对于只读数据库是必需的。
•
介质恢复不恢复
Tempfile
。
若要优化临时表空间内的排序性能,可将
UNIFORM SIZE
设置为
SORT_AREA_SIZE
参数的整数倍。
CREATE TEMPORARY TABLESPACE temp
TEMPFILE '/u01/oradata/temp01.dbf' SIZE 500M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 4M;
缺省临时表空间
可使用以下命令进行创建:
1、
在创建数据库时:
CREATE DATABASE
…
…
DEFAULT TEMPORARY TABLESPACE temp
TEMPFILE '/$HOME/ORADATA/u03/temp01.dbf' SIZE 4M
2
、数据库创建完成后:
查看当前缺省临时表空间:
SQL> select property_name, property_value from database_properties;
PROPERTY_NAME PROPERTY_VALUE
------------------------------ ------------------------------
DEFAULT_TEMP_TABLESPACE TEMP
查看表空间类型:
SQL> select tablespace_name,contents,extent_management from dba_tablespaces;
TABLESPACE_NAME CONTENTS EXTENT_MAN
------------------------------ --------- ----------
SYSTEM PERMANENT LOCAL
UNDOTBS1 UNDO LOCAL
TEMP TEMPORARY LOCAL
CWMLITE PERMANENT LOCAL
DRSYS PERMANENT LOCAL
EXAMPLE PERMANENT LOCAL
INDX PERMANENT LOCAL
ODM PERMANENT LOCAL
TOOLS PERMANENT LOCAL
USERS PERMANENT LOCAL
XDB PERMANENT LOCAL
创建临时表空间:
SQL> create temporary tablespace mytemp
2 tempfile '/u01/oradata/temp01.dbf' size 20m
3 extent management local uniform size 2m;
改变当前缺省表空间为
mytemp
:
SQL> alter database default temporary tablespace mytemp;
验证:
SQL> select * from database_properties;
PROPERTY_NAME PROPERTY_VALUE
------------------------------ ------------------------------
DEFAULT_TEMP_TABLESPACE MYTEMP
注意:如果不指定缺省临时表空间,那么
system
表空间将充当临时表空间。
缺省临时表空间的限制
不能对缺省临时表空间执行下列操作:
•
将其删除,除非已经有新的缺省临时表空间
•
使其脱机
•
更改为永久表空间
表空间的只读模式
ALTER TABLESPACE [tablespace]READ ONLY
命令将表空间置于过渡只读模式。除了以前修改过该表空间中的块的已有事务处理回退,这种过渡状态不允许再对该表空间进行任何写入操作。当已有的所有事务处理提交或者回退后(如果有未完成的事务,则会等待事务提交或回滚。完成这些后checkpoint),只读命令完成,该表空间置于只读模式。您可以删除只读表空间内的表和索引等项,因为这些命令只影响数据字典。之所以可以这样操作,是因为
DROP
命令只更新数据字典,而不更新构成表空间的物理文件。对于本地管理的表空间,删除的段将改为临时段以避免更新位图。要使只读表空间可写,表空间内的所有数据文件都必须联机。将表空间设为只读将导致对表空间的数据文件执行检查点操作。
将表空间设为只读可防止对表空间中的数据文件进行任何写操作。为此,数据文件可驻留在只读介质上,如
CD-ROM
或一次性写入
(WORM)
驱动器。只读表空间可以免去对数据库大量的静态分配执行备份。
创建表空间
luo
:
SQL> create tablespace luo
2 datafile '/u01/oradata/lty/luo/luo01.dbf' size 20m
3 extent management local uniform size 128k;
创建用户,用户的缺省表空间为
luo
:
S
QL> create user luo identified by luo default tablespace
2 luo;
User created.
SQL> grant connect, resource to luo;
Grant succeeded.
以
luo
用户登录并创建表:
$ sqlplus luo/luo
SQL> create table test (num integer, name char(10));
Table created.
SQL> insert into test values(0, 'aaa');
1 row created.
SQL> commit ;
Commit complete.
SQL> insert into test values(1,'bbb');
1 row created.
#
这里不提交。
切换到
sys
用户,将
tablespace
置为
read-only
:
SQL> alter tablespace luo read on
ly;
#
这时会发现命令处于等待状态,当
luo
用户执行
commit
后才会完成命令。
切换到
luo
用户:
SQL> truncate table test;
truncate table test
*
ERROR at line 1:
ORA-00372: file 11 cannot be modified at this time
ORA-01110: data file 11: '/u01/oradata/lty/luo.dbf'
SQL> drop table test;
Table dropped.
查询表空间里有哪些表:dba_tables
使表空间脱机
表空间一般是联机的,这样可方便数据库用户使用其中包含的数据。但是,数据库管理员可以让表空间脱机以便:
•
使数据库的一部分不可用,但允许正常访问数据库的其余部分
•
执行脱机表空间备份(尽管表空间可以在联机使用时备份)
•
在数据库打开时恢复表空间或数据文件
•
在数据库打开时移动数据文件
当表空间脱机后,
Oracle
不允许随后有任何
SQL
语句引用该表空间含有的对象。试图对脱机表空间内的对象进行访问的用户将收到一条错误消息。当表空间脱机或者重新联机后,该事件记录在数据字典和控制文件内。如果关闭数据库时表空间仍然脱机,则当随后数据库装载并重新打开时,该表空间仍保持脱机且不会被检查。
如果遇到某些错误(例如,当数据库写入程序进程
DBWn
几次试图向某表空间的数据文件写入都失败时),
Oracle
例程自动将表空间从联机切换为脱机。
只要数据库打开,数据库管理员就可以使任何表空间脱机(
SYSTEM
表空间
,缺省临时表空间
和任何具有活动还原段或临时段的表空间除外)。当一个表空间脱机后,
Oracle
服务器将使与之相关联的所有数据文件脱机
ALTER TABLESPACE tablespace{ONLINE |OFFLINE [NORMAL|TEMPORARY|IMMEDIATE|FOR RECOVER]}
其中:
NORMAL
:将该表空间中所有数据文件内的所有块从
SGA
中清空。这是缺省设置。在使该表空间重新联机之前,您无须对其执行介质恢复。尽可能使用
NORMAL
子句。
TEMPORARY
:对表空间内的所有联机数据文件执行检查点操作,即使某些文件无法写入。所有脱机文件可能都需要进行介质恢复。
IMMEDIATE
:不保证表空间文件可用,而且不执行检查点操作。在使表空间重新联机前,您必须对其执行介质恢复操作。
FOR RECOVER
:使表空间脱机以进行表空间时间点恢复。此选项在11g中已废除。
SQL> alter tablespace luo offline;
Tablespace altered.
SQL> select tablespace_name, status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ---------
LUO OFFLINE
SQL> alter tablespace luo online;
Tablespace altered.
更改存储设置
•
使用ALTER TABLESPACE 命令更改存储设置
ALTER TABLESPACE userdata MINIMUM EXTENT 2M;
ALTER TABLESPACE userdata DEFAULT STORAGE (INITIAL 2M NEXT 2M MAXEXTENTS 999);
•
不能更改在本地管理的表空间的存储设置
调整表空间大小
启用数据文件自动扩展:
1、
create database
2、
添加一个自动扩展文件:
新表空间:
SQL> create tablespace test datafile
2 '/u01/oradata/lty/test.dbf' size 20m
3 autoextend on next 10m maxsize 50m;
原有表空间:
SQL> alter tablespace luo add datafile
2 '/u01/oradata/lty/luo01.dbf' size 10m
3 autoextend on next 10m maxsize 30m;
3
、修改原有数据文件:
SQL> alter database datafile '/u01/oradata/lty/luo.dbf'
2
autoextend on next 10m maxsize 50m;
验证:
SQL> select file_name, autoextensible from dba_data_files;
FILE_NAME AUT
----------------------------------- ---
/u01/oradata/lty/system01.dbf YES
/u01/oradata/lty/undotbs01.dbf YES
/u01/oradata/lty/cwmlite01.dbf YES
/u01/oradata/lty/drsys01.dbf YES
/u01/oradata/lty/example01.dbf YES
/u01/oradata/lty/indx01.dbf YES
/u01/oradata/lty/odm01.dbf YES
/u01/oradata/lty/tools01.dbf YES
/u01/oradata/lty/users01.dbf YES
/u01/oradata/lty/xdb01.dbf YES
/u01/oradata/lty/luo.dbf YES
FILE_NAME AUT
----------------------------------- ---
/u01/oradata/lty/test.dbf YES
/u01/oradata/lty/luo01.dbf YES
手动调整数据文件大小:
查询表空间使用情况:
select a.TABLESPACE_NAME,
a.BYTES bytes_used,
b.BYTES bytes_free,
b.largest,
round(((a.BYTES-b.BYTES)/a.BYTES)*100,2) percent_used
from
(
select TABLESPACE_NAME,
sum(BYTES) BYTES
from dba_data_files
group by TABLESPACE_NAME
)
a,
(
select TABLESPACE_NAME,
sum(BYTES) BYTES ,
max(BYTES) largest
from dba_free_space
group by TABLESPACE_NAME
)
b
where a.TABLESPACE_NAME=b.TABLESPACE_NAME
order by ((a.BYTES-b.BYTES)/a.BYTES) desc
注:在
oracle10g
中提供了一个新的视图,可以直接获得表空间的空间使用情况:
SQL> select * from dba_tablespace_usage_metrics;
改变数据文件大小:
SQL> alter database datafile '/u01/oradata/lty/test.dbf'
2 resize 10m;
移动数据文件
•
重命名数据文件的步骤:
�C
使表空间脱机。
�C
使用操作系统命令移动或复制文件。
�C
执行
ALTER TABLESPACE RENAME DATAFILE
命令。
�C
使表空间联机。
�C
必要时使用操作系统命令删除该文件
SQL> alter tablespace test online;
$ mv test.dbf ./ts/
SQL> alter tablespace test rename datafile
2 '/u01/oradata/lty/test.dbf' to
3 '/u01/oradata/lty/ts/test.dbf';
Tablespace altered.
SQL> alter tablespace test online;
验证:
SQL> select file_name, tablespace_name from dba_data_files;
FILE_NAME TABLESPACE_NAME
----------------------------------- ------------------------------
/u01/oradata/lty/ts/test.dbf TEST
移动
system
表空间的方法:
1.
关闭数据库(因为system表空间无法offline)
2.
使用操作系统命令移动文件。
3.
装载数据库(mount状态)。
4.
执行
ALTER DATABASE RENAME FILE
命令。
5.
打开数据库。
删除表空间
不能删除下列表空间:
�C
SYSTEM
表空间
�C
具有活动段的表空间
DROP TABLESPACE tablespace
[INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]]
其中:
tablespace
:指定要删除的表空间的名称
INCLUDING CONTENTS
:删除表空间内的所有段
AND DATAFILES
:删除关联的操作系统文件
CASCADE CONSTRAINTS
:如果要删除的表空间之外的表引用了该表空间内表的主键和唯一键,则删除这种引用完整性约束
原则:
•
不使用
INCLUDING CONTENTS
选项,将无法删除仍包含数据的表空间。当表空间包含许多对象时,该选项可能会生成许多还原数据。
•
删除表空间后,其数据将不再包含在数据库内。
•
在删除表空间时,只删除关联数据库控制文件内的文件指针。操作系统文件仍然存在,如果未使用
AND DATAFILES
子句或数据文件是
OMF
,则必须使用适当的操作系统命令明确删除这些文件。
•
即使将表空间切换到只读状态,仍可以删除该表空间以及其中的段。
•
删除表空间之前,建议您将表空间脱机,以确保没有事务处理访问该表空间内的任何段。
获得关于表空间的信息:
-DBA_TABLESPACES
- V$TABLESPACE
- V$DATAFILE
练习:
1 Create permanent tablespaces with the following names and storage:
a Tablespace name: DATA01
Data file name: data01.dbf
Size: 2M
Extent Management: dictionary
Location: u04
b Tablespace name: DATA02
Data file name: data02.dbf
Size: 1M
Extent management: local uniform size 100K
Location: u03
c Tablespace name: INDEX01
Data file name: index01.dbf
Size: 1M
Extent management: local uniform size 4K
Location: u02
Enable automatic extension of 500 KB when more extents are required with a maximum size of 2 MB.
d Tablespace name: RONLY
Data file name: ronly01.dbf
Size: 1M
Location: u01
Default storage. DO NOT make the tablespace read-only at this time.
e Display the information from the data dictionary.
Hint: Information about tablespaces can be viewed using any of the following queries.
- DBA_TABLESPACES
- V$TABLESPACE
- V$DATAFILE
2 Allocate 500K more disk space to tablespace DATA02. Verify the result.
3 Relocate tablespace INDEX01 to subdirectory u06. Verify relocation and status of
INDEX01.
Hints
- Take the INDEX01 tablespace offline.
- Use V$DATAFILE to verify status.
- Use operating system move command to move the tablespace to u06.
- Use ALTER TABLESPACE to relocate the tablespace.
- Place the INDEX01 tablespace online.
- Use V$DATAFILE to verify status.
4 a Connect as user SYSTEM and create a table in tablespace RONLY. Make tablespace
read-only. Run a query to verify it.
b Attempt to create an additional table called TABLE2. Drop the first created table,
TABLE1. What happens?
5 Drop tablespace RONLY and the associated data file. Verify it.
Hints
- Use the INCLUDING CONTENTS AND DATAFILES clause
- View V$TABLESPACE to verify the tablespace was dropped.
- Use the ! from the SQL prompt to see a list of the data files in u01.
本文出自 “ 冰冷的太阳” 博客,请务必保留此出处 http://luotaoyang.blog.51cto.com/545649/288361