1. 介绍
在 Oracle 中,表空间是用来分配存储空间的逻辑结构。当需要定义表、索引时,都会指定它们所使用的表空间。
由于数据库中的表空间很容易因为数据量增长导致空间不足的情况,因此需要对表空间进行管理和更改。
2. 查看表空间信息
在进行表空间的管理和更改操作前,需要对表空间进行查看。
2.1 查看表空间使用情况
可以使用以下 SQL 语句查看所有表空间的使用情况:
SELECT
TABLESPACE_NAME,
ROUND(SUM(BYTES) / 1024 / 1024, 2) AS TOTAL_MB,
ROUND(SUM(BYTES - NVL(BLOCKS * BLOCK_SIZE, 0)) / 1024 / 1024, 2) AS USED_MB,
ROUND(NVL(SUM(BLOCKS * BLOCK_SIZE), 0) / 1024 / 1024, 2) AS FREE_MB,
ROUND((SUM(BYTES - NVL(BLOCKS * BLOCK_SIZE, 0))) / SUM(BYTES) * 100, 2) AS USED_PERCENTAGE
FROM
DBA_DATA_FILES
GROUP BY TABLESPACE_NAME;
该 SQL 语句会返回每个表空间的名称、总空间、已用空间、可用空间和使用百分比。查询结果如下图所示:
2.2 查看指定表空间的信息
可以使用以下 SQL 语句查看指定表空间(例如表空间 tbs_01)的详细信息:
SELECT
FILE_NAME,
ROUND(BYTES / 1024 / 1024, 2) AS TOTAL_MB,
AUTOEXTENSIBLE,
MAXBYTES,
INCREMENT_BY,
ROUND((BYTES - NVL(BLOCKS * BLOCK_SIZE, 0)) / 1024 / 1024, 2) AS USED_MB,
ROUND(NVL(BLOCKS * BLOCK_SIZE, 0) / 1024 / 1024, 2) AS FREE_MB,
ROUND((BYTES - NVL(BLOCKS * BLOCK_SIZE, 0)) / BYTES * 100, 2) AS USED_PERCENTAGE
FROM
DBA_DATA_FILES
WHERE
TABLESPACE_NAME = 'TBS_01';
该 SQL 语句会返回表空间 tbs_01 中每个数据文件的名称、总空间、是否自动扩展、最大空间、增量、已用空间、可用空间和使用百分比。查询结果如下图所示:
3. 更改表空间
在进行更改表空间的操作前,需要先了解以下几个概念:
表空间(tablespace):逻辑存储单元。
数据文件(datafile):物理存储单元。
段(segment):表、索引、LOB 等结构的存储区域。
表空间和数据文件的关系:一个表空间可以由多个数据文件组成。
更改表空间需要进行以下几个步骤:
创建一个新的表空间。
将需要更改的数据文件从原来的表空间中分离出来(detaching)。
将数据文件附加(attaching)到新的表空间中。
将表空间中的段(表、索引、LOB 等)移动到新的表空间中。
3.1 创建新的表空间
可以使用以下 SQL 语句创建一个新的表空间(例如表空间 tbs_02):
CREATE TABLESPACE TBS_02
DATAFILE '/u01/oracle/oradata/ORCL/tbs_02_01.dbf' SIZE 100M
AUTOEXTEND ON NEXT 100M
MAXSIZE UNLIMITED;
该语句会创建一个表空间 tbs_02,其中包含一个数据文件 tbs_02_01.dbf(路径为 /u01/oracle/oradata/ORCL/tbs_02_01.dbf),初始大小为 100M,自动扩展时每次增加 100M,最大不限制。
3.2 分离数据文件
可以使用以下 SQL 语句将数据文件(例如数据文件 tbs_01_01.dbf)从原来的表空间中分离出来:
ALTER TABLESPACE TBS_01
OFFLINE NORMAL
DATAFILE '/u01/oracle/oradata/ORCL/tbs_01_01.dbf';
该语句会将数据文件 tbs_01_01.dbf 从表空间 tbs_01 中分离出来。
3.3 附加数据文件
可以使用以下 SQL 语句将数据文件(例如数据文件 tbs_01_01.dbf)附加到新的表空间(例如表空间 tbs_02)中:
ALTER TABLESPACE TBS_02
ADD DATAFILE '/u01/oracle/oradata/ORCL/tbs_01_01.dbf'
SIZE 100M
AUTOEXTEND ON NEXT 100M
MAXSIZE UNLIMITED;
该语句会将数据文件 tbs_01_01.dbf 附加到表空间 tbs_02 中,初始大小为 100M,自动扩展时每次增加 100M,最大不限制。
3.4 移动段
可以使用以下 SQL 语句将一个段(例如表 emp)从原来的表空间中移动到新的表空间中:
ALTER TABLE EMP
MOVE TABLESPACE TBS_02;
该语句会将表 emp 从原来的表空间中移动到表空间 tbs_02 中。
4. 总结
更改表空间是进行 Oracle 数据库管理的一项重要操作。在进行操作前,需要先查看表空间信息,然后按照顺序分别进行创建新的表空间、分离数据文件、附加数据文件和移动段。