Oracle 19c入门学习教程,从入门到精通, Oracle 表空间与数据文件管理详解(9)

Oracle 表空间与数据文件管理详解

本章系统讲解 Oracle 数据库中 表空间(Tablespace)数据文件(Datafile) 的结构、关系及管理方法,涵盖 永久表空间、撤销表空间、临时表空间 的创建、维护与优化,是数据库存储架构设计和性能调优的核心内容。


一、环境准备与前提条件

1. 安装要求

  • 已安装 Oracle Database Enterprise/Standard Edition(如 19c/21c)
  • 具备 SYSDBA 权限
  • 操作系统有足够磁盘空间(建议 /u01, /u02 等挂载点)

2. 连接数据库

bash 复制代码
su - oracle
sqlplus / as sysdba
SQL> STARTUP;  -- 若未启动

二、表空间与数据文件的关系

概念 说明
表空间(Tablespace) 逻辑存储单元,包含一个或多个数据文件
数据文件(Datafile) 物理文件(.dbf),存储实际数据
关系 1 个表空间 → N 个数据文件 1 个数据文件 → 仅属于 1 个表空间

设计原则

  • 将不同应用的数据分离到不同表空间
  • I/O 密集型表空间使用独立磁盘

三、Oracle 默认表空间

1. SYSTEM 表空间

  • 作用 :存储数据字典(如 DBA_TABLES)、系统回滚段等

  • 特点

    • 创建数据库时自动创建
    • 禁止存放用户对象
    • 必须处于 ONLINE 状态

2. SYSAUX 表空间

  • 作用:辅助 SYSTEM,存放 OEM、AWR、Statspack 等工具数据
  • 优势:减轻 SYSTEM 负担,提高可维护性
sql 复制代码
-- 查看默认表空间
SELECT property_name, property_value 
FROM database_properties 
WHERE property_name LIKE '%DEFAULT%';

输出示例:

复制代码
PROPERTY_NAME                PROPERTY_VALUE
---------------------------  --------------
DEFAULT_PERMANENT_TABLESPACE USERS
DEFAULT_TEMP_TABLESPACE      TEMP

四、创建表空间

1. 基本语法

sql 复制代码
CREATE TABLESPACE tablespace_name
DATAFILE 'file_path' SIZE size
[ AUTOEXTEND ON NEXT increment MAXSIZE max_size ]
[ EXTENT MANAGEMENT { LOCAL | DICTIONARY } ]
[ SEGMENT SPACE MANAGEMENT { AUTO | MANUAL } ];

2. 通过本地化管理方式创建(推荐)

本地管理表空间(LMT):使用位图管理区(Extent),性能优于字典管理。

sql 复制代码
-- 创建本地管理表空间(默认)
CREATE TABLESPACE tbs_app
DATAFILE '/u01/oradata/ORCL/tbs_app01.dbf'
SIZE 500M
AUTOEXTEND ON NEXT 100M MAXSIZE 2G
EXTENT MANAGEMENT LOCAL;  -- 显式指定(实际为默认)

✅ 优势:避免递归 SQL,减少争用。


3. 通过段空间管理方式创建

  • SEGMENT SPACE MANAGEMENT AUTO:使用 位图 管理段内空间(推荐)
  • MANUAL:使用 空闲列表(Freelist)(旧方式,不推荐)
sql 复制代码
-- 创建自动段空间管理表空间(ASSM)
CREATE TABLESPACE tbs_user
DATAFILE '/u01/oradata/ORCL/tbs_user01.dbf'
SIZE 1G
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;  -- 默认值

💡 ASSM 自动处理并发插入,避免"缓冲区忙等待"。


4. 创建非标准块表空间

Oracle 默认块大小由 DB_BLOCK_SIZE 决定(通常 8KB)。

可创建 2KB、16KB、32KB 等非标准块表空间(需先设置 DB_nK_CACHE_SIZE)。

步骤1:设置缓存池
sql 复制代码
-- 设置 16KB 缓存池(动态)
ALTER SYSTEM SET db_16k_cache_size = 100M;
步骤2:创建非标准块表空间
sql 复制代码
CREATE TABLESPACE tbs_large_block
DATAFILE '/u01/oradata/ORCL/tbs_large01.dbf'
SIZE 500M
BLOCKSIZE 16K;  -- 必须匹配已配置的缓存池

📌 适用场景:数据仓库大行表、LOB 存储。


5. 建立大文件表空间(Bigfile Tablespace)

  • 特点:

    • 仅含 1 个数据文件
    • 文件最大可达 128TB(8KB 块)
    • 适用于 超大数据库(VLDB)
sql 复制代码
-- 创建大文件表空间
CREATE BIGFILE TABLESPACE tbs_big
DATAFILE '/u02/oradata/ORCL/tbs_big.dbf'
SIZE 10G
AUTOEXTEND ON NEXT 1G;

⚠️ 注意:不能与小文件表空间混用;RMAN 备份策略需调整。


五、维护表空间与数据文件

1. 设置默认表空间

sql 复制代码
-- 设置数据库默认永久表空间
ALTER DATABASE DEFAULT TABLESPACE tbs_user;

