14、Oracle 教程 - Oracle 的数据文件(Data files)与表空间管理

Oracle 的表空间是一个逻辑概念,Oracle数据库是由若干个表空间构成的。数据库对象在存储时必须存储在某个表空间中。一个表空间对应若干个数据文件,即一个表空间由一个或多个数据文件构成,但一个数据文件只能属于一个表空间。
表空间可以理解为操作系统中的文件夹,是 Oracle 数据库逻辑结构与物理文件之间的一个映射。数据库的存储空间在物理上表现为数据文件,在逻辑上表现为表空间。表空间的大小等于所有从属于它的数据文件大小的总和。

一、表空间的概念

Oarcle 数据库真正存放数据的是数据文件,表空间(tablespaces)实际上是一个逻辑的概念,在物理上并不存在。表空间具有如下特点:
(1)一个数据库可以包含多个表空间,一个表空间只能属于一个数据库;
(2)一个表空间包含多个数据文件,一个数据文件只能属于一个表空间。

表空间分为系统表空间(system 表空间、sysaux 表空间)和非系统表空间(undo 表空间,temp 表空间,users 表空间,自定义表空间)。查看表空间:

SQL> select * from v$tablespace;

       TS# NAME 			  INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
	 0 SYSTEM			  YES NO  YES       -- system 表空间
	 1 SYSAUX			  YES NO  YES       -- systemaux 表空间
	 2 UNDOTBS1			  YES NO  YES       -- undo 表空间
	 4 USERS			  YES NO  YES       -- users 表空间
	 3 TEMP 			  NO  NO  YES       -- temp 表空间
	 5 UNDOTBS2			  YES NO  YES       -- undo 表空间

6 rows selected.

各种表空间的作用如下:
(1)system 表空间:用来存储整个数据库的数据字典表(data dictionary table),该表空间一旦损坏,数据库将无法打开。
(2)sysaux 表空间:Oracle 将工具放到 sysaux 表空间,以减轻 system 表空间的压力。
(3)undo 表空间:用来保存事务中的 DML 语句的 undo 信息,保存的是数据在被修改之前的值。undo 表空间用于:事务的回滚;实例恢复(回滚);一致性读时需要构造 CR 块。
(4)temp 表空间:即临时表空间,用来存放用户排序,分组等操作时的数据信息。
(5)users 表空间:存放用户数据。
(6)自定义表空间:用户创建的表空间。

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

SQL> select tablespace_name,file_id,file_name from dba_data_files;

TABLESPACE_NAME 		  FILE_ID FILE_NAME
----------------- ---------- ------------------------------------------------------------
USERS					4 +DATA/orcl/datafile/users.259.1070471891
UNDOTBS1				3 +DATA/orcl/datafile/undotbs1.258.1070471891
SYSAUX					2 +DATA/orcl/datafile/sysaux.257.1070471889
SYSTEM					1 +DATA/orcl/datafile/system.256.1070471889
UNDOTBS2				5 +DATA/orcl/datafile/undotbs2.264.1070472143

SQL> select file#,vd.ts#,vt.name tablespace_name,vd.name datafile_name 
     from v$datafile vd, v$tablespace vt 
     where vd.ts#=vt.ts#;

     FILE#	  TS# TABLESPACE_NAME		     DATAFILE_NAME
---------- ---------- ------------------------------ ------------------------------------
	 1	    0 SYSTEM			     +DATA/orcl/datafile/system.256.1070471889
	 2	    1 SYSAUX			     +DATA/orcl/datafile/sysaux.257.1070471889
	 3	    2 UNDOTBS1			     +DATA/orcl/datafile/undotbs1.258.1070471891
	 4	    4 USERS			         +DATA/orcl/datafile/users.259.1070471891
	 5	    5 UNDOTBS2			     +DATA/orcl/datafile/undotbs2.264.1070472143

二、创建表空间

Oracle 使用 create tablespace 命令创建表空间,该命令的语法格式如下:

create [TEMPORARY] tablespace tablespace_name  ----- 表空间的名称
TEMPFILE | datafile '.../*.dbf'               ----- 数据文件的路径和名称
size x M|G                         ----- 数据文件的初始大小
autoextend on next x M|G           ----- 数据文件每次自动扩展多少
maxsize unlimited | x M|G;         ----- 数据文件的最大尺寸

-- 说明:TEMPORARY 选项用于创建临时表空间,同时使用 TEMPFILE 指定文件名。

举例:

SQL> create tablespace ts001 
     datafile '+DATA/orcl/datafile/ts001.DBF' 
     size 100M 
     autoextend on next 100M 
     maxsize 2G;
Tablespace created.

SQL> select tablespace_name,file_id,file_name from dba_data_files;
TABLESPACE_NAME 		  FILE_ID FILE_NAME
------ ---------- ------------------------------------------------------------
USERS					4 +DATA/orcl/datafile/users.259.1070471891
UNDOTBS1				3 +DATA/orcl/datafile/undotbs1.258.1070471891
SYSAUX					2 +DATA/orcl/datafile/sysaux.257.1070471889
SYSTEM					1 +DATA/orcl/datafile/system.256.1070471889
UNDOTBS2				5 +DATA/orcl/datafile/undotbs2.264.1070472143
TS001					6 +DATA/orcl/datafile/ts001.dbf
6 rows selected.

创建用户 hmj 并指定临时表空间和默认表空间:

-- 创建用户 hmj
create user hmj identified by hmj
default tablespace TS001
temporary tablespace TEMP;
 
