不能直接迁移。Oracle 不提供 ALTER TABLESPACE ... CONVERT TO BIGFILE 语法,Smallfile 和 Bigfile 是创建时决定的元数据属性,不可更改;DBA_TABLESPACES.BIGFILE 标志位仅在 CREATE BIGFILE TABLESPACE 时设为 YES,后续无法更新,尝试修改会报 ORA-02236;唯一可行方式是新建 Bigfile 表空间并逐个迁移对象,同时需彻底清理依赖(如物化视图日志、用户默认表空间、临时段等),否则易引发 ORA-01502 等错误。

不能直接迁移。Oracle 不提供 ALTER TABLESPACE ... CONVERT TO BIGFILE 这类语法,Smallfile 和 Bigfile 是创建时就决定的元数据属性,不可更改。
为什么不能 ALTER TABLESPACE 转换类型
Bigfile 表空间在数据字典中由 DBA_TABLESPACES.BIGFILE 标志位标识,该值只在 CREATE BIGFILE TABLESPACE 时设为 YES,后续无法更新。尝试用 ALTER TABLESPACE 修改该列会报 ORA-02236:invalid file name —— 因为 Oracle 根本没开放这个操作入口。
- 表空间类型属于“一次性声明”,类似表的
ORGANIZATION属性,建完即固化 -
DBA_TABLESPACES中查到BIGFILE = 'NO',就说明它永远是 Smallfile,哪怕你往里加了 100 个数据文件 - 试图对 Smallfile 表空间执行
ALTER DATABASE DATAFILE ... RESIZE并不会触发类型转换,只会扩展那个指定文件
实际可行的替代路径:重建 + 迁移
唯一可靠的方式是新建一个 Bigfile 表空间,再把原表空间中的对象逐个搬过去。这不是“转换”,而是“替换”。
- 先创建 Bigfile 表空间:
CREATE BIGFILE TABLESPACE tbs_new DATAFILE '/u01/oradata/db/tbs_new.dbf' SIZE 50G AUTOEXTEND ON NEXT 1G MAXSIZE 200G EXTENT MANAGEMENT LOCAL; - 确认所有待迁移对象(表、索引、LOB、分区)都归属原 Smallfile 表空间:
SELECT table_name, tablespace_name FROM user_tables WHERE tablespace_name = 'OLD_TBS'; - 对每个表执行
ALTER TABLE t MOVE TABLESPACE tbs_new;;注意:MOVE 后索引会变UNUSABLE,必须立刻ALTER INDEX i REBUILD TABLESPACE tbs_new; - LOB 段要单独处理:
ALTER TABLE t MOVE LOB(c) STORE AS (TABLESPACE tbs_new); - 迁移完成后,验证对象状态:
SELECT segment_name, segment_type, tablespace_name FROM user_segments WHERE tablespace_name = 'tbs_new';
容易踩的坑:误删旧表空间前没清依赖
很多人在新表空间建好、表 MOVE 完就急着 DROP TABLESPACE old_tbs INCLUDING CONTENTS AND DATAFILES,结果发现还有残留:
- 物化视图日志、队列表、高级队列表可能仍挂在旧表空间,
DROP会报 ORA-00955 或 ORA-14404 - 用户默认表空间仍是 old_tbs,新对象还会继续写进去,得先
ALTER USER u DEFAULT TABLESPACE tbs_new; - 临时段或排序段可能还在 old_tbs 的数据文件里活跃,需检查
v$sort_segment和v$tempseg_usage - 没改回原表空间的
ONLINE状态?执行ALTER TABLESPACE old_tbs OFFLINE前,确保无活动事务正在写入其中任一数据文件
真正麻烦的不是语法,而是对象依赖的完整性——一个没查到的 LOBINDEX 或分区索引,就能让应用在半夜报 ORA-01502。


