-- 设置默认临时表空间
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_new;

新建用户若未指定 DEFAULT TABLESPACE,将使用此默认值。


2. 更改表空间状态

状态 作用 命令
ONLINE 正常访问 ALTER TABLESPACE tbs_name ONLINE;
OFFLINE 不可用(用于维护) ALTER TABLESPACE tbs_name OFFLINE;
READ ONLY 只读(用于备份) ALTER TABLESPACE tbs_name READ ONLY;
READ WRITE 恢复读写 ALTER TABLESPACE tbs_name READ WRITE;
sql 复制代码
-- 示例:将表空间设为只读进行备份
ALTER TABLESPACE tbs_app READ ONLY;
-- ... 执行备份 ...
ALTER TABLESPACE tbs_app READ WRITE;

3. 重命名表空间

sql 复制代码
-- 重命名(Oracle 10g+ 支持)
ALTER TABLESPACE tbs_old RENAME TO tbs_new;

✅ 优点:无需导出/导入数据。


4. 删除表空间

sql 复制代码
-- 删除表空间及数据文件(谨慎!)
DROP TABLESPACE tbs_test INCLUDING CONTENTS AND DATAFILES;

⚠️ INCLUDING CONTENTS:删除所有对象

⚠️ AND DATAFILES:同时删除操作系统文件


5. 维护数据文件

(1) 添加数据文件
sql 复制代码
ALTER TABLESPACE tbs_app
ADD DATAFILE '/u02/oradata/ORCL/tbs_app02.dbf'
SIZE 500M AUTOEXTEND ON;
(2) 调整数据文件大小
sql 复制代码
-- 手动扩容
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/tbs_app01.dbf' RESIZE 1G;

-- 开启自动扩展
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/tbs_app01.dbf'
AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;
(3) 移动/重命名数据文件
sql 复制代码
-- 1. OFFLINE 表空间
ALTER TABLESPACE tbs_app OFFLINE;

-- 2. 操作系统级移动文件
-- !mv /old/path/file.dbf /new/path/file.dbf

-- 3. 更新控制文件
ALTER DATABASE RENAME FILE '/old/path/file.dbf' TO '/new/path/file.dbf';

-- 4. ONLINE 表空间
ALTER TABLESPACE tbs_app ONLINE;

六、管理撤销表空间(Undo Tablespace)

1. 撤销表空间的作用

  • 存储 DML 操作前的旧值(Before Image)
  • 支持 回滚(ROLLBACK)读一致性(Read Consistency)闪回查询

2. 初始化参数

参数 说明
UNDO_MANAGEMENT AUTO(自动)或 MANUAL(手动)
UNDO_TABLESPACE 指定当前撤销表空间
UNDO_RETENTION 保留时间(秒,默认 900)
sql 复制代码
-- 查看参数
SHOW PARAMETER undo;

3. 基本操作

(1) 创建撤销表空间
sql 复制代码
CREATE UNDO TABLESPACE undotbs2
DATAFILE '/u01/oradata/ORCL/undotbs02.dbf'
SIZE 2G AUTOEXTEND ON;
(2) 切换撤销表空间
sql 复制代码
-- 动态切换(无需重启)
ALTER SYSTEM SET undo_tablespace = undotbs2;
(3) 删除旧撤销表空间
sql 复制代码
-- 确保未被使用
DROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;

💡 监控撤销使用:

sql 复制代码
SELECT tablespace_name, status, sum(bytes)/1024/1024 AS mb
FROM dba_undo_extents
GROUP BY tablespace_name, status;

七、管理临时表空间(Temporary Tablespace)

1. 临时表空间简介

  • 存储 排序(ORDER BY)、哈希连接、临时表 的中间结果
  • 数据在会话结束时自动清除
  • 文件扩展名为 .tmp

2. 创建临时表空间

sql 复制代码
-- 创建临时表空间
CREATE TEMPORARY TABLESPACE temp_new
TEMPFILE '/u01/oradata/ORCL/temp_new01.dbf'
SIZE 500M AUTOEXTEND ON;

-- 设置为默认临时表空间
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_new;

⚠️ 注意:使用 TEMPFILE 而非 DATAFILE

3. 查询临时表空间信息

sql 复制代码
-- 临时表空间及文件
SELECT tablespace_name, file_name, bytes/1024/1024 AS size_mb
FROM dba_temp_files;

-- 临时段使用情况
SELECT s.username, u.tablespace, u.extents, u.blocks
FROM v$session s, v$tempseg_usage u
WHERE s.saddr = u.session_addr;

4. 管理临时表空间组(Oracle 10g+)

允许多个临时表空间组成 组(Group),提高并发排序能力。

(1) 创建临时表空间组
sql 复制代码
-- 创建时指定组
CREATE TEMPORARY TABLESPACE temp1
TEMPFILE '/u01/oradata/ORCL/temp1.dbf' SIZE 500M
TABLESPACE GROUP temp_group;

