物化视图不能直接 move 表空间,因其本质是“查询快照+日志+刷新机制”的组合体,非纯数据段;唯一可靠迁移方式是导出定义、修改 tablespace 后重建,并同步处理日志、索引和刷新作业。

物化视图不能直接用 ALTER MATERIALIZED VIEW ... MOVE TABLESPACE —— 语法不支持,强行执行会报 ORA-00905: missing keyword 或 ORA-02003: invalid userenv parameter 类错误。
为什么物化视图不能像表一样 MOVE?
物化视图本质是“查询结果的快照+日志+刷新机制”的组合体,不是纯数据段。它的主表(MVIEW 对应的基表)可能在某个表空间,但物化视图日志(MLOG$)、物化视图本身的数据段、以及依赖的索引,各自独立存储,且没有统一的 MOVE 接口。
- 物化视图的数据段类型是
MATERIALIZED VIEW,但DBA_SEGMENTS.SEGMENT_TYPE中查到的是TABLE(因为底层用普通表实现),容易误判 -
ALTER TABLE ... MOVE对物化视图主表无效:它只是个只读逻辑对象,DML 被禁用,MOVE 会失败 - 物化视图日志(如
MLOG$_T1)是真实表,可 MOVE,但必须先停刷新、删日志、重建,否则刷新中断或丢失增量
正确迁移路径:重建 + 显式指定表空间
唯一可靠方式是 导出定义 → 修改建表语句中的 TABLESPACE → 重建。不能跳过重建,也不能指望 ALTER 修改元数据。
- 先查当前物化视图定义:
SELECT query FROM dba_mviews WHERE mview_name = 'MV_NAME' - 查它依赖的基表和日志:
SELECT master, log_table FROM dba_mview_logs WHERE log_owner = 'OWNER' - 生成新建语句时,必须显式写死
TABLESPACE new_ts在CREATE MATERIALIZED VIEW子句里,例如:CREATE MATERIALIZED VIEW mv_t1 TABLESPACE new_ts BUILD IMMEDIATE REFRESH FAST ON COMMIT AS SELECT * FROM t1;
- 如果原物化视图带物化视图日志,重建前需先
DROP MATERIALIZED VIEW LOG ON t1,再在新表空间重建日志:CREATE MATERIALIZED VIEW LOG ON t1 TABLESPACE new_ts - 重建后,原统计信息丢失,需手动收集:
EXEC DBMS_STATS.GATHER_TABLE_STATS('OWNER', 'MV_NAME')
重建时容易漏掉的三个依赖项
物化视图看似独立,实际绑定了三类隐性对象,漏处理会导致刷新失败或查询报错。
-
物化视图日志:必须和基表在同一个表空间?不一定,但必须存在且可用;跨表空间日志能工作,但 DBA 很少这么配,建议统一 -
主键/唯一约束索引:FAST REFRESH 要求基表有主键或唯一索引,且对应索引必须在可访问表空间;MOVE 基表后若没重建索引,物化视图刷新直接报ORA-12008 -
刷新作业(DBA_JOBS / DBA_SCHEDULER_JOBS):原作业指向旧对象名或旧 schema,重建后需检查并更新WHAT字段或重新创建作业
真正耗时的不是语法执行,而是判断哪些基表要先迁、日志是否启用、刷新策略是否允许停机——这些没法靠脚本自动推断,必须人工核对 DBA_MVIEWS、DBA_MVIEW_LOGS 和 DBA_DEPENDENCIES 三张视图。











