alter user default tablespace仅修改用户默认表空间属性,不影响已有表、索引、lob、分区等任何现存段;新建对象才使用该表空间,旧对象须逐个迁移并重建索引、更新统计信息。

ALTER USER DEFAULT TABLESPACE 只影响后续新建对象,对已有表、索引、LOB 等完全无效——这不是迁移,只是设个“出生地”。
ALTER USER DEFAULT TABLESPACE 能做什么、不能做什么
- 它只改
user_users.default_tablespace字段,不碰任何现存段(segment) - 新建的表、索引、临时表等会自动落到这个新表空间,但旧对象纹丝不动
- 如果你发现用户下很多表还在
SYSTEM或旧表空间,说明历史建表时没指定TABLESPACE,且当时default_tablespace就是错的 - 执行前务必确认目标表空间已存在、在线、有足够空闲空间:
SELECT status, bytes/1024/1024 MB FROM dba_data_files WHERE tablespace_name = 'NEW_TBS';
怎么查出哪些对象还卡在旧表空间里
普通用户只能查自己拥有的对象,用以下四条语句交叉验证,别只看 user_tables:
- 表本身:
SELECT table_name, tablespace_name FROM user_tables WHERE tablespace_name IN ('SYSTEM', 'OLD_TBS'); - 索引:
SELECT index_name, tablespace_name FROM user_indexes WHERE tablespace_name IN ('SYSTEM', 'OLD_TBS'); - LOB 段(最容易漏):
SELECT table_name, column_name, segment_name, tablespace_name FROM user_lobs WHERE tablespace_name IN ('SYSTEM', 'OLD_TBS'); - 分区(含子分区):
SELECT table_name, partition_name, tablespace_name FROM user_tab_partitions WHERE tablespace_name IN ('SYSTEM', 'OLD_TBS');
⚠️ 注意:user_lobs.tablespace_name 才是 LOB 数据的真实位置,不是表名所在表空间;user_tab_partitions 里的分区可能比 user_tables 多出几十个条目,必须单独处理。
表、索引、LOB、分区必须分步迁移,顺序不能乱
- 先
ALTER TABLE t MOVE TABLESPACE NEW_TBS;:表数据搬走,但所有普通索引立刻变UNUSABLE,查询带索引条件会直接报ORA-01502 - 紧接着重建索引:
ALTER INDEX i REBUILD TABLESPACE NEW_TBS;;别等全部表搬完再统一建,中间窗口期应用可能崩 - LOB 字段要单独动:
ALTER TABLE "MyTable" MOVE LOB("content") STORE AS (TABLESPACE NEW_TBS);;MOVE TABLE 语句对 LOB 段完全没作用 - 分区表不能整表 MOVE:
ORA-14511报错;得拆成:ALTER TABLE "Sales" MOVE PARTITION "P_2024_Q1" TABLESPACE NEW_TBS;
所有语句末尾必须带分号,SQL*Plus 粘贴时缺分号会导致下一行被吞成续行,语法报错。
迁移后最容易被忽略的三件事
- 统计信息不会自动更新,
DBA_TAB_STATISTICS里last_analyzed还是旧时间,执行计划可能劣化,必须手动跑:DBMS_STATS.GATHER_TABLE_STATS('OWNER', 'TABLE_NAME'); - 函数索引、位图索引、域索引不一定出现在
user_indexes,建议用dba_indexes全局查:SELECT index_name FROM dba_indexes WHERE owner = 'YOUR_USER' AND tablespace_name IN ('SYSTEM', 'OLD_TBS'); - 表名含大小写或特殊字符(如空格、中文、短横线)时,
ALTER TABLE必须用双引号包裹:ALTER TABLE "My-Table" MOVE TABLESPACE NEW_TBS;,否则报ORA-00942
迁移不是改个配置就完事,每个对象类型都有自己的“脾气”,漏掉一类,就可能让某条业务 SQL 突然慢十倍或直接失败。