CREATE TEMPORARY TABLESPACE temp2
TEMPFILE '/u01/oradata/ORCL/temp2.dbf' SIZE 500M
TABLESPACE GROUP temp_group;
(2) 将用户分配到组
sql 复制代码
-- 用户使用整个组
ALTER USER scott TEMPORARY TABLESPACE temp_group;
(3) 查看组信息
sql 复制代码
SELECT * FROM dba_tablespace_groups;

八、综合性实战案例

案例:为 OLTP 系统设计高可用存储架构

需求

  1. 创建专用应用表空间(本地管理 + ASSM)
  2. 配置独立撤销和临时表空间
  3. 设置自动扩展与监控
  4. 验证配置
步骤1:创建应用表空间
sql 复制代码
-- 永久表空间
CREATE TABLESPACE tbs_oltp
DATAFILE '/u01/oradata/ORCL/tbs_oltp01.dbf'
SIZE 2G
AUTOEXTEND ON NEXT 200M MAXSIZE 10G
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;

-- 添加第二数据文件(跨磁盘)
ALTER TABLESPACE tbs_oltp
ADD DATAFILE '/u02/oradata/ORCL/tbs_oltp02.dbf'
SIZE 2G AUTOEXTEND ON;
步骤2:创建撤销表空间
sql 复制代码
CREATE UNDO TABLESPACE undotbs_oltp
DATAFILE '/u01/oradata/ORCL/undotbs_oltp.dbf'
SIZE 3G AUTOEXTEND ON;

-- 切换并设置保留时间
ALTER SYSTEM SET undo_tablespace = undotbs_oltp;
ALTER SYSTEM SET undo_retention = 1800;  -- 30分钟
步骤3:创建临时表空间组
sql 复制代码
CREATE TEMPORARY TABLESPACE temp_oltp1
TEMPFILE '/u01/oradata/ORCL/temp_oltp1.dbf'
SIZE 1G AUTOEXTEND ON
TABLESPACE GROUP temp_oltp_group;

CREATE TEMPORARY TABLESPACE temp_oltp2
TEMPFILE '/u02/oradata/ORCL/temp_oltp2.dbf'
SIZE 1G AUTOEXTEND ON
TABLESPACE GROUP temp_oltp_group;

-- 设置为默认
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_oltp_group;
步骤4:创建用户并分配表空间
sql 复制代码
CREATE USER app_user IDENTIFIED BY secure_password
DEFAULT TABLESPACE tbs_oltp
TEMPORARY TABLESPACE temp_oltp_group
QUOTA UNLIMITED ON tbs_oltp;

GRANT CONNECT, RESOURCE TO app_user;
步骤5:验证配置
sql 复制代码
-- 表空间列表
SELECT tablespace_name, contents, status FROM dba_tablespaces;

-- 数据文件分布
SELECT tablespace_name, file_name, bytes/1024/1024 AS size_mb
FROM dba_data_files
WHERE tablespace_name LIKE '%OLTP%'
UNION ALL
SELECT tablespace_name, file_name, bytes/1024/1024
FROM dba_temp_files
ORDER BY 1;

-- 撤销表空间状态
SHOW PARAMETER undo_tablespace;
步骤6:测试临时空间使用
sql 复制代码
-- 以 app_user 登录
CONNECT app_user/secure_password

-- 执行大排序(触发临时段)
SELECT * FROM (
  SELECT object_id, object_name
  FROM all_objects
  ORDER BY object_name
)
WHERE ROWNUM <= 10000;

九、总结

表空间类型 关键命令 最佳实践
永久表空间 CREATE TABLESPACE ADD DATAFILE LMT + ASSM,多数据文件跨磁盘
撤销表空间 CREATE UNDO TABLESPACE ALTER SYSTEM SET undo_tablespace 独立表空间,合理设置 UNDO_RETENTION
临时表空间 CREATE TEMPORARY TABLESPACE TABLESPACE GROUP 使用组提升并发排序性能

💡 黄金法则

  • 绝不使用 SYSTEM/SYSAUX 存放用户数据
  • 所有表空间启用 AUTOEXTEND(设上限)
  • 定期监控空间使用(DBA_FREE_SPACE

掌握本章内容,即可构建高性能、高可用的 Oracle 存储体系,为业务系统提供坚实基础。

相关推荐
zhengfei6112 小时前
Chroma DB — 未经授权的信息披露
数据库
KaiwuDB2 小时前
KaiwuDB 获评“2025 中国大数据产业年度国产化优秀代表厂商”
数据库
浅念-3 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法
百***07453 小时前
一步API+Gemini 3.0 Pro进阶实战:多模态开发、性能调优与项目落地
数据库·microsoft
不想写bug呀3 小时前
Redis主从复制介绍
数据库·redis
颜颜yan_3 小时前
Oracle 迁移到 KingbaseES 实战:从评估到追平的一套可落地流程
数据库·oracle
砚边数影3 小时前
Oracle迁移替换实战:金仓数据库如何破解企业数据迁移难题
数据库·oracle·kingbase·kingbasees·数据库平替用金仓·金仓数据库
burning_maple3 小时前
mysql数据库笔记
数据库·笔记·mysql
hkNaruto3 小时前
【AI】AI学习笔记:LangGraph 与 LangChain的关系以及系统性学习路线选择
笔记·学习·langchain