Oracle表空间维护操作总结
一、表空间基本概述
1.1 什么是表空间
表空间(Tablespace)是Oracle数据库中的一种逻辑存储结构,用于存储数据库对象(如表、索引、视图等),是Oracle中信息存储的最大逻辑单元。
从逻辑结构来看,数据库由多个表空间构成,表空间下包含段(Segment)、区(Extent)、数据块(Data Block)等逻辑数据类型。从物理结构来看,数据信息存储在数据文件中,一个表空间至少包含一个数据文件。表空间的大小等于其所有数据文件的大小总和。
核心要点:
- 表空间是逻辑概念,数据文件是物理概念
- 一个表空间至少包含一个数据文件
- 表空间是Oracle数据库恢复的最小单位
- 一个表空间只能属于一个数据库
1.2 表空间的逻辑层次
数据库(Database)
└── 表空间(Tablespace) ← 最大逻辑单元
└── 段(Segment)
└── 区(Extent)
└── 数据块(Data Block) ← 最小I/O单元
└── 操作系统块(OS Block)
二、Oracle表空间的类型
2.1 按用途分类
| 类型 | 说明 | 存储内容 |
|---|---|---|
| 永久表空间(PERMANENT) | 存储需要永久保存的数据库对象 | 表、索引、视图、存储过程等 |
| 临时表空间(TEMPORARY) | 存储数据库操作过程中的临时数据 | ORDER BY排序、GROUP BY分组产生的临时数据 |
| 撤销表空间(UNDO) | 存储数据修改前的副本 | 事务回滚、读一致性、闪回查询所需的数据 |
2.2 按文件规模分类
| 类型 | 说明 | 数据文件数量 |
|---|---|---|
| 小文件表空间(Smallfile) | 传统表空间,使用多个数据文件 | 最多1022个数据文件 |
| 大文件表空间(Bigfile) | Oracle 10g引入,使用单个超大文件 | 仅1个数据文件 |
2.3 系统默认表空间
Oracle数据库安装完成后默认创建以下表空间:
- SYSTEM:系统表空间,存储数据字典、系统对象和PL/SQL源代码
- SYSAUX:辅助系统表空间,减轻SYSTEM表空间负荷
- TEMP:默认临时表空间
- UNDOTBS1:默认撤销表空间(自动撤销管理模式下)
- USERS:默认用户表空间
三、表空间创建语法
3.1 创建永久表空间
基本语法:
CREATE TABLESPACE tablespace_name
DATAFILE 'datafile_path' SIZE size
[AUTOEXTEND ON NEXT increment_size MAXSIZE max_size]
[EXTENT MANAGEMENT LOCAL
[UNIFORM SIZE uniform_size | AUTOALLOCATE]]
[SEGMENT SPACE MANAGEMENT {AUTO | MANUAL}];
| 参数 | 说明 |
|---|---|
DATAFILE |
指定数据文件路径和名称 |
SIZE |
数据文件初始大小 |
AUTOEXTEND ON |
启用自动扩展 |
NEXT |
每次自动扩展的增量 |
MAXSIZE |
数据文件最大上限,UNLIMITED 表示无限制 |
EXTENT MANAGEMENT LOCAL |
本地化管理区分配(Oracle 9i 后默认且推荐) |
| UNIFORM SIZE | 本地化管理区分配下,表示表空间中所有段(表、索引等)在分配区时,每个区的大小都固定统一,不随段的增长而变化 |
| AUTOALLOCATE | 本地化管理区分配下,默认区分配方式,由 Oracle 自动决定每个区的大小,Oracle 会根据段(Segment)当前的数据量,按阶梯式递增策略动态分配区大小 |
SEGMENT SPACE MANAGEMENT AUTO |
自动段空间管理(ASSM),使用位图管理空闲空间 |
示例:
-- 创建基础表空间
CREATE TABLESPACE my_tbs
DATAFILE '/oradata/orcl/my_tbs01.dbf' SIZE 50M;
-- 创建表空间并启用自动扩展
CREATE TABLESPACE app_data
DATAFILE '/oradata/orcl/app_data01.dbf' SIZE 50M
AUTOEXTEND ON NEXT 100M MAXSIZE 20G;
-- 创建表空间指定区和段管理方式
CREATE TABLESPACE hr_data
DATAFILE '/oradata/orcl/hr_data01.dbf' SIZE 50M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
SEGMENT SPACE MANAGEMENT AUTO;
3.2 创建临时表空间
CREATE TEMPORARY TABLESPACE temp_tbs
TEMPFILE 'tempfile_path' SIZE size
[AUTOEXTEND ON NEXT increment_size MAXSIZE max_size]
[EXTENT MANAGEMENT LOCAL UNIFORM SIZE size];
-- 示例
CREATE TEMPORARY TABLESPACE temp_data
TEMPFILE '/oradata/orcl/temp_data01.dbf' SIZE 50M
AUTOEXTEND ON NEXT 50M MAXSIZE 10G
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
3.3 创建撤销表空间
CREATE UNDO TABLESPACE undo_tbs
DATAFILE 'datafile_path' SIZE size
[RETENTION GUARANTEE];
-- 示例
CREATE UNDO TABLESPACE undo_data
DATAFILE '/oradata/orcl/undo_data01.dbf' SIZE 50M;
3.4 设置默认表空间
-- 设置默认永久表空间
ALTER DATABASE DEFAULT TABLESPACE app_data;
-- 设置默认临时表空间
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_data;
3.5 查看创建语句
-- 查询表空间创建DDL语句
set long 200000
SELECT DBMS_METADATA.GET_DDL('TABLESPACE', 'MY_TBS') FROM DUAL;
四、表空间扩容方法
当表空间容量不足时,可以通过以下三种方法进行扩容。
4.1 方法一:添加新的数据文件
ALTER TABLESPACE tablespace_name ADD DATAFILE 'file_path' SIZE size;
-- 示例
ALTER TABLESPACE app_data ADD DATAFILE '/u01/app/oracle/oradata/mydb/app_data02.dbf' SIZE 1G;
4.2 方法二:调整现有数据文件大小
ALTER DATABASE DATAFILE 'file_path' RESIZE new_size;
-- 示例
ALTER DATABASE DATAFILE '/oradata/orcl/app_data01.dbf' RESIZE 100M;
4.3 方法三:启用数据文件自动扩展
-- 对已存在的数据文件启用自动扩展
ALTER DATABASE DATAFILE 'file_path'
AUTOEXTEND ON NEXT increment_size MAXSIZE max_size;
-- 示例
ALTER DATABASE DATAFILE '/oradata/orcl/app_data01.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE 20G;
4.4 创建表空间时指定自动扩展
CREATE TABLESPACE my_tbs
DATAFILE '/oradata/orcl/my_tbs01.dbf' SIZE 50M
AUTOEXTEND ON NEXT 50M MAXSIZE 20480M;
注意事项:
- 确保有足够的磁盘空间
- 自动扩展可能导致磁盘空间迅速耗尽,需合理设置增量和最大大小
五、表空间删除
5.1 基本语法
DROP TABLESPACE tablespace_name [INCLUDING CONTENTS [AND DATAFILES]];
5.2 删除方式
| 删除方式 | 说明 |
|---|---|
DROP TABLESPACE tbs_name; |
仅删除表空间定义(表空间必须为空) |
DROP TABLESPACE tbs_name INCLUDING CONTENTS; |
删除表空间及其中的所有对象 |
DROP TABLESPACE tbs_name INCLUDING CONTENTS AND DATAFILES; |
删除表空间、对象及对应的数据文件 |
5.3 重要限制
- 回收站:删除的表空间不会进入回收站,无法恢复
- 不能删除SYSTEM表空间
- 默认表空间:不能删除数据库的默认表空间
- 活动事务:不能删除包含活动事务回滚段的表空间
5.4 删除示例
-- 删除表空间及其所有内容和数据文件
DROP TABLESPACE my_tbs INCLUDING CONTENTS AND DATAFILES;
六、表空间中删除数据文件
6.1 基本语法
ALTER TABLESPACE tablespace_name DROP DATAFILE 'datafile_path';
6.2 删除条件
删除数据文件必须满足以下条件:
- 数据文件必须为空(没有已分配的区段),否则报错
ORA-03262: the file is non-empty - 不能是表空间的第一个数据文件
- 表空间不能处于READ ONLY状态
6.3 删除前检查
-- 查看数据文件中是否存在段
SELECT segment_name, segment_type, owner
FROM dba_extents
WHERE file_id = (SELECT file_id FROM dba_data_files WHERE file_name = '/path/to/file.dbf');
6.4 删除示例
SQL> SELECT segment_name, segment_type, owner
2 FROM dba_extents
3 WHERE file_id = (SELECT file_id FROM dba_data_files WHERE file_name = '/oradata/orcl/app_data02.dbf');
no rows selected
SQL> ALTER TABLESPACE app_data DROP DATAFILE '/oradata/orcl/app_data02.dbf';
Tablespace altered.
SQL> select file_name from dba_data_Files where tablespace_Name='APP_DATA';
FILE_NAME
--------------------------------------------------------------------------------
/oradata/orcl/app_data01.dbf
可以看到,控制文件和数据字典中,app_data02.dbf已经被彻底删除!
6.5 常见误区
ALTER DATABASE DATAFILE ... OFFLINE DROP 并不会删除数据文件,只是将数据文件置于离线状态。数据文件的相关信息仍会保留在数据字典和控制文件中。
SQL> ALTER DATABASE DATAFILE '/oradata/orcl/app_data02.dbf' offline DROP;
Database altered.
SQL> select file_name from dba_data_Files where tablespace_Name='APP_DATA';
FILE_NAME
--------------------------------------------------------------------------------
/oradata/orcl/app_data02.dbf --可以看到,文件在控制文件和数据字典中元数据保留
/oradata/orcl/app_data01.dbf
如果有增量归档日志,可以将该文件恢复后,继续联机online,类似如下:
SQL> recover datafile '/oradata/orcl/app_data02.dbf';
Media recovery complete.
SQL> ALTER DATABASE DATAFILE '/oradata/orcl/app_data02.dbf' online;
Database altered.
七、表空间离线和联机
7.1 基本语法
-- 将表空间设置为联机状态
ALTER TABLESPACE tablespace_name ONLINE;
-- 将表空间设置为离线状态
ALTER TABLESPACE tablespace_name OFFLINE [NORMAL | TEMPORARY | IMMEDIATE];
-- 示例
SQL> alter tablespace app_data offline immediate;
Tablespace altered.
SQL> recover tablespace app_data;
Media recovery complete.
SQL> alter tablespace app_data online;
Tablespace altered.
7.2 离线方式的区别
| 离线方式 | 检查点 | 是否需要介质恢复 | 说明 |
|---|---|---|---|
| NORMAL(默认) | 对所有数据文件执行检查点 | 不需要 | 最安全的方式 |
| TEMPORARY | 仅对在线的数据文件执行检查点 | 可能需要 | 适用于部分数据文件已损坏 |
| IMMEDIATE | 不执行检查点 | 必须执行 | 最快但恢复成本最高 |
7.3 重要限制
- 临时表空间不能离线
- SYSTEM表空间不能离线
- 数据库必须处于OPEN状态才能修改表空间的可用性
- immediate选项必须数据库开启归档模式才可以
7.4 表空间只读/读写
-- 设置为只读
ALTER TABLESPACE tablespace_name READ ONLY;
-- 设置为读写
ALTER TABLESPACE tablespace_name READ WRITE;
-- 示例
SQL> alter tablespace app_data read only;
Tablespace altered.
SQL> alter tablespace app_data read write;
Tablespace altered.
注意:SYSAUX、SYSTEM和临时表空间不能设置为只读
八、大文件表空间介绍
8.1 什么是大文件表空间
大文件表空间(Bigfile Tablespace)是Oracle 10g开始引入的特性,每个表空间仅包含一个数据文件或临时文件,该文件最多可包含约40亿(2³²)个数据块。由于大文件单点故障、备份恢复都不友好,实际生产环境,使用这种模式的表空间很少,了解即可。
| 对比维度 | 大文件表空间(Bigfile) | 小文件表空间(Smallfile) |
|---|---|---|
| 数据文件数量 | 每个表空间仅1个 | 每个表空间最多1022个 |
| 单文件最大容量(8K块) | 约32TB | 约32GB |
| 管理复杂度 | 低(单文件透明管理) | 较高(需管理多个文件) |
| 单点故障风险 | 高 | 低(风险分散) |
| 适用场景 | 数据仓库、ASM环境、云存储 | OLTP、多设备环境 |
| 备份恢复 | 大文件备份恢复的时间窗口较长 | 粒度细,可并行 |
8.2 创建大文件表空间
CREATE BIGFILE tablespace big_ts
DATAFILE '/oradata/orcl/big_ts01.dbf' SIZE 50m
AUTOEXTEND ON NEXT 1G MAXSIZE UNLIMITED;
-- 创建大文件临时表空间
CREATE BIGFILE TEMPORARY tablespace temp_big
TEMPFILE '/oradata/orcl/temp_big01.dbf' SIZE 50m;
8.3 大文件表空间扩容
由于大文件表空间只有一个数据文件,扩容直接在表空间级别操作:
-- 方法一:调整表空间大小
ALTER tablespace big_ts RESIZE 100m;
-- 方法二:通过数据文件方式
ALTER DATABASE DATAFILE '/oradata/orcl/big_ts01.dbf' RESIZE 150m;
-- 方法三:启用自动扩展
ALTER tablespace big_ts AUTOEXTEND ON NEXT 1G MAXSIZE 10T;
8.4 查看大文件表空间
-- 查看表空间类型
SELECT tablespace_name, bigfile FROM dba_tablespaces;
-- 查看大文件表空间的数据文件
SELECT file_name, bytes FROM dba_data_files WHERE tablespace_name = 'BIG_TS';
九、表空间重命名操作
9.1 基本语法
ALTER TABLESPACE old_tablespace RENAME TO new_tablespace;
示例:
ALTER TABLESPACE app_data RENAME TO app_data_1;
9.2 注意事项
- 重命名后,数据库会更新数据字典、控制文件和数据文件头中的名称引用
- SYSTEM和SYSAUX表空间不建议重命名
- 重命名操作不会影响数据文件的实际路径和名称
- 需要拥有
ALTER TABLESPACE权限
十、表空间中数据文件迁移操作
10.1 方法一:ALTER DATABASE RENAME FILE(适用于任何表空间)
适用于表空间离线或数据库MOUNT状态:
-- 1. 查看当前数据文件路径
SELECT file_name FROM dba_data_files WHERE tablespace_name = 'TBS_NAME';
-- 2. 关闭数据库并启动到MOUNT状态
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
-- 3. 在操作系统层面移动文件(如mv命令)
-- 4. 更新控制文件
ALTER DATABASE RENAME FILE '/old_path/datafile.dbf' TO '/new_path/datafile.dbf';
-- 5. 打开数据库
ALTER DATABASE OPEN;
-- 示例
SQL> SELECT file_name FROM dba_data_files WHERE tablespace_name = 'APP_DATA';
FILE_NAME
--------------------------------------------------------------------------------
/oradata/orcl/app_data02.dbf
/oradata/orcl/app_data01.dbf
SQL> SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> ORACLE instance started.
......
Database mounted.
操作系统层面oracle用户执行
mv /oradata/orcl/app_data02.dbf /oradata/orcl_test/app_data_test02.dbf
SQL> ALTER DATABASE RENAME FILE '/oradata/orcl/app_data02.dbf' TO '/oradata/orcl_test/app_data_test02.dbf';
Database altered.
SQL> alter database open;
Database altered.
SQL> SELECT file_name FROM dba_data_files WHERE tablespace_name = 'APP_DATA';
FILE_NAME
--------------------------------------------------------------------------------
/oradata/orcl_test/app_data_test02.dbf --可以看到已经移动成功
/oradata/orcl/app_data01.dbf
10.2 方法二:ALTER TABLESPACE RENAME DATAFILE(表空间级别)
适用于表空间离线,无需关闭整个数据库:
-- 1. 将表空间离线
ALTER TABLESPACE tablespace_name OFFLINE;
-- 2. 在操作系统层面移动文件(如mv命令)
-- 3. 更新表空间中的数据文件路径
ALTER TABLESPACE tablespace_name
RENAME DATAFILE '/old_path/datafile.dbf' TO '/new_path/datafile.dbf';
-- 4. 将表空间联机
ALTER TABLESPACE tablespace_name ONLINE;
-- 示例
SQL> SELECT file_name FROM dba_data_files WHERE tablespace_name = 'APP_DATA';
FILE_NAME
--------------------------------------------------------------------------------
/oradata/orcl_test/app_data_test02.dbf
/oradata/orcl/app_data01.dbf
SQL> ALTER TABLESPACE APP_DATA OFFLINE;
Tablespace altered.
SQL> host mv /oradata/orcl/app_data01.dbf /oradata/orcl_test/app_data_test01.dbf
//host表示执行后续执行操作系统命令,mv表示移动文件
SQL> ALTER TABLESPACE APP_DATA RENAME DATAFILE '/oradata/orcl/app_data01.dbf' TO '/oradata/orcl_test/app_data_test01.dbf';
Tablespace altered.
SQL> ALTER TABLESPACE APP_DATA ONLINE;
Tablespace altered.
SQL> SELECT file_name FROM dba_data_files WHERE tablespace_name = 'APP_DATA';
FILE_NAME
--------------------------------------------------------------------------------
/oradata/orcl_test/app_data_test02.dbf
/oradata/orcl_test/app_data_test01.dbf --可以看到数据文件移动成功
10.3 注意事项
- 确保目标路径有足够的磁盘空间
- 对于SYSTEM表空间的数据文件迁移,需要数据库处于MOUNT状态
十一、OMF文件管理方式
11.1 OMF概述
OMF(Oracle Managed Files)是Oracle提供的自动化文件管理方式,启用后无需指定文件名称、大小、路径,由Oracle自动分配和管理。
11.2 配置OMF
-- 设置OMF数据文件默认存放路径
ALTER SYSTEM SET DB_CREATE_FILE_DEST = '/oradata/omf' SCOPE=BOTH;
-- 查看当前OMF配置
SHOW PARAMETER DB_CREATE_FILE_DEST;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string /oradata/omf
11.3 使用OMF创建表空间
-- 创建表空间(Oracle自动命名和分配文件)
CREATE TABLESPACE omf_ts DATAFILE SIZE 100M;
-- 创建大文件表空间
CREATE BIGFILE TABLESPACE omf_big_ts DATAFILE SIZE 500M;
-- 创建临时表空间
CREATE TEMPORARY TABLESPACE omf_temp TEMPFILE SIZE 200M;
-- 创建撤销表空间
CREATE UNDO TABLESPACE omf_undo DATAFILE SIZE 300M;
11.4 OMF表空间的维护
-- 为OMF表空间添加数据文件(Oracle自动命名)
ALTER TABLESPACE omf_ts ADD DATAFILE SIZE 100M;
-- 删除OMF表空间(Oracle自动删除对应的数据文件)
DROP TABLESPACE omf_ts INCLUDING CONTENTS AND DATAFILES;
-- 将OMF表空间的数据文件移动到新位置
-- 1. 先获取OMF生成的完整文件名
SELECT file_name FROM dba_data_files WHERE tablespace_name = 'OMF_TS';
-- 2. 离线表空间并移动文件,然后使用RENAME命令更新,与常规数据文件重命名一样
11.5 OMF的优势与注意事项
| 优势 | 说明 |
|---|---|
| 简化管理 | 无需手动管理文件名和路径 |
| 自动清理 | 删除表空间时自动删除对应的数据文件 |
| 减少错误 | 避免因路径或文件名错误导致的问题 |
注意:OMF模式下创建的表空间,数据文件位置由
DB_CREATE_FILE_DEST参数决定,不能通过CREATE TABLESPACE语句指定其他位置。
十二、表空间备份和恢复
实际生产环境中,很少单独备份表空间,一般都是全库备份+增量归档备份为主!了解即可
12.1 使用RMAN备份表空间
-- 连接RMAN
rman target /
-- 备份指定表空间
RMAN> BACKUP TABLESPACE tablespace_name;
-- 备份表空间并同时备份归档日志
RMAN> BACKUP TABLESPACE tablespace_name PLUS ARCHIVELOG DELETE INPUT;
-- 备份多个表空间
RMAN> BACKUP TABLESPACE users, app_data, hr_data;
12.2 使用RMAN恢复表空间
-- 恢复表空间
RMAN> RESTORE TABLESPACE tablespace_name;
RMAN> RECOVER TABLESPACE tablespace_name;
-- 恢复并重新联机
RMAN> RESTORE TABLESPACE tablespace_name;
RMAN> RECOVER TABLESPACE tablespace_name;
RMAN> ALTER TABLESPACE tablespace_name ONLINE;
12.3 传输表空间
-- 生成可传输表空间集合
RMAN> TRANSPORT TABLESPACE tablespace_name
TABLESPACE DESTINATION '/destination_path';
十三、表空间常用查询语句
13.1 查看所有表空间和大小
-- 查看所有表空间名称
SELECT tablespace_name FROM dba_tablespaces;
-- 查看表空间详细信息
SELECT tablespace_name, status, contents, bigfile
FROM dba_tablespaces;
-- 查看各表空间的大小
SELECT tablespace_name, round(sum(bytes )/ (1024 * 1024), 0) AS size_mb
FROM dba_data_files
group BY tablespace_name;
13.2 查看表空间数据文件
SELECT tablespace_name, file_id, file_name,
ROUND(bytes / (1024 * 1024), 0) AS size_mb,
autoextensible,ROUND(maxbytes / (1024 * 1024), 0) AS maxsize_mb
FROM dba_data_files
ORDER BY tablespace_name;
13.3 查看表空间使用情况(含使用率)
set linesize 200
set pagesize 2000
set time on
set timing on
col tablespace_name for a20
SELECT df.tablespace_name,
COUNT(*) file_cnt,
trunc(nvl(SUM(df.BYTES),0) / 1024 / 1024/ 1024, 2) totol_mb,
trunc(nvl(SUM(free.BYTES),0) / 1024 / 1024/ 1024, 2) free_mb,
trunc(nvl(SUM(df.BYTES),0) / 1024 / 1024/ 1024 - nvl(SUM(free.BYTES),0) / 1024 / 1024/ 1024, 2) used_mb,
trunc(100 * (nvl(SUM(df.BYTES) - SUM(free.BYTES),0)) / nvl(SUM(df.BYTES),1), 2) pct_used,
trunc(nvl(sum
(
case when df.autoextensible='YES' then
df.maxbytes
else
df.BYTES
end)
,0) / 1024 / 1024/ 1024, 2) totol_max_mb,
trunc(100 * (nvl(SUM(df.BYTES) - SUM(free.BYTES),0)) / nvl(sum(case when df.autoextensible='YES' then df.maxbytes else df.BYTES end),1), 2) pct_used_max
FROM dba_data_files df,
(SELECT tablespace_name, file_id, nvl(SUM(BYTES), 0) BYTES
FROM dba_free_space
where bytes > 1024 * 1024
GROUP BY tablespace_name, file_id) free
WHERE df.tablespace_name = free.tablespace_name(+)
AND df.file_id = free.file_id(+)
and df.tablespace_name not like 'UNDO%'
GROUP BY df.tablespace_name
ORDER BY 6 desc;
备注:
totol_max_mb表示如果数据文件打开自动扩属性,以可以扩展的最大大小,来统计数据文件大小,进而计算表空间的最大大小!
pct_used_max表示,表空间最大大小为基准,来计算表空间使用率
bytes > 1024 * 1024 表示去掉1M以下的空闲空间,因为有时候会空间虽然够,但是还是说无法分配足够的空间
另一个简便的语法:
SELECT df.tablespace_name,
file_cnt,
totol_gb,
max_totol_gb,
totol_gb-nvl(free_gb,0) used_gb,
nvl(free_gb,0) as "FREE_GB",
trunc(100 * (totol_gb- nvl(free_gb,0))/totol_gb,2) pct_used,
trunc(100 * (totol_gb- nvl(free_gb,0))/max_totol_gb,2) pct_used_max
FROM (SELECT tablespace_name,
count(*) file_cnt,
round(nvl(SUM(bytes)/1024/1024/1024,0),3) AS totol_gb,
round(nvl(SUM(GREATEST(maxbytes, bytes))/1024/1024/1024,0),3) AS max_totol_gb
FROM dba_data_files
GROUP BY tablespace_name) df,
(SELECT tablespace_name, round(nvl(SUM(BYTES)/1024/1024/1024, 0),3) free_gb
FROM dba_free_space
where bytes > 1024 * 1024
GROUP BY tablespace_name) free
WHERE df.tablespace_name = free.tablespace_name(+)
ORDER BY 7 desc;
13.4 查看表空间中各数据文件的使用情况
SELECT file_name,
ROUND(df.bytes / (1024 * 1024), 0) AS total_mb,
ROUND((df.bytes - SUM(fs.bytes)) / (1024 * 1024), 0) AS used_mb,
ROUND(SUM(fs.bytes) / df.bytes * 100, 2) AS free_pct
FROM dba_data_files df, dba_free_space fs
WHERE df.file_id = fs.file_id
GROUP BY file_name, df.bytes;
13.5 查看默认表空间
SELECT property_name, property_value
FROM database_properties
WHERE property_name IN ('DEFAULT_PERMANENT_TABLESPACE', 'DEFAULT_TEMP_TABLESPACE');
13.6 查看用户的默认表空间
SELECT username, default_tablespace, temporary_tablespace
FROM dba_users
WHERE username = 'USERNAME';
十四、表空间常见错误
14.1 ORA-01653:无法扩展表段
错误信息:
ORA-01653: unable to extend table table_name by 128 in tablespace tablespace_name
原因:表空间已满,无法为表段分配新的区段
解决方法:
-- 扩容表空间
ALTER TABLESPACE tablespace_name ADD DATAFILE 'new_file.dbf' SIZE 1G;
-- 或调整现有文件大小
ALTER DATABASE DATAFILE 'existing_file.dbf' RESIZE 2G;
14.2 ORA-01652:无法扩展临时段
错误信息:
ORA-01652: unable to extend temp segment by 256 in tablespace TEMP
原因:临时表空间已满
解决方法:
-- 为临时表空间添加临时文件
ALTER TABLESPACE temp ADD TEMPFILE '/u01/app/oracle/oradata/mydb/temp02.dbf' SIZE 500M;
-- 或调整临时文件大小
ALTER DATABASE TEMPFILE '/u01/app/oracle/oradata/mydb/temp01.dbf' RESIZE 2G;
14.3 ORA-03262:数据文件非空
错误信息:
ORA-03262: the file is non-empty
原因:尝试删除的数据文件中还存在已分配的对象
解决方法:
- 将数据文件中的对象移动到其他数据文件
- 确认数据文件确实为空后再执行删除
14.4 ORA-03249:不支持在大文件表空间上使用DROP DATAFILE
错误信息:
ORA-03249: DROP DATAFILE not allowed for bigfile tablespace
原因:大文件表空间只有一个数据文件,不支持删除数据文件操作
解决方法:删除整个表空间而非单个数据文件
DROP TABLESPACE big_ts INCLUDING CONTENTS AND DATAFILES;
14.5 表空间无法联机
可能原因:
- 数据文件丢失或损坏
- 需要介质恢复
解决方法:
- 检查数据文件是否存在
- 使用RMAN进行恢复
- 如果数据文件已损坏且无法恢复,可考虑离线删除该数据文件
14.6 ORA-00376:文件无法读写
错误信息:
ORA-00376: file file_id cannot be read at this time
原因:数据文件处于离线状态
解决方法:
-- 恢复数据文件联机
ALTER DATABASE DATAFILE 'file_path' ONLINE;




