ALTER TABLESPACE ... READ ONLY 会阻塞DML和DDL操作,但允许SELECT、临时段使用、expdp导出及归档日志记录;需满足无活动事务、非默认临时表空间、非SYSTEM/SYSAUX、闪回已关闭等前置条件。
ALTER TABLESPACE ... READ ONLY 会阻塞哪些操作
执行 alter tablespace users read only 时,oracle 会等待该表空间内所有未提交的事务完成,并阻止后续对其中任何段(表、索引等)的 dml(insert、update、delete)和 ddl(如 alter table、drop index)。但以下操作仍被允许:
• 查询(select)不受影响
• 临时段(如排序、哈希连接产生的临时数据)可继续使用临时表空间,与目标表空间是否只读无关
• 数据泵导出(expdp)可正常读取只读表空间中的数据
• 归档日志仍会记录该表空间的 scn 变更,但不再记录数据块变更日志(因为无写入)
必须满足的前置条件才能成功设为只读
Oracle 不会自动检查依赖项,若忽略这些条件,命令会卡住或报错:
• 表空间中不能有未提交的活动事务(否则 ALTER TABLESPACE 会挂起等待)
• 不能有处于 ACTIVE 状态的回滚段(需先切换到其他 undo 表空间并确保原表空间内无活跃事务)
• 表空间不能是当前数据库的默认临时表空间(可通过 SELECT property_value FROM database_properties WHERE property_name = 'DEFAULT_TEMP_TABLESPACE' 查看)
• 不能是 SYSTEM 或 SYSAUX 表空间(Oracle 禁止对它们设为只读)
• 若启用了闪回数据库(FLASHBACK DATABASE),该表空间必须已关闭闪回(ALTER TABLESPACE ... FLASHBACK OFF)
只读表空间的常见误操作与恢复难点
一旦设为只读,很多看似“只读”的操作其实隐含写入,容易触发 ORA-01642 错误:
• 执行 ANALYZE TABLE ... COMPUTE STATISTICS 会失败(因需更新数据字典基表)
• 使用 DBMS_STATS.GATHER_TABLE_STATS 默认会写入统计信息到 SYSAUX,但如果指定 STATTYPE => 'ALL' 且目标表在只读表空间中,部分内部操作可能尝试访问本地段元数据,导致失败
• 尝试在只读表空间中创建新对象(如 CREATE TABLE ... TABLESPACE users)直接报 ORA-01642
• 恢复时若忘了先执行 ALTER TABLESPACE users READ WRITE,后续 RECOVER TABLESPACE 或数据文件还原会失败
如何安全地切回读写模式
只读转读写不是简单逆向操作,需确认底层一致性:
• 必须保证数据库处于 MOUNT 状态或 OPEN 状态均可执行,但建议在 OPEN 状态下操作以验证可用性
• 执行 ALTER TABLESPACE users READ WRITE 后,Oracle 会校验该表空间对应数据文件头的只读标志位,并重置内部状态
• 如果该表空间自设为只读后曾离线过(ALTER TABLESPACE users OFFLINE),必须先在线(ALTER TABLESPACE users ONLINE)再执行读写切换
• 切换后首次 DML 可能稍慢,因 Oracle 需重新初始化段级锁结构和 LRU 列表,属正常现象

