-- 给用户 hmj 授权
SQL> grant connect, resource to hmj;
Grant succeeded.

三、数据文件的管理

1、为表空间添加数据文件

SQL> alter tablespace ts001 
     add datafile '+DATA/orcl/datafile/ts001_2.dbf' 
     size 100M 
     autoextend on next 50m;
Tablespace altered.

SQL> select tablespace_name,file_id,file_name from dba_data_files;

TABLESPACE_NAME 		  FILE_ID FILE_NAME
---------------------------------------------------------------------------------
USERS					4 +DATA/orcl/datafile/users.259.1070471891
UNDOTBS1				3 +DATA/orcl/datafile/undotbs1.258.1070471891
SYSAUX					2 +DATA/orcl/datafile/sysaux.257.1070471889
SYSTEM					1 +DATA/orcl/datafile/system.256.1070471889
UNDOTBS2				5 +DATA/orcl/datafile/undotbs2.264.1070472143
TS001					6 +DATA/orcl/datafile/ts001.dbf
TMP002					7 +DATA/orcl/datafile/tmp002.dbf
TS001					8 +DATA/orcl/datafile/ts001_2.dbf
8 rows selected.

2、修改数据文件大小

SQL> alter database orcl
     datafile '+DATA/orcl/datafile/ts001_2.dbf' 
     resize 200M;
Database altered.

3、重命名数据文件

(1)使用 alter tablespace 命令——不需要停库

-- 数据库在 open 状态
--1、设置表空间为 offline 状态
SQL> alter tablespace ts001 offline;
Tablespace altered.

--2、在操作系统下修改文件名
ASMCMD> cp +DATA/orcl/datafile/ts001.dbf +DATA/orcl/datafile/ts001_1.dbf
copying +DATA/orcl/datafile/ts001.dbf -> +DATA/orcl/datafile/ts001_1.dbf
ASMCMD> rm +DATA/orcl/datafile/ts001.dbf

--3、更新控制文件中的数据文件信息
SQL> alter tablespace rename file '+DATA/orcl/datafile/ts001.dbf' to '+DATA/orcl/datafile/ts001_1.dbf';
Tablespace altered.

--4、设置表空间为 online 状态
SQL> alter tablespace ts001 online;
Tablespace altered.

查看表空间对应的数据文件信息:

SQL> select tablespace_name,file_id,file_name from dba_data_files;
TABLESPACE_NAME 		  FILE_ID FILE_NAME
---------------------- ---------- ------------------------------------------------------------
USERS					4 +DATA/orcl/datafile/users.259.1070471891
UNDOTBS1				3 +DATA/orcl/datafile/undotbs1.258.1070471891
SYSAUX					2 +DATA/orcl/datafile/sysaux.257.1070471889
SYSTEM					1 +DATA/orcl/datafile/system.256.1070471889
UNDOTBS2				5 +DATA/orcl/datafile/undotbs2.264.1070472143
TS001					6 +DATA/orcl/datafile/ts001_1.dbf
TMP002					7 +DATA/orcl/datafile/tmp002.dbf
TS001					8 +DATA/orcl/datafile/ts001_2.dbf

8 rows selected.

(2)使用 alter database 命令——需要停库

--1、关闭数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

--2、移动 ts001 表空间对应的数据文件
ASMCMD> cp +DATA/orcl/datafile/ts001_1.dbf +DATA/orcl/datafile/ts1_001.dbf
copying +DATA/orcl/datafile/ts001_1.dbf -> +DATA/orcl/datafile/ts1_001.dbf
ASMCMD> rm +DATA/orcl/datafile/ts001_1.dbf
ASMCMD> cp +DATA/orcl/datafile/ts001_2.dbf +DATA/orcl/datafile/ts1_002.dbf
copying +DATA/orcl/datafile/ts001_2.dbf -> +DATA/orcl/datafile/ts1_002.dbf
ASMCMD> rm +DATA/orcl/datafile/ts001_2.dbf

--3、启动到数据库到 mount 状态
SQL> startup mount
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size		    2257840 bytes
Variable Size		  603982928 bytes
Database Buffers	  226492416 bytes
Redo Buffers		    2371584 bytes
Database mounted.

--4、使用 alter database 命令更改控制文件中数据文件的位置信息
SQL> alter database rename file '+DATA/orcl/datafile/ts001_1.dbf' to '+DATA/orcl/datafile/ts1_001.dbf';
Database altered.

SQL> alter database rename file '+DATA/orcl/datafile/ts001_2.dbf' to '+DATA/orcl/datafile/ts1_002.dbf';
Database altered.

--5、启动数据库到 open 状态
SQL> alter database open;
Database altered.

查看表空间对应的数据文件信息:

SQL> select tablespace_name,file_id,file_name from dba_data_files;

TABLESPACE_NAME 		  FILE_ID FILE_NAME
-------------- ---------- ------------------------------------------------------------
USERS					4 +DATA/orcl/datafile/users.259.1070471891
UNDOTBS1				3 +DATA/orcl/datafile/undotbs1.258.1070471891
SYSAUX					2 +DATA/orcl/datafile/sysaux.257.1070471889
SYSTEM					1 +DATA/orcl/datafile/system.256.1070471889
UNDOTBS2				5 +DATA/orcl/datafile/undotbs2.264.1070472143
TS001					6 +DATA/orcl/datafile/ts1_001.dbf
TMP002					7 +DATA/orcl/datafile/tmp002.dbf
TS001					8 +DATA/orcl/datafile/ts1_002.dbf

8 rows selected.